diff --git a/asinkj-api/asinkj-api-system/src/main/java/org/asinkj/system/api/domain/vo/RemoteUserVo.java b/asinkj-api/asinkj-api-system/src/main/java/org/asinkj/system/api/domain/vo/RemoteUserVo.java index 9a7e6a0..0c6c807 100644 --- a/asinkj-api/asinkj-api-system/src/main/java/org/asinkj/system/api/domain/vo/RemoteUserVo.java +++ b/asinkj-api/asinkj-api-system/src/main/java/org/asinkj/system/api/domain/vo/RemoteUserVo.java @@ -70,4 +70,7 @@ public class RemoteUserVo implements Serializable { */ private Date createTime; + + private String address; + } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizLogisticsQuoteController.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizLogisticsQuoteController.java index f2bc0c6..d7abd48 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizLogisticsQuoteController.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizLogisticsQuoteController.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Map; import cn.dev33.satoken.annotation.SaCheckRole; +import cn.dev33.satoken.annotation.SaMode; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import jakarta.servlet.http.HttpServletResponse; @@ -167,7 +168,7 @@ public class BizLogisticsQuoteController extends BaseController { * * @return */ - @SaCheckRole("yunying") + @SaCheckRole(value = {"superadmin", "yunying"}, mode = SaMode.OR) @PostMapping("/report") public R>> getInfo(@Valid @RequestBody BizLogisticsQuoteReportBo bo) { List> maps = bizLogisticsQuoteService.generateReport(bo); diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizPurchaseOrderController.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizPurchaseOrderController.java index 365d663..1d0382c 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizPurchaseOrderController.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizPurchaseOrderController.java @@ -48,8 +48,8 @@ public class BizPurchaseOrderController extends BaseController { /** * 查询采购单主列表 */ - @SaCheckPermission("amz:purchaseOrder:list") - @SaCheckRole(value = {"gongying","gengdan", "superadmin"}, mode = SaMode.OR) +// @SaCheckPermission("amz:purchaseOrder:list") + @SaCheckRole(value = {"gongying","gengdan", "superadmin","yunying"}, mode = SaMode.OR) @GetMapping("/list") public TableDataInfo list(BizPurchaseOrderBo bo, PageQuery pageQuery) { return bizPurchaseOrderService.queryPageList(bo, pageQuery); @@ -69,13 +69,13 @@ public class BizPurchaseOrderController extends BaseController { /** * 获取采购单主详细信息 * - * @param orderSn 主键 + * @param id 主键 */ @SaCheckPermission("amz:purchaseOrder:query") - @GetMapping("/{orderSn}") + @GetMapping("/{id}") public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable String orderSn) { - return R.ok(bizPurchaseOrderService.queryById(orderSn)); + @PathVariable Long id) { + return R.ok(bizPurchaseOrderService.queryById(id)); } /** @@ -100,6 +100,14 @@ public class BizPurchaseOrderController extends BaseController { return toAjax(bizPurchaseOrderService.updateByBo(bo)); } + @SaCheckPermission("amz:purchaseOrder:edit") + @Log(title = "采购单主", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/confirm") + public R confirm(@Validated(EditGroup.class) @RequestBody BizPurchaseOrderBo bo) { + return toAjax(bizPurchaseOrderService.confirmByBo(bo)); + } + /** * 删除采购单主 * diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizSendOrderController.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizSendOrderController.java index 4787b51..61e83a6 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizSendOrderController.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizSendOrderController.java @@ -42,7 +42,7 @@ public class BizSendOrderController extends BaseController { /** * 查询供应商创建的发货单列表 */ - @SaCheckRole(value = {"gongying","gengdan", "superadmin"}, mode = SaMode.OR) + @SaCheckRole(value = {"gongying", "gengdan", "superadmin", "yunying"}, mode = SaMode.OR) @GetMapping("/list") public TableDataInfo list(BizSendOrderBo bo, PageQuery pageQuery) { return bizSendOrderService.queryPageList(bo, pageQuery); @@ -51,7 +51,7 @@ public class BizSendOrderController extends BaseController { /** * 导出供应商创建的发货单列表 */ - @SaCheckRole(value = {"gongying","gengdan", "superadmin"}, mode = SaMode.OR) + @SaCheckRole(value = {"gongying", "gengdan", "superadmin"}, mode = SaMode.OR) @Log(title = "供应商创建的发货单", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(BizSendOrderBo bo, HttpServletResponse response) { @@ -64,7 +64,7 @@ public class BizSendOrderController extends BaseController { * * @param id 主键 */ - @SaCheckRole(value = {"gongying","gengdan", "superadmin"}, mode = SaMode.OR) + @SaCheckRole(value = {"gongying", "gengdan", "superadmin", "yunying"}, mode = SaMode.OR) @GetMapping("/{id}") public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) { @@ -85,7 +85,7 @@ public class BizSendOrderController extends BaseController { /** * 修改供应商创建的发货单 */ - @SaCheckRole(value = {"gongying","gengdan", "superadmin"}, mode = SaMode.OR) + @SaCheckRole(value = {"gongying", "gengdan", "superadmin", "yunying"}, mode = SaMode.OR) @Log(title = "供应商创建的发货单", businessType = BusinessType.UPDATE) @RepeatSubmit() @PutMapping() @@ -94,13 +94,13 @@ public class BizSendOrderController extends BaseController { } - @SaCheckRole(value = {"gongying","gengdan", "superadmin"}, mode = SaMode.OR) + @SaCheckRole(value = {"gongying", "gengdan", "superadmin"}, mode = SaMode.OR) @Log(title = "供应商创建的发货单", businessType = BusinessType.UPDATE) @RepeatSubmit() @PutMapping("/link") public R link(@Validated(EditGroup.class) @RequestBody BizSendOrderBo bo) { bizSendOrderService.linkByBo(bo); - return R.ok(); + return R.ok(); } /** diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizShipForwardController.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizShipForwardController.java index 27573db..faa2bf4 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizShipForwardController.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizShipForwardController.java @@ -86,7 +86,7 @@ public class BizShipForwardController extends BaseController { /** * 修改货件转发 */ - @SaCheckRole(value = {"gengdan", "superadmin"}, mode = SaMode.OR) + @SaCheckRole(value = {"gengdan", "gongying", "superadmin"}, mode = SaMode.OR) @Log(title = "货件转发", businessType = BusinessType.UPDATE) @RepeatSubmit() @PutMapping() diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/SysStatusHistoryController.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/SysStatusHistoryController.java new file mode 100644 index 0000000..6a08916 --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/SysStatusHistoryController.java @@ -0,0 +1,106 @@ +package org.asinkj.amz.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.asinkj.common.idempotent.annotation.RepeatSubmit; +import org.asinkj.common.log.annotation.Log; +import org.asinkj.common.web.core.BaseController; +import org.asinkj.common.mybatis.core.page.PageQuery; +import org.asinkj.common.core.domain.R; +import org.asinkj.common.core.validate.AddGroup; +import org.asinkj.common.core.validate.EditGroup; +import org.asinkj.common.log.enums.BusinessType; +import org.asinkj.common.excel.utils.ExcelUtil; +import org.asinkj.amz.domain.vo.SysStatusHistoryVo; +import org.asinkj.amz.domain.bo.SysStatusHistoryBo; +import org.asinkj.amz.service.ISysStatusHistoryService; +import org.asinkj.common.mybatis.core.page.TableDataInfo; + +/** + * 状态历史 + * 前端访问路由地址为:/amz/statusHistory + * + * @author shuo hu + * @date 2025-06-09 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/statusHistory") +public class SysStatusHistoryController extends BaseController { + + private final ISysStatusHistoryService sysStatusHistoryService; + + /** + * 查询状态历史列表 + */ + @SaCheckPermission("amz:statusHistory:list") + @GetMapping("/list") + public TableDataInfo list(SysStatusHistoryBo bo, PageQuery pageQuery) { + return sysStatusHistoryService.queryPageList(bo, pageQuery); + } + + /** + * 导出状态历史列表 + */ + @SaCheckPermission("amz:statusHistory:export") + @Log(title = "状态历史", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysStatusHistoryBo bo, HttpServletResponse response) { + List list = sysStatusHistoryService.queryList(bo); + ExcelUtil.exportExcel(list, "状态历史", SysStatusHistoryVo.class, response); + } + + /** + * 获取状态历史详细信息 + * + * @param historyId 主键 + */ + @SaCheckPermission("amz:statusHistory:query") + @GetMapping("/{historyId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long historyId) { + return R.ok(sysStatusHistoryService.queryById(historyId)); + } + + /** + * 新增状态历史 + */ + @SaCheckPermission("amz:statusHistory:add") + @Log(title = "状态历史", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysStatusHistoryBo bo) { + return toAjax(sysStatusHistoryService.insertByBo(bo)); + } + + /** + * 修改状态历史 + */ + @SaCheckPermission("amz:statusHistory:edit") + @Log(title = "状态历史", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysStatusHistoryBo bo) { + return toAjax(sysStatusHistoryService.updateByBo(bo)); + } + + /** + * 删除状态历史 + * + * @param historyIds 主键串 + */ + @SaCheckPermission("amz:statusHistory:remove") + @Log(title = "状态历史", businessType = BusinessType.DELETE) + @DeleteMapping("/{historyIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] historyIds) { + return toAjax(sysStatusHistoryService.deleteWithValidByIds(List.of(historyIds), true)); + } +} diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizInquiryRequest.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizInquiryRequest.java index bbfa1b4..1d249d9 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizInquiryRequest.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizInquiryRequest.java @@ -99,6 +99,8 @@ public class BizInquiryRequest extends TenantEntity { */ private Date effectiveEndTime; + private String customsFlag; + /** * 报价目标日期 */ diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizLogisticsOrder.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizLogisticsOrder.java index 3b6e473..cf94712 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizLogisticsOrder.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizLogisticsOrder.java @@ -4,10 +4,13 @@ import org.asinkj.common.tenant.core.TenantEntity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import lombok.EqualsAndHashCode; + import java.util.Date; + import com.fasterxml.jackson.annotation.JsonFormat; import java.io.Serial; +import java.util.List; /** * 物流订单对象 biz_logistics_order @@ -93,6 +96,9 @@ public class BizLogisticsOrder extends TenantEntity { private String podUrl; + private String status; + @TableField(exist = false) + private List details; } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizLogisticsQuote.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizLogisticsQuote.java index 9e76238..9dd34be 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizLogisticsQuote.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizLogisticsQuote.java @@ -60,6 +60,9 @@ public class BizLogisticsQuote extends TenantEntity { */ private Long leadTime; + private Long minLeadTime; + + /** * 附加费 */ diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizPurchaseOrder.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizPurchaseOrder.java index f7f9f76..4c9d8a7 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizPurchaseOrder.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizPurchaseOrder.java @@ -5,7 +5,9 @@ import org.asinkj.common.tenant.core.TenantEntity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import lombok.EqualsAndHashCode; + import java.util.Date; + import com.fasterxml.jackson.annotation.JsonFormat; import java.io.Serial; @@ -27,7 +29,11 @@ public class BizPurchaseOrder extends TenantEntity { /** * 采购单号 */ + @TableId + private Long id; + + private String orderSn; /** @@ -285,8 +291,14 @@ public class BizPurchaseOrder extends TenantEntity { */ private Long dlvTimeVar; + @AutoMapping(dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date divTime; + private String storeName; + + + } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizPurchaseOrderItem.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizPurchaseOrderItem.java index d571776..0609865 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizPurchaseOrderItem.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizPurchaseOrderItem.java @@ -5,10 +5,13 @@ import org.asinkj.common.tenant.core.TenantEntity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import lombok.EqualsAndHashCode; + import java.util.Date; + import com.fasterxml.jackson.annotation.JsonFormat; import java.io.Serial; +import java.util.List; /** * 供应商订单产品明细对象 biz_purchase_order_item @@ -27,6 +30,7 @@ public class BizPurchaseOrderItem extends TenantEntity { /** * 采购单子项ID */ + @TableId private Long id; /** @@ -176,5 +180,17 @@ public class BizPurchaseOrderItem extends TenantEntity { @TableLogic private String delFlag; + private Long sfgAvlQty; + private String orderStatus; + + @TableField(exist = false) + private List sysStatusHistories; + + @TableField(exist = false) + private String hasForward = "N"; + + @TableField(exist = false) + private String hasSendOrder = "N"; + } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizSendOrder.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizSendOrder.java index 189457f..a61f697 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizSendOrder.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizSendOrder.java @@ -4,7 +4,9 @@ import org.asinkj.common.tenant.core.TenantEntity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import lombok.EqualsAndHashCode; + import java.util.Date; + import com.fasterxml.jackson.annotation.JsonFormat; import java.io.Serial; @@ -39,6 +41,10 @@ public class BizSendOrder extends TenantEntity { */ private String orderSn; + + private Long orderDetailId; + + /** * 发货日期 */ @@ -89,5 +95,17 @@ public class BizSendOrder extends TenantEntity { */ private String sendStatus; + private Long sendId; + + private String sendName; + + + private String sendDetail; + + private String logisticsProviderName; + + private Long logisticsProviderId; + private String shipmentId; + } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizShipForward.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizShipForward.java index 7fba98b..fa0c727 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizShipForward.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizShipForward.java @@ -4,7 +4,9 @@ import org.asinkj.common.tenant.core.TenantEntity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import lombok.EqualsAndHashCode; + import java.util.Date; + import com.fasterxml.jackson.annotation.JsonFormat; import java.io.Serial; @@ -114,5 +116,21 @@ public class BizShipForward extends TenantEntity { */ private Long orderDetailId; + /** + * 预计到达时间 + */ + private Date expDeliveryDate; + + + /** + * 实际到达日期 + */ + private Date deliveryDate; + + /** + * 箱数 + */ + private Long boxNum; + } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/SysStatusHistory.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/SysStatusHistory.java new file mode 100644 index 0000000..063f16e --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/SysStatusHistory.java @@ -0,0 +1,68 @@ +package org.asinkj.amz.domain; + +import org.asinkj.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 状态历史对象 sys_status_history + * + * @author shuo hu + * @date 2025-06-09 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_status_history") +public class SysStatusHistory extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * $column.columnComment + */ + private Long historyId; + + /** + * $column.columnComment + */ + private String tableName; + + /** + * $column.columnComment + */ + private Long recordId; + + /** + * $column.columnComment + */ + private String statusColumn; + + /** + * $column.columnComment + */ + private String oldStatus; + + /** + * $column.columnComment + */ + private String newStatus; + + /** + * 删除标志(0=正常 1=删除) + */ + @TableLogic + private String delFlag; + + /** + * $column.columnComment + */ + private Date originalChangedAt; + + +} diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsOrderBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsOrderBo.java index d0784a4..21a1601 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsOrderBo.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsOrderBo.java @@ -8,7 +8,9 @@ import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import lombok.EqualsAndHashCode; import jakarta.validation.constraints.*; + import java.util.Date; + import com.fasterxml.jackson.annotation.JsonFormat; /** @@ -25,12 +27,13 @@ public class BizLogisticsOrderBo extends BaseEntity { /** * 主键(应用层生成的全局唯一ID,如雪花算法) */ + @NotNull(message = "主键不能为空") private Long id; /** * FBA货件编号(亚马逊系统生成的唯一标识) */ - @NotBlank(message = "FBA货件编号(亚马逊系统生成的唯一标识)不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotBlank(message = "FBA货件编号(亚马逊系统生成的唯一标识)不能为空", groups = { AddGroup.class, EditGroup.class }) private String fbaShipmentId; /** @@ -41,37 +44,37 @@ public class BizLogisticsOrderBo extends BaseEntity { /** * 物流商ID(关联物流商信息表) */ - @NotNull(message = "物流商ID(关联物流商信息表)不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotNull(message = "物流商ID(关联物流商信息表)不能为空", groups = { AddGroup.class, EditGroup.class }) private Long logisticsProviderId; /** * 物流商名称(冗余存储,避免高频联表查询) */ - @NotBlank(message = "物流商名称(冗余存储,避免高频联表查询)不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotBlank(message = "物流商名称(冗余存储,避免高频联表查询)不能为空", groups = { AddGroup.class, EditGroup.class }) private String logisticsProviderName; /** * 物流渠道 */ - @NotBlank(message = "物流渠道(如空运/海运/快递等)不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotBlank(message = "物流渠道(如空运/海运/快递等)不能为空", groups = { AddGroup.class, EditGroup.class }) private String channelName; /** * 目的地仓库名称或编码 */ - @NotBlank(message = "目的地仓库名称或编码不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotBlank(message = "目的地仓库名称或编码不能为空", groups = { AddGroup.class, EditGroup.class }) private String destination; /** * 总箱子数量(此订单包含的箱子总数) */ - @NotNull(message = "总箱子数量(此订单包含的箱子总数)不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotNull(message = "总箱子数量(此订单包含的箱子总数)不能为空", groups = { AddGroup.class, EditGroup.class }) private Long boxQuantity; /** * 总货件数量(商品件数总和) */ - @NotNull(message = "总货件数量(商品件数总和)不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotNull(message = "总货件数量(商品件数总和)不能为空", groups = { AddGroup.class, EditGroup.class }) private Long shipmentQuantity; /** @@ -88,4 +91,7 @@ public class BizLogisticsOrderBo extends BaseEntity { private String podUrl; + private String status; + + } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsOrderStatusBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsOrderStatusBo.java new file mode 100644 index 0000000..3215021 --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsOrderStatusBo.java @@ -0,0 +1,96 @@ +package org.asinkj.amz.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.asinkj.amz.domain.BizLogisticsOrder; +import org.asinkj.common.core.validate.AddGroup; +import org.asinkj.common.core.validate.EditGroup; +import org.asinkj.common.mybatis.core.domain.BaseEntity; + +import java.util.Date; + +/** + * 物流订单业务对象 biz_logistics_order + * + * @author shuo hu + * @date 2025-03-24 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BizLogisticsOrder.class, reverseConvertGenerate = false) +public class BizLogisticsOrderStatusBo extends BaseEntity { + + /** + * 主键(应用层生成的全局唯一ID,如雪花算法) + */ + @NotNull(message = "主键不能为空") + private Long id; + + /** + * FBA货件编号(亚马逊系统生成的唯一标识) + */ +// @NotBlank(message = "FBA货件编号(亚马逊系统生成的唯一标识)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fbaShipmentId; + + /** + * 订单编号(应用层生成的唯一业务流水号) + */ + private String orderId; + + /** + * 物流商ID(关联物流商信息表) + */ +// @NotNull(message = "物流商ID(关联物流商信息表)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long logisticsProviderId; + + /** + * 物流商名称(冗余存储,避免高频联表查询) + */ +// @NotBlank(message = "物流商名称(冗余存储,避免高频联表查询)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String logisticsProviderName; + + /** + * 物流渠道 + */ +// @NotBlank(message = "物流渠道(如空运/海运/快递等)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelName; + + /** + * 目的地仓库名称或编码 + */ +// @NotBlank(message = "目的地仓库名称或编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String destination; + + /** + * 总箱子数量(此订单包含的箱子总数) + */ +// @NotNull(message = "总箱子数量(此订单包含的箱子总数)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long boxQuantity; + + /** + * 总货件数量(商品件数总和) + */ +// @NotNull(message = "总货件数量(商品件数总和)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long shipmentQuantity; + + /** + * 亚马逊仓库实际上架日期 + */ + private Date amazonShelfDate; + + /** + * 上架时效(单位:天,从发货到上架的总天数) + */ + private Long shelfTimeliness; + + + private String podUrl; + + @NotNull(message = "状态不能为空") + private String status; + + +} diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsQuoteBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsQuoteBo.java index 0b8138a..30040bc 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsQuoteBo.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsQuoteBo.java @@ -62,6 +62,9 @@ public class BizLogisticsQuoteBo extends BaseEntity { @NotNull(message = "时效(单位:天)不能为空", groups = { AddGroup.class, EditGroup.class }) private Long leadTime; + private Long minLeadTime; + + /** * 附加费 */ diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsQuoteMostBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsQuoteMostBo.java index 05b317d..cd53f8a 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsQuoteMostBo.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsQuoteMostBo.java @@ -64,6 +64,9 @@ public class BizLogisticsQuoteMostBo extends BaseEntity { @NotNull(message = "时效(单位:天)不能为空", groups = { AddGroup.class, EditGroup.class }) private Long leadTime; + @NotNull(message = "时效(单位:天)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long minLeadTime; + /** * 附加费 */ @@ -120,4 +123,6 @@ public class BizLogisticsQuoteMostBo extends BaseEntity { private String unit; + private String backLogisticsType; + } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizPurchaseOrderBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizPurchaseOrderBo.java index e20a239..b755ae8 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizPurchaseOrderBo.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizPurchaseOrderBo.java @@ -1,5 +1,6 @@ package org.asinkj.amz.domain.bo; +import io.github.linpeilie.annotations.AutoMapping; import org.asinkj.amz.domain.BizPurchaseOrder; import org.asinkj.common.mybatis.core.domain.BaseEntity; import org.asinkj.common.core.validate.AddGroup; @@ -10,8 +11,10 @@ import lombok.EqualsAndHashCode; import jakarta.validation.constraints.*; import java.util.Date; +import java.util.List; import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; /** * 采购单主业务对象 biz_purchase_order @@ -24,10 +27,12 @@ import com.fasterxml.jackson.annotation.JsonFormat; @AutoMapper(target = BizPurchaseOrder.class, reverseConvertGenerate = false) public class BizPurchaseOrderBo extends BaseEntity { + @NotNull(message = "采购单号ID不能为空") + private Long id; + /** * 采购单号 */ - @NotBlank(message = "采购单号不能为空", groups = {AddGroup.class, EditGroup.class}) private String orderSn; /** @@ -315,7 +320,8 @@ public class BizPurchaseOrderBo extends BaseEntity { /** * 交货时间 */ - @NotNull(message = "交货时间不能为空", groups = {AddGroup.class, EditGroup.class}) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date deliveryTime; /** @@ -324,5 +330,15 @@ public class BizPurchaseOrderBo extends BaseEntity { // @NotNull(message = "订单交付变动天数不能为空", groups = { AddGroup.class, EditGroup.class }) private Long dlvTimeVar; + private String storeName; + + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date divTime; + + + private String sku; + } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizPurchaseOrderItemBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizPurchaseOrderItemBo.java index 64d0cce..30e7f46 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizPurchaseOrderItemBo.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizPurchaseOrderItemBo.java @@ -8,7 +8,9 @@ import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import lombok.EqualsAndHashCode; import jakarta.validation.constraints.*; + import java.util.Date; + import com.fasterxml.jackson.annotation.JsonFormat; /** @@ -25,176 +27,180 @@ public class BizPurchaseOrderItemBo extends BaseEntity { /** * 采购单子项ID */ - @NotNull(message = "采购单子项ID不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotNull(message = "采购单子项ID不能为空", groups = {AddGroup.class, EditGroup.class}) private Long id; /** * 关联采购单号 */ - @NotBlank(message = "关联采购单号不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotBlank(message = "关联采购单号不能为空", groups = {AddGroup.class, EditGroup.class}) private String orderSn; /** * 仓库ID */ - @NotNull(message = "仓库ID不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotNull(message = "仓库ID不能为空", groups = {AddGroup.class, EditGroup.class}) private Long wid; /** * 仓库名称 */ - @NotBlank(message = "仓库名称不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotBlank(message = "仓库名称不能为空", groups = {AddGroup.class, EditGroup.class}) private String wareHouseName; /** * 采购计划号 */ - @NotBlank(message = "采购计划号不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotBlank(message = "采购计划号不能为空", groups = {AddGroup.class, EditGroup.class}) private String planSn; /** * 本地产品ID */ - @NotNull(message = "本地产品ID不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotNull(message = "本地产品ID不能为空", groups = {AddGroup.class, EditGroup.class}) private Long productId; /** * 品名 */ - @NotBlank(message = "品名不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotBlank(message = "品名不能为空", groups = {AddGroup.class, EditGroup.class}) private String productName; /** * SKU */ - @NotBlank(message = "SKU不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotBlank(message = "SKU不能为空", groups = {AddGroup.class, EditGroup.class}) private String sku; /** * FNSKU */ - @NotBlank(message = "FNSKU不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotBlank(message = "FNSKU不能为空", groups = {AddGroup.class, EditGroup.class}) private String fnsku; /** * 店铺ID */ - @NotBlank(message = "店铺ID不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotBlank(message = "店铺ID不能为空", groups = {AddGroup.class, EditGroup.class}) private String sid; /** * 型号 */ - @NotBlank(message = "型号不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotBlank(message = "型号不能为空", groups = {AddGroup.class, EditGroup.class}) private String model; /** * 含税单价 */ - @NotNull(message = "含税单价不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotNull(message = "含税单价不能为空", groups = {AddGroup.class, EditGroup.class}) private Long price; /** * 价税合计 */ - @NotNull(message = "价税合计不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotNull(message = "价税合计不能为空", groups = {AddGroup.class, EditGroup.class}) private Long amount; /** * 计划采购量 */ - @NotNull(message = "计划采购量不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotNull(message = "计划采购量不能为空", groups = {AddGroup.class, EditGroup.class}) private Long quantityPlan; /** * 实际采购量 */ - @NotNull(message = "实际采购量不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotNull(message = "实际采购量不能为空", groups = {AddGroup.class, EditGroup.class}) private Long quantityReal; /** * 到货入库量 */ - @NotNull(message = "到货入库量不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotNull(message = "到货入库量不能为空", groups = {AddGroup.class, EditGroup.class}) private Long quantityEntry; /** * 待到货量 */ - @NotNull(message = "待到货量不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotNull(message = "待到货量不能为空", groups = {AddGroup.class, EditGroup.class}) private Long quantityReceive; /** * 退货数 */ - @NotNull(message = "退货数不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotNull(message = "退货数不能为空", groups = {AddGroup.class, EditGroup.class}) private Long quantityReturn; /** * 换货量 */ - @NotNull(message = "换货量不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotNull(message = "换货量不能为空", groups = {AddGroup.class, EditGroup.class}) private Long quantityExchange; /** * 质检量 */ - @NotNull(message = "质检量不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotNull(message = "质检量不能为空", groups = {AddGroup.class, EditGroup.class}) private Long quantityQc; /** * 待质检量 */ - @NotNull(message = "待质检量不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotNull(message = "待质检量不能为空", groups = {AddGroup.class, EditGroup.class}) private Long quantityQcPrepare; /** * 期待到货时间 */ - @NotNull(message = "期待到货时间不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotNull(message = "期待到货时间不能为空", groups = {AddGroup.class, EditGroup.class}) private Date expectArriveTime; /** * 备注 */ - @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotBlank(message = "备注不能为空", groups = {AddGroup.class, EditGroup.class}) private String remark; /** * 箱数 */ - @NotNull(message = "箱数不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotNull(message = "箱数不能为空", groups = {AddGroup.class, EditGroup.class}) private Long casesNum; /** * 单箱数量 */ - @NotNull(message = "单箱数量不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotNull(message = "单箱数量不能为空", groups = {AddGroup.class, EditGroup.class}) private Long quantityPerCase; /** * 是否删除:0 否,1 是 */ - @NotNull(message = "是否删除:0 否,1 是不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotNull(message = "是否删除:0 否,1 是不能为空", groups = {AddGroup.class, EditGroup.class}) private Long isDelete; /** * 税率 */ - @NotBlank(message = "税率不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotBlank(message = "税率不能为空", groups = {AddGroup.class, EditGroup.class}) private String taxRate; /** * SPU */ - @NotBlank(message = "SPU不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotBlank(message = "SPU不能为空", groups = {AddGroup.class, EditGroup.class}) private String spu; /** * 款名 */ - @NotBlank(message = "款名不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotBlank(message = "款名不能为空", groups = {AddGroup.class, EditGroup.class}) private String spuName; + private Long sfgAvlQty; + + private String orderStatus; + } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizSendOrderBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizSendOrderBo.java index ec7bcb2..611e38d 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizSendOrderBo.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizSendOrderBo.java @@ -35,10 +35,14 @@ public class BizSendOrderBo extends BaseEntity { @NotBlank(message = "采购单号不能为空", groups = {AddGroup.class, EditGroup.class}) private String orderSn; + + private Long orderDetailId; + + /** * 发货日期 */ - @NotNull(message = "发货日期不能为空", groups = {AddGroup.class, EditGroup.class}) +// @NotNull(message = "发货日期不能为空", groups = {AddGroup.class, EditGroup.class}) private Date sendDate; /** @@ -56,13 +60,13 @@ public class BizSendOrderBo extends BaseEntity { /** * 发货数量 */ - @NotNull(message = "发货数量不能为空", groups = {AddGroup.class, EditGroup.class}) +// @NotNull(message = "发货数量不能为空", groups = {AddGroup.class, EditGroup.class}) private Long quantitySend; /** * 单箱产品数量 */ - @NotNull(message = "单箱产品数量不能为空", groups = {AddGroup.class, EditGroup.class}) +// @NotNull(message = "单箱产品数量不能为空", groups = {AddGroup.class, EditGroup.class}) private Long quantityPerBox; /** @@ -96,4 +100,18 @@ public class BizSendOrderBo extends BaseEntity { private String sendStatus; + private String sendDetail; + + + private Long sendId; + + private String sendName; + + private String logisticsProviderName; + + private Long logisticsProviderId; + + private String shipmentId; + + } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizShipForwardBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizShipForwardBo.java index 6787308..66ac664 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizShipForwardBo.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizShipForwardBo.java @@ -8,7 +8,9 @@ import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import lombok.EqualsAndHashCode; import jakarta.validation.constraints.*; + import java.util.Date; + import com.fasterxml.jackson.annotation.JsonFormat; import org.springframework.format.annotation.DateTimeFormat; @@ -32,13 +34,13 @@ public class BizShipForwardBo extends BaseEntity { /** * 采购单号 */ - @NotBlank(message = "采购单号不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotBlank(message = "采购单号不能为空", groups = {AddGroup.class, EditGroup.class}) private String orderSn; /** * 采购店铺名称 */ - @NotBlank(message = "采购店铺名称不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotBlank(message = "采购店铺名称不能为空", groups = {AddGroup.class, EditGroup.class}) private String storeName; /** @@ -56,37 +58,37 @@ public class BizShipForwardBo extends BaseEntity { /** * 实际发货数量 */ - @NotNull(message = "实际发货数量不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotNull(message = "实际发货数量不能为空", groups = {AddGroup.class, EditGroup.class}) private Long quantitySend; /** * 发货供应商名称 */ - @NotBlank(message = "发货供应商名称不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotBlank(message = "发货供应商名称不能为空", groups = {AddGroup.class, EditGroup.class}) private String outSupplierName; /** * 发货供应商系统ID */ - @NotNull(message = "发货供应商系统ID不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotNull(message = "发货供应商系统ID不能为空", groups = {AddGroup.class, EditGroup.class}) private Long outSupplierId; /** * 收货供应商名称 */ - @NotBlank(message = "收货供应商名称不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotBlank(message = "收货供应商名称不能为空", groups = {AddGroup.class, EditGroup.class}) private String inSupplierName; /** * 收货供应商系统ID */ - @NotNull(message = "收货供应商系统ID不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotNull(message = "收货供应商系统ID不能为空", groups = {AddGroup.class, EditGroup.class}) private Long inSupplierId; /** * 计划发货起始时间 */ - @NotNull(message = "计划发货起始时间不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotNull(message = "计划发货起始时间不能为空", groups = { AddGroup.class, EditGroup.class }) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date shipmentStart; @@ -94,7 +96,7 @@ public class BizShipForwardBo extends BaseEntity { /** * 计划发货截止时间 */ - @NotNull(message = "计划发货截止时间不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotNull(message = "计划发货截止时间不能为空", groups = { AddGroup.class, EditGroup.class }) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date shipmentEnd; @@ -121,13 +123,15 @@ public class BizShipForwardBo extends BaseEntity { * 发货时间 */ // @NotNull(message = "发货时间不能为空", groups = { AddGroup.class, EditGroup.class }) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date sendTime; /** * 采购单子项ID */ - @NotNull(message = "采购单子项ID不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotNull(message = "采购单子项ID不能为空", groups = {AddGroup.class, EditGroup.class}) private Long orderDetailId; @@ -135,4 +139,15 @@ public class BizShipForwardBo extends BaseEntity { private String type; + /** + * 预计到达时间 + */ + private Date expDeliveryDate; + + /** + * 箱数 + */ + private Long boxNum; + + } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizShipmentPlanBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizShipmentPlanBo.java index fcc5273..95a2728 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizShipmentPlanBo.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizShipmentPlanBo.java @@ -12,7 +12,9 @@ import lombok.EqualsAndHashCode; import jakarta.validation.constraints.*; import java.math.BigDecimal; +import java.util.Collection; import java.util.Date; +import java.util.List; import com.fasterxml.jackson.annotation.JsonFormat; import org.springframework.format.annotation.DateTimeFormat; @@ -199,4 +201,6 @@ public class BizShipmentPlanBo extends BaseEntity { private String sellerName; + private Collection sidList; + } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/SysStatusHistoryBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/SysStatusHistoryBo.java new file mode 100644 index 0000000..59d7dcb --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/SysStatusHistoryBo.java @@ -0,0 +1,68 @@ +package org.asinkj.amz.domain.bo; + +import org.asinkj.amz.domain.SysStatusHistory; +import org.asinkj.common.mybatis.core.domain.BaseEntity; +import org.asinkj.common.core.validate.AddGroup; +import org.asinkj.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 状态历史业务对象 sys_status_history + * + * @author shuo hu + * @date 2025-06-09 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysStatusHistory.class, reverseConvertGenerate = false) +public class SysStatusHistoryBo extends BaseEntity { + + /** + * $column.columnComment + */ + @NotNull(message = "$column.columnComment不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long historyId; + + /** + * $column.columnComment + */ + @NotBlank(message = "$column.columnComment不能为空", groups = { AddGroup.class, EditGroup.class }) + private String tableName; + + /** + * $column.columnComment + */ + @NotNull(message = "$column.columnComment不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long recordId; + + /** + * $column.columnComment + */ + @NotBlank(message = "$column.columnComment不能为空", groups = { AddGroup.class, EditGroup.class }) + private String statusColumn; + + /** + * $column.columnComment + */ + @NotBlank(message = "$column.columnComment不能为空", groups = { AddGroup.class, EditGroup.class }) + private String oldStatus; + + /** + * $column.columnComment + */ + @NotBlank(message = "$column.columnComment不能为空", groups = { AddGroup.class, EditGroup.class }) + private String newStatus; + + /** + * $column.columnComment + */ + @NotNull(message = "$column.columnComment不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date originalChangedAt; + + +} diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsOrderVo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsOrderVo.java index 0cffb54..04341e5 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsOrderVo.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsOrderVo.java @@ -110,5 +110,8 @@ public class BizLogisticsOrderVo implements Serializable { @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; + private String status; + + } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsQuoteVo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsQuoteVo.java index 6056465..a7b0daa 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsQuoteVo.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsQuoteVo.java @@ -74,6 +74,9 @@ public class BizLogisticsQuoteVo implements Serializable { @ExcelDictFormat(readConverterExp = "单=位:天") private Long leadTime; + private Long minLeadTime; + + /** * 附加费 */ diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizPurchaseOrderItemVo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizPurchaseOrderItemVo.java index 1cb4317..0ea64a5 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizPurchaseOrderItemVo.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizPurchaseOrderItemVo.java @@ -205,4 +205,11 @@ public class BizPurchaseOrderItemVo implements Serializable { private String spuName; + @ExcelProperty(value = "半成品可发货数量") + private Long sfgAvlQty; + + @ExcelProperty(value = "订单状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "vendor_order_status") + private String orderStatus; + } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizPurchaseOrderVo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizPurchaseOrderVo.java index a58dff2..e63876e 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizPurchaseOrderVo.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizPurchaseOrderVo.java @@ -1,5 +1,6 @@ package org.asinkj.amz.domain.vo; +import java.math.BigDecimal; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; import org.asinkj.amz.domain.BizPurchaseOrder; @@ -7,10 +8,12 @@ import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; import org.asinkj.amz.domain.BizPurchaseOrderItem; import org.asinkj.amz.domain.BizShipForward; +import org.asinkj.amz.domain.SysStatusHistory; import org.asinkj.common.excel.annotation.ExcelDictFormat; import org.asinkj.common.excel.convert.ExcelDictConvert; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; import java.io.Serial; import java.io.Serializable; @@ -35,6 +38,8 @@ public class BizPurchaseOrderVo implements Serializable { /** * 采购单号 */ + + private Long id; @ExcelProperty(value = "采购单号") private String orderSn; @@ -337,6 +342,13 @@ public class BizPurchaseOrderVo implements Serializable { @ExcelProperty(value = "订单交付变动天数") private Long dlvTimeVar; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date divTime; + + + private BigDecimal remainingQuantity; + @@ -345,4 +357,6 @@ public class BizPurchaseOrderVo implements Serializable { private List forwardList; + + } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizSendOrderVo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizSendOrderVo.java index ea2d2d4..5352f43 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizSendOrderVo.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizSendOrderVo.java @@ -1,7 +1,8 @@ package org.asinkj.amz.domain.vo; import java.util.Date; -import com.fasterxml.jackson.annotation.JsonFormat; + +import org.asinkj.amz.domain.BizLogisticsOrder; import org.asinkj.amz.domain.BizSendOrder; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; @@ -12,8 +13,6 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; -import java.util.Date; - /** @@ -42,12 +41,18 @@ public class BizSendOrderVo implements Serializable { @ExcelProperty(value = "采购单号") private String orderSn; + private Long orderDetailId; + + /** * 发货日期 */ @ExcelProperty(value = "发货日期") private Date sendDate; + @ExcelProperty(value = "创建时间") + private Date createTime; + /** * 采购店铺 */ @@ -104,4 +109,22 @@ public class BizSendOrderVo implements Serializable { private String sendStatus; + private String sendDetail; + + private Long sendId; + + private String sendName; + + + private String logisticsProviderName; + + private Long logisticsProviderId; + + private String address; + + private String shipmentId; + + private BizLogisticsOrder bizLogisticsOrder; + + } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizShipForwardVo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizShipForwardVo.java index 471a4fd..f45408b 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizShipForwardVo.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizShipForwardVo.java @@ -135,4 +135,16 @@ public class BizShipForwardVo implements Serializable { private Long orderDetailId; + + /** + * 预计到达时间 + */ + private Date expDeliveryDate; + + /** + * 箱数 + */ + private Long boxNum; + + } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/InquiryRequestItemVo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/InquiryRequestItemVo.java index 831fcd6..705046c 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/InquiryRequestItemVo.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/InquiryRequestItemVo.java @@ -45,6 +45,9 @@ public class InquiryRequestItemVo implements Serializable { @ExcelProperty(value = "渠道ID") private Long channelId; + + private String customsFlag; + /** * 报价目标日期 */ diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/SysStatusHistoryVo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/SysStatusHistoryVo.java new file mode 100644 index 0000000..6d17cb5 --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/SysStatusHistoryVo.java @@ -0,0 +1,83 @@ +package org.asinkj.amz.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.asinkj.amz.domain.SysStatusHistory; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.asinkj.common.excel.annotation.ExcelDictFormat; +import org.asinkj.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 状态历史视图对象 sys_status_history + * + * @author shuo hu + * @date 2025-06-09 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysStatusHistory.class) +public class SysStatusHistoryVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * $column.columnComment + */ + @ExcelProperty(value = "${comment}", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "$column.readConverterExp()") + private Long historyId; + + /** + * $column.columnComment + */ + @ExcelProperty(value = "${comment}", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "$column.readConverterExp()") + private String tableName; + + /** + * $column.columnComment + */ + @ExcelProperty(value = "${comment}", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "$column.readConverterExp()") + private Long recordId; + + /** + * $column.columnComment + */ + @ExcelProperty(value = "${comment}", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "$column.readConverterExp()") + private String statusColumn; + + /** + * $column.columnComment + */ + @ExcelProperty(value = "${comment}", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "$column.readConverterExp()") + private String oldStatus; + + /** + * $column.columnComment + */ + @ExcelProperty(value = "${comment}", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "$column.readConverterExp()") + private String newStatus; + + /** + * $column.columnComment + */ + @ExcelProperty(value = "${comment}", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "$column.readConverterExp()") + private Date originalChangedAt; + + +} diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizLogisticsOrderQuotationMapper.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizLogisticsOrderQuotationMapper.java index 358ad3e..8ea8569 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizLogisticsOrderQuotationMapper.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizLogisticsOrderQuotationMapper.java @@ -3,6 +3,7 @@ package org.asinkj.amz.mapper; import org.asinkj.amz.domain.BizLogisticsOrderQuotation; import org.asinkj.amz.domain.vo.BizLogisticsOrderQuotationVo; import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus; +import org.springframework.stereotype.Component; /** * 物流订单确认Mapper接口 @@ -10,6 +11,7 @@ import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus; * @author shuo hu * @date 2025-04-21 */ +@Component public interface BizLogisticsOrderQuotationMapper extends BaseMapperPlus { } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizLogisticsQuoteMapper.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizLogisticsQuoteMapper.java index 7e8d179..7e0ab7b 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizLogisticsQuoteMapper.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizLogisticsQuoteMapper.java @@ -6,6 +6,7 @@ import org.asinkj.amz.domain.BizLogisticsQuote; import org.asinkj.amz.domain.vo.BizLogisticsQuoteVo; import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus; import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.stereotype.Component; import java.time.LocalDate; import java.util.Date; @@ -18,6 +19,7 @@ import java.util.Map; * @author shuo hu * @date 2025-03-20 */ +@Component public interface BizLogisticsQuoteMapper extends BaseMapperPlus { List selectQuotesByProvidersAndDate( @@ -29,10 +31,10 @@ public interface BizLogisticsQuoteMapper extends BaseMapperPlus> selectDynamicReport(@Param("channels") List channels); - List> getQuoteReport( @Param("columns") List channels, - @Param("startDate") @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate, - @Param("endDate") @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate, - @Param("destination") @Size(max = 10) String destination); + List> getQuoteReport(@Param("columns") List channels, + @Param("startDate") @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate, + @Param("endDate") @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate, + @Param("destination") @Size(max = 10) String destination); List> getQuoteAvgDayReport(@Param("columns") List channels); diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizPurchaseOrderMapper.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizPurchaseOrderMapper.java index 2ceacbb..93ea8b3 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizPurchaseOrderMapper.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizPurchaseOrderMapper.java @@ -3,6 +3,7 @@ package org.asinkj.amz.mapper; import org.asinkj.amz.domain.BizPurchaseOrder; import org.asinkj.amz.domain.vo.BizPurchaseOrderVo; import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus; +import org.springframework.stereotype.Component; /** * 采购单主Mapper接口 @@ -10,6 +11,7 @@ import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus; * @author shuo hu * @date 2025-05-10 */ +@Component public interface BizPurchaseOrderMapper extends BaseMapperPlus { } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/SysStatusHistoryMapper.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/SysStatusHistoryMapper.java new file mode 100644 index 0000000..e77d28d --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/SysStatusHistoryMapper.java @@ -0,0 +1,15 @@ +package org.asinkj.amz.mapper; + +import org.asinkj.amz.domain.SysStatusHistory; +import org.asinkj.amz.domain.vo.SysStatusHistoryVo; +import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 状态历史Mapper接口 + * + * @author shuo hu + * @date 2025-06-09 + */ +public interface SysStatusHistoryMapper extends BaseMapperPlus { + +} diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizPurchaseOrderService.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizPurchaseOrderService.java index fa85649..f34f4c2 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizPurchaseOrderService.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizPurchaseOrderService.java @@ -20,10 +20,10 @@ public interface IBizPurchaseOrderService { /** * 查询采购单主 * - * @param orderSn 主键 + * @param id 主键 * @return 采购单主 */ - BizPurchaseOrderVo queryById(String orderSn); + BizPurchaseOrderVo queryById(Long id); /** * 分页查询采购单主列表 @@ -66,4 +66,6 @@ public interface IBizPurchaseOrderService { * @return 是否删除成功 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + Boolean confirmByBo(BizPurchaseOrderBo bo); } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizSendOrderService.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizSendOrderService.java index 00f9973..b067e4d 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizSendOrderService.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizSendOrderService.java @@ -72,5 +72,5 @@ public interface IBizSendOrderService { void linkByBo(BizSendOrderBo bo); - void updateStatus(Long sendOrderId, String completed); + void updateStatus(Long sendOrderId, String completed,String shipmentId); } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/ISysStatusHistoryService.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/ISysStatusHistoryService.java new file mode 100644 index 0000000..86ea158 --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/ISysStatusHistoryService.java @@ -0,0 +1,69 @@ +package org.asinkj.amz.service; + +import org.asinkj.amz.domain.SysStatusHistory; +import org.asinkj.amz.domain.vo.SysStatusHistoryVo; +import org.asinkj.amz.domain.bo.SysStatusHistoryBo; +import org.asinkj.common.mybatis.core.page.TableDataInfo; +import org.asinkj.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 状态历史Service接口 + * + * @author shuo hu + * @date 2025-06-09 + */ +public interface ISysStatusHistoryService { + + /** + * 查询状态历史 + * + * @param historyId 主键 + * @return 状态历史 + */ + SysStatusHistoryVo queryById(Long historyId); + + /** + * 分页查询状态历史列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 状态历史分页列表 + */ + TableDataInfo queryPageList(SysStatusHistoryBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的状态历史列表 + * + * @param bo 查询条件 + * @return 状态历史列表 + */ + List queryList(SysStatusHistoryBo bo); + + /** + * 新增状态历史 + * + * @param bo 状态历史 + * @return 是否新增成功 + */ + Boolean insertByBo(SysStatusHistoryBo bo); + + /** + * 修改状态历史 + * + * @param bo 状态历史 + * @return 是否修改成功 + */ + Boolean updateByBo(SysStatusHistoryBo bo); + + /** + * 校验并批量删除状态历史信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizInquiryRequestServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizInquiryRequestServiceImpl.java index b8d8a0b..617364e 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizInquiryRequestServiceImpl.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizInquiryRequestServiceImpl.java @@ -367,6 +367,7 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService { BizInquiryRequest bizInquiryRequest = new BizInquiryRequest(); bizInquiryRequest.setDestination(request.getDestination()); bizInquiryRequest.setChannelId(request.getChannelId()); + bizInquiryRequest.setCustomsFlag(request.getCustomsFlag()); bizInquiryRequest.setRequesterName(LoginHelper.getLoginUser().getNickname()); bizInquiryRequest.setInquiryNo(SerialNoGenerator.generateInquiryNo()); diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsOrderQuotationServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsOrderQuotationServiceImpl.java index 5a717c7..312e3e7 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsOrderQuotationServiceImpl.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsOrderQuotationServiceImpl.java @@ -17,6 +17,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; +import org.asinkj.common.satoken.utils.LoginHelper; import org.asinkj.system.api.RemoteUserService; import org.asinkj.utils.SerialNoGenerator; import org.springframework.stereotype.Service; @@ -27,10 +28,7 @@ import org.asinkj.amz.mapper.BizLogisticsOrderQuotationMapper; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Collection; +import java.util.*; /** * 物流订单确认Service业务层处理 @@ -118,6 +116,10 @@ public class BizLogisticsOrderQuotationServiceImpl implements IBizLogisticsOrder lqw.eq(bo.getBoxQuantity() != null, BizLogisticsOrderQuotation::getBoxQuantity, bo.getBoxQuantity()); lqw.eq(bo.getShipmentQuantity() != null, BizLogisticsOrderQuotation::getShipmentQuantity, bo.getShipmentQuantity()); lqw.eq(bo.getQuoteOrderId() != null, BizLogisticsOrderQuotation::getQuoteOrderId, bo.getQuoteOrderId()); + if (!LoginHelper.isSuperAdmin() && !LoginHelper.isManagerAdmin()) { + lqw.eq( BizLogisticsOrderQuotation::getLogisticsProviderId, LoginHelper.getUserId()); + + } return lqw; } @@ -240,6 +242,8 @@ public class BizLogisticsOrderQuotationServiceImpl implements IBizLogisticsOrder detail.setLogisticsProviderName(nickName); detail.setChannelName(quoteVo.getChannelName()); detail.setDestination(quoteVo.getDestination()); + detail.setTimeliness(quoteVo.getLeadTime()); + detail.setEstimatedDeliveryDate(DateUtil.offsetDay(new Date(), Math.toIntExact(quoteVo.getLeadTime()))); detail.setPricePerKg(quoteVo.getPrice()); detail.setPlannedQuantity(bizShipmentTracking.getTotal()); detail.setCarrierConfirmTime(DateUtil.date()); diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsQuoteServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsQuoteServiceImpl.java index 613ce6b..246072a 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsQuoteServiceImpl.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsQuoteServiceImpl.java @@ -251,6 +251,8 @@ public class BizLogisticsQuoteServiceImpl implements IBizLogisticsQuoteService { bizLogisticsQuote.setLogisticsName(LoginHelper.getLoginUser().getNickname()); bizLogisticsQuote.setChannelName(bo.getChannelName()); bizLogisticsQuote.setPrice(bo.getPrice()); + bizLogisticsQuote.setMinLeadTime(bo.getMinLeadTime()); + bizLogisticsQuote.setBackLogisticsType(bo.getBackLogisticsType()); bizLogisticsQuote.setLeadTime(bo.getLeadTime()); bizLogisticsQuote.setSurcharge(bo.getSurcharge()); bizLogisticsQuote.setQuoteDate(dateTime.toJdkDate()); @@ -284,7 +286,7 @@ public class BizLogisticsQuoteServiceImpl implements IBizLogisticsQuoteService { .reduce(BigDecimal.ZERO, BigDecimal::add) .divide(new BigDecimal(bizLogisticsQuotes.size()), 2, RoundingMode.HALF_UP); - if (average.compareTo(bo.getPrice()) > 0) { + if (average.compareTo(bo.getPrice()) < 0) { return Boolean.FALSE; } return Boolean.TRUE; @@ -294,6 +296,7 @@ public class BizLogisticsQuoteServiceImpl implements IBizLogisticsQuoteService { @Override public List getTodayQuoteStatus() { LocalDate today = LocalDate.now(); + List inquiries = bizInquiryRequestMapper.selectOpenAndEffectiveInquiries(today); Map> inquiryProvidersMap = new HashMap<>(); @@ -308,10 +311,9 @@ public class BizLogisticsQuoteServiceImpl implements IBizLogisticsQuoteService { new ArrayList<>(allProviderIds), today ); - Map, BizLogisticsQuote> quoteMap = quotes.stream() - .collect(Collectors.toMap( - quote -> Pair.of(quote.getInquiryId(), quote.getChannelId()), - Function.identity() + Map, List> quoteMap = quotes.stream() + .collect(Collectors.groupingBy( + quote -> Pair.of(quote.getInquiryId(), quote.getChannelId()) )); List result = new ArrayList<>(); diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizPurchaseOrderServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizPurchaseOrderServiceImpl.java index 04fa42b..edd0d01 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizPurchaseOrderServiceImpl.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizPurchaseOrderServiceImpl.java @@ -2,10 +2,11 @@ package org.asinkj.amz.service.impl; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.collection.CollectionUtil; -import org.asinkj.amz.domain.BizPurchaseOrderItem; -import org.asinkj.amz.domain.BizShipForward; -import org.asinkj.amz.mapper.BizPurchaseOrderItemMapper; -import org.asinkj.amz.mapper.BizShipForwardMapper; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.asinkj.amz.domain.*; +import org.asinkj.amz.mapper.*; import org.asinkj.amz.service.IBizPurchaseOrderItemService; import org.asinkj.common.core.utils.MapstructUtils; import org.asinkj.common.core.utils.StringUtils; @@ -19,11 +20,10 @@ import org.asinkj.common.satoken.utils.LoginHelper; import org.springframework.stereotype.Service; import org.asinkj.amz.domain.bo.BizPurchaseOrderBo; import org.asinkj.amz.domain.vo.BizPurchaseOrderVo; -import org.asinkj.amz.domain.BizPurchaseOrder; -import org.asinkj.amz.mapper.BizPurchaseOrderMapper; import org.asinkj.amz.service.IBizPurchaseOrderService; import javax.annotation.Resource; +import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; @@ -44,17 +44,29 @@ public class BizPurchaseOrderServiceImpl implements IBizPurchaseOrderService { @Resource private BizShipForwardMapper bizForwardMapper; - ; + + + @Resource + private BizSendOrderMapper bizSendOrderMapper; + + + @Resource + private SysStatusHistoryMapper sysStatusHistoryMapper; + + + @Resource + private BizPurchaseOrderItemMapper bizPurchaseOrderItemMapper; + /** * 查询采购单主 * - * @param orderSn 主键 + * @param id 主键 * @return 采购单主 */ @Override - public BizPurchaseOrderVo queryById(String orderSn) { - return baseMapper.selectVoById(orderSn); + public BizPurchaseOrderVo queryById(Long id) { + return baseMapper.selectVoById(id); } /** @@ -70,26 +82,75 @@ public class BizPurchaseOrderServiceImpl implements IBizPurchaseOrderService { Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); List records = result.getRecords(); Set orderSnSet = records.stream().map(BizPurchaseOrderVo::getOrderSn).collect(Collectors.toSet()); + Set orderIds = records.stream().map(BizPurchaseOrderVo::getId).collect(Collectors.toSet()); LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.in(CollectionUtil.isNotEmpty(orderSnSet), BizPurchaseOrderItem::getOrderSn, orderSnSet); Map> itemMaps = purchaseOrderItemMapper.selectList(lambdaQueryWrapper).stream().collect(Collectors.groupingBy(BizPurchaseOrderItem::getOrderSn)); + HashSet itemIds = new HashSet<>(); + itemMaps.values().forEach(itemList -> { + itemList.forEach(item -> { + itemIds.add(item.getId()); + }); + }); LambdaQueryWrapper bizShipForwardWrapper = new LambdaQueryWrapper<>(); bizShipForwardWrapper.in(CollectionUtil.isNotEmpty(orderSnSet), BizShipForward::getOrderSn, orderSnSet); - Map> bizShipForwardMap = bizForwardMapper.selectList(bizShipForwardWrapper).stream().collect(Collectors.groupingBy(BizShipForward::getOrderSn)); + List bizShipForwards1 = bizForwardMapper.selectList(bizShipForwardWrapper); + Map> bizShipForwardMap = new HashMap<>(); + Map> bizShipForwardItemMap = new HashMap<>(); + if (CollectionUtil.isNotEmpty(bizShipForwards1)) { + bizShipForwardMap = bizShipForwards1.stream().collect(Collectors.groupingBy(BizShipForward::getOrderSn)); + bizShipForwardItemMap = bizShipForwards1.stream().collect(Collectors.groupingBy(BizShipForward::getOrderDetailId)); + } + LambdaQueryWrapper bizSendOrderWrapper = new LambdaQueryWrapper<>(); + bizSendOrderWrapper.in(CollectionUtil.isNotEmpty(orderSnSet), BizSendOrder::getOrderSn, orderSnSet); + List bizSendOrders1 = bizSendOrderMapper.selectList(bizSendOrderWrapper); + Map> BizSendOrderMap = new HashMap<>(); + Map> BizSendOrderItemMap = new HashMap<>(); + if (CollectionUtil.isNotEmpty(bizSendOrders1)) { + BizSendOrderMap = bizSendOrders1.stream().collect(Collectors.groupingBy(BizSendOrder::getOrderSn)); + BizSendOrderItemMap = bizSendOrders1.stream().filter(c -> ObjectUtil.isNotNull(c.getOrderDetailId())).collect(Collectors.groupingBy(BizSendOrder::getOrderDetailId)); + } + LambdaQueryWrapper historyLambdaQueryWrapper = new LambdaQueryWrapper<>(); + historyLambdaQueryWrapper.in(CollectionUtil.isNotEmpty(itemIds), SysStatusHistory::getRecordId, itemIds); + Map> sysStatusHistoryMap = sysStatusHistoryMapper.selectList(historyLambdaQueryWrapper).stream().collect(Collectors.groupingBy(SysStatusHistory::getRecordId)); for (BizPurchaseOrderVo record : records) { List bizPurchaseOrderItems = itemMaps.get(record.getOrderSn()); if (CollectionUtil.isNotEmpty(bizPurchaseOrderItems)) { + Map> finalBizSendOrderItemMap = BizSendOrderItemMap; + Map> finalBizShipForwardItemMap = bizShipForwardItemMap; + bizPurchaseOrderItems.forEach(item -> { + item.setSysStatusHistories(sysStatusHistoryMap.get(item.getId())); + List bizShipForwards = finalBizShipForwardItemMap.get(item.getId()); + List bizSendOrders = finalBizSendOrderItemMap.get(item.getId()); + if (CollectionUtil.isNotEmpty(bizShipForwards)) { + item.setHasForward("Y"); + } + if (CollectionUtil.isNotEmpty(bizSendOrders)) { + item.setHasSendOrder("Y"); + } + }); record.setItems(bizPurchaseOrderItems); } List bizShipForwards = bizShipForwardMap.get(record.getOrderSn()); if (CollectionUtil.isNotEmpty(bizShipForwards)) { record.setForwardList(bizShipForwards); } + BigDecimal bizShipForwardDecimal = BigDecimal.ZERO; + if (CollectionUtil.isNotEmpty(bizShipForwards)) { + bizShipForwardDecimal = bizShipForwards.stream().map(bizShipForward -> new BigDecimal(bizShipForward.getQuantitySend())).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); + } + List bizSendOrders = BizSendOrderMap.get(record.getOrderSn()); + BigDecimal sendOrderDecimal = BigDecimal.ZERO; + if (CollectionUtil.isNotEmpty(bizSendOrders)) { + sendOrderDecimal = bizSendOrders.stream().map(bizSendOrder -> new BigDecimal(bizSendOrder.getQuantitySend())).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); + } + + record.setRemainingQuantity(new BigDecimal(record.getQuantityReal()).subtract(bizShipForwardDecimal).subtract(sendOrderDecimal)); } return TableDataInfo.build(result); } @@ -155,15 +216,32 @@ public class BizPurchaseOrderServiceImpl implements IBizPurchaseOrderService { lqw.eq(StringUtils.isNotBlank(bo.getSettlementDescription()), BizPurchaseOrder::getSettlementDescription, bo.getSettlementDescription()); lqw.eq(bo.getPaymentMethod() != null, BizPurchaseOrder::getPaymentMethod, bo.getPaymentMethod()); lqw.eq(bo.getEstDlvDays() != null, BizPurchaseOrder::getEstDlvDays, bo.getEstDlvDays()); - lqw.eq(StringUtils.isNotBlank(bo.getOrderStatus()), BizPurchaseOrder::getOrderStatus, bo.getOrderStatus()); + lqw.in(StringUtils.isNotBlank(bo.getOrderStatus()), BizPurchaseOrder::getOrderStatus, StrUtil.split(bo.getOrderStatus(), ",")); lqw.eq(bo.getDeliveryTime() != null, BizPurchaseOrder::getDeliveryTime, bo.getDeliveryTime()); lqw.eq(bo.getDlvTimeVar() != null, BizPurchaseOrder::getDlvTimeVar, bo.getDlvTimeVar()); + lqw.like(StringUtils.isNotBlank(bo.getStoreName()), BizPurchaseOrder::getStoreName, bo.getStoreName()); + lqw.orderBy(true, false, BizPurchaseOrder::getOrderTime); +// lqw.last("ORDER BY CASE status WHEN 2 THEN 1 ELSE 3 END ASC , order_time DESC"); +// lqw.(true,true, "CASE status WHEN 2 THEN 1 WHEN 1 THEN 2 WHEN 3 THEN 3 ELSE 4 END"); + if (StpUtil.hasRole("gongying")) { lqw.eq(BizPurchaseOrder::getSupplierName, Objects.requireNonNull(LoginHelper.getLoginUser()).getNickname()); } + if (!LoginHelper.isSuperAdmin()) { + lqw.in(BizPurchaseOrder::getStatus, 2, 9); + } + if (StrUtil.isNotBlank(bo.getSku())) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(BizPurchaseOrderItem::getSku, StrUtil.split(bo.getSku(), ",")); + + List bizPurchaseOrderItems = purchaseOrderItemMapper.selectList(lambdaQueryWrapper); + List orderSnList = bizPurchaseOrderItems.stream().map(BizPurchaseOrderItem::getOrderSn).collect(Collectors.toList()); + lqw.in(BizPurchaseOrder::getOrderSn, orderSnList); + } + return lqw; } @@ -218,4 +296,15 @@ public class BizPurchaseOrderServiceImpl implements IBizPurchaseOrderService { } return baseMapper.deleteByIds(ids) > 0; } + + @Override + public Boolean confirmByBo(BizPurchaseOrderBo bo) { + BizPurchaseOrder update = MapstructUtils.convert(bo, BizPurchaseOrder.class); + validEntityBeforeSave(update); + LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + lambdaUpdateWrapper.in(BizPurchaseOrderItem::getOrderSn, update.getOrderSn()); + lambdaUpdateWrapper.set(BizPurchaseOrderItem::getOrderStatus, "ord_confirmed"); + purchaseOrderItemMapper.update(lambdaUpdateWrapper); + return baseMapper.updateById(update) > 0; + } } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizSendOrderServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizSendOrderServiceImpl.java index 0ecf53c..c2f5dc9 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizSendOrderServiceImpl.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizSendOrderServiceImpl.java @@ -1,8 +1,15 @@ package org.asinkj.amz.service.impl; +import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import org.asinkj.amz.domain.SysAmazonStore; +import org.apache.dubbo.config.annotation.DubboReference; +import org.asinkj.amz.domain.*; +import org.asinkj.amz.domain.bo.SysAmazonStoreBo; +import org.asinkj.amz.domain.vo.SysAmazonStoreVo; +import org.asinkj.amz.mapper.BizLogisticsOrderDetailMapper; +import org.asinkj.amz.mapper.BizLogisticsOrderMapper; +import org.asinkj.amz.service.ISysAmazonStoreService; import org.asinkj.common.core.utils.MapstructUtils; import org.asinkj.common.core.utils.StringUtils; import org.asinkj.common.mybatis.core.page.TableDataInfo; @@ -11,17 +18,22 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; +import org.asinkj.common.satoken.utils.LoginHelper; +import org.asinkj.system.api.RemoteUserService; +import org.asinkj.system.api.domain.vo.RemoteUserVo; import org.springframework.stereotype.Service; import org.asinkj.amz.domain.bo.BizSendOrderBo; import org.asinkj.amz.domain.vo.BizSendOrderVo; -import org.asinkj.amz.domain.BizSendOrder; import org.asinkj.amz.mapper.BizSendOrderMapper; import org.asinkj.amz.service.IBizSendOrderService; +import javax.annotation.Resource; import java.util.List; import java.util.Map; import java.util.Collection; import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; /** * 供应商创建的发货单Service业务层处理 @@ -35,6 +47,19 @@ public class BizSendOrderServiceImpl implements IBizSendOrderService { private final BizSendOrderMapper baseMapper; + @Resource + private ISysAmazonStoreService iSysAmazonStoreService; + + @DubboReference + private RemoteUserService remoteUserService; + + @Resource + private BizLogisticsOrderMapper bizLogisticsOrderMapper; + + + @Resource + private BizLogisticsOrderDetailMapper bizLogisticsOrderDetailMapper; + /** * 查询供应商创建的发货单 * @@ -57,6 +82,36 @@ public class BizSendOrderServiceImpl implements IBizSendOrderService { public TableDataInfo queryPageList(BizSendOrderBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + List records = result.getRecords(); + Set shipmentIds = records.stream().map(BizSendOrderVo::getShipmentId).collect(Collectors.toSet()); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(CollectionUtil.isNotEmpty(shipmentIds), BizLogisticsOrder::getFbaShipmentId, shipmentIds); + List bizLogisticsOrders = bizLogisticsOrderMapper.selectList(lambdaQueryWrapper); + Set collect = bizLogisticsOrders.stream().map(BizLogisticsOrder::getOrderId).collect(Collectors.toSet()); + + LambdaQueryWrapper orderDetailLambdaQueryWrapper = new LambdaQueryWrapper<>(); + orderDetailLambdaQueryWrapper.in(CollectionUtil.isNotEmpty(collect), BizLogisticsOrderDetail::getOrderId, collect); + List bizLogisticsOrderDetails = bizLogisticsOrderDetailMapper.selectList(orderDetailLambdaQueryWrapper); + Map> detailMap = bizLogisticsOrderDetails.stream().collect(Collectors.groupingBy(BizLogisticsOrderDetail::getOrderId)); + + for (BizLogisticsOrder bizLogisticsOrder : bizLogisticsOrders) { + bizLogisticsOrder.setDetails(detailMap.get(bizLogisticsOrder.getOrderId())); + } + + Map logisticsOrderMap = bizLogisticsOrders.stream().collect(Collectors.toMap(BizLogisticsOrder::getFbaShipmentId, Function.identity())); + + List logicIds = records.stream().map(BizSendOrderVo::getLogisticsProviderId).distinct().toList(); + Map remoteUserVoMap = remoteUserService.selectListByIds(logicIds).stream().collect(Collectors.toMap(RemoteUserVo::getUserId, Function.identity())); + for (BizSendOrderVo record : records) { + RemoteUserVo remoteUserVo = remoteUserVoMap.get(record.getLogisticsProviderId()); + if (remoteUserVo != null) { + record.setAddress(remoteUserVo.getAddress()); + } + BizLogisticsOrder bizLogisticsOrder = logisticsOrderMap.get(record.getShipmentId()); + if (bizLogisticsOrder != null) { + record.setBizLogisticsOrder(bizLogisticsOrder); + } + } return TableDataInfo.build(result); } @@ -86,6 +141,18 @@ public class BizSendOrderServiceImpl implements IBizSendOrderService { lqw.eq(bo.getWeightPerBox() != null, BizSendOrder::getWeightPerBox, bo.getWeightPerBox()); lqw.like(StringUtils.isNotBlank(bo.getRealStoreName()), BizSendOrder::getRealStoreName, bo.getRealStoreName()); lqw.eq(StringUtils.isNotBlank(bo.getSendStatus()), BizSendOrder::getSendStatus, bo.getSendStatus()); + if (StpUtil.hasRole("yunying")) { + SysAmazonStoreBo sysAmazonStoreBo = new SysAmazonStoreBo(); + sysAmazonStoreBo.setUserId(LoginHelper.getUserId()); + List sysAmazonStoreVos = iSysAmazonStoreService.queryList(sysAmazonStoreBo); + Set storeNameCollect = sysAmazonStoreVos.stream().map(SysAmazonStoreVo::getStoreName).collect(Collectors.toSet()); + if (CollectionUtil.isNotEmpty(storeNameCollect)) { + lqw.and(queryWrapper -> queryWrapper.in(BizSendOrder::getStoreName, storeNameCollect).or().in(BizSendOrder::getRealStoreName, storeNameCollect)); + } + } else if (StpUtil.hasRole("gongying")) { + lqw.eq(BizSendOrder::getSendId, LoginHelper.getUserId()); + } + return lqw; } @@ -99,6 +166,8 @@ public class BizSendOrderServiceImpl implements IBizSendOrderService { public Boolean insertByBo(BizSendOrderBo bo) { BizSendOrder add = MapstructUtils.convert(bo, BizSendOrder.class); validEntityBeforeSave(add); + add.setSendId(LoginHelper.getUserId()); + add.setSendName(LoginHelper.getLoginUser().getNickname()); boolean flag = baseMapper.insert(add) > 0; if (flag) { bo.setId(add.getId()); @@ -157,9 +226,9 @@ public class BizSendOrderServiceImpl implements IBizSendOrderService { } @Override - public void updateStatus(Long sendOrderId, String completed) { + public void updateStatus(Long sendOrderId, String completed, String shipmentId) { LambdaUpdateWrapper queryWrapper = new LambdaUpdateWrapper<>(); - queryWrapper.eq(BizSendOrder::getId, sendOrderId).set(BizSendOrder::getSendStatus, completed); + queryWrapper.eq(BizSendOrder::getId, sendOrderId).set(BizSendOrder::getSendStatus, completed).set(BizSendOrder::getShipmentId, shipmentId); baseMapper.update(queryWrapper); } } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizShipForwardServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizShipForwardServiceImpl.java index f97e8c1..65f307c 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizShipForwardServiceImpl.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizShipForwardServiceImpl.java @@ -1,5 +1,7 @@ package org.asinkj.amz.service.impl; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import org.apache.dubbo.config.annotation.DubboReference; import org.asinkj.common.core.utils.MapstructUtils; @@ -171,10 +173,10 @@ public class BizShipForwardServiceImpl implements IBizShipForwardService { @Override public void sendUpdateByBo(BizShipForwardBo bo) { LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(BizShipForward::getId, bo.getId()); updateWrapper.set(BizShipForward::getFwdStatus, bo.getFwdStatus()); + updateWrapper.set(ObjectUtil.isNotEmpty(bo.getExpDeliveryDate()), BizShipForward::getExpDeliveryDate, bo.getExpDeliveryDate()); + updateWrapper.set(ObjectUtil.isNotEmpty(bo.getBoxNum()), BizShipForward::getBoxNum, bo.getBoxNum()); baseMapper.update(updateWrapper); - } } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizShipmentPlanServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizShipmentPlanServiceImpl.java index 85fb0d8..102760e 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizShipmentPlanServiceImpl.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizShipmentPlanServiceImpl.java @@ -101,9 +101,9 @@ public class BizShipmentPlanServiceImpl implements IBizShipmentPlanService { if (StrUtil.isNotBlank(bo.getSellerName())) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.like(SysAmazonStore::getStoreName, bo.getSellerName()); - SysAmazonStore sysAmazonStore = sysAmazonStoreMapper.selectOne(queryWrapper); - if (sysAmazonStore != null) { - bo.setSid(sysAmazonStore.getSid()); + List sysAmazonStores = sysAmazonStoreMapper.selectList(queryWrapper); + if (CollectionUtil.isNotEmpty(sysAmazonStores)) { + bo.setSidList(sysAmazonStores.stream().map(SysAmazonStore::getSid).collect(Collectors.toSet())); } } LambdaQueryWrapper lqw = buildQueryWrapper(bo); @@ -194,6 +194,7 @@ public class BizShipmentPlanServiceImpl implements IBizShipmentPlanService { Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.eq(bo.getSid() != null, BizShipmentPlan::getSid, bo.getSid()); + lqw.in(CollectionUtil.isNotEmpty(bo.getSidList()), BizShipmentPlan::getSid, bo.getSidList()); lqw.eq(StringUtils.isNotBlank(bo.getShipmentId()), BizShipmentPlan::getShipmentId, bo.getShipmentId()); lqw.like(StringUtils.isNotBlank(bo.getShipmentName()), BizShipmentPlan::getShipmentName, bo.getShipmentName()); lqw.eq(StringUtils.isNotBlank(bo.getIsClosed()), BizShipmentPlan::getIsClosed, bo.getIsClosed()); @@ -454,7 +455,7 @@ public class BizShipmentPlanServiceImpl implements IBizShipmentPlanService { public Boolean linkByBo(BizShipmentPlanBo bo) { BizShipmentPlan update = MapstructUtils.convert(bo, BizShipmentPlan.class); validEntityBeforeSave(update); - iSendOrderService.updateStatus(bo.getSendOrderId(), "completed"); + iSendOrderService.updateStatus(bo.getSendOrderId(), "fba_created",update.getShipmentId()); return baseMapper.updateById(update) > 0; } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/SysAmazonStoreServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/SysAmazonStoreServiceImpl.java index 26f737d..5698aec 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/SysAmazonStoreServiceImpl.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/SysAmazonStoreServiceImpl.java @@ -10,6 +10,7 @@ import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.TypeReference; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import okhttp3.Call; @@ -534,7 +535,10 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService { JSONObject jsonObject = JSONObject.parse(string); JSONArray data = jsonObject.getJSONArray("data"); - + if (ObjectUtil.isEmpty(data)) { + log.info("未获取到采购订单"); + return; + } List list = data.toList(PurchaseOrderResponse.OrderData.class); log.info("list:{}", list); @@ -543,7 +547,10 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService { return; } list = list.stream().filter(c -> !"外采".equals(c.getSupplierName())).collect(Collectors.toList()); - + if (CollectionUtil.isEmpty(list)) { + log.info("未获取非外采到采购订单"); + return; + } Set orderSns = list.stream().map(PurchaseOrderResponse.OrderData::getOrderSn).collect(Collectors.toSet()); Set storeList = new HashSet<>(); for (PurchaseOrderResponse.OrderData orderData : list) { @@ -552,6 +559,7 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService { storeList.add(itemListItem.getSid()); } + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(SysAmazonStore::getSid, storeList); @@ -585,7 +593,34 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService { if (CollectionUtil.isNotEmpty(orders)) { - bizPurchaseOrderMapper.insertOrUpdateBatch(orders); +// 获取所有已存在的 order_sn 列表 + LambdaQueryWrapper orderQueryWrapper = new LambdaQueryWrapper<>(); + orderQueryWrapper.select(BizPurchaseOrder::getOrderSn); // 仅查询标识字段 + List existSnList = bizPurchaseOrderMapper.selectList(orderQueryWrapper) + .stream() + .map(BizPurchaseOrder::getOrderSn) + .toList(); +// bizPurchaseOrderMapper.insertOrUpdateBatch(orders); + Map> groupMap = orders.stream() + .collect(Collectors.groupingBy( + order -> existSnList.contains(order.getOrderSn()) // true=需更新, false=需新增 + )); + + List toUpdate = groupMap.get(true); // 需更新的数据 + List toInsert = groupMap.get(false); // 需新增的数据 + // 批量更新(根据非主键字段) + if (!CollectionUtil.isEmpty(toUpdate)) { + toUpdate.forEach(order -> { + LambdaQueryWrapper bpowrapper = new LambdaQueryWrapper<>(); + bpowrapper.eq(BizPurchaseOrder::getOrderSn, order.getOrderSn()); // 按 order_sn 更新 + bizPurchaseOrderMapper.update(order, bpowrapper); + }); + } + +// 批量新增 + if (!CollectionUtil.isEmpty(toInsert)) { + bizPurchaseOrderMapper.insertBatch(toInsert); // 高效批量插入[1](@ref) + } } if (CollectionUtil.isNotEmpty(bizPurchaseOrderItems)) { bizPurchaseOrderItemMapper.insertOrUpdateBatch(bizPurchaseOrderItems); @@ -876,7 +911,9 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService { AmzShippingResponse amzShippingResponse = JSON.parseObject(shipmentString, new TypeReference<>() { }); - + if (amzShippingResponse.getData() == null){ + return bizShipmentPlans; + } List shipmentList1 = amzShippingResponse.getData().getShipmentList(); @@ -893,6 +930,7 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService { bizShipmentPlan.setShipmentStatus(shipment.getStatus()); bizShipmentPlan.setDestination(shipment.getWarehouseId()); bizShipmentPlan.setStaShipmentDate(shipment.getShipingTime()); + bizShipmentPlan.setSetTotal(Long.valueOf(shipment.getItemCount())); FbaShipmentApiResponse.Address shipFromAddress = new FbaShipmentApiResponse.Address(); shipFromAddress.setAddressLine1(shipment.getSendAddress().getAddressLine1()); shipFromAddress.setAddressLine2(shipment.getSendAddress().getAddressLine2()); @@ -928,7 +966,7 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService { bizShipmentItem.setSku(item.getSku()); bizShipmentItem.setProductName(item.getProductName()); bizShipmentItem.setAsin(item.getAsin()); -// bizShipmentItem.setQuantityShipped(item.getQuantity()); + bizShipmentItem.setQuantityShipped(Long.valueOf(item.getQuantity())); bizShipmentItems.add(bizShipmentItem); } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/SysStatusHistoryServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/SysStatusHistoryServiceImpl.java new file mode 100644 index 0000000..5a45267 --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/SysStatusHistoryServiceImpl.java @@ -0,0 +1,135 @@ +package org.asinkj.amz.service.impl; + +import org.asinkj.common.core.utils.MapstructUtils; +import org.asinkj.common.core.utils.StringUtils; +import org.asinkj.common.mybatis.core.page.TableDataInfo; +import org.asinkj.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.asinkj.amz.domain.bo.SysStatusHistoryBo; +import org.asinkj.amz.domain.vo.SysStatusHistoryVo; +import org.asinkj.amz.domain.SysStatusHistory; +import org.asinkj.amz.mapper.SysStatusHistoryMapper; +import org.asinkj.amz.service.ISysStatusHistoryService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 状态历史Service业务层处理 + * + * @author shuo hu + * @date 2025-06-09 + */ +@RequiredArgsConstructor +@Service +public class SysStatusHistoryServiceImpl implements ISysStatusHistoryService { + + private final SysStatusHistoryMapper baseMapper; + + /** + * 查询状态历史 + * + * @param historyId 主键 + * @return 状态历史 + */ + @Override + public SysStatusHistoryVo queryById(Long historyId){ + return baseMapper.selectVoById(historyId); + } + + /** + * 分页查询状态历史列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 状态历史分页列表 + */ + @Override + public TableDataInfo queryPageList(SysStatusHistoryBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的状态历史列表 + * + * @param bo 查询条件 + * @return 状态历史列表 + */ + @Override + public List queryList(SysStatusHistoryBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysStatusHistoryBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getHistoryId() != null, SysStatusHistory::getHistoryId, bo.getHistoryId()); + lqw.like(StringUtils.isNotBlank(bo.getTableName()), SysStatusHistory::getTableName, bo.getTableName()); + lqw.eq(bo.getRecordId() != null, SysStatusHistory::getRecordId, bo.getRecordId()); + lqw.eq(StringUtils.isNotBlank(bo.getStatusColumn()), SysStatusHistory::getStatusColumn, bo.getStatusColumn()); + lqw.eq(StringUtils.isNotBlank(bo.getOldStatus()), SysStatusHistory::getOldStatus, bo.getOldStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getNewStatus()), SysStatusHistory::getNewStatus, bo.getNewStatus()); + lqw.eq(bo.getOriginalChangedAt() != null, SysStatusHistory::getOriginalChangedAt, bo.getOriginalChangedAt()); + return lqw; + } + + /** + * 新增状态历史 + * + * @param bo 状态历史 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(SysStatusHistoryBo bo) { + SysStatusHistory add = MapstructUtils.convert(bo, SysStatusHistory.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setHistoryId(add.getHistoryId()); + } + return flag; + } + + /** + * 修改状态历史 + * + * @param bo 状态历史 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(SysStatusHistoryBo bo) { + SysStatusHistory update = MapstructUtils.convert(bo, SysStatusHistory.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysStatusHistory entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除状态历史信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizLogisticsOrderMapper.xml b/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizLogisticsOrderMapper.xml index 9084fdd..5a94ce6 100644 --- a/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizLogisticsOrderMapper.xml +++ b/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizLogisticsOrderMapper.xml @@ -8,9 +8,9 @@ SELECT blo.* FROM biz_logistics_order blo WHERE blo.logistics_provider_id = #{userId} - + AND blo.del_flag = '0' AND EXISTS ( SELECT 1 @@ -19,7 +19,8 @@ AND blod.del_flag = '0' AND blod.estimated_delivery_date BETWEEN CURRENT_DATE AND CURRENT_DATE + INTERVAL '5 days' AND blod.logistics_status != 'delivered' - LIMIT 1 -- 明确只需判断存在至少一条符合条件的明细 + LIMIT 1 + ); diff --git a/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/SysStatusHistoryMapper.xml b/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/SysStatusHistoryMapper.xml new file mode 100644 index 0000000..1a6d783 --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/SysStatusHistoryMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/asinkj-common/asinkj-common-core/pom.xml b/asinkj-common/asinkj-common-core/pom.xml index a91ceb2..6de42d2 100644 --- a/asinkj-common/asinkj-common-core/pom.xml +++ b/asinkj-common/asinkj-common-core/pom.xml @@ -74,6 +74,7 @@ org.projectlombok lombok + provided diff --git a/asinkj-common/asinkj-common-sse/src/main/java/org/asinkj/common/sse/core/SseEmitterManager.java b/asinkj-common/asinkj-common-sse/src/main/java/org/asinkj/common/sse/core/SseEmitterManager.java index 87866c3..4fcbffd 100644 --- a/asinkj-common/asinkj-common-sse/src/main/java/org/asinkj/common/sse/core/SseEmitterManager.java +++ b/asinkj-common/asinkj-common-sse/src/main/java/org/asinkj/common/sse/core/SseEmitterManager.java @@ -67,6 +67,9 @@ public class SseEmitterManager { * @param token 用户的唯一令牌,用于识别具体的连接 */ public void disconnect(Long userId, String token) { + if (userId == null || token == null) { + return; + } Map emitters = USER_TOKEN_EMITTERS.get(userId); if (emitters != null) { try { diff --git a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/domain/SysUser.java b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/domain/SysUser.java index 672234b..7ed68c4 100644 --- a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/domain/SysUser.java +++ b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/domain/SysUser.java @@ -105,6 +105,8 @@ public class SysUser extends TenantEntity { */ private String remark; + private String address; + public SysUser(Long userId) { this.userId = userId; diff --git a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/domain/bo/SysUserBo.java b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/domain/bo/SysUserBo.java index bd8d90a..35d01a9 100644 --- a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/domain/bo/SysUserBo.java +++ b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/domain/bo/SysUserBo.java @@ -108,6 +108,10 @@ public class SysUserBo extends BaseEntity { */ private String excludeUserIds; + + private String address; + + public SysUserBo(Long userId) { this.userId = userId; } diff --git a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/domain/bo/SysUserProfileBo.java b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/domain/bo/SysUserProfileBo.java index fa055ac..4c72c61 100644 --- a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/domain/bo/SysUserProfileBo.java +++ b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/domain/bo/SysUserProfileBo.java @@ -38,6 +38,12 @@ public class SysUserProfileBo extends BaseEntity { @Size(min = 0, max = 50, message = "邮箱长度不能超过{max}个字符") private String email; + + // @Sensitive(strategy = SensitiveStrategy.EMAIL) +// @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 500, message = "地址长度不能超过{max}个字符") + private String address; + /** * 手机号码 */ diff --git a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/domain/vo/SysUserVo.java b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/domain/vo/SysUserVo.java index 9f7bc77..b3695ec 100644 --- a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/domain/vo/SysUserVo.java +++ b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/domain/vo/SysUserVo.java @@ -141,4 +141,8 @@ public class SysUserVo implements Serializable { */ private Long roleId; + + private String address; + + } diff --git a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/dubbo/RemoteUserServiceImpl.java b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/dubbo/RemoteUserServiceImpl.java index 9954d3b..5a91846 100644 --- a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/dubbo/RemoteUserServiceImpl.java +++ b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/dubbo/RemoteUserServiceImpl.java @@ -3,6 +3,7 @@ package org.asinkj.system.dubbo; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.lang.Opt; import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; import org.apache.dubbo.config.annotation.DubboService; diff --git a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/mapper/SysUserMapper.java b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/mapper/SysUserMapper.java index 0cfda69..e0c08dc 100644 --- a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/mapper/SysUserMapper.java +++ b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/mapper/SysUserMapper.java @@ -26,10 +26,10 @@ public interface SysUserMapper extends BaseMapperPlus { }) Page selectPageUserList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); - @DataPermission({ - @DataColumn(key = "deptName", value = "dept_id"), - @DataColumn(key = "userName", value = "user_id") - }) +// @DataPermission({ +// @DataColumn(key = "deptName", value = "dept_id") +// @DataColumn(key = "userName", value = "user_id") +// }) List selectUserList(@Param(Constants.WRAPPER) Wrapper queryWrapper); /** diff --git a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/service/impl/SysUserServiceImpl.java b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/service/impl/SysUserServiceImpl.java index e3b3572..21f8634 100644 --- a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/service/impl/SysUserServiceImpl.java +++ b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/service/impl/SysUserServiceImpl.java @@ -185,7 +185,7 @@ public class SysUserServiceImpl implements ISysUserService { @Override public List selectUserByIds(List userIds, Long deptId) { return baseMapper.selectUserList(new LambdaQueryWrapper() - .select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName, SysUser::getEmail, SysUser::getPhonenumber) .eq(SysUser::getStatus, UserConstants.USER_NORMAL) + .select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName, SysUser::getEmail, SysUser::getPhonenumber, SysUser::getAddress).eq(SysUser::getStatus, UserConstants.USER_NORMAL) .eq(ObjectUtil.isNotNull(deptId), SysUser::getDeptId, deptId) .in(CollUtil.isNotEmpty(userIds), SysUser::getUserId, userIds)); } @@ -390,6 +390,7 @@ public class SysUserServiceImpl implements ISysUserService { .set(SysUser::getPhonenumber, user.getPhonenumber()) .set(SysUser::getEmail, user.getEmail()) .set(SysUser::getSex, user.getSex()) + .set(SysUser::getAddress, user.getAddress()) .eq(SysUser::getUserId, user.getUserId())); } diff --git a/asinkj-node/src/nacos-config.js b/asinkj-node/src/nacos-config.js new file mode 100644 index 0000000..21c4d4d --- /dev/null +++ b/asinkj-node/src/nacos-config.js @@ -0,0 +1,79 @@ +// nacos-config.js +const NacosNamingClient = require('nacos').NacosNamingClient; + +// 创建 Nacos 客户端 +const nacosClient = new NacosNamingClient({ + serverList: '112.74.106.216:8848', // 您的 Nacos 地址 + namespace: 'dev', // 命名空间 + username: 'nacos', + password: 'nacos', + logger: console +}); + +// 服务注册配置 +const serviceConfig = { + serviceName: 'node-bff-service', + groupName: 'DEFAULT_GROUP', + ip: getContainerIP(), // 获取本机IP + port: 3000, + ephemeral: true, // 临时实例 + metadata: { + type: 'nodejs', + version: '1.0' + } +}; + +// 获取本机IP (适合 Docker 容器环境) +// 优化后的Node.js IP获取方案 +function getContainerIP() { + // 1. 优先使用K8s/Docker设置的环境变量 + if (process.env.POD_IP) return process.env.POD_IP; + if (process.env.HOST_IP) return process.env.HOST_IP; + + // 2. 自动检测网络接口 + const nets = require('os').networkInterfaces(); + for (const name of Object.keys(nets)) { + for (const net of nets[name]) { + if (net.family === 'IPv4' && !net.internal) { + return net.address; + } + } + } + + // 3. 使用服务名作为回退方案 (K8s中有效) + return require('os').hostname(); +} + +module.exports = { + nacosClient, + serviceConfig +}; + +// 初始化并注册服务 +async function registerToNacos() { + await nacosClient.ready(); + + // 注册服务 + await nacosClient.registerInstance( + serviceConfig.serviceName, + serviceConfig + ); + + console.log('✅ 服务成功注册到 Nacos:', serviceConfig); +} + +// 启动时自动注册 +registerToNacos().catch(err => { + console.error('❌ Nacos 注册失败:', err); + process.exit(1); +}); + +// 退出时注销服务 +process.on('SIGINT', async () => { + await nacosClient.deregisterInstance( + serviceConfig.serviceName, + serviceConfig + ); + console.log('🚪 服务已从 Nacos 注销'); + process.exit(); +}); diff --git a/asinkj-node/src/routes/bff.js b/asinkj-node/src/routes/bff.js new file mode 100644 index 0000000..e69de29 diff --git a/asinkj-node/src/server.js b/asinkj-node/src/server.js new file mode 100644 index 0000000..15cd0aa --- /dev/null +++ b/asinkj-node/src/server.js @@ -0,0 +1,68 @@ +const express = require('express'); +const app = express(); +const axios = require('axios'); +const {nacosClient, serviceConfig} = require('./nacos-config'); + +const PORT = process.env.PORT || 3000; + +// 中间件 +app.use(express.json()); + +// 健康检查端点 +app.get('/health', (req, res) => { + res.json({ + status: 'UP', + service: 'node-bff', + timestamp: new Date() + }); +}); + + +// ================= 新增的测试接口 ================= +// 简单的 hello 测试接口 +app.get('/bff/hello', (req, res) => { + console.log('BFF 接收到请求:', req.method, req.url); + res.json({ + message: 'Hello from Node.js BFF!', + serviceName: serviceConfig.serviceName, + clientIp: req.ip, + time: new Date().toISOString(), + tips: '访问此接口验证通过网关的路由是否生效' + }); +}); + +// BFF 路由示例:聚合用户数据 +app.get('/bff/users/:id', async (req, res) => { + try { + // 从 Nacos 获取 Java 用户服务实例 + const javaService = 'java-user-service'; + const instances = await nacosClient.getAllInstances(javaService, 'DEFAULT_GROUP'); + + if (!instances || instances.length === 0) { + return res.status(503).send('后端服务不可用'); + } + + // 选择第一个可用实例 + const targetInstance = instances[0]; + const serviceUrl = `http://${targetInstance.ip}:${targetInstance.port}`; + + // 调用 Java 服务 + const userResponse = await axios.get(`${serviceUrl}/users/${req.params.id}`); + + res.json({ + source: 'Node.js BFF', + backend: targetInstance, + data: userResponse.data + }); + + } catch (error) { + console.error('BFF 服务错误:', error); + res.status(500).send('内部服务器错误'); + } +}); + +// 启动服务 +app.listen(PORT, () => { + console.log(`🚀 Node BFF 服务运行中: http://localhost:${PORT}`); + console.log('✅ 注册在 Nacos 的服务名:', serviceConfig.serviceName); +});