From 58126e77732671422bcf59f9d46d43410c1582e1 Mon Sep 17 00:00:00 2001 From: dev <182542500@qq.com> Date: Mon, 24 Mar 2025 19:07:18 +0800 Subject: [PATCH] frist commit --- .../BizInquiryRequestController.java | 21 +- .../BizLogisticsOrderController.java | 120 +++++++++ .../BizLogisticsOrderDetailController.java | 106 ++++++++ .../BizLogisticsQuoteController.java | 20 +- .../asinkj/amz/domain/BizInquiryRequest.java | 7 + .../asinkj/amz/domain/BizLogisticsOrder.java | 88 +++++++ .../amz/domain/BizLogisticsOrderDetail.java | 144 +++++++++++ .../asinkj/amz/domain/BizLogisticsQuote.java | 16 +- .../asinkj/amz/domain/BizShipmentPlan.java | 2 +- .../amz/domain/bo/BizInquiryRequestBo.java | 6 + .../domain/bo/BizLogisticsCreateOrderBo.java | 37 +++ .../amz/domain/bo/BizLogisticsOrderBo.java | 88 +++++++ .../domain/bo/BizLogisticsOrderDetailBo.java | 160 ++++++++++++ .../amz/domain/bo/BizLogisticsQuoteBo.java | 20 +- .../domain/bo/BizLogisticsQuoteMostBo.java | 122 +++++++++ .../amz/domain/bo/BizShipmentPlanBo.java | 2 +- .../amz/domain/vo/BizInquiryRequestVo.java | 5 + .../domain/vo/BizLogisticsOrderDetailVo.java | 190 ++++++++++++++ .../amz/domain/vo/BizLogisticsOrderVo.java | 109 ++++++++ .../amz/domain/vo/BizLogisticsQuoteVo.java | 17 +- .../amz/domain/vo/BizShipmentPlanVo.java | 2 +- .../mapper/BizLogisticsOrderDetailMapper.java | 15 ++ .../amz/mapper/BizLogisticsOrderMapper.java | 15 ++ .../service/IBizInquiryRequestService.java | 4 +- .../IBizLogisticsOrderDetailService.java | 69 ++++++ .../service/IBizLogisticsOrderService.java | 72 ++++++ .../service/IBizLogisticsQuoteService.java | 6 +- .../amz/service/IBizShipmentItemService.java | 3 + .../amz/service/IBizShipmentPlanService.java | 2 + .../service/IBizShipmentTrackingService.java | 2 + .../impl/BizInquiryRequestServiceImpl.java | 21 +- .../BizLogisticsOrderDetailServiceImpl.java | 150 +++++++++++ .../impl/BizLogisticsOrderServiceImpl.java | 233 ++++++++++++++++++ .../impl/BizLogisticsQuoteServiceImpl.java | 60 +++-- .../impl/BizShipmentItemServiceImpl.java | 11 + .../impl/BizShipmentPlanServiceImpl.java | 14 +- .../impl/BizShipmentTrackingServiceImpl.java | 10 + .../entity/FbaShipmentApiResponse.java | 4 +- .../org/asinkj/asinking/entity/Shipment.java | 4 +- .../org/asinkj/utils/SerialNoGenerator.java | 78 ++++++ .../amz/BizLogisticsOrderDetailMapper.xml | 7 + .../mapper/amz/BizLogisticsOrderMapper.xml | 7 + 42 files changed, 2025 insertions(+), 44 deletions(-) create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizLogisticsOrderController.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizLogisticsOrderDetailController.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizLogisticsOrder.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizLogisticsOrderDetail.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsCreateOrderBo.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsOrderBo.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsOrderDetailBo.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsQuoteMostBo.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsOrderDetailVo.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsOrderVo.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizLogisticsOrderDetailMapper.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizLogisticsOrderMapper.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizLogisticsOrderDetailService.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizLogisticsOrderService.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsOrderDetailServiceImpl.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsOrderServiceImpl.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/utils/SerialNoGenerator.java create mode 100644 asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizLogisticsOrderDetailMapper.xml create mode 100644 asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizLogisticsOrderMapper.xml diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizInquiryRequestController.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizInquiryRequestController.java index 3002413..8f9413a 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizInquiryRequestController.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizInquiryRequestController.java @@ -48,13 +48,26 @@ public class BizInquiryRequestController extends BaseController { /** - * 根据目的地仓库和渠道创建物流报价列表 + * 根据目的地仓库和渠道创建物流询价单 */ @SaCheckPermission("amz:inquiryRequest:list") - @GetMapping("/create/{destination}/{channelId}") + @GetMapping("/query/{destination}/{channelId}/{date}") + public TableDataInfo queryWithDesAndChannel(@PathVariable("destination") @NotNull(message = "目的地不能为空") String destination, + @PathVariable("channelId") @NotNull(message = "渠道不能为空") String channelId, + @PathVariable("date") @NotNull(message = "日期不能为空") String date) { + return bizInquiryRequestService.queryWithDesAndChannel(destination, channelId,date); + } + + + /** + * 根据目的地仓库和渠道创建物流询价单 + */ + @SaCheckPermission("amz:inquiryRequest:list") + @GetMapping("/create/{destination}/{channelId}/{date}") public R createWithDesAndChannel(@PathVariable("destination") @NotNull(message = "目的地不能为空") String destination, - @PathVariable("channelId") @NotNull(message = "渠道不能为空") String channelId) { - return bizInquiryRequestService.createWithDesAndChannel(destination, channelId); + @PathVariable("channelId") @NotNull(message = "渠道不能为空") String channelId, + @PathVariable("date") @NotNull(message = "日期不能为空") String date) { + return bizInquiryRequestService.createWithDesAndChannel(destination, channelId,date); } /** diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizLogisticsOrderController.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizLogisticsOrderController.java new file mode 100644 index 0000000..74e5448 --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizLogisticsOrderController.java @@ -0,0 +1,120 @@ +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.asinkj.amz.domain.bo.BizLogisticsCreateOrderBo; +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.BizLogisticsOrderVo; +import org.asinkj.amz.domain.bo.BizLogisticsOrderBo; +import org.asinkj.amz.service.IBizLogisticsOrderService; +import org.asinkj.common.mybatis.core.page.TableDataInfo; + +/** + * 物流订单 + * 前端访问路由地址为:/amz/logisticsOrder + * + * @author shuo hu + * @date 2025-03-24 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/logisticsOrder") +public class BizLogisticsOrderController extends BaseController { + + private final IBizLogisticsOrderService bizLogisticsOrderService; + + /** + * 查询物流订单列表 + */ + @SaCheckPermission("amz:logisticsOrder:list") + @GetMapping("/list") + public TableDataInfo list(BizLogisticsOrderBo bo, PageQuery pageQuery) { + return bizLogisticsOrderService.queryPageList(bo, pageQuery); + } + + /** + * 导出物流订单列表 + */ + @SaCheckPermission("amz:logisticsOrder:export") + @Log(title = "物流订单", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BizLogisticsOrderBo bo, HttpServletResponse response) { + List list = bizLogisticsOrderService.queryList(bo); + ExcelUtil.exportExcel(list, "物流订单", BizLogisticsOrderVo.class, response); + } + + /** + * 获取物流订单详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("amz:logisticsOrder:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(bizLogisticsOrderService.queryById(id)); + } + + /** + * 新增物流订单 + */ + @SaCheckPermission("amz:logisticsOrder:add") + @Log(title = "物流订单", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BizLogisticsOrderBo bo) { + return toAjax(bizLogisticsOrderService.insertByBo(bo)); + } + + + /** + * 新增物流订单 + */ + @SaCheckPermission("amz:logisticsOrder:add") + @Log(title = "物流订单", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/createOrder") + public R createOrder(@Validated(AddGroup.class) @RequestBody BizLogisticsCreateOrderBo bo) { + bizLogisticsOrderService.createByBo(bo); + return R.ok(); + } + + /** + * 修改物流订单 + */ + @SaCheckPermission("amz:logisticsOrder:edit") + @Log(title = "物流订单", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BizLogisticsOrderBo bo) { + return toAjax(bizLogisticsOrderService.updateByBo(bo)); + } + + /** + * 删除物流订单 + * + * @param ids 主键串 + */ + @SaCheckPermission("amz:logisticsOrder:remove") + @Log(title = "物流订单", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(bizLogisticsOrderService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizLogisticsOrderDetailController.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizLogisticsOrderDetailController.java new file mode 100644 index 0000000..3077bda --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizLogisticsOrderDetailController.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.BizLogisticsOrderDetailVo; +import org.asinkj.amz.domain.bo.BizLogisticsOrderDetailBo; +import org.asinkj.amz.service.IBizLogisticsOrderDetailService; +import org.asinkj.common.mybatis.core.page.TableDataInfo; + +/** + * 物流订单明细(按箱子维度存储) + * 前端访问路由地址为:/amz/logisticsOrderDetail + * + * @author shuo hu + * @date 2025-03-24 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/logisticsOrderDetail") +public class BizLogisticsOrderDetailController extends BaseController { + + private final IBizLogisticsOrderDetailService bizLogisticsOrderDetailService; + + /** + * 查询物流订单明细(按箱子维度存储)列表 + */ + @SaCheckPermission("amz:logisticsOrderDetail:list") + @GetMapping("/list") + public TableDataInfo list(BizLogisticsOrderDetailBo bo, PageQuery pageQuery) { + return bizLogisticsOrderDetailService.queryPageList(bo, pageQuery); + } + + /** + * 导出物流订单明细(按箱子维度存储)列表 + */ + @SaCheckPermission("amz:logisticsOrderDetail:export") + @Log(title = "物流订单明细(按箱子维度存储)", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BizLogisticsOrderDetailBo bo, HttpServletResponse response) { + List list = bizLogisticsOrderDetailService.queryList(bo); + ExcelUtil.exportExcel(list, "物流订单明细(按箱子维度存储)", BizLogisticsOrderDetailVo.class, response); + } + + /** + * 获取物流订单明细(按箱子维度存储)详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("amz:logisticsOrderDetail:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(bizLogisticsOrderDetailService.queryById(id)); + } + + /** + * 新增物流订单明细(按箱子维度存储) + */ + @SaCheckPermission("amz:logisticsOrderDetail:add") + @Log(title = "物流订单明细(按箱子维度存储)", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BizLogisticsOrderDetailBo bo) { + return toAjax(bizLogisticsOrderDetailService.insertByBo(bo)); + } + + /** + * 修改物流订单明细(按箱子维度存储) + */ + @SaCheckPermission("amz:logisticsOrderDetail:edit") + @Log(title = "物流订单明细(按箱子维度存储)", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BizLogisticsOrderDetailBo bo) { + return toAjax(bizLogisticsOrderDetailService.updateByBo(bo)); + } + + /** + * 删除物流订单明细(按箱子维度存储) + * + * @param ids 主键串 + */ + @SaCheckPermission("amz:logisticsOrderDetail:remove") + @Log(title = "物流订单明细(按箱子维度存储)", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(bizLogisticsOrderDetailService.deleteWithValidByIds(List.of(ids), true)); + } +} 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 a58e33a..5bda9be 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 @@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.*; import cn.dev33.satoken.annotation.SaCheckPermission; +import org.asinkj.amz.domain.bo.BizLogisticsQuoteMostBo; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; import org.asinkj.common.idempotent.annotation.RepeatSubmit; @@ -50,10 +51,11 @@ public class BizLogisticsQuoteController extends BaseController { * 根据目的地仓库和渠道查询物流报价列表 */ @SaCheckPermission("amz:logisticsQuote:list") - @GetMapping("/query/{destination}/{channelId}") + @GetMapping("/query/{destination}/{channelId}/{date}") public TableDataInfo queryWithDesAndChannel(@PathVariable("destination") @NotNull(message = "目的地不能为空") String destination, - @PathVariable("channelId") @NotNull(message = "渠道不能为空") String channelId) { - return bizLogisticsQuoteService.listWithDesAndChannel(destination, channelId); + @PathVariable("channelId") @NotNull(message = "渠道不能为空") String channelId, + @PathVariable("date") @NotNull(message = "日期不能为空") String date) { + return bizLogisticsQuoteService.listWithDesAndChannel(destination, channelId,date); } @@ -93,6 +95,18 @@ public class BizLogisticsQuoteController extends BaseController { return toAjax(bizLogisticsQuoteService.insertByBo(bo)); } + /** + * 新增物流报价 + */ + @SaCheckPermission("amz:logisticsQuote:add") + @Log(title = "生成多日期的物流报价", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/most") + public R addMostQuote(@Validated(AddGroup.class) @RequestBody BizLogisticsQuoteMostBo bo) { + bizLogisticsQuoteService.insertMostQuoteByBo(bo); + return R.ok(); + } + /** * 修改物流报价 */ 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 6686112..a503b05 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 @@ -8,6 +8,7 @@ import lombok.EqualsAndHashCode; import java.time.LocalDateTime; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; import java.io.Serial; @@ -91,5 +92,11 @@ public class BizInquiryRequest extends TenantEntity { */ private Date effectiveEndTime; + /** + * 报价目标日期 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date quoteDate; + } 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 new file mode 100644 index 0000000..0d605fe --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizLogisticsOrder.java @@ -0,0 +1,88 @@ +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; + +/** + * 物流订单对象 biz_logistics_order + * + * @author shuo hu + * @date 2025-03-24 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("biz_logistics_order") +public class BizLogisticsOrder extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键(应用层生成的全局唯一ID,如雪花算法) + */ + private Long id; + + /** + * FBA货件编号(亚马逊系统生成的唯一标识) + */ + private String fbaShipmentId; + + /** + * 订单编号(应用层生成的唯一业务流水号) + */ + private String orderId; + + /** + * 物流商ID(关联物流商信息表) + */ + private Long logisticsProviderId; + + /** + * 物流商名称(冗余存储,避免高频联表查询) + */ + private String logisticsProviderName; + + /** + * 物流渠道(如空运/海运/快递等) + */ + private String channelName; + + /** + * 目的地仓库名称或编码 + */ + private String destination; + + /** + * 总箱子数量(此订单包含的箱子总数) + */ + private Long boxQuantity; + + /** + * 总货件数量(商品件数总和) + */ + private Long shipmentQuantity; + + /** + * 亚马逊仓库实际上架日期 + */ + private Date amazonShelfDate; + + /** + * 上架时效(单位:天,从发货到上架的总天数) + */ + private Long shelfTimeliness; + + /** + * 删除标记(0=正常,1=删除) + */ + @TableLogic + private String delFlag; + + +} diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizLogisticsOrderDetail.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizLogisticsOrderDetail.java new file mode 100644 index 0000000..e408ff9 --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizLogisticsOrderDetail.java @@ -0,0 +1,144 @@ +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; + +/** + * 物流订单明细(按箱子维度存储)对象 biz_logistics_order_detail + * + * @author shuo hu + * @date 2025-03-24 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("biz_logistics_order_detail") +public class BizLogisticsOrderDetail extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键(应用层生成的全局唯一ID) + */ + private Long id; + + /** + * 关联主表ID(biz_logistics_order.id) + */ + private String orderId; + + /** + * FBA货件编号(冗余存储,避免联表查询) + */ + private String fbaShipmentId; + + + /** + * FBA箱号(亚马逊系统中箱子的唯一标识) + */ + private String fbaBoxNumber; + + /** + * 物流商ID(冗余存储) + */ + private Long logisticsProviderId; + + /** + * 物流商名称(冗余存储) + */ + private String logisticsProviderName; + + /** + * 物流渠道(与主表一致) + */ + private String channelName; + + /** + * 目的地仓库(冗余存储) + */ + private String destination; + + /** + * 计划数量(该箱子预计装载的商品数量) + */ + private Long plannedQuantity; + + /** + * 实际货件数量(该箱子实际装载的商品数量) + */ + private Long shipmentQuantity; + + /** + * 物流追踪号(物流商提供的唯一包裹标识) + */ + private String trackingNumber; + + /** + * 供应商称重(单位:KG,由供应商提供) + */ + private Long supplierWeight; + + /** + * 物流商计重(单位:KG,物流商实际测量值) + */ + private Long logisticsWeight; + + /** + * 称重差异(应用层计算:物流商计重 - 供应商称重) + */ + private Long weightDiff; + + /** + * 物流单价(单位:元/KG,由合同或报价确定) + */ + private Long pricePerKg; + + /** + * 物流计价重量(应用层根据业务规则计算) + */ + private Long logisticsCalculationPrice; + + /** + * 其他物流费用(如报关费、保险费等) + */ + private Long otherFee; + + /** + * 费用合计(应用层计算:物流计价 + 其他费用) + */ + private Long totalFee; + + /** + * 物流状态(pending:待发运/in_transit:运输中/delivered:已签收) + */ + private String logisticsStatus; + + /** + * 预计签收日期(物流商提供的预估日期) + */ + private Date estimatedDeliveryDate; + + /** + * 实际签收日期(物流商回传的实际日期) + */ + private Date actualDeliveryDate; + + /** + * 运输时效(单位:天,实际签收日期 - 发货日期) + */ + private Long timeliness; + + /** + * 删除标记(0=正常,1=删除) + */ + @TableLogic + private String delFlag; + + +} 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 9435023..8893789 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 @@ -6,6 +6,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; import java.io.Serial; @@ -13,7 +14,7 @@ import java.io.Serial; * 物流报价对象 biz_logistics_quote * * @author shuo hu - * @date 2025-03-20 + * @date 2025-03-22 */ @Data @EqualsAndHashCode(callSuper = true) @@ -41,7 +42,7 @@ public class BizLogisticsQuote extends TenantEntity { /** * 渠道名称(冗余存储,保证查询效率) */ - private String transportChannel; + private String channelName; /** * 基础价格 @@ -61,6 +62,7 @@ public class BizLogisticsQuote extends TenantEntity { /** * 报价生效日期 */ + @DateTimeFormat(pattern = "yyyy-MM-dd") private Date quoteDate; /** @@ -89,5 +91,15 @@ public class BizLogisticsQuote extends TenantEntity { */ private Long channelId; + /** + * 是否双清包税(N不是 Y是) + */ + private String isDdp; + + /** + * 单位 + */ + private String unit; + } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizShipmentPlan.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizShipmentPlan.java index 7f1e63c..79707cc 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizShipmentPlan.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizShipmentPlan.java @@ -58,7 +58,7 @@ public class BizShipmentPlan extends TenantEntity { /** * 物流中心编码 */ - private String destinationFulfillmentCenterId; + private String destination; /** * 运输模式 diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizInquiryRequestBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizInquiryRequestBo.java index a2c9a20..c0b0fdb 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizInquiryRequestBo.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizInquiryRequestBo.java @@ -93,4 +93,10 @@ public class BizInquiryRequestBo extends BaseEntity { private Date effectiveEndTime; + /** + * 报价目标日期 + */ + private Date quoteDate; + + } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsCreateOrderBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsCreateOrderBo.java new file mode 100644 index 0000000..509ab09 --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsCreateOrderBo.java @@ -0,0 +1,37 @@ +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 BizLogisticsCreateOrderBo extends BaseEntity { + + + /** + * FBA货件编号(亚马逊系统生成的唯一标识) + */ + @NotBlank(message = "FBA货件编号(亚马逊系统生成的唯一标识)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fbaShipmentId; + + @NotBlank(message = "物流商报价唯一ID号 不能为空", groups = { AddGroup.class, EditGroup.class }) + private String logicQuoteId; + + +} 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 new file mode 100644 index 0000000..b159aad --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsOrderBo.java @@ -0,0 +1,88 @@ +package org.asinkj.amz.domain.bo; + +import org.asinkj.amz.domain.BizLogisticsOrder; +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; + +/** + * 物流订单业务对象 biz_logistics_order + * + * @author shuo hu + * @date 2025-03-24 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BizLogisticsOrder.class, reverseConvertGenerate = false) +public class BizLogisticsOrderBo extends BaseEntity { + + /** + * 主键(应用层生成的全局唯一ID,如雪花算法) + */ + 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; + + +} diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsOrderDetailBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsOrderDetailBo.java new file mode 100644 index 0000000..28fc376 --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsOrderDetailBo.java @@ -0,0 +1,160 @@ +package org.asinkj.amz.domain.bo; + +import org.asinkj.amz.domain.BizLogisticsOrderDetail; +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; + +/** + * 物流订单明细(按箱子维度存储)业务对象 biz_logistics_order_detail + * + * @author shuo hu + * @date 2025-03-24 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BizLogisticsOrderDetail.class, reverseConvertGenerate = false) +public class BizLogisticsOrderDetailBo extends BaseEntity { + + /** + * 主键(应用层生成的全局唯一ID) + */ + @NotNull(message = "主键(应用层生成的全局唯一ID)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long id; + + /** + * 关联主表ID(biz_logistics_order.id) + */ + @NotNull(message = "关联主表ID(biz_logistics_order.id)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String orderId; + + /** + * FBA货件编号(冗余存储,避免联表查询) + */ + @NotBlank(message = "FBA货件编号(冗余存储,避免联表查询)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fbaShipmentId; + + + + /** + * FBA箱号(亚马逊系统中箱子的唯一标识) + */ + @NotBlank(message = "FBA箱号(亚马逊系统中箱子的唯一标识)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fbaBoxNumber; + + /** + * 物流商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 plannedQuantity; + + /** + * 实际货件数量(该箱子实际装载的商品数量) + */ + @NotNull(message = "实际货件数量(该箱子实际装载的商品数量)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long shipmentQuantity; + + /** + * 物流追踪号(物流商提供的唯一包裹标识) + */ + @NotBlank(message = "物流追踪号(物流商提供的唯一包裹标识)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String trackingNumber; + + /** + * 供应商称重(单位:KG,由供应商提供) + */ + @NotNull(message = "供应商称重(单位:KG,由供应商提供)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long supplierWeight; + + /** + * 物流商计重(单位:KG,物流商实际测量值) + */ + @NotNull(message = "物流商计重(单位:KG,物流商实际测量值)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long logisticsWeight; + + /** + * 称重差异(应用层计算:物流商计重 - 供应商称重) + */ + @NotNull(message = "称重差异(应用层计算:物流商计重 - 供应商称重)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long weightDiff; + + /** + * 物流单价(单位:元/KG,由合同或报价确定) + */ + @NotNull(message = "物流单价(单位:元/KG,由合同或报价确定)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long pricePerKg; + + /** + * 物流计价重量(应用层根据业务规则计算) + */ + @NotNull(message = "物流计价重量(应用层根据业务规则计算)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long logisticsCalculationPrice; + + /** + * 其他物流费用(如报关费、保险费等) + */ + @NotNull(message = "其他物流费用(如报关费、保险费等)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long otherFee; + + /** + * 费用合计(应用层计算:物流计价 + 其他费用) + */ + @NotNull(message = "费用合计(应用层计算:物流计价 + 其他费用)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long totalFee; + + /** + * 物流状态(pending:待发运/in_transit:运输中/delivered:已签收) + */ + @NotBlank(message = "物流状态(pending:待发运/in_transit:运输中/delivered:已签收)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String logisticsStatus; + + /** + * 预计签收日期(物流商提供的预估日期) + */ + @NotNull(message = "预计签收日期(物流商提供的预估日期)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date estimatedDeliveryDate; + + /** + * 实际签收日期(物流商回传的实际日期) + */ + @NotNull(message = "实际签收日期(物流商回传的实际日期)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date actualDeliveryDate; + + /** + * 运输时效(单位:天,实际签收日期 - 发货日期) + */ + @NotNull(message = "运输时效(单位:天,实际签收日期 - 发货日期)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long timeliness; + + +} 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 86412fa..b854b4b 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 @@ -8,6 +8,8 @@ import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import lombok.EqualsAndHashCode; import jakarta.validation.constraints.*; + +import java.io.Serial; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; @@ -15,13 +17,15 @@ import com.fasterxml.jackson.annotation.JsonFormat; * 物流报价业务对象 biz_logistics_quote * * @author shuo hu - * @date 2025-03-20 + * @date 2025-03-22 */ @Data @EqualsAndHashCode(callSuper = true) @AutoMapper(target = BizLogisticsQuote.class, reverseConvertGenerate = false) public class BizLogisticsQuoteBo extends BaseEntity { + @Serial + private static final long serialVersionUID = -8065228533338642055L; /** * 主键ID */ @@ -44,7 +48,7 @@ public class BizLogisticsQuoteBo extends BaseEntity { * 渠道名称(冗余存储,保证查询效率) */ @NotBlank(message = "渠道名称(冗余存储,保证查询效率)不能为空", groups = { AddGroup.class, EditGroup.class }) - private String transportChannel; + private String channelName; /** * 基础价格 @@ -94,5 +98,17 @@ public class BizLogisticsQuoteBo extends BaseEntity { @NotNull(message = "渠道ID(system=dict_code,custom=自定义渠道ID)不能为空", groups = { AddGroup.class, EditGroup.class }) private Long channelId; + /** + * 是否双清包税(N不是 Y是) + */ + @NotBlank(message = "是否双清包税(N不是 Y是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String isDdp; + + /** + * 单位 + */ + @NotBlank(message = "单位不能为空", groups = { AddGroup.class, EditGroup.class }) + private String unit; + } 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 new file mode 100644 index 0000000..e473965 --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsQuoteMostBo.java @@ -0,0 +1,122 @@ +package org.asinkj.amz.domain.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +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.BizLogisticsQuote; +import org.asinkj.common.core.validate.AddGroup; +import org.asinkj.common.core.validate.EditGroup; +import org.asinkj.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; +import java.util.Date; + +/** + * 物流报价业务对象 biz_logistics_quote + * + * @author shuo hu + * @date 2025-03-22 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BizLogisticsQuote.class, reverseConvertGenerate = false) +public class BizLogisticsQuoteMostBo extends BaseEntity { + + @Serial + private static final long serialVersionUID = -8065228533338642055L; + /** + * 主键ID + */ +// @NotNull(message = "主键ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long id; + + /** + * 物流商用户ID(关联sys_user表) + */ +// @NotNull(message = "物流商用户ID(关联sys_user表)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long userId; + + /** + * 目的地(建议使用ISO国家代码如CN/US/GB) + */ + @NotBlank(message = "目的地(建议使用ISO国家代码如CN/US/GB)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String destination; + + /** + * 渠道名称(冗余存储,保证查询效率) + */ + @NotBlank(message = "渠道名称(冗余存储,保证查询效率)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelName; + + /** + * 基础价格 + */ + @NotNull(message = "基础价格不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long price; + + /** + * 时效(单位:天) + */ + @NotNull(message = "时效(单位:天)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long leadTime; + + /** + * 附加费 + */ + @NotNull(message = "附加费不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long surcharge; + + + + /** + * 报价生效起始日期 + */ + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") + private Date quoteStartDate; + /** + * 报价生效结束日期 + */ + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") + private Date quoteEndDate; + + /** + * 提交状态(Y已提交 N未提交) + */ + @NotBlank(message = "提交状态(Y已提交 N未提交)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String isSubmitted; + + /** + * 报价备注 + */ +// @NotBlank(message = "报价备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String remark; + + /** + * 渠道类型(system=系统/custom=自定义) + */ +// @NotBlank(message = "渠道类型(system=系统/custom=自定义)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String channelType; + + /** + * 渠道ID(system=dict_code,custom=自定义渠道ID) + */ + @NotNull(message = "渠道ID(system=dict_code,custom=自定义渠道ID)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long channelId; + + /** + * 是否双清包税(N不是 Y是) + */ + @NotBlank(message = "是否双清包税(N不是 Y是)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String isDdp; + + /** + * 单位 + */ + @NotBlank(message = "单位不能为空", groups = { AddGroup.class, EditGroup.class }) + private String unit; + + +} 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 2532308..be65b53 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 @@ -63,7 +63,7 @@ public class BizShipmentPlanBo extends BaseEntity { * 物流中心编码 */ @NotBlank(message = "物流中心编码不能为空", groups = { AddGroup.class, EditGroup.class }) - private String destinationFulfillmentCenterId; + private String destination; /** * 运输模式 diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizInquiryRequestVo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizInquiryRequestVo.java index f456ed0..60954b7 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizInquiryRequestVo.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizInquiryRequestVo.java @@ -111,5 +111,10 @@ public class BizInquiryRequestVo implements Serializable { @ExcelProperty(value = "报价有效的结束日期") private Date effectiveEndTime; + /** + * 报价目标日期 + */ + private Date quoteDate; + } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsOrderDetailVo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsOrderDetailVo.java new file mode 100644 index 0000000..98630a8 --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsOrderDetailVo.java @@ -0,0 +1,190 @@ +package org.asinkj.amz.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.asinkj.amz.domain.BizLogisticsOrderDetail; +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; + + + +/** + * 物流订单明细(按箱子维度存储)视图对象 biz_logistics_order_detail + * + * @author shuo hu + * @date 2025-03-24 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BizLogisticsOrderDetail.class) +public class BizLogisticsOrderDetailVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键(应用层生成的全局唯一ID) + */ + @ExcelProperty(value = "主键", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "应=用层生成的全局唯一ID") + private Long id; + + /** + * 关联主表ID(biz_logistics_order.id) + */ + @ExcelProperty(value = "关联主表ID", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "b=iz_logistics_order.id") + private String orderId; + + /** + * FBA货件编号(冗余存储,避免联表查询) + */ + @ExcelProperty(value = "FBA货件编号", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "冗=余存储,避免联表查询") + private String fbaShipmentId; + + + + /** + * FBA箱号(亚马逊系统中箱子的唯一标识) + */ + @ExcelProperty(value = "FBA箱号", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "亚=马逊系统中箱子的唯一标识") + private String fbaBoxNumber; + + /** + * 物流商ID(冗余存储) + */ + @ExcelProperty(value = "物流商ID", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "冗=余存储") + private Long logisticsProviderId; + + /** + * 物流商名称(冗余存储) + */ + @ExcelProperty(value = "物流商名称", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "冗=余存储") + private String logisticsProviderName; + + /** + * 物流渠道(与主表一致) + */ + @ExcelProperty(value = "物流渠道", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "与=主表一致") + private String logisticsChannel; + + /** + * 目的地仓库(冗余存储) + */ + @ExcelProperty(value = "目的地仓库", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "冗=余存储") + private String destination; + + /** + * 计划数量(该箱子预计装载的商品数量) + */ + @ExcelProperty(value = "计划数量", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "该=箱子预计装载的商品数量") + private Long plannedQuantity; + + /** + * 实际货件数量(该箱子实际装载的商品数量) + */ + @ExcelProperty(value = "实际货件数量", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "该=箱子实际装载的商品数量") + private Long shipmentQuantity; + + /** + * 物流追踪号(物流商提供的唯一包裹标识) + */ + @ExcelProperty(value = "物流追踪号", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "物=流商提供的唯一包裹标识") + private String trackingNumber; + + /** + * 供应商称重(单位:KG,由供应商提供) + */ + @ExcelProperty(value = "供应商称重", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "单=位:KG,由供应商提供") + private Long supplierWeight; + + /** + * 物流商计重(单位:KG,物流商实际测量值) + */ + @ExcelProperty(value = "物流商计重", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "单=位:KG,物流商实际测量值") + private Long logisticsWeight; + + /** + * 称重差异(应用层计算:物流商计重 - 供应商称重) + */ + @ExcelProperty(value = "称重差异", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "应=用层计算:物流商计重,-=,供=应商称重") + private Long weightDiff; + + /** + * 物流单价(单位:元/KG,由合同或报价确定) + */ + @ExcelProperty(value = "物流单价", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "单=位:元/KG,由合同或报价确定") + private Long pricePerKg; + + /** + * 物流计价重量(应用层根据业务规则计算) + */ + @ExcelProperty(value = "物流计价重量", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "应=用层根据业务规则计算") + private Long logisticsCalculationPrice; + + /** + * 其他物流费用(如报关费、保险费等) + */ + @ExcelProperty(value = "其他物流费用", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "如=报关费、保险费等") + private Long otherFee; + + /** + * 费用合计(应用层计算:物流计价 + 其他费用) + */ + @ExcelProperty(value = "费用合计", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "应=用层计算:物流计价,+=,其=他费用") + private Long totalFee; + + /** + * 物流状态(pending:待发运/in_transit:运输中/delivered:已签收) + */ + @ExcelProperty(value = "物流状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "p=ending:待发运/in_transit:运输中/delivered:已签收") + private String logisticsStatus; + + /** + * 预计签收日期(物流商提供的预估日期) + */ + @ExcelProperty(value = "预计签收日期", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "物=流商提供的预估日期") + private Date estimatedDeliveryDate; + + /** + * 实际签收日期(物流商回传的实际日期) + */ + @ExcelProperty(value = "实际签收日期", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "物=流商回传的实际日期") + private Date actualDeliveryDate; + + /** + * 运输时效(单位:天,实际签收日期 - 发货日期) + */ + @ExcelProperty(value = "运输时效", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "单=位:天,实际签收日期,-=,发=货日期") + private Long timeliness; + + +} 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 new file mode 100644 index 0000000..8203b34 --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsOrderVo.java @@ -0,0 +1,109 @@ +package org.asinkj.amz.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.asinkj.amz.domain.BizLogisticsOrder; +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; + + + +/** + * 物流订单视图对象 biz_logistics_order + * + * @author shuo hu + * @date 2025-03-24 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BizLogisticsOrder.class) +public class BizLogisticsOrderVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键(应用层生成的全局唯一ID,如雪花算法) + */ + @ExcelProperty(value = "主键", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "应=用层生成的全局唯一ID,如雪花算法") + private Long id; + + /** + * FBA货件编号(亚马逊系统生成的唯一标识) + */ + @ExcelProperty(value = "FBA货件编号", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "亚=马逊系统生成的唯一标识") + private String fbaShipmentId; + + /** + * 订单编号(应用层生成的唯一业务流水号) + */ + @ExcelProperty(value = "订单编号", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "应=用层生成的唯一业务流水号") + private String orderId; + + /** + * 物流商ID(关联物流商信息表) + */ + @ExcelProperty(value = "物流商ID", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "关=联物流商信息表") + private Long logisticsProviderId; + + /** + * 物流商名称(冗余存储,避免高频联表查询) + */ + @ExcelProperty(value = "物流商名称", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "冗=余存储,避免高频联表查询") + private String logisticsProviderName; + + /** + * 物流渠道(如空运/海运/快递等) + */ + @ExcelProperty(value = "物流渠道", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "如=空运/海运/快递等") + private String logisticsChannel; + + /** + * 目的地仓库名称或编码 + */ + @ExcelProperty(value = "目的地仓库名称或编码") + private String destination; + + /** + * 总箱子数量(此订单包含的箱子总数) + */ + @ExcelProperty(value = "总箱子数量", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "此=订单包含的箱子总数") + private Long boxQuantity; + + /** + * 总货件数量(商品件数总和) + */ + @ExcelProperty(value = "总货件数量", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "商=品件数总和") + private Long shipmentQuantity; + + /** + * 亚马逊仓库实际上架日期 + */ + @ExcelProperty(value = "亚马逊仓库实际上架日期") + private Date amazonShelfDate; + + /** + * 上架时效(单位:天,从发货到上架的总天数) + */ + @ExcelProperty(value = "上架时效", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "单=位:天,从发货到上架的总天数") + private Long shelfTimeliness; + + +} 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 769a18a..d776590 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 @@ -20,7 +20,7 @@ import java.util.Date; * 物流报价视图对象 biz_logistics_quote * * @author shuo hu - * @date 2025-03-20 + * @date 2025-03-22 */ @Data @ExcelIgnoreUnannotated @@ -55,7 +55,7 @@ public class BizLogisticsQuoteVo implements Serializable { */ @ExcelProperty(value = "渠道名称", converter = ExcelDictConvert.class) @ExcelDictFormat(readConverterExp = "冗=余存储,保证查询效率") - private String transportChannel; + private String channelName; /** * 基础价格 @@ -109,5 +109,18 @@ public class BizLogisticsQuoteVo implements Serializable { @ExcelDictFormat(readConverterExp = "s=ystem=dict_code,custom=自定义渠道ID") private Long channelId; + /** + * 是否双清包税(N不是 Y是) + */ + @ExcelProperty(value = "是否双清包税", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "N=不是,Y=是") + private String isDdp; + + /** + * 单位 + */ + @ExcelProperty(value = "单位") + private String unit; + } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizShipmentPlanVo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizShipmentPlanVo.java index e6cd85a..e6c7d21 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizShipmentPlanVo.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizShipmentPlanVo.java @@ -75,7 +75,7 @@ public class BizShipmentPlanVo implements Serializable { * 物流中心编码 */ @ExcelProperty(value = "物流中心编码") - private String destinationFulfillmentCenterId; + private String destination; /** * 运输模式 diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizLogisticsOrderDetailMapper.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizLogisticsOrderDetailMapper.java new file mode 100644 index 0000000..bf28dc4 --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizLogisticsOrderDetailMapper.java @@ -0,0 +1,15 @@ +package org.asinkj.amz.mapper; + +import org.asinkj.amz.domain.BizLogisticsOrderDetail; +import org.asinkj.amz.domain.vo.BizLogisticsOrderDetailVo; +import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 物流订单明细(按箱子维度存储)Mapper接口 + * + * @author shuo hu + * @date 2025-03-24 + */ +public interface BizLogisticsOrderDetailMapper extends BaseMapperPlus { + +} diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizLogisticsOrderMapper.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizLogisticsOrderMapper.java new file mode 100644 index 0000000..9171ffb --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizLogisticsOrderMapper.java @@ -0,0 +1,15 @@ +package org.asinkj.amz.mapper; + +import org.asinkj.amz.domain.BizLogisticsOrder; +import org.asinkj.amz.domain.vo.BizLogisticsOrderVo; +import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 物流订单Mapper接口 + * + * @author shuo hu + * @date 2025-03-24 + */ +public interface BizLogisticsOrderMapper extends BaseMapperPlus { + +} diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizInquiryRequestService.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizInquiryRequestService.java index e0d003f..acf9b9d 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizInquiryRequestService.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizInquiryRequestService.java @@ -69,5 +69,7 @@ public interface IBizInquiryRequestService { */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); - R createWithDesAndChannel(@NotNull(message = "目的地不能为空") String destination, @NotNull(message = "渠道不能为空") String channelId); + R createWithDesAndChannel(@NotNull(message = "目的地不能为空") String destination, @NotNull(message = "渠道不能为空") String channelId, @NotNull(message = "日期不能为空") String date); + + TableDataInfo queryWithDesAndChannel(@NotNull(message = "目的地不能为空") String destination, @NotNull(message = "渠道不能为空") String channelId, @NotNull(message = "日期不能为空") String date); } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizLogisticsOrderDetailService.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizLogisticsOrderDetailService.java new file mode 100644 index 0000000..de1219a --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizLogisticsOrderDetailService.java @@ -0,0 +1,69 @@ +package org.asinkj.amz.service; + +import org.asinkj.amz.domain.BizLogisticsOrderDetail; +import org.asinkj.amz.domain.vo.BizLogisticsOrderDetailVo; +import org.asinkj.amz.domain.bo.BizLogisticsOrderDetailBo; +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-03-24 + */ +public interface IBizLogisticsOrderDetailService { + + /** + * 查询物流订单明细(按箱子维度存储) + * + * @param id 主键 + * @return 物流订单明细(按箱子维度存储) + */ + BizLogisticsOrderDetailVo queryById(Long id); + + /** + * 分页查询物流订单明细(按箱子维度存储)列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 物流订单明细(按箱子维度存储)分页列表 + */ + TableDataInfo queryPageList(BizLogisticsOrderDetailBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的物流订单明细(按箱子维度存储)列表 + * + * @param bo 查询条件 + * @return 物流订单明细(按箱子维度存储)列表 + */ + List queryList(BizLogisticsOrderDetailBo bo); + + /** + * 新增物流订单明细(按箱子维度存储) + * + * @param bo 物流订单明细(按箱子维度存储) + * @return 是否新增成功 + */ + Boolean insertByBo(BizLogisticsOrderDetailBo bo); + + /** + * 修改物流订单明细(按箱子维度存储) + * + * @param bo 物流订单明细(按箱子维度存储) + * @return 是否修改成功 + */ + Boolean updateByBo(BizLogisticsOrderDetailBo 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/IBizLogisticsOrderService.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizLogisticsOrderService.java new file mode 100644 index 0000000..68125ce --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizLogisticsOrderService.java @@ -0,0 +1,72 @@ +package org.asinkj.amz.service; + +import org.asinkj.amz.domain.BizLogisticsOrder; +import org.asinkj.amz.domain.bo.BizLogisticsCreateOrderBo; +import org.asinkj.amz.domain.vo.BizLogisticsOrderVo; +import org.asinkj.amz.domain.bo.BizLogisticsOrderBo; +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-03-24 + */ +public interface IBizLogisticsOrderService { + + /** + * 查询物流订单 + * + * @param id 主键 + * @return 物流订单 + */ + BizLogisticsOrderVo queryById(Long id); + + /** + * 分页查询物流订单列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 物流订单分页列表 + */ + TableDataInfo queryPageList(BizLogisticsOrderBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的物流订单列表 + * + * @param bo 查询条件 + * @return 物流订单列表 + */ + List queryList(BizLogisticsOrderBo bo); + + /** + * 新增物流订单 + * + * @param bo 物流订单 + * @return 是否新增成功 + */ + Boolean insertByBo(BizLogisticsOrderBo bo); + + /** + * 修改物流订单 + * + * @param bo 物流订单 + * @return 是否修改成功 + */ + Boolean updateByBo(BizLogisticsOrderBo bo); + + /** + * 校验并批量删除物流订单信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + void createByBo(BizLogisticsCreateOrderBo bo); +} diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizLogisticsQuoteService.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizLogisticsQuoteService.java index 1507217..bd21e07 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizLogisticsQuoteService.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizLogisticsQuoteService.java @@ -1,10 +1,9 @@ package org.asinkj.amz.service; import jakarta.validation.constraints.NotNull; -import org.asinkj.amz.domain.BizLogisticsQuote; +import org.asinkj.amz.domain.bo.BizLogisticsQuoteMostBo; import org.asinkj.amz.domain.vo.BizLogisticsQuoteVo; import org.asinkj.amz.domain.bo.BizLogisticsQuoteBo; -import org.asinkj.common.core.domain.R; import org.asinkj.common.mybatis.core.page.TableDataInfo; import org.asinkj.common.mybatis.core.page.PageQuery; @@ -72,6 +71,7 @@ public interface IBizLogisticsQuoteService { List queryQuoteWithDestination(String destination, String channel); - TableDataInfo listWithDesAndChannel(@NotNull(message = "目的地不能为空") String destination, @NotNull(message = "渠道不能为空") String channel); + TableDataInfo listWithDesAndChannel(@NotNull(message = "目的地不能为空") String destination, @NotNull(message = "渠道不能为空") String channel, @NotNull(message = "日期不能为空") String date); + void insertMostQuoteByBo(BizLogisticsQuoteMostBo bo); } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizShipmentItemService.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizShipmentItemService.java index d5bba4c..02392cc 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizShipmentItemService.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizShipmentItemService.java @@ -66,4 +66,7 @@ public interface IBizShipmentItemService { * @return 是否删除成功 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + + List queryByPlanId(String shipmentId); } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizShipmentPlanService.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizShipmentPlanService.java index d57b66f..86364ea 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizShipmentPlanService.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizShipmentPlanService.java @@ -70,4 +70,6 @@ public interface IBizShipmentPlanService { Boolean deleteWithValidByIds(Collection ids, Boolean isValid); List getQuote(@NotNull(message = "主键不能为空") String destination, String channel); + + BizShipmentPlanVo queryByfbaShipmentId(String fbaShipmentId); } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizShipmentTrackingService.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizShipmentTrackingService.java index f8f4ec8..a20e8d5 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizShipmentTrackingService.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizShipmentTrackingService.java @@ -66,4 +66,6 @@ public interface IBizShipmentTrackingService { * @return 是否删除成功 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + List queryByPlanId(String shipmentId); } 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 0443945..ebcf02d 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 @@ -1,5 +1,7 @@ package org.asinkj.amz.service.impl; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.NumberUtil; import lombok.extern.slf4j.Slf4j; import org.asinkj.amz.domain.vo.BizLogisticsChannelVo; @@ -14,6 +16,7 @@ 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.utils.SerialNoGenerator; import org.springframework.stereotype.Service; import org.asinkj.amz.domain.bo.BizInquiryRequestBo; import org.asinkj.amz.domain.vo.BizInquiryRequestVo; @@ -157,7 +160,7 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService { } @Override - public R createWithDesAndChannel(String destination, String channelId) { + public R createWithDesAndChannel(String destination, String channelId,String date) { BizInquiryRequest bizInquiryRequest = new BizInquiryRequest(); bizInquiryRequest.setDestination(destination); bizInquiryRequest.setChannelId(NumberUtil.parseLong(channelId)); @@ -168,7 +171,7 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService { return R.fail("目的地不能为空"); } //询价单号(规则:INQ+年月+6位序列) - bizInquiryRequest.setInquiryNo(generateInquiryNo()); + bizInquiryRequest.setInquiryNo(SerialNoGenerator.generateInquiryNo()); //查询出渠道信息 BizLogisticsChannelVo bizLogisticsChannelVo = bizLogisticsChannelService.queryById(bizInquiryRequest.getChannelId()); @@ -194,12 +197,26 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService { bizInquiryRequest.setDeadline(LocalDate.now() .atTime(11, 0)); bizInquiryRequest.setRequesterId(LoginHelper.getUserId()); + DateTime dateTime = DateUtil.parseDate(date); + bizInquiryRequest.setQuoteDate(dateTime); billingRequestMapper.insert(bizInquiryRequest); return R.ok(); } + @Override + public TableDataInfo queryWithDesAndChannel(String destination, String channelId, String date) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(BizInquiryRequest::getDestination, destination); + queryWrapper.eq(BizInquiryRequest::getChannelId, NumberUtil.parseLong(channelId)); + queryWrapper.eq(BizInquiryRequest::getQuoteDate, date); + + List bizInquiryRequestVos = baseMapper.selectVoList(queryWrapper); + return TableDataInfo.build(bizInquiryRequestVos); + } + + private String generateInquiryNo() { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM"); String datePart = sdf.format(new Date()); diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsOrderDetailServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsOrderDetailServiceImpl.java new file mode 100644 index 0000000..bbb88f4 --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsOrderDetailServiceImpl.java @@ -0,0 +1,150 @@ +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.BizLogisticsOrderDetailBo; +import org.asinkj.amz.domain.vo.BizLogisticsOrderDetailVo; +import org.asinkj.amz.domain.BizLogisticsOrderDetail; +import org.asinkj.amz.mapper.BizLogisticsOrderDetailMapper; +import org.asinkj.amz.service.IBizLogisticsOrderDetailService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 物流订单明细(按箱子维度存储)Service业务层处理 + * + * @author shuo hu + * @date 2025-03-24 + */ +@RequiredArgsConstructor +@Service +public class BizLogisticsOrderDetailServiceImpl implements IBizLogisticsOrderDetailService { + + private final BizLogisticsOrderDetailMapper baseMapper; + + /** + * 查询物流订单明细(按箱子维度存储) + * + * @param id 主键 + * @return 物流订单明细(按箱子维度存储) + */ + @Override + public BizLogisticsOrderDetailVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询物流订单明细(按箱子维度存储)列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 物流订单明细(按箱子维度存储)分页列表 + */ + @Override + public TableDataInfo queryPageList(BizLogisticsOrderDetailBo 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(BizLogisticsOrderDetailBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BizLogisticsOrderDetailBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getOrderId() != null, BizLogisticsOrderDetail::getOrderId, bo.getOrderId()); + lqw.eq(StringUtils.isNotBlank(bo.getFbaShipmentId()), BizLogisticsOrderDetail::getFbaShipmentId, bo.getFbaShipmentId()); + lqw.eq(StringUtils.isNotBlank(bo.getOrderId()), BizLogisticsOrderDetail::getOrderId, bo.getOrderId()); + lqw.eq(StringUtils.isNotBlank(bo.getFbaBoxNumber()), BizLogisticsOrderDetail::getFbaBoxNumber, bo.getFbaBoxNumber()); + lqw.eq(bo.getLogisticsProviderId() != null, BizLogisticsOrderDetail::getLogisticsProviderId, bo.getLogisticsProviderId()); + lqw.like(StringUtils.isNotBlank(bo.getLogisticsProviderName()), BizLogisticsOrderDetail::getLogisticsProviderName, bo.getLogisticsProviderName()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelName()), BizLogisticsOrderDetail::getChannelName, bo.getChannelName()); + lqw.eq(StringUtils.isNotBlank(bo.getDestination()), BizLogisticsOrderDetail::getDestination, bo.getDestination()); + lqw.eq(bo.getPlannedQuantity() != null, BizLogisticsOrderDetail::getPlannedQuantity, bo.getPlannedQuantity()); + lqw.eq(bo.getShipmentQuantity() != null, BizLogisticsOrderDetail::getShipmentQuantity, bo.getShipmentQuantity()); + lqw.eq(StringUtils.isNotBlank(bo.getTrackingNumber()), BizLogisticsOrderDetail::getTrackingNumber, bo.getTrackingNumber()); + lqw.eq(bo.getSupplierWeight() != null, BizLogisticsOrderDetail::getSupplierWeight, bo.getSupplierWeight()); + lqw.eq(bo.getLogisticsWeight() != null, BizLogisticsOrderDetail::getLogisticsWeight, bo.getLogisticsWeight()); + lqw.eq(bo.getWeightDiff() != null, BizLogisticsOrderDetail::getWeightDiff, bo.getWeightDiff()); + lqw.eq(bo.getPricePerKg() != null, BizLogisticsOrderDetail::getPricePerKg, bo.getPricePerKg()); + lqw.eq(bo.getLogisticsCalculationPrice() != null, BizLogisticsOrderDetail::getLogisticsCalculationPrice, bo.getLogisticsCalculationPrice()); + lqw.eq(bo.getOtherFee() != null, BizLogisticsOrderDetail::getOtherFee, bo.getOtherFee()); + lqw.eq(bo.getTotalFee() != null, BizLogisticsOrderDetail::getTotalFee, bo.getTotalFee()); + lqw.eq(StringUtils.isNotBlank(bo.getLogisticsStatus()), BizLogisticsOrderDetail::getLogisticsStatus, bo.getLogisticsStatus()); + lqw.eq(bo.getEstimatedDeliveryDate() != null, BizLogisticsOrderDetail::getEstimatedDeliveryDate, bo.getEstimatedDeliveryDate()); + lqw.eq(bo.getActualDeliveryDate() != null, BizLogisticsOrderDetail::getActualDeliveryDate, bo.getActualDeliveryDate()); + lqw.eq(bo.getTimeliness() != null, BizLogisticsOrderDetail::getTimeliness, bo.getTimeliness()); + return lqw; + } + + /** + * 新增物流订单明细(按箱子维度存储) + * + * @param bo 物流订单明细(按箱子维度存储) + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(BizLogisticsOrderDetailBo bo) { + BizLogisticsOrderDetail add = MapstructUtils.convert(bo, BizLogisticsOrderDetail.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改物流订单明细(按箱子维度存储) + * + * @param bo 物流订单明细(按箱子维度存储) + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(BizLogisticsOrderDetailBo bo) { + BizLogisticsOrderDetail update = MapstructUtils.convert(bo, BizLogisticsOrderDetail.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BizLogisticsOrderDetail 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/java/org/asinkj/amz/service/impl/BizLogisticsOrderServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsOrderServiceImpl.java new file mode 100644 index 0000000..9fbe704 --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsOrderServiceImpl.java @@ -0,0 +1,233 @@ +package org.asinkj.amz.service.impl; + +import lombok.extern.slf4j.Slf4j; +import org.asinkj.amz.domain.*; +import org.asinkj.amz.domain.bo.BizLogisticsCreateOrderBo; +import org.asinkj.amz.domain.vo.BizLogisticsQuoteVo; +import org.asinkj.amz.domain.vo.BizShipmentPlanVo; +import org.asinkj.amz.mapper.BizLogisticsOrderDetailMapper; +import org.asinkj.amz.service.*; +import org.asinkj.common.core.exception.ServiceException; +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.asinkj.common.satoken.utils.LoginHelper; +import org.asinkj.utils.SerialNoGenerator; +import org.springframework.stereotype.Service; +import org.asinkj.amz.domain.bo.BizLogisticsOrderBo; +import org.asinkj.amz.domain.vo.BizLogisticsOrderVo; +import org.asinkj.amz.mapper.BizLogisticsOrderMapper; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 物流订单Service业务层处理 + * + * @author shuo hu + * @date 2025-03-24 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class BizLogisticsOrderServiceImpl implements IBizLogisticsOrderService { + + private final BizLogisticsOrderMapper baseMapper; + + @Resource + private IBizLogisticsQuoteService bizLogisticsQuoteService; + + @Resource + private IBizShipmentPlanService bizShipmentPlanService; + + @Resource + private IBizShipmentTrackingService bizShipmentTrackingService; + + @Resource + private IBizShipmentItemService bizShipmentItemService; + + @Resource + private BizLogisticsOrderDetailMapper bizLogisticsOrderDetailMapper; + + @Resource + private BizLogisticsOrderMapper bizOrderMapper; + + /** + * 查询物流订单 + * + * @param id 主键 + * @return 物流订单 + */ + @Override + public BizLogisticsOrderVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询物流订单列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 物流订单分页列表 + */ + @Override + public TableDataInfo queryPageList(BizLogisticsOrderBo 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(BizLogisticsOrderBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BizLogisticsOrderBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getFbaShipmentId()), BizLogisticsOrder::getFbaShipmentId, bo.getFbaShipmentId()); + lqw.eq(StringUtils.isNotBlank(bo.getOrderId()), BizLogisticsOrder::getOrderId, bo.getOrderId()); + lqw.eq(bo.getLogisticsProviderId() != null, BizLogisticsOrder::getLogisticsProviderId, bo.getLogisticsProviderId()); + lqw.like(StringUtils.isNotBlank(bo.getLogisticsProviderName()), BizLogisticsOrder::getLogisticsProviderName, bo.getLogisticsProviderName()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelName()), BizLogisticsOrder::getChannelName, bo.getChannelName()); + lqw.eq(StringUtils.isNotBlank(bo.getDestination()), BizLogisticsOrder::getDestination, bo.getDestination()); + lqw.eq(bo.getBoxQuantity() != null, BizLogisticsOrder::getBoxQuantity, bo.getBoxQuantity()); + lqw.eq(bo.getShipmentQuantity() != null, BizLogisticsOrder::getShipmentQuantity, bo.getShipmentQuantity()); + lqw.eq(bo.getAmazonShelfDate() != null, BizLogisticsOrder::getAmazonShelfDate, bo.getAmazonShelfDate()); + lqw.eq(bo.getShelfTimeliness() != null, BizLogisticsOrder::getShelfTimeliness, bo.getShelfTimeliness()); + return lqw; + } + + /** + * 新增物流订单 + * + * @param bo 物流订单 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(BizLogisticsOrderBo bo) { + BizLogisticsOrder add = MapstructUtils.convert(bo, BizLogisticsOrder.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改物流订单 + * + * @param bo 物流订单 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(BizLogisticsOrderBo bo) { + BizLogisticsOrder update = MapstructUtils.convert(bo, BizLogisticsOrder.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BizLogisticsOrder entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除物流订单信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + @Override + public void createByBo(BizLogisticsCreateOrderBo bo) { + String logicQuoteId = bo.getLogicQuoteId(); + BizLogisticsQuoteVo quoteVo = bizLogisticsQuoteService.queryById(Long.valueOf(logicQuoteId)); + + if (quoteVo == null) { + throw new ServiceException("物流报价不存在"); + } + String fbaShipmentId = bo.getFbaShipmentId(); + BizShipmentPlanVo planVo = bizShipmentPlanService.queryByfbaShipmentId(fbaShipmentId); + if (planVo == null) { + throw new ServiceException("物流计划不存在"); + } + + List trackingList = bizShipmentTrackingService.queryByPlanId(planVo.getShipmentId()); + + List itemList = bizShipmentItemService.queryByPlanId(planVo.getShipmentId()); + long sum = itemList.stream().mapToLong(BizShipmentItem::getQuantityShipped).sum(); + + + BizLogisticsOrder bizLogisticsOrder = new BizLogisticsOrder(); + bizLogisticsOrder.setFbaShipmentId(fbaShipmentId); + + //订单编号 + bizLogisticsOrder.setOrderId(SerialNoGenerator.generateOrderNo()); + + bizLogisticsOrder.setLogisticsProviderId(quoteVo.getUserId()); + + // todo bizLogisticsOrderBo.setLogisticsProviderName(quoteVo.getUserName()); + bizLogisticsOrder.setChannelName(quoteVo.getChannelName()); + // 目的地 + bizLogisticsOrder.setDestination(quoteVo.getDestination()); + + //总箱子数量 + bizLogisticsOrder.setBoxQuantity((long) trackingList.size()); + //总货件数量 + bizLogisticsOrder.setShipmentQuantity(sum); + + + ArrayList orderDetailList = new ArrayList<>(); + + for (BizShipmentTracking bizShipmentTracking : trackingList) { + BizLogisticsOrderDetail detail = new BizLogisticsOrderDetail(); + detail.setFbaShipmentId(fbaShipmentId); + detail.setOrderId(bizLogisticsOrder.getOrderId()); + detail.setFbaBoxNumber(bizShipmentTracking.getBoxId()); + detail.setLogisticsProviderId(quoteVo.getUserId()); + // todo detail.setLogisticsProviderName(quoteVo.getUserName()); + detail.setChannelName(quoteVo.getChannelName()); + detail.setDestination(quoteVo.getDestination()); + detail.setPricePerKg(quoteVo.getPrice()); + detail.setLogisticsStatus("pending"); +// detail.setPlannedQuantity(bizShipmentTracking.getQuantity()); +// detail.setShipmentQuantity(sum); +// detail.setTrackingNumber(bizShipmentTracking.getTrackingNumber()); + orderDetailList.add(detail); + } + + int insert = bizOrderMapper.insert(bizLogisticsOrder); + + boolean b = bizLogisticsOrderDetailMapper.insertBatch(orderDetailList); + log.info("物流订单创建成功"); + + } + +} 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 562dd7e..31fabe1 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 @@ -1,14 +1,13 @@ package org.asinkj.amz.service.impl; +import cn.hutool.core.date.DateField; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.NumberUtil; import lombok.extern.slf4j.Slf4j; -import org.asinkj.amz.domain.BizInquiryRequest; -import org.asinkj.amz.domain.BizLogisticsChannel; -import org.asinkj.amz.domain.vo.BizLogisticsChannelVo; +import org.asinkj.amz.domain.bo.BizLogisticsQuoteMostBo; import org.asinkj.amz.mapper.BizInquiryRequestMapper; -import org.asinkj.amz.service.IBizInquiryRequestService; import org.asinkj.amz.service.IBizLogisticsChannelService; -import org.asinkj.common.core.domain.R; import org.asinkj.common.core.utils.MapstructUtils; import org.asinkj.common.core.utils.StringUtils; import org.asinkj.common.mybatis.core.page.TableDataInfo; @@ -17,6 +16,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.springframework.stereotype.Service; import org.asinkj.amz.domain.bo.BizLogisticsQuoteBo; import org.asinkj.amz.domain.vo.BizLogisticsQuoteVo; @@ -25,10 +25,7 @@ import org.asinkj.amz.mapper.BizLogisticsQuoteMapper; import org.asinkj.amz.service.IBizLogisticsQuoteService; import javax.annotation.Resource; -import java.text.SimpleDateFormat; -import java.time.LocalDate; import java.util.*; -import java.util.concurrent.atomic.AtomicInteger; /** * 物流报价Service业务层处理 @@ -44,13 +41,11 @@ public class BizLogisticsQuoteServiceImpl implements IBizLogisticsQuoteService { private final BizLogisticsQuoteMapper baseMapper; - - @Resource private IBizLogisticsChannelService bizLogisticsChannelService; @Resource - private BizInquiryRequestMapper billingRequestMapper; + private BizInquiryRequestMapper bizInquiryRequestMapper; /** * 查询物流报价 @@ -94,7 +89,7 @@ public class BizLogisticsQuoteServiceImpl implements IBizLogisticsQuoteService { LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.eq(bo.getUserId() != null, BizLogisticsQuote::getUserId, bo.getUserId()); lqw.eq(StringUtils.isNotBlank(bo.getDestination()), BizLogisticsQuote::getDestination, bo.getDestination()); - lqw.eq(StringUtils.isNotBlank(bo.getTransportChannel()), BizLogisticsQuote::getTransportChannel, bo.getTransportChannel()); + lqw.eq(StringUtils.isNotBlank(bo.getChannelName()), BizLogisticsQuote::getChannelName, bo.getChannelName()); lqw.eq(bo.getPrice() != null, BizLogisticsQuote::getPrice, bo.getPrice()); lqw.eq(bo.getLeadTime() != null, BizLogisticsQuote::getLeadTime, bo.getLeadTime()); lqw.eq(bo.getSurcharge() != null, BizLogisticsQuote::getSurcharge, bo.getSurcharge()); @@ -161,25 +156,56 @@ public class BizLogisticsQuoteServiceImpl implements IBizLogisticsQuoteService { public List queryQuoteWithDestination(String destination, String channel) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(BizLogisticsQuote::getDestination, destination); - queryWrapper.eq(BizLogisticsQuote::getTransportChannel, channel); + queryWrapper.eq(BizLogisticsQuote::getChannelName, channel); return baseMapper.selectVoList(queryWrapper); } @Override - public TableDataInfo listWithDesAndChannel(String destination, String channel) { + public TableDataInfo listWithDesAndChannel(String destination, String channel,String date) { if (StringUtils.isNotBlank(destination) && StringUtils.isNotBlank(channel)) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(BizLogisticsQuote::getDestination, destination); queryWrapper.eq(BizLogisticsQuote::getChannelId, NumberUtil.parseLong(channel)); + + queryWrapper.eq(BizLogisticsQuote::getQuoteDate, date); + return TableDataInfo.build(baseMapper.selectVoList(queryWrapper)); } + return null; + + + } + + @Override + public void insertMostQuoteByBo(BizLogisticsQuoteMostBo bo) { + Date quoteStartDate = bo.getQuoteStartDate(); + Date quoteEndDate = bo.getQuoteEndDate(); + //计算中间的每一天的日期 +// List dateList = DateUtil.getDatesBetween(quoteStartDate, quoteEndDate); + List dateTimes = DateUtil.rangeToList(quoteStartDate, quoteEndDate, DateField.DAY_OF_YEAR); + ArrayList bizLogisticsQuotes = new ArrayList<>(); + for (DateTime dateTime : dateTimes) { + BizLogisticsQuote bizLogisticsQuote = new BizLogisticsQuote(); + bizLogisticsQuote.setDestination(bo.getDestination()); + bizLogisticsQuote.setUserId(LoginHelper.getUserId()); + bizLogisticsQuote.setChannelName(bo.getChannelName()); + bizLogisticsQuote.setPrice(bo.getPrice()); + bizLogisticsQuote.setLeadTime(bo.getLeadTime()); + bizLogisticsQuote.setSurcharge(bo.getSurcharge()); + bizLogisticsQuote.setQuoteDate(dateTime.toJdkDate()); + bizLogisticsQuote.setIsSubmitted(bo.getIsSubmitted()); + bizLogisticsQuote.setChannelType(bo.getChannelType()); + bizLogisticsQuote.setChannelId(bo.getChannelId()); + bizLogisticsQuote.setIsDdp(bo.getIsDdp()); + bizLogisticsQuote.setUnit(bo.getUnit()); + bizLogisticsQuotes.add(bizLogisticsQuote); + } + boolean b = baseMapper.insertBatch(bizLogisticsQuotes); + log.info("b:{}", b); } - - - } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizShipmentItemServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizShipmentItemServiceImpl.java index 14d25e6..4bb6b8a 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizShipmentItemServiceImpl.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizShipmentItemServiceImpl.java @@ -134,4 +134,15 @@ public class BizShipmentItemServiceImpl implements IBizShipmentItemService { } return baseMapper.deleteByIds(ids) > 0; } + + @Override + public List queryByPlanId(String shipmentId) { + if (StringUtils.isNotBlank(shipmentId)) { + return baseMapper.selectList(Wrappers.lambdaQuery(BizShipmentItem.class) + .eq(BizShipmentItem::getShipmentId, shipmentId)); + } + return List.of(); + } + + } 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 675a2a7..36568f0 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 @@ -1,5 +1,6 @@ package org.asinkj.amz.service.impl; +import cn.hutool.core.util.ObjectUtil; import org.asinkj.amz.domain.BizLogisticsQuote; import org.asinkj.amz.domain.vo.BizLogisticsQuoteVo; import org.asinkj.amz.service.IBizLogisticsQuoteService; @@ -83,7 +84,7 @@ public class BizShipmentPlanServiceImpl implements IBizShipmentPlanService { lqw.like(StringUtils.isNotBlank(bo.getShipmentName()), BizShipmentPlan::getShipmentName, bo.getShipmentName()); lqw.eq(StringUtils.isNotBlank(bo.getIsClosed()), BizShipmentPlan::getIsClosed, bo.getIsClosed()); lqw.eq(StringUtils.isNotBlank(bo.getShipmentStatus()), BizShipmentPlan::getShipmentStatus, bo.getShipmentStatus()); - lqw.eq(StringUtils.isNotBlank(bo.getDestinationFulfillmentCenterId()), BizShipmentPlan::getDestinationFulfillmentCenterId, bo.getDestinationFulfillmentCenterId()); + lqw.eq(StringUtils.isNotBlank(bo.getDestination()), BizShipmentPlan::getDestination, bo.getDestination()); lqw.eq(StringUtils.isNotBlank(bo.getShippingMode()), BizShipmentPlan::getShippingMode, bo.getShippingMode()); lqw.eq(StringUtils.isNotBlank(bo.getShippingSolution()), BizShipmentPlan::getShippingSolution, bo.getShippingSolution()); lqw.eq(bo.getGmtModified() != null, BizShipmentPlan::getGmtModified, bo.getGmtModified()); @@ -156,4 +157,15 @@ public class BizShipmentPlanServiceImpl implements IBizShipmentPlanService { public List getQuote(String destination, String channel) { return iLogisticsQuoteService.queryQuoteWithDestination(destination, channel); } + + @Override + public BizShipmentPlanVo queryByfbaShipmentId(String fbaShipmentId) { + LambdaQueryWrapper bizShipmentPlanLambdaQueryWrapper = new LambdaQueryWrapper<>(); + bizShipmentPlanLambdaQueryWrapper.eq(BizShipmentPlan::getShipmentId, fbaShipmentId); + BizShipmentPlanVo bizShipmentPlanVo = baseMapper.selectVoOne(bizShipmentPlanLambdaQueryWrapper); + if (ObjectUtil.isNotNull(bizShipmentPlanVo)){ + return bizShipmentPlanVo; + } + return null; + } } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizShipmentTrackingServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizShipmentTrackingServiceImpl.java index 1a0b829..15f5d5c 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizShipmentTrackingServiceImpl.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizShipmentTrackingServiceImpl.java @@ -128,4 +128,14 @@ public class BizShipmentTrackingServiceImpl implements IBizShipmentTrackingServi } return baseMapper.deleteByIds(ids) > 0; } + + @Override + public List queryByPlanId(String shipmentId) { + if (StringUtils.isNotBlank(shipmentId)) { + return baseMapper.selectList(Wrappers.lambdaQuery().eq(BizShipmentTracking::getShipmentId, shipmentId)); + } + return List.of(); + } + + } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/asinking/entity/FbaShipmentApiResponse.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/asinking/entity/FbaShipmentApiResponse.java index 628a8ee..4b02cdb 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/asinking/entity/FbaShipmentApiResponse.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/asinking/entity/FbaShipmentApiResponse.java @@ -52,8 +52,8 @@ public class FbaShipmentApiResponse { @JSONField(name = "sync_time") private String syncTime; - @JSONField(name = "destination_fulfillment_center_id") - private String destinationFulfillmentCenterId; + @JSONField(name = "destination") + private String destination; private String username; private String seller; diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/asinking/entity/Shipment.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/asinking/entity/Shipment.java index 31f1092..17959f0 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/asinking/entity/Shipment.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/asinking/entity/Shipment.java @@ -35,8 +35,8 @@ public class Shipment { @JsonProperty("sync_time") private LocalDateTime syncTime; // 空字符串会反序列化为null - @JsonProperty("destination_fulfillment_center_id") - private String destinationFulfillmentCenterId; + @JsonProperty("destination") + private String destination; private String username; private String seller; diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/utils/SerialNoGenerator.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/utils/SerialNoGenerator.java new file mode 100644 index 0000000..4b1545c --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/utils/SerialNoGenerator.java @@ -0,0 +1,78 @@ +package org.asinkj.utils; + +import org.asinkj.common.redis.utils.RedisUtils; + +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; + +public class SerialNoGenerator { + + /** + * 生成询价单号(格式:INQ+年月日+6位序列) + * @return 示例:INQ20231023000001 + */ + public static String generateInquiryNo() { + // 1. 生成日期部分 + String datePart = LocalDate.now(ZoneId.of("Asia/Shanghai")) + .format(DateTimeFormatter.ofPattern("yyyyMMdd")); + + // 2. 构建Redis键 + String redisKey = "inquiry:serial:" + datePart; + + // 3. 原子递增序列号 + long sequence = RedisUtils.incrAtomicValue(redisKey); + + // 4. 首次生成时设置过期时间(次日凌晨过期) + if (sequence == 1L) { + LocalDateTime now = LocalDateTime.now(ZoneId.of("Asia/Shanghai")); + LocalDateTime expirationTime = now.toLocalDate() + .plusDays(1) + .atStartOfDay(); + + Duration ttl = Duration.between(now, expirationTime); + RedisUtils.expire(redisKey, ttl); + } + + // 5. 校验序列号范围(根据业务需求可选) + if (sequence > 999_999L) { + throw new IllegalStateException("当日序列号已用尽"); + } + + // 6. 格式化输出 + return String.format("INQ%s%06d", datePart, sequence); + } + + public static String generateOrderNo() { + // 1. 生成日期部分 + String datePart = LocalDate.now(ZoneId.of("Asia/Shanghai")) + .format(DateTimeFormatter.ofPattern("yyyyMMdd")); + + // 2. 构建Redis键 + String redisKey = "order:serial:" + datePart; + + // 3. 原子递增序列号 + long sequence = RedisUtils.incrAtomicValue(redisKey); + + // 4. 首次生成时设置过期时间(次日凌晨过期) + if (sequence == 1L) { + LocalDateTime now = LocalDateTime.now(ZoneId.of("Asia/Shanghai")); + LocalDateTime expirationTime = now.toLocalDate() + .plusDays(1) + .atStartOfDay(); + + Duration ttl = Duration.between(now, expirationTime); + RedisUtils.expire(redisKey, ttl); + } + + // 5. 校验序列号范围(根据业务需求可选) + if (sequence > 999_999L) { + throw new IllegalStateException("当日序列号已用尽"); + } + + // 6. 格式化输出 + return String.format("ORDER%s%06d", datePart, sequence); + } +} diff --git a/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizLogisticsOrderDetailMapper.xml b/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizLogisticsOrderDetailMapper.xml new file mode 100644 index 0000000..33b2bfa --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizLogisticsOrderDetailMapper.xml @@ -0,0 +1,7 @@ + + + + + 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 new file mode 100644 index 0000000..465c89b --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizLogisticsOrderMapper.xml @@ -0,0 +1,7 @@ + + + + +