diff --git a/asinkj-biz/asinkj-amz/pom.xml b/asinkj-biz/asinkj-amz/pom.xml
new file mode 100644
index 0000000..5ffcd9e
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/pom.xml
@@ -0,0 +1,115 @@
+
+
+ 4.0.0
+
+ org.asinkj
+ asinkj-cloud-plus
+ 2.2.2
+ ../../pom.xml
+
+
+ asinkj-amz
+
+
+ 17
+ 17
+ UTF-8
+
+
+
+ org.asinkj
+ asinkj-common-nacos
+
+
+
+ org.asinkj
+ asinkj-common-sentinel
+
+
+
+
+ org.asinkj
+ asinkj-common-log
+
+
+
+ org.asinkj
+ asinkj-common-dict
+
+
+
+ org.asinkj
+ asinkj-common-doc
+
+
+
+ org.asinkj
+ asinkj-common-web
+
+
+
+ org.asinkj
+ asinkj-common-mybatis
+
+
+
+ org.asinkj
+ asinkj-common-dubbo
+
+
+
+ org.asinkj
+ asinkj-common-seata
+
+
+
+ org.asinkj
+ asinkj-common-idempotent
+
+
+
+ org.asinkj
+ asinkj-common-tenant
+
+
+
+ org.asinkj
+ asinkj-common-security
+
+
+
+ org.asinkj
+ asinkj-common-translation
+
+
+
+ org.asinkj
+ asinkj-common-sensitive
+
+
+
+ org.asinkj
+ asinkj-common-encrypt
+
+
+
+
+ org.asinkj
+ asinkj-api-system
+
+
+
+ org.asinkj
+ asinkj-api-resource
+
+
+
+ com.squareup.okhttp3
+ okhttp
+ 4.9.0
+
+
+
+
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/AsinKjAmzApplication.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/AsinKjAmzApplication.java
new file mode 100644
index 0000000..2fd5c38
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/AsinKjAmzApplication.java
@@ -0,0 +1,17 @@
+package org.asinkj;
+
+import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
+
+@EnableDubbo
+@SpringBootApplication
+public class AsinKjAmzApplication {
+ public static void main(String[] args) {
+ SpringApplication application = new SpringApplication(AsinKjAmzApplication.class);
+ application.setApplicationStartup(new BufferingApplicationStartup(2048));
+ application.run(args);
+ System.out.println("(♥◠‿◠)ノ゙ 亚马逊模块启动成功 ლ(´ڡ`ლ)゙ ");
+ }
+}
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
new file mode 100644
index 0000000..3002413
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizInquiryRequestController.java
@@ -0,0 +1,117 @@
+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.BizInquiryRequestVo;
+import org.asinkj.amz.domain.bo.BizInquiryRequestBo;
+import org.asinkj.amz.service.IBizInquiryRequestService;
+import org.asinkj.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 物流询价
+ * 前端访问路由地址为:/amz/inquiryRequest
+ *
+ * @author shuo hu
+ * @date 2025-03-21
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/inquiryRequest")
+public class BizInquiryRequestController extends BaseController {
+
+ private final IBizInquiryRequestService bizInquiryRequestService;
+
+ /**
+ * 查询物流询价列表
+ */
+ @SaCheckPermission("amz:inquiryRequest:list")
+ @GetMapping("/list")
+ public TableDataInfo list(BizInquiryRequestBo bo, PageQuery pageQuery) {
+ return bizInquiryRequestService.queryPageList(bo, pageQuery);
+ }
+
+
+ /**
+ * 根据目的地仓库和渠道创建物流报价列表
+ */
+ @SaCheckPermission("amz:inquiryRequest:list")
+ @GetMapping("/create/{destination}/{channelId}")
+ public R createWithDesAndChannel(@PathVariable("destination") @NotNull(message = "目的地不能为空") String destination,
+ @PathVariable("channelId") @NotNull(message = "渠道不能为空") String channelId) {
+ return bizInquiryRequestService.createWithDesAndChannel(destination, channelId);
+ }
+
+ /**
+ * 导出物流询价列表
+ */
+ @SaCheckPermission("amz:inquiryRequest:export")
+ @Log(title = "物流询价", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(BizInquiryRequestBo bo, HttpServletResponse response) {
+ List list = bizInquiryRequestService.queryList(bo);
+ ExcelUtil.exportExcel(list, "物流询价", BizInquiryRequestVo.class, response);
+ }
+
+ /**
+ * 获取物流询价详细信息
+ *
+ * @param id 主键
+ */
+ @SaCheckPermission("amz:inquiryRequest:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long id) {
+ return R.ok(bizInquiryRequestService.queryById(id));
+ }
+
+ /**
+ * 新增物流询价
+ */
+ @SaCheckPermission("amz:inquiryRequest:add")
+ @Log(title = "物流询价", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody BizInquiryRequestBo bo) {
+ return toAjax(bizInquiryRequestService.insertByBo(bo));
+ }
+
+ /**
+ * 修改物流询价
+ */
+ @SaCheckPermission("amz:inquiryRequest:edit")
+ @Log(title = "物流询价", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody BizInquiryRequestBo bo) {
+ return toAjax(bizInquiryRequestService.updateByBo(bo));
+ }
+
+ /**
+ * 删除物流询价
+ *
+ * @param ids 主键串
+ */
+ @SaCheckPermission("amz:inquiryRequest:remove")
+ @Log(title = "物流询价", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(bizInquiryRequestService.deleteWithValidByIds(List.of(ids), true));
+ }
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizLogisticsChannelController.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizLogisticsChannelController.java
new file mode 100644
index 0000000..21cdd4b
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizLogisticsChannelController.java
@@ -0,0 +1,112 @@
+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.BizLogisticsChannelVo;
+import org.asinkj.amz.domain.bo.BizLogisticsChannelBo;
+import org.asinkj.amz.service.IBizLogisticsChannelService;
+import org.asinkj.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 物流商渠道
+ * 前端访问路由地址为:/amz/logisticsChannel
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/logisticsChannel")
+public class BizLogisticsChannelController extends BaseController {
+
+ private final IBizLogisticsChannelService bizLogisticsChannelService;
+
+ /**
+ * 查询物流商渠道列表
+ */
+ @SaCheckPermission("amz:logisticsChannel:list")
+ @GetMapping("/list")
+ public TableDataInfo list(BizLogisticsChannelBo bo, PageQuery pageQuery) {
+ return bizLogisticsChannelService.queryPageList(bo, pageQuery);
+ }
+
+ @SaCheckPermission("amz:logisticsChannel:list")
+ @GetMapping("/list/all")
+ public TableDataInfo listAll() {
+ return bizLogisticsChannelService.queryListAll();
+ }
+
+ /**
+ * 导出物流商渠道列表
+ */
+ @SaCheckPermission("amz:logisticsChannel:export")
+ @Log(title = "物流商渠道", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(BizLogisticsChannelBo bo, HttpServletResponse response) {
+ List list = bizLogisticsChannelService.queryList(bo);
+ ExcelUtil.exportExcel(list, "物流商渠道", BizLogisticsChannelVo.class, response);
+ }
+
+ /**
+ * 获取物流商渠道详细信息
+ *
+ * @param id 主键
+ */
+ @SaCheckPermission("amz:logisticsChannel:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long id) {
+ return R.ok(bizLogisticsChannelService.queryById(id));
+ }
+
+ /**
+ * 新增物流商渠道
+ */
+ @SaCheckPermission("amz:logisticsChannel:add")
+ @Log(title = "物流商渠道", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody BizLogisticsChannelBo bo) {
+ return toAjax(bizLogisticsChannelService.insertByBo(bo));
+ }
+
+ /**
+ * 修改物流商渠道
+ */
+ @SaCheckPermission("amz:logisticsChannel:edit")
+ @Log(title = "物流商渠道", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody BizLogisticsChannelBo bo) {
+ return toAjax(bizLogisticsChannelService.updateByBo(bo));
+ }
+
+ /**
+ * 删除物流商渠道
+ *
+ * @param ids 主键串
+ */
+ @SaCheckPermission("amz:logisticsChannel:remove")
+ @Log(title = "物流商渠道", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(bizLogisticsChannelService.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
new file mode 100644
index 0000000..a58e33a
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizLogisticsQuoteController.java
@@ -0,0 +1,119 @@
+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.BizLogisticsQuoteVo;
+import org.asinkj.amz.domain.bo.BizLogisticsQuoteBo;
+import org.asinkj.amz.service.IBizLogisticsQuoteService;
+import org.asinkj.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 物流报价
+ * 前端访问路由地址为:/amz/logisticsQuote
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/logisticsQuote")
+public class BizLogisticsQuoteController extends BaseController {
+
+ private final IBizLogisticsQuoteService bizLogisticsQuoteService;
+
+ /**
+ * 查询物流报价列表
+ */
+ @SaCheckPermission("amz:logisticsQuote:list")
+ @GetMapping("/list")
+ public TableDataInfo list(BizLogisticsQuoteBo bo, PageQuery pageQuery) {
+ return bizLogisticsQuoteService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 根据目的地仓库和渠道查询物流报价列表
+ */
+ @SaCheckPermission("amz:logisticsQuote:list")
+ @GetMapping("/query/{destination}/{channelId}")
+ public TableDataInfo queryWithDesAndChannel(@PathVariable("destination") @NotNull(message = "目的地不能为空") String destination,
+ @PathVariable("channelId") @NotNull(message = "渠道不能为空") String channelId) {
+ return bizLogisticsQuoteService.listWithDesAndChannel(destination, channelId);
+ }
+
+
+
+
+ /**
+ * 导出物流报价列表
+ */
+ @SaCheckPermission("amz:logisticsQuote:export")
+ @Log(title = "物流报价", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(BizLogisticsQuoteBo bo, HttpServletResponse response) {
+ List list = bizLogisticsQuoteService.queryList(bo);
+ ExcelUtil.exportExcel(list, "物流报价", BizLogisticsQuoteVo.class, response);
+ }
+
+ /**
+ * 获取物流报价详细信息
+ *
+ * @param id 主键
+ */
+ @SaCheckPermission("amz:logisticsQuote:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long id) {
+ return R.ok(bizLogisticsQuoteService.queryById(id));
+ }
+
+ /**
+ * 新增物流报价
+ */
+ @SaCheckPermission("amz:logisticsQuote:add")
+ @Log(title = "物流报价", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody BizLogisticsQuoteBo bo) {
+ return toAjax(bizLogisticsQuoteService.insertByBo(bo));
+ }
+
+ /**
+ * 修改物流报价
+ */
+ @SaCheckPermission("amz:logisticsQuote:edit")
+ @Log(title = "物流报价", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody BizLogisticsQuoteBo bo) {
+ return toAjax(bizLogisticsQuoteService.updateByBo(bo));
+ }
+
+ /**
+ * 删除物流报价
+ *
+ * @param ids 主键串
+ */
+ @SaCheckPermission("amz:logisticsQuote:remove")
+ @Log(title = "物流报价", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(bizLogisticsQuoteService.deleteWithValidByIds(List.of(ids), true));
+ }
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizShipmentItemController.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizShipmentItemController.java
new file mode 100644
index 0000000..ba706b1
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizShipmentItemController.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.BizShipmentItemVo;
+import org.asinkj.amz.domain.bo.BizShipmentItemBo;
+import org.asinkj.amz.service.IBizShipmentItemService;
+import org.asinkj.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 货品明细
+ * 前端访问路由地址为:/amz/shipmentItem
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/shipmentItem")
+public class BizShipmentItemController extends BaseController {
+
+ private final IBizShipmentItemService bizShipmentItemService;
+
+ /**
+ * 查询货品明细列表
+ */
+ @SaCheckPermission("amz:shipmentItem:list")
+ @GetMapping("/list")
+ public TableDataInfo list(BizShipmentItemBo bo, PageQuery pageQuery) {
+ return bizShipmentItemService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出货品明细列表
+ */
+ @SaCheckPermission("amz:shipmentItem:export")
+ @Log(title = "货品明细", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(BizShipmentItemBo bo, HttpServletResponse response) {
+ List list = bizShipmentItemService.queryList(bo);
+ ExcelUtil.exportExcel(list, "货品明细", BizShipmentItemVo.class, response);
+ }
+
+ /**
+ * 获取货品明细详细信息
+ *
+ * @param id 主键
+ */
+ @SaCheckPermission("amz:shipmentItem:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long id) {
+ return R.ok(bizShipmentItemService.queryById(id));
+ }
+
+ /**
+ * 新增货品明细
+ */
+ @SaCheckPermission("amz:shipmentItem:add")
+ @Log(title = "货品明细", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody BizShipmentItemBo bo) {
+ return toAjax(bizShipmentItemService.insertByBo(bo));
+ }
+
+ /**
+ * 修改货品明细
+ */
+ @SaCheckPermission("amz:shipmentItem:edit")
+ @Log(title = "货品明细", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody BizShipmentItemBo bo) {
+ return toAjax(bizShipmentItemService.updateByBo(bo));
+ }
+
+ /**
+ * 删除货品明细
+ *
+ * @param ids 主键串
+ */
+ @SaCheckPermission("amz:shipmentItem:remove")
+ @Log(title = "货品明细", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(bizShipmentItemService.deleteWithValidByIds(List.of(ids), true));
+ }
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizShipmentPlanController.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizShipmentPlanController.java
new file mode 100644
index 0000000..30108ff
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizShipmentPlanController.java
@@ -0,0 +1,121 @@
+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.vo.BizLogisticsQuoteVo;
+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.BizShipmentPlanVo;
+import org.asinkj.amz.domain.bo.BizShipmentPlanBo;
+import org.asinkj.amz.service.IBizShipmentPlanService;
+import org.asinkj.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 货件计划
+ * 前端访问路由地址为:/amz/shipmentPlan
+ *
+ * @author shuo hu
+ * @date 2025-03-19
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/shipmentPlan")
+public class BizShipmentPlanController extends BaseController {
+
+ private final IBizShipmentPlanService bizShipmentPlanService;
+
+ /**
+ * 查询货件计划列表
+ */
+ @SaCheckPermission("amz:shipmentPlan:list")
+ @GetMapping("/list")
+ public TableDataInfo list(BizShipmentPlanBo bo, PageQuery pageQuery) {
+ return bizShipmentPlanService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出货件计划列表
+ */
+ @SaCheckPermission("amz:shipmentPlan:export")
+ @Log(title = "货件计划", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(BizShipmentPlanBo bo, HttpServletResponse response) {
+ List list = bizShipmentPlanService.queryList(bo);
+ ExcelUtil.exportExcel(list, "货件计划", BizShipmentPlanVo.class, response);
+ }
+
+ /**
+ * 获取货件计划详细信息
+ *
+ * @param id 主键
+ */
+ @SaCheckPermission("amz:shipmentPlan:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long id) {
+ return R.ok(bizShipmentPlanService.queryById(id));
+ }
+
+ /**
+ * 新增货件计划
+ */
+ @SaCheckPermission("amz:shipmentPlan:add")
+ @Log(title = "货件计划", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody BizShipmentPlanBo bo) {
+ return toAjax(bizShipmentPlanService.insertByBo(bo));
+ }
+
+ /**
+ * 修改货件计划
+ */
+ @SaCheckPermission("amz:shipmentPlan:edit")
+ @Log(title = "货件计划", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody BizShipmentPlanBo bo) {
+ return toAjax(bizShipmentPlanService.updateByBo(bo));
+ }
+
+ /**
+ * 删除货件计划
+ *
+ * @param ids 主键串
+ */
+ @SaCheckPermission("amz:shipmentPlan:remove")
+ @Log(title = "货件计划", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(bizShipmentPlanService.deleteWithValidByIds(List.of(ids), true));
+ }
+
+ /**
+ * 获取货件计划详细信息
+ *
+ *
+ */
+ @SaCheckPermission("amz:shipmentPlan:query")
+ @GetMapping("/quote/{destination}/{channel}")
+ public R> getQuote(@NotNull(message = "主键不能为空")
+ @PathVariable String destination,
+ @PathVariable String channel) {
+ return R.ok(bizShipmentPlanService.getQuote(destination,channel));
+ }
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizShipmentTrackingController.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizShipmentTrackingController.java
new file mode 100644
index 0000000..ae16fa0
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizShipmentTrackingController.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.BizShipmentTrackingVo;
+import org.asinkj.amz.domain.bo.BizShipmentTrackingBo;
+import org.asinkj.amz.service.IBizShipmentTrackingService;
+import org.asinkj.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 物流追踪
+ * 前端访问路由地址为:/amz/shipmentTracking
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/shipmentTracking")
+public class BizShipmentTrackingController extends BaseController {
+
+ private final IBizShipmentTrackingService bizShipmentTrackingService;
+
+ /**
+ * 查询物流追踪列表
+ */
+ @SaCheckPermission("amz:shipmentTracking:list")
+ @GetMapping("/list")
+ public TableDataInfo list(BizShipmentTrackingBo bo, PageQuery pageQuery) {
+ return bizShipmentTrackingService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出物流追踪列表
+ */
+ @SaCheckPermission("amz:shipmentTracking:export")
+ @Log(title = "物流追踪", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(BizShipmentTrackingBo bo, HttpServletResponse response) {
+ List list = bizShipmentTrackingService.queryList(bo);
+ ExcelUtil.exportExcel(list, "物流追踪", BizShipmentTrackingVo.class, response);
+ }
+
+ /**
+ * 获取物流追踪详细信息
+ *
+ * @param id 主键
+ */
+ @SaCheckPermission("amz:shipmentTracking:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long id) {
+ return R.ok(bizShipmentTrackingService.queryById(id));
+ }
+
+ /**
+ * 新增物流追踪
+ */
+ @SaCheckPermission("amz:shipmentTracking:add")
+ @Log(title = "物流追踪", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody BizShipmentTrackingBo bo) {
+ return toAjax(bizShipmentTrackingService.insertByBo(bo));
+ }
+
+ /**
+ * 修改物流追踪
+ */
+ @SaCheckPermission("amz:shipmentTracking:edit")
+ @Log(title = "物流追踪", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody BizShipmentTrackingBo bo) {
+ return toAjax(bizShipmentTrackingService.updateByBo(bo));
+ }
+
+ /**
+ * 删除物流追踪
+ *
+ * @param ids 主键串
+ */
+ @SaCheckPermission("amz:shipmentTracking:remove")
+ @Log(title = "物流追踪", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(bizShipmentTrackingService.deleteWithValidByIds(List.of(ids), true));
+ }
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/SysAmazonStoreController.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/SysAmazonStoreController.java
new file mode 100644
index 0000000..fe7a4ea
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/SysAmazonStoreController.java
@@ -0,0 +1,137 @@
+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.SysAmazonStoreVo;
+import org.asinkj.amz.domain.bo.SysAmazonStoreBo;
+import org.asinkj.amz.service.ISysAmazonStoreService;
+import org.asinkj.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 亚马逊店铺信息
+ * 前端访问路由地址为:/amz/amazonStore
+ *
+ * @author shuo hu
+ * @date 2025-03-17
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/amazonStore")
+public class SysAmazonStoreController extends BaseController {
+
+ private final ISysAmazonStoreService sysAmazonStoreService;
+
+ /**
+ * 查询亚马逊店铺信息列表
+ */
+ @SaCheckPermission("amz:amazonStore:list")
+ @GetMapping("/list")
+ public TableDataInfo list(SysAmazonStoreBo bo, PageQuery pageQuery) {
+ return sysAmazonStoreService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出亚马逊店铺信息列表
+ */
+ @SaCheckPermission("amz:amazonStore:export")
+ @Log(title = "亚马逊店铺信息", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(SysAmazonStoreBo bo, HttpServletResponse response) {
+ List list = sysAmazonStoreService.queryList(bo);
+ ExcelUtil.exportExcel(list, "亚马逊店铺信息", SysAmazonStoreVo.class, response);
+ }
+
+ /**
+ * 获取亚马逊店铺信息详细信息
+ *
+ * @param id 主键
+ */
+ @SaCheckPermission("amz:amazonStore:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long id) {
+ return R.ok(sysAmazonStoreService.queryById(id));
+ }
+
+ /**
+ * 新增亚马逊店铺信息
+ */
+ @SaCheckPermission("amz:amazonStore:add")
+ @Log(title = "亚马逊店铺信息", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody SysAmazonStoreBo bo) {
+ return toAjax(sysAmazonStoreService.insertByBo(bo));
+ }
+
+ /**
+ * 修改亚马逊店铺信息
+ */
+ @SaCheckPermission("amz:amazonStore:edit")
+ @Log(title = "亚马逊店铺信息", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody SysAmazonStoreBo bo) {
+ return toAjax(sysAmazonStoreService.updateByBo(bo));
+ }
+
+ /**
+ * 删除亚马逊店铺信息
+ *
+ * @param ids 主键串
+ */
+ @SaCheckPermission("amz:amazonStore:remove")
+ @Log(title = "亚马逊店铺信息", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(sysAmazonStoreService.deleteWithValidByIds(List.of(ids), true));
+ }
+
+
+ /**
+ * 亚马逊api
+ *
+ *
+ */
+ @SaCheckPermission("amz:amazonStore:remove")
+ @Log(title = "获取亚马逊店铺数据", businessType = BusinessType.OTHER)
+ @GetMapping("/amz-store")
+ public R getAmzApiToken() {
+ sysAmazonStoreService.collectAmzStoreData();
+ return R.ok();
+ }
+
+ /**
+ * 亚马逊api
+ *
+ *
+ */
+ @SaCheckPermission("amz:amazonStore:remove")
+ @Log(title = "亚马逊FBA", businessType = BusinessType.OTHER)
+ @GetMapping("/amz-fba/{startDate}/{endDate}")
+ public R getAmzFbaToken(@PathVariable String startDate, @PathVariable String endDate) {
+ try {
+ sysAmazonStoreService.pullAmzFBAData(startDate,endDate);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ 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
new file mode 100644
index 0000000..6686112
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizInquiryRequest.java
@@ -0,0 +1,95 @@
+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.time.LocalDateTime;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 物流询价对象 biz_inquiry_request
+ *
+ * @author shuo hu
+ * @date 2025-03-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("biz_inquiry_request")
+public class BizInquiryRequest extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键ID(自增序列)
+ */
+ private Long id;
+
+ /**
+ * 询价单号(规则:INQ+年月+6位序列)
+ */
+ private String inquiryNo;
+
+ /**
+ * 发起人id
+ */
+ private Long requesterId;
+
+ /**
+ * 目标物流商ID列表(JSON数组格式,示例:[101,202,303])
+ */
+ private String targetProviders;
+
+ /**
+ * 目的地(存储四级行政编码,如CN310115)
+ */
+ private String destination;
+
+ /**
+ * 运输方式(枚举值:AIR-空运/SEA-海运/LAND-公路/RAIL-铁路)
+ */
+ private String transportChannel;
+
+ /**
+ * 询价状态(状态机:OPEN-开放中/CLOSED-已关闭/COMPLETED-已完成)
+ */
+ private String inquiryStatus;
+
+ /**
+ * 报价截止时间(超过此时限自动关闭询价)
+ */
+ private LocalDateTime deadline;
+
+ /**
+ * $column.columnComment
+ */
+ @TableLogic
+ private String delFlag;
+
+ /**
+ * 渠道ID(system=dict_code,custom=自定义渠道ID)
+ */
+ private Long channelId;
+
+ /**
+ * 渠道名称
+ */
+ private String channelName;
+
+ /**
+ * 报价有效的开始日期
+ */
+ private Date effectiveStartTime;
+
+ /**
+ * 报价有效的结束日期
+ */
+ private Date effectiveEndTime;
+
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizLogisticsChannel.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizLogisticsChannel.java
new file mode 100644
index 0000000..af1e40d
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizLogisticsChannel.java
@@ -0,0 +1,66 @@
+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.io.Serial;
+
+/**
+ * 物流商渠道对象 biz_logistics_channel
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("biz_logistics_channel")
+public class BizLogisticsChannel extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 渠道ID
+ */
+ private Long id;
+
+ /**
+ * 物流商用户ID(关联sys_user)
+ */
+ private Long userId;
+
+ /**
+ * 渠道名称
+ */
+ private String channelName;
+
+ /**
+ * 渠道描述
+ */
+ private String description;
+
+ /**
+ * 删除标志(0正常 2删除)
+ */
+ @TableLogic
+ private String delFlag;
+
+ /**
+ * 渠道类型(system=系统/custom=自定义)
+ */
+ private String channelType;
+
+ /**
+ * 国家
+ */
+ private String country;
+
+ /**
+ * 运输方式
+ */
+ private String shippingMethod;
+
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizLogisticsCustomChannel.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizLogisticsCustomChannel.java
new file mode 100644
index 0000000..102b3c8
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizLogisticsCustomChannel.java
@@ -0,0 +1,51 @@
+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.io.Serial;
+
+/**
+ * 物流商自定义渠道对象 biz_logistics_custom_channel
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("biz_logistics_channel")
+public class BizLogisticsCustomChannel extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 渠道ID
+ */
+ private Long id;
+
+ /**
+ * 物流商用户ID(关联sys_user)
+ */
+ private Long userId;
+
+ /**
+ * 渠道名称
+ */
+ private String channelName;
+
+ /**
+ * 渠道描述
+ */
+ private String description;
+
+ /**
+ * 删除标志(0正常 2删除)
+ */
+ @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
new file mode 100644
index 0000000..9435023
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizLogisticsQuote.java
@@ -0,0 +1,93 @@
+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_quote
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("biz_logistics_quote")
+public class BizLogisticsQuote extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键ID
+ */
+ private Long id;
+
+ /**
+ * 物流商用户ID(关联sys_user表)
+ */
+ private Long userId;
+
+ /**
+ * 目的地(建议使用ISO国家代码如CN/US/GB)
+ */
+ private String destination;
+
+ /**
+ * 渠道名称(冗余存储,保证查询效率)
+ */
+ private String transportChannel;
+
+ /**
+ * 基础价格
+ */
+ private Long price;
+
+ /**
+ * 时效(单位:天)
+ */
+ private Long leadTime;
+
+ /**
+ * 附加费
+ */
+ private Long surcharge;
+
+ /**
+ * 报价生效日期
+ */
+ private Date quoteDate;
+
+ /**
+ * 提交状态(Y已提交 N未提交)
+ */
+ private String isSubmitted;
+
+ /**
+ * 报价备注
+ */
+ private String remark;
+
+ /**
+ * 删除标志(0正常 2删除)
+ */
+ @TableLogic
+ private String delFlag;
+
+ /**
+ * 渠道类型(system=系统/custom=自定义)
+ */
+ private String channelType;
+
+ /**
+ * 渠道ID(system=dict_code,custom=自定义渠道ID)
+ */
+ private Long channelId;
+
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizShipmentItem.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizShipmentItem.java
new file mode 100644
index 0000000..a2bd8d6
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizShipmentItem.java
@@ -0,0 +1,83 @@
+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_shipment_item
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("biz_shipment_item")
+public class BizShipmentItem extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键ID
+ */
+ private Long id;
+
+ /**
+ * 关联货件ID
+ */
+ private String shipmentId;
+
+ /**
+ * 商家SKU
+ */
+ private String msku;
+
+ /**
+ * 仓储编码
+ */
+ private String fnsku;
+
+ /**
+ * 发货量
+ */
+ private Long quantityShipped;
+
+ /**
+ * 收货量
+ */
+ private Long quantityReceived;
+
+ /**
+ * 预处理说明
+ */
+ private String prepInstruction;
+
+ /**
+ * 责任方
+ */
+ private String prepOwner;
+
+ /**
+ * 商品SKU
+ */
+ private String sku;
+
+ /**
+ * 有效期
+ */
+ private Date expiration;
+
+ /**
+ * $column.columnComment
+ */
+ @TableLogic
+ private String delFlag;
+
+
+}
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
new file mode 100644
index 0000000..7f1e63c
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizShipmentPlan.java
@@ -0,0 +1,137 @@
+package org.asinkj.amz.domain;
+
+import org.asinkj.amz.hanlder.AddressTypeHandler;
+import org.asinkj.asinking.entity.FbaShipmentApiResponse;
+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_shipment_plan
+ *
+ * @author shuo hu
+ * @date 2025-03-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("biz_shipment_plan")
+public class BizShipmentPlan extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键ID
+ */
+ private Long id;
+
+ /**
+ * 关联系统ID
+ */
+ private Long sid;
+
+ /**
+ * 货件编号
+ */
+ private String shipmentId;
+
+ /**
+ * 货件名称
+ */
+ private String shipmentName;
+
+ /**
+ * 是否关闭
+ */
+ private String isClosed;
+
+ /**
+ * 货件状态
+ */
+ private String shipmentStatus;
+
+ /**
+ * 物流中心编码
+ */
+ private String destinationFulfillmentCenterId;
+
+ /**
+ * 运输模式
+ */
+ private String shippingMode;
+
+ /**
+ * 运输方案
+ */
+ private String shippingSolution;
+
+ /**
+ * 最后更新时间
+ */
+ private Date gmtModified;
+
+ /**
+ * 创建时间
+ */
+ private Date gmtCreate;
+
+ /**
+ * 同步时间
+ */
+ private Date syncTime;
+
+ /**
+ * 计划发货日期
+ */
+ private Date staShipmentDate;
+
+ /**
+ * 预计到货开始日
+ */
+ private Date staDeliveryStartDate;
+
+ /**
+ * 预计到货截止日
+ */
+ private Date staDeliveryEndDate;
+
+ /**
+ * 发货地址
+ */
+ @TableField(typeHandler = AddressTypeHandler.class)
+ private FbaShipmentApiResponse.Address shipFromAddress;
+
+ /**
+ * 收货地址
+ */
+ @TableField(typeHandler = AddressTypeHandler.class)
+ private FbaShipmentApiResponse.Address shipToAddress;
+
+ /**
+ * 参考编号
+ */
+ private String referenceId;
+
+ /**
+ * 入库计划ID
+ */
+ private String staInboundPlanId;
+
+ /**
+ * 是否STA计划
+ */
+ private String isSta;
+
+ /**
+ * 删除标记
+ */
+ @TableLogic
+ private String delFlag;
+
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizShipmentTracking.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizShipmentTracking.java
new file mode 100644
index 0000000..a44f9f1
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizShipmentTracking.java
@@ -0,0 +1,51 @@
+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.io.Serial;
+
+/**
+ * 物流追踪对象 biz_shipment_tracking
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("biz_shipment_tracking")
+public class BizShipmentTracking extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键ID
+ */
+ private Long id;
+
+ /**
+ * 关联货件ID
+ */
+ private String shipmentId;
+
+ /**
+ * 箱号
+ */
+ private String boxId;
+
+ /**
+ * 物流单号
+ */
+ private String trackingNumber;
+
+ /**
+ * $column.columnComment
+ */
+ @TableLogic
+ private String delFlag;
+
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/SysAmazonStore.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/SysAmazonStore.java
new file mode 100644
index 0000000..495339c
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/SysAmazonStore.java
@@ -0,0 +1,104 @@
+package org.asinkj.amz.domain;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.asinkj.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 亚马逊店铺信息对象 sys_amazon_store
+ *
+ * @author shuo hu
+ * @date 2025-03-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_amazon_store")
+public class SysAmazonStore extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键ID
+ */
+ @TableId(value = "id")
+ private Long id;
+
+ /**
+ * 所属用户ID(关联sys_user)
+ */
+ private Long userId;
+
+ /**
+ * 领星ERP店铺标识ID
+ */
+ private Long sid;
+
+ /**
+ * 站点ID
+ */
+ private Long mid;
+
+ /**
+ * 店铺名称
+ */
+ @JsonProperty("name")
+ private String storeName;
+
+ /**
+ * 亚马逊店铺ID(如AZTOL**)
+ */
+ @JsonProperty("seller_id")
+ private String sellerId;
+
+ /**
+ * 店铺账户名称
+ */
+ @JsonProperty("account_name")
+ private String accountName;
+
+ /**
+ * 店铺账号ID
+ */
+ @JsonProperty("seller_account_id")
+ private Long sellerAccountId;
+
+ /**
+ * 站点简称(如NA/EU)
+ */
+ private String region;
+
+ /**
+ * 商城所在国家
+ */
+ private String country;
+
+ /**
+ * 亚马逊市场ID
+ */
+ @JsonProperty("marketplace_id")
+ private String marketplaceId;
+
+ /**
+ * 广告授权 0未授权 1已授权
+ */
+ @JsonProperty("has_ads_setting")
+ private Long hasAdsSetting;
+
+ /**
+ * 店铺状态 0停用 1正常 2异常 3欠费
+ */
+ private Long status;
+
+ /**
+ * 删除标志(0存在 2删除)
+ */
+ @TableLogic
+ private String delFlag;
+
+
+}
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
new file mode 100644
index 0000000..a2c9a20
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizInquiryRequestBo.java
@@ -0,0 +1,96 @@
+package org.asinkj.amz.domain.bo;
+
+import org.asinkj.amz.domain.BizInquiryRequest;
+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_inquiry_request
+ *
+ * @author shuo hu
+ * @date 2025-03-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = BizInquiryRequest.class, reverseConvertGenerate = false)
+public class BizInquiryRequestBo extends BaseEntity {
+
+ /**
+ * 主键ID(自增序列)
+ */
+ private Long id;
+
+ /**
+ * 询价单号(规则:INQ+年月+6位序列)
+ */
+ private String inquiryNo;
+
+ /**
+ * 发起人id
+ */
+ @NotNull(message = "发起人id不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long requesterId;
+
+ /**
+ * 目标物流商ID列表(JSON数组格式,示例:[101,202,303])
+ */
+ @NotBlank(message = "目标物流商ID列表(JSON数组格式,示例:[101,202,303])不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String targetProviders;
+
+ /**
+ * 目的地(存储四级行政编码,如CN310115)
+ */
+ @NotBlank(message = "目的地(存储四级行政编码,如CN310115)不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String destination;
+
+ /**
+ * 运输方式(枚举值:AIR-空运/SEA-海运/LAND-公路/RAIL-铁路)
+ */
+ @NotBlank(message = "运输方式(枚举值:AIR-空运/SEA-海运/LAND-公路/RAIL-铁路)不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String transportChannel;
+
+ /**
+ * 询价状态(状态机:OPEN-开放中/CLOSED-已关闭/COMPLETED-已完成)
+ */
+ @NotBlank(message = "询价状态(状态机:OPEN-开放中/CLOSED-已关闭/COMPLETED-已完成)不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String inquiryStatus;
+
+ /**
+ * 报价截止时间(超过此时限自动关闭询价)
+ */
+ @NotNull(message = "报价截止时间(超过此时限自动关闭询价)不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Date deadline;
+
+ /**
+ * 渠道ID(system=dict_code,custom=自定义渠道ID)
+ */
+ @NotNull(message = "渠道ID(system=dict_code,custom=自定义渠道ID)不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long channelId;
+
+ /**
+ * 渠道名称
+ */
+ @NotBlank(message = "渠道名称不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String channelName;
+
+ /**
+ * 报价有效的开始日期
+ */
+ @NotNull(message = "报价有效的开始日期不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Date effectiveStartTime;
+
+ /**
+ * 报价有效的结束日期
+ */
+ @NotNull(message = "报价有效的结束日期不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Date effectiveEndTime;
+
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsChannelBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsChannelBo.java
new file mode 100644
index 0000000..56a629b
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsChannelBo.java
@@ -0,0 +1,66 @@
+package org.asinkj.amz.domain.bo;
+
+import org.asinkj.amz.domain.BizLogisticsChannel;
+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.*;
+
+/**
+ * 物流商渠道业务对象 biz_logistics_channel
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = BizLogisticsChannel.class, reverseConvertGenerate = false)
+public class BizLogisticsChannelBo extends BaseEntity {
+
+ /**
+ * 渠道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;
+
+ /**
+ * 渠道名称
+ */
+ @NotBlank(message = "渠道名称不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String channelName;
+
+ /**
+ * 渠道描述
+ */
+ @NotBlank(message = "渠道描述不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String description;
+
+ /**
+ * 渠道类型(system=系统/custom=自定义)
+ */
+// @NotBlank(message = "渠道类型(system=系统/custom=自定义)不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String channelType;
+
+ /**
+ * 国家
+ */
+ @NotBlank(message = "国家不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String country;
+
+ /**
+ * 运输方式
+ */
+ @NotBlank(message = "运输方式不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String shippingMethod;
+
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsCustomChannelBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsCustomChannelBo.java
new file mode 100644
index 0000000..d1cfe8d
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsCustomChannelBo.java
@@ -0,0 +1,48 @@
+package org.asinkj.amz.domain.bo;
+
+import org.asinkj.amz.domain.BizLogisticsCustomChannel;
+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.*;
+
+/**
+ * 物流商自定义渠道业务对象 biz_logistics_custom_channel
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = BizLogisticsCustomChannel.class, reverseConvertGenerate = false)
+public class BizLogisticsCustomChannelBo extends BaseEntity {
+
+ /**
+ * 渠道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;
+
+ /**
+ * 渠道名称
+ */
+ @NotBlank(message = "渠道名称不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String channelName;
+
+ /**
+ * 渠道描述
+ */
+ @NotBlank(message = "渠道描述不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String description;
+
+
+}
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
new file mode 100644
index 0000000..86412fa
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsQuoteBo.java
@@ -0,0 +1,98 @@
+package org.asinkj.amz.domain.bo;
+
+import org.asinkj.amz.domain.BizLogisticsQuote;
+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_quote
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = BizLogisticsQuote.class, reverseConvertGenerate = false)
+public class BizLogisticsQuoteBo extends BaseEntity {
+
+ /**
+ * 主键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 transportChannel;
+
+ /**
+ * 基础价格
+ */
+ @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;
+
+ /**
+ * 报价生效日期
+ */
+ @NotNull(message = "报价生效日期不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Date quoteDate;
+
+ /**
+ * 提交状态(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;
+
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizShipmentItemBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizShipmentItemBo.java
new file mode 100644
index 0000000..4bb1755
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizShipmentItemBo.java
@@ -0,0 +1,86 @@
+package org.asinkj.amz.domain.bo;
+
+import org.asinkj.amz.domain.BizShipmentItem;
+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_shipment_item
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = BizShipmentItem.class, reverseConvertGenerate = false)
+public class BizShipmentItemBo extends BaseEntity {
+
+ /**
+ * 主键ID
+ */
+ @NotNull(message = "主键ID不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long id;
+
+ /**
+ * 关联货件ID
+ */
+ @NotBlank(message = "关联货件ID不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String shipmentId;
+
+ /**
+ * 商家SKU
+ */
+ @NotBlank(message = "商家SKU不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String msku;
+
+ /**
+ * 仓储编码
+ */
+ @NotBlank(message = "仓储编码不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String fnsku;
+
+ /**
+ * 发货量
+ */
+ @NotNull(message = "发货量不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long quantityShipped;
+
+ /**
+ * 收货量
+ */
+ @NotNull(message = "收货量不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long quantityReceived;
+
+ /**
+ * 预处理说明
+ */
+ @NotBlank(message = "预处理说明不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String prepInstruction;
+
+ /**
+ * 责任方
+ */
+ @NotBlank(message = "责任方不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String prepOwner;
+
+ /**
+ * 商品SKU
+ */
+ @NotBlank(message = "商品SKU不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String sku;
+
+ /**
+ * 有效期
+ */
+ @NotNull(message = "有效期不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Date expiration;
+
+
+}
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
new file mode 100644
index 0000000..2532308
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizShipmentPlanBo.java
@@ -0,0 +1,147 @@
+package org.asinkj.amz.domain.bo;
+
+import org.asinkj.amz.domain.BizShipmentPlan;
+import org.asinkj.asinking.entity.FbaShipmentApiResponse;
+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_shipment_plan
+ *
+ * @author shuo hu
+ * @date 2025-03-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = BizShipmentPlan.class, reverseConvertGenerate = false)
+public class BizShipmentPlanBo extends BaseEntity {
+
+ /**
+ * 主键ID
+ */
+ @NotNull(message = "主键ID不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long id;
+
+ /**
+ * 关联系统ID
+ */
+ @NotNull(message = "关联系统ID不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long sid;
+
+ /**
+ * 货件编号
+ */
+ @NotBlank(message = "货件编号不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String shipmentId;
+
+ /**
+ * 货件名称
+ */
+ @NotBlank(message = "货件名称不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String shipmentName;
+
+ /**
+ * 是否关闭
+ */
+ @NotBlank(message = "是否关闭不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String isClosed;
+
+ /**
+ * 货件状态
+ */
+ @NotBlank(message = "货件状态不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String shipmentStatus;
+
+ /**
+ * 物流中心编码
+ */
+ @NotBlank(message = "物流中心编码不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String destinationFulfillmentCenterId;
+
+ /**
+ * 运输模式
+ */
+ @NotBlank(message = "运输模式不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String shippingMode;
+
+ /**
+ * 运输方案
+ */
+ @NotBlank(message = "运输方案不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String shippingSolution;
+
+ /**
+ * 最后更新时间
+ */
+ @NotNull(message = "最后更新时间不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Date gmtModified;
+
+ /**
+ * 创建时间
+ */
+ @NotNull(message = "创建时间不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Date gmtCreate;
+
+ /**
+ * 同步时间
+ */
+ @NotNull(message = "同步时间不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Date syncTime;
+
+ /**
+ * 计划发货日期
+ */
+ @NotNull(message = "计划发货日期不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Date staShipmentDate;
+
+ /**
+ * 预计到货开始日
+ */
+ @NotNull(message = "预计到货开始日不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Date staDeliveryStartDate;
+
+ /**
+ * 预计到货截止日
+ */
+ @NotNull(message = "预计到货截止日不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Date staDeliveryEndDate;
+
+ /**
+ * 发货地址
+ */
+ @NotBlank(message = "发货地址不能为空", groups = { AddGroup.class, EditGroup.class })
+ private FbaShipmentApiResponse.Address shipFromAddress;
+
+ /**
+ * 收货地址
+ */
+ @NotBlank(message = "收货地址不能为空", groups = { AddGroup.class, EditGroup.class })
+ private FbaShipmentApiResponse.Address shipToAddress;
+
+ /**
+ * 参考编号
+ */
+ @NotBlank(message = "参考编号不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String referenceId;
+
+ /**
+ * 入库计划ID
+ */
+ @NotBlank(message = "入库计划ID不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String staInboundPlanId;
+
+ /**
+ * 是否STA计划
+ */
+ @NotBlank(message = "是否STA计划不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String isSta;
+
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizShipmentTrackingBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizShipmentTrackingBo.java
new file mode 100644
index 0000000..35f641d
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizShipmentTrackingBo.java
@@ -0,0 +1,48 @@
+package org.asinkj.amz.domain.bo;
+
+import org.asinkj.amz.domain.BizShipmentTracking;
+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.*;
+
+/**
+ * 物流追踪业务对象 biz_shipment_tracking
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = BizShipmentTracking.class, reverseConvertGenerate = false)
+public class BizShipmentTrackingBo extends BaseEntity {
+
+ /**
+ * 主键ID
+ */
+ @NotNull(message = "主键ID不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long id;
+
+ /**
+ * 关联货件ID
+ */
+ @NotBlank(message = "关联货件ID不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String shipmentId;
+
+ /**
+ * 箱号
+ */
+ @NotBlank(message = "箱号不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String boxId;
+
+ /**
+ * 物流单号
+ */
+ @NotBlank(message = "物流单号不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String trackingNumber;
+
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/SysAmazonStoreBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/SysAmazonStoreBo.java
new file mode 100644
index 0000000..1c270d0
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/SysAmazonStoreBo.java
@@ -0,0 +1,102 @@
+package org.asinkj.amz.domain.bo;
+
+import org.asinkj.amz.domain.SysAmazonStore;
+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.*;
+
+/**
+ * 亚马逊店铺信息业务对象 sys_amazon_store
+ *
+ * @author shuo hu
+ * @date 2025-03-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysAmazonStore.class, reverseConvertGenerate = false)
+public class SysAmazonStoreBo extends BaseEntity {
+
+ /**
+ * 主键ID
+ */
+ @NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
+ private Long id;
+
+ /**
+ * 所属用户ID(关联sys_user)
+ */
+ @NotNull(message = "所属用户ID(关联sys_user)不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long userId;
+
+ /**
+ * 领星ERP店铺标识ID
+ */
+ @NotNull(message = "领星ERP店铺标识ID不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long sid;
+
+ /**
+ * 站点ID
+ */
+ @NotNull(message = "站点ID不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long mid;
+
+ /**
+ * 店铺名称
+ */
+ @NotBlank(message = "店铺名称不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String storeName;
+
+ /**
+ * 亚马逊店铺ID(如AZTOL**)
+ */
+ @NotBlank(message = "亚马逊店铺ID(如AZTOL**)不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String sellerId;
+
+ /**
+ * 店铺账户名称
+ */
+ @NotBlank(message = "店铺账户名称不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String accountName;
+
+ /**
+ * 店铺账号ID
+ */
+ @NotNull(message = "店铺账号ID不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long sellerAccountId;
+
+ /**
+ * 站点简称(如NA/EU)
+ */
+ @NotBlank(message = "站点简称(如NA/EU)不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String region;
+
+ /**
+ * 商城所在国家
+ */
+ @NotBlank(message = "商城所在国家不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String country;
+
+ /**
+ * 亚马逊市场ID
+ */
+ @NotBlank(message = "亚马逊市场ID不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String marketplaceId;
+
+ /**
+ * 广告授权 0未授权 1已授权
+ */
+ @NotNull(message = "广告授权 0未授权 1已授权不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long hasAdsSetting;
+
+ /**
+ * 店铺状态 0停用 1正常 2异常 3欠费
+ */
+ @NotNull(message = "店铺状态 0停用 1正常 2异常 3欠费不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long status;
+
+
+}
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
new file mode 100644
index 0000000..f456ed0
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizInquiryRequestVo.java
@@ -0,0 +1,115 @@
+package org.asinkj.amz.domain.vo;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.asinkj.amz.domain.BizInquiryRequest;
+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_inquiry_request
+ *
+ * @author shuo hu
+ * @date 2025-03-21
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = BizInquiryRequest.class)
+public class BizInquiryRequestVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键ID(自增序列)
+ */
+ @ExcelProperty(value = "主键ID", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "自=增序列")
+ private Long id;
+
+ /**
+ * 询价单号(规则:INQ+年月+6位序列)
+ */
+ @ExcelProperty(value = "询价单号", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "规=则:INQ+年月+6位序列")
+ private String inquiryNo;
+
+ /**
+ * 发起人id
+ */
+ @ExcelProperty(value = "发起人id")
+ private Long requesterId;
+
+ /**
+ * 目标物流商ID列表(JSON数组格式,示例:[101,202,303])
+ */
+ @ExcelProperty(value = "目标物流商ID列表", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "J=SON数组格式,示例:[101,202,303]")
+ private String targetProviders;
+
+ /**
+ * 目的地(存储四级行政编码,如CN310115)
+ */
+ @ExcelProperty(value = "目的地", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "存=储四级行政编码,如CN310115")
+ private String destination;
+
+ /**
+ * 运输方式(枚举值:AIR-空运/SEA-海运/LAND-公路/RAIL-铁路)
+ */
+ @ExcelProperty(value = "运输方式", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "枚=举值:AIR-空运/SEA-海运/LAND-公路/RAIL-铁路")
+ private String transportChannel;
+
+ /**
+ * 询价状态(状态机:OPEN-开放中/CLOSED-已关闭/COMPLETED-已完成)
+ */
+ @ExcelProperty(value = "询价状态", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "状=态机:OPEN-开放中/CLOSED-已关闭/COMPLETED-已完成")
+ private String inquiryStatus;
+
+ /**
+ * 报价截止时间(超过此时限自动关闭询价)
+ */
+ @ExcelProperty(value = "报价截止时间", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "超=过此时限自动关闭询价")
+ private LocalDateTime deadline;
+
+ /**
+ * 渠道ID(system=dict_code,custom=自定义渠道ID)
+ */
+ @ExcelProperty(value = "渠道ID", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "s=ystem=dict_code,custom=自定义渠道ID")
+ private Long channelId;
+
+ /**
+ * 渠道名称
+ */
+ @ExcelProperty(value = "渠道名称")
+ private String channelName;
+
+ /**
+ * 报价有效的开始日期
+ */
+ @ExcelProperty(value = "报价有效的开始日期")
+ private Date effectiveStartTime;
+
+ /**
+ * 报价有效的结束日期
+ */
+ @ExcelProperty(value = "报价有效的结束日期")
+ private Date effectiveEndTime;
+
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsChannelVo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsChannelVo.java
new file mode 100644
index 0000000..9a38796
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsChannelVo.java
@@ -0,0 +1,76 @@
+package org.asinkj.amz.domain.vo;
+
+import org.asinkj.amz.domain.BizLogisticsChannel;
+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_channel
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = BizLogisticsChannel.class)
+public class BizLogisticsChannelVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 渠道ID
+ */
+ @ExcelProperty(value = "渠道ID")
+ private Long id;
+
+ /**
+ * 物流商用户ID(关联sys_user)
+ */
+ @ExcelProperty(value = "物流商用户ID", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "关=联sys_user")
+ private Long userId;
+
+ /**
+ * 渠道名称
+ */
+ @ExcelProperty(value = "渠道名称")
+ private String channelName;
+
+ /**
+ * 渠道描述
+ */
+ @ExcelProperty(value = "渠道描述")
+ private String description;
+
+ /**
+ * 渠道类型(system=系统/custom=自定义)
+ */
+ @ExcelProperty(value = "渠道类型", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "s=ystem=系统/custom=自定义")
+ private String channelType;
+
+ /**
+ * 国家
+ */
+ @ExcelProperty(value = "国家")
+ private String country;
+
+ /**
+ * 运输方式
+ */
+ @ExcelProperty(value = "运输方式")
+ private String shippingMethod;
+
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsCustomChannelVo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsCustomChannelVo.java
new file mode 100644
index 0000000..48f007c
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsCustomChannelVo.java
@@ -0,0 +1,57 @@
+package org.asinkj.amz.domain.vo;
+
+import org.asinkj.amz.domain.BizLogisticsCustomChannel;
+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_custom_channel
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = BizLogisticsCustomChannel.class)
+public class BizLogisticsCustomChannelVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 渠道ID
+ */
+ @ExcelProperty(value = "渠道ID")
+ private Long id;
+
+ /**
+ * 物流商用户ID(关联sys_user)
+ */
+ @ExcelProperty(value = "物流商用户ID", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "关=联sys_user")
+ private Long userId;
+
+ /**
+ * 渠道名称
+ */
+ @ExcelProperty(value = "渠道名称")
+ private String channelName;
+
+ /**
+ * 渠道描述
+ */
+ @ExcelProperty(value = "渠道描述")
+ private String description;
+
+
+}
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
new file mode 100644
index 0000000..769a18a
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsQuoteVo.java
@@ -0,0 +1,113 @@
+package org.asinkj.amz.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.asinkj.amz.domain.BizLogisticsQuote;
+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_quote
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = BizLogisticsQuote.class)
+public class BizLogisticsQuoteVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键ID
+ */
+ @ExcelProperty(value = "主键ID")
+ private Long id;
+
+ /**
+ * 物流商用户ID(关联sys_user表)
+ */
+ @ExcelProperty(value = "物流商用户ID", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "关=联sys_user表")
+ private Long userId;
+
+ /**
+ * 目的地(建议使用ISO国家代码如CN/US/GB)
+ */
+ @ExcelProperty(value = "目的地", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "建=议使用ISO国家代码如CN/US/GB")
+ private String destination;
+
+ /**
+ * 渠道名称(冗余存储,保证查询效率)
+ */
+ @ExcelProperty(value = "渠道名称", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "冗=余存储,保证查询效率")
+ private String transportChannel;
+
+ /**
+ * 基础价格
+ */
+ @ExcelProperty(value = "基础价格")
+ private Long price;
+
+ /**
+ * 时效(单位:天)
+ */
+ @ExcelProperty(value = "时效", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "单=位:天")
+ private Long leadTime;
+
+ /**
+ * 附加费
+ */
+ @ExcelProperty(value = "附加费")
+ private Long surcharge;
+
+ /**
+ * 报价生效日期
+ */
+ @ExcelProperty(value = "报价生效日期")
+ private Date quoteDate;
+
+ /**
+ * 提交状态(Y已提交 N未提交)
+ */
+ @ExcelProperty(value = "提交状态", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "Y=已提交,N=未提交")
+ private String isSubmitted;
+
+ /**
+ * 报价备注
+ */
+ @ExcelProperty(value = "报价备注")
+ private String remark;
+
+ /**
+ * 渠道类型(system=系统/custom=自定义)
+ */
+ @ExcelProperty(value = "渠道类型", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "s=ystem=系统/custom=自定义")
+ private String channelType;
+
+ /**
+ * 渠道ID(system=dict_code,custom=自定义渠道ID)
+ */
+ @ExcelProperty(value = "渠道ID", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "s=ystem=dict_code,custom=自定义渠道ID")
+ private Long channelId;
+
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizShipmentItemVo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizShipmentItemVo.java
new file mode 100644
index 0000000..be055c8
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizShipmentItemVo.java
@@ -0,0 +1,94 @@
+package org.asinkj.amz.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.asinkj.amz.domain.BizShipmentItem;
+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_shipment_item
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = BizShipmentItem.class)
+public class BizShipmentItemVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键ID
+ */
+ @ExcelProperty(value = "主键ID")
+ private Long id;
+
+ /**
+ * 关联货件ID
+ */
+ @ExcelProperty(value = "关联货件ID")
+ private String shipmentId;
+
+ /**
+ * 商家SKU
+ */
+ @ExcelProperty(value = "商家SKU")
+ private String msku;
+
+ /**
+ * 仓储编码
+ */
+ @ExcelProperty(value = "仓储编码")
+ private String fnsku;
+
+ /**
+ * 发货量
+ */
+ @ExcelProperty(value = "发货量")
+ private Long quantityShipped;
+
+ /**
+ * 收货量
+ */
+ @ExcelProperty(value = "收货量")
+ private Long quantityReceived;
+
+ /**
+ * 预处理说明
+ */
+ @ExcelProperty(value = "预处理说明")
+ private String prepInstruction;
+
+ /**
+ * 责任方
+ */
+ @ExcelProperty(value = "责任方")
+ private String prepOwner;
+
+ /**
+ * 商品SKU
+ */
+ @ExcelProperty(value = "商品SKU")
+ private String sku;
+
+ /**
+ * 有效期
+ */
+ @ExcelProperty(value = "有效期")
+ private Date expiration;
+
+
+}
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
new file mode 100644
index 0000000..e6cd85a
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizShipmentPlanVo.java
@@ -0,0 +1,168 @@
+package org.asinkj.amz.domain.vo;
+
+import java.util.Date;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.asinkj.amz.domain.BizShipmentPlan;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.asinkj.amz.hanlder.AddressTypeHandler;
+import org.asinkj.asinking.entity.FbaShipmentApiResponse;
+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_shipment_plan
+ *
+ * @author shuo hu
+ * @date 2025-03-19
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = BizShipmentPlan.class)
+public class BizShipmentPlanVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键ID
+ */
+ @ExcelProperty(value = "主键ID")
+ private Long id;
+
+ /**
+ * 关联系统ID
+ */
+ @ExcelProperty(value = "关联系统ID")
+ private Long sid;
+
+ /**
+ * 货件编号
+ */
+ @ExcelProperty(value = "货件编号")
+ private String shipmentId;
+
+ /**
+ * 货件名称
+ */
+ @ExcelProperty(value = "货件名称")
+ private String shipmentName;
+
+ /**
+ * 是否关闭
+ */
+ @ExcelProperty(value = "是否关闭")
+ private String isClosed;
+
+ /**
+ * 货件状态
+ */
+ @ExcelProperty(value = "货件状态")
+ private String shipmentStatus;
+
+ /**
+ * 物流中心编码
+ */
+ @ExcelProperty(value = "物流中心编码")
+ private String destinationFulfillmentCenterId;
+
+ /**
+ * 运输模式
+ */
+ @ExcelProperty(value = "运输模式")
+ private String shippingMode;
+
+ /**
+ * 运输方案
+ */
+ @ExcelProperty(value = "运输方案")
+ private String shippingSolution;
+
+ /**
+ * 最后更新时间
+ */
+ @ExcelProperty(value = "最后更新时间")
+ private Date gmtModified;
+
+ /**
+ * 创建时间
+ */
+ @ExcelProperty(value = "创建时间")
+ private Date gmtCreate;
+
+ /**
+ * 同步时间
+ */
+ @ExcelProperty(value = "同步时间")
+ private Date syncTime;
+
+ /**
+ * 计划发货日期
+ */
+ @ExcelProperty(value = "计划发货日期")
+ private Date staShipmentDate;
+
+ /**
+ * 预计到货开始日
+ */
+ @ExcelProperty(value = "预计到货开始日")
+ private Date staDeliveryStartDate;
+
+ /**
+ * 预计到货截止日
+ */
+ @ExcelProperty(value = "预计到货截止日")
+ private Date staDeliveryEndDate;
+
+ /**
+ * 发货地址
+ */
+ @ExcelProperty(value = "发货地址")
+ @TableField(value = "ship_from_address", typeHandler = AddressTypeHandler.class)
+ private FbaShipmentApiResponse.Address shipFromAddress;
+
+ /**
+ * 收货地址
+ */
+ @ExcelProperty(value = "收货地址")
+ @TableField(value = "ship_to_address", typeHandler = AddressTypeHandler.class)
+ private FbaShipmentApiResponse.Address shipToAddress;
+
+ /**
+ * 参考编号
+ */
+ @ExcelProperty(value = "参考编号")
+ private String referenceId;
+
+ /**
+ * 入库计划ID
+ */
+ @ExcelProperty(value = "入库计划ID")
+ private String staInboundPlanId;
+
+ /**
+ * 是否STA计划
+ */
+ @ExcelProperty(value = "是否STA计划")
+ private String isSta;
+
+
+ // 显式添加 Setter(即使使用 @Data)
+ public void setShipFromAddress(FbaShipmentApiResponse.Address shipFromAddress) {
+ System.out.printf(String.valueOf(shipToAddress));
+ this.shipFromAddress = shipFromAddress;
+ }
+
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizShipmentTrackingVo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizShipmentTrackingVo.java
new file mode 100644
index 0000000..d50ea35
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizShipmentTrackingVo.java
@@ -0,0 +1,56 @@
+package org.asinkj.amz.domain.vo;
+
+import org.asinkj.amz.domain.BizShipmentTracking;
+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_shipment_tracking
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = BizShipmentTracking.class)
+public class BizShipmentTrackingVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键ID
+ */
+ @ExcelProperty(value = "主键ID")
+ private Long id;
+
+ /**
+ * 关联货件ID
+ */
+ @ExcelProperty(value = "关联货件ID")
+ private String shipmentId;
+
+ /**
+ * 箱号
+ */
+ @ExcelProperty(value = "箱号")
+ private String boxId;
+
+ /**
+ * 物流单号
+ */
+ @ExcelProperty(value = "物流单号")
+ private String trackingNumber;
+
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/SysAmazonStoreVo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/SysAmazonStoreVo.java
new file mode 100644
index 0000000..badcab2
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/SysAmazonStoreVo.java
@@ -0,0 +1,113 @@
+package org.asinkj.amz.domain.vo;
+
+import org.asinkj.amz.domain.SysAmazonStore;
+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_amazon_store
+ *
+ * @author shuo hu
+ * @date 2025-03-17
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysAmazonStore.class)
+public class SysAmazonStoreVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键ID
+ */
+ @ExcelProperty(value = "主键ID")
+ private Long id;
+
+ /**
+ * 所属用户ID(关联sys_user)
+ */
+ @ExcelProperty(value = "所属用户ID", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "关=联sys_user")
+ private Long userId;
+
+ /**
+ * 领星ERP店铺标识ID
+ */
+ @ExcelProperty(value = "领星ERP店铺标识ID")
+ private Long sid;
+
+ /**
+ * 站点ID
+ */
+ @ExcelProperty(value = "站点ID")
+ private Long mid;
+
+ /**
+ * 店铺名称
+ */
+ @ExcelProperty(value = "店铺名称")
+ private String storeName;
+
+ /**
+ * 亚马逊店铺ID(如AZTOL**)
+ */
+ @ExcelProperty(value = "亚马逊店铺ID", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "如=AZTOL**")
+ private String sellerId;
+
+ /**
+ * 店铺账户名称
+ */
+ @ExcelProperty(value = "店铺账户名称")
+ private String accountName;
+
+ /**
+ * 店铺账号ID
+ */
+ @ExcelProperty(value = "店铺账号ID")
+ private Long sellerAccountId;
+
+ /**
+ * 站点简称(如NA/EU)
+ */
+ @ExcelProperty(value = "站点简称", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "如=NA/EU")
+ private String region;
+
+ /**
+ * 商城所在国家
+ */
+ @ExcelProperty(value = "商城所在国家")
+ private String country;
+
+ /**
+ * 亚马逊市场ID
+ */
+ @ExcelProperty(value = "亚马逊市场ID")
+ private String marketplaceId;
+
+ /**
+ * 广告授权 0未授权 1已授权
+ */
+ @ExcelProperty(value = "广告授权 0未授权 1已授权")
+ private Long hasAdsSetting;
+
+ /**
+ * 店铺状态 0停用 1正常 2异常 3欠费
+ */
+ @ExcelProperty(value = "店铺状态 0停用 1正常 2异常 3欠费")
+ private Long status;
+
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/hanlder/AddressTypeHandler.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/hanlder/AddressTypeHandler.java
new file mode 100644
index 0000000..a9d76ea
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/hanlder/AddressTypeHandler.java
@@ -0,0 +1,51 @@
+package org.asinkj.amz.hanlder;
+
+import com.alibaba.fastjson2.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.MappedJdbcTypes;
+import org.apache.ibatis.type.MappedTypes;
+import org.asinkj.asinking.entity.FbaShipmentApiResponse;
+import org.asinkj.asinking.entity.FbaShipmentApiResponse.Address;
+import org.postgresql.util.PGobject;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+@Slf4j
+@MappedTypes(FbaShipmentApiResponse.Address.class)
+@MappedJdbcTypes(JdbcType.VARCHAR)
+public class AddressTypeHandler extends BaseTypeHandler {
+
+ @Override
+ public void setNonNullParameter(PreparedStatement ps, int i, Address address, JdbcType jdbcType) throws SQLException {
+ PGobject jsonObject = new PGobject();
+ jsonObject.setType("jsonb");
+ jsonObject.setValue(com.alibaba.fastjson2.JSON.toJSONString(address));
+ ps.setObject(i, jsonObject);
+ }
+
+ @Override
+ public Address getNullableResult(ResultSet rs, String columnName) throws SQLException {
+ log.info("getNullableResult: {}", columnName);
+ return parseJsonb(rs.getString(columnName));
+ }
+
+ @Override
+ public Address getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+ return parseJsonb(rs.getString(columnIndex));
+ }
+
+ @Override
+ public Address getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+ return parseJsonb(cs.getString(columnIndex));
+ }
+
+ private Address parseJsonb(String json) {
+ log.info("parseJsonb: {}", json);
+ return com.alibaba.fastjson2.JSON.parseObject(json, Address.class);
+ }
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/hanlder/MyBatisConfig.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/hanlder/MyBatisConfig.java
new file mode 100644
index 0000000..c9148f6
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/hanlder/MyBatisConfig.java
@@ -0,0 +1,17 @@
+package org.asinkj.amz.hanlder;
+
+import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
+import com.baomidou.mybatisplus.core.MybatisConfiguration;
+import org.asinkj.asinking.entity.FbaShipmentApiResponse;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class MyBatisConfig implements ConfigurationCustomizer {
+
+
+
+ @Override
+ public void customize(MybatisConfiguration configuration) {
+ configuration.getTypeHandlerRegistry().register(FbaShipmentApiResponse.Address.class, AddressTypeHandler.class);
+ }
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizInquiryRequestMapper.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizInquiryRequestMapper.java
new file mode 100644
index 0000000..bf6e0ec
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizInquiryRequestMapper.java
@@ -0,0 +1,15 @@
+package org.asinkj.amz.mapper;
+
+import org.asinkj.amz.domain.BizInquiryRequest;
+import org.asinkj.amz.domain.vo.BizInquiryRequestVo;
+import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 物流询价Mapper接口
+ *
+ * @author shuo hu
+ * @date 2025-03-21
+ */
+public interface BizInquiryRequestMapper extends BaseMapperPlus {
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizLogisticsChannelMapper.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizLogisticsChannelMapper.java
new file mode 100644
index 0000000..c6a9a10
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizLogisticsChannelMapper.java
@@ -0,0 +1,15 @@
+package org.asinkj.amz.mapper;
+
+import org.asinkj.amz.domain.BizLogisticsChannel;
+import org.asinkj.amz.domain.vo.BizLogisticsChannelVo;
+import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 物流商渠道Mapper接口
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+public interface BizLogisticsChannelMapper extends BaseMapperPlus {
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizLogisticsCustomChannelMapper.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizLogisticsCustomChannelMapper.java
new file mode 100644
index 0000000..13dc3da
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizLogisticsCustomChannelMapper.java
@@ -0,0 +1,15 @@
+package org.asinkj.amz.mapper;
+
+import org.asinkj.amz.domain.BizLogisticsCustomChannel;
+import org.asinkj.amz.domain.vo.BizLogisticsCustomChannelVo;
+import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 物流商自定义渠道Mapper接口
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+public interface BizLogisticsCustomChannelMapper 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
new file mode 100644
index 0000000..381ee51
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizLogisticsQuoteMapper.java
@@ -0,0 +1,15 @@
+package org.asinkj.amz.mapper;
+
+import org.asinkj.amz.domain.BizLogisticsQuote;
+import org.asinkj.amz.domain.vo.BizLogisticsQuoteVo;
+import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 物流报价Mapper接口
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+public interface BizLogisticsQuoteMapper extends BaseMapperPlus {
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizShipmentItemMapper.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizShipmentItemMapper.java
new file mode 100644
index 0000000..e21f4ce
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizShipmentItemMapper.java
@@ -0,0 +1,15 @@
+package org.asinkj.amz.mapper;
+
+import org.asinkj.amz.domain.BizShipmentItem;
+import org.asinkj.amz.domain.vo.BizShipmentItemVo;
+import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 货品明细Mapper接口
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+public interface BizShipmentItemMapper extends BaseMapperPlus {
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizShipmentPlanMapper.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizShipmentPlanMapper.java
new file mode 100644
index 0000000..989abf7
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizShipmentPlanMapper.java
@@ -0,0 +1,23 @@
+package org.asinkj.amz.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.asinkj.amz.domain.BizShipmentPlan;
+import org.asinkj.amz.domain.vo.BizShipmentPlanVo;
+import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 货件计划Mapper接口
+ *
+ * @author shuo hu
+ * @date 2025-03-19
+ */
+@Mapper
+public interface BizShipmentPlanMapper extends BaseMapperPlus {
+
+ List selectExistingShipmentIds(@Param("batchIds") Collection batchIds);
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizShipmentTrackingMapper.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizShipmentTrackingMapper.java
new file mode 100644
index 0000000..9b37089
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizShipmentTrackingMapper.java
@@ -0,0 +1,15 @@
+package org.asinkj.amz.mapper;
+
+import org.asinkj.amz.domain.BizShipmentTracking;
+import org.asinkj.amz.domain.vo.BizShipmentTrackingVo;
+import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 物流追踪Mapper接口
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+public interface BizShipmentTrackingMapper extends BaseMapperPlus {
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/SysAmazonStoreMapper.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/SysAmazonStoreMapper.java
new file mode 100644
index 0000000..aaf5fa6
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/SysAmazonStoreMapper.java
@@ -0,0 +1,19 @@
+package org.asinkj.amz.mapper;
+
+import org.asinkj.amz.domain.SysAmazonStore;
+import org.asinkj.amz.domain.vo.SysAmazonStoreVo;
+import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus;
+import org.mapstruct.Mapper;
+
+import java.util.List;
+
+/**
+ * 亚马逊店铺信息Mapper接口
+ *
+ * @author shuo hu
+ * @date 2025-03-17
+ */
+public interface SysAmazonStoreMapper extends BaseMapperPlus {
+
+ void batchInsertOrUpdate(List dataList);
+}
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
new file mode 100644
index 0000000..e0d003f
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizInquiryRequestService.java
@@ -0,0 +1,73 @@
+package org.asinkj.amz.service;
+
+import jakarta.validation.constraints.NotNull;
+import org.asinkj.amz.domain.BizInquiryRequest;
+import org.asinkj.amz.domain.vo.BizInquiryRequestVo;
+import org.asinkj.amz.domain.bo.BizInquiryRequestBo;
+import org.asinkj.common.core.domain.R;
+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-21
+ */
+public interface IBizInquiryRequestService {
+
+ /**
+ * 查询物流询价
+ *
+ * @param id 主键
+ * @return 物流询价
+ */
+ BizInquiryRequestVo queryById(Long id);
+
+ /**
+ * 分页查询物流询价列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 物流询价分页列表
+ */
+ TableDataInfo queryPageList(BizInquiryRequestBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询符合条件的物流询价列表
+ *
+ * @param bo 查询条件
+ * @return 物流询价列表
+ */
+ List queryList(BizInquiryRequestBo bo);
+
+ /**
+ * 新增物流询价
+ *
+ * @param bo 物流询价
+ * @return 是否新增成功
+ */
+ Boolean insertByBo(BizInquiryRequestBo bo);
+
+ /**
+ * 修改物流询价
+ *
+ * @param bo 物流询价
+ * @return 是否修改成功
+ */
+ Boolean updateByBo(BizInquiryRequestBo bo);
+
+ /**
+ * 校验并批量删除物流询价信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+
+ R createWithDesAndChannel(@NotNull(message = "目的地不能为空") String destination, @NotNull(message = "渠道不能为空") String channelId);
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizLogisticsChannelService.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizLogisticsChannelService.java
new file mode 100644
index 0000000..e9a4387
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizLogisticsChannelService.java
@@ -0,0 +1,71 @@
+package org.asinkj.amz.service;
+
+import org.asinkj.amz.domain.BizLogisticsChannel;
+import org.asinkj.amz.domain.vo.BizLogisticsChannelVo;
+import org.asinkj.amz.domain.bo.BizLogisticsChannelBo;
+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-20
+ */
+public interface IBizLogisticsChannelService {
+
+ /**
+ * 查询物流商渠道
+ *
+ * @param id 主键
+ * @return 物流商渠道
+ */
+ BizLogisticsChannelVo queryById(Long id);
+
+ /**
+ * 分页查询物流商渠道列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 物流商渠道分页列表
+ */
+ TableDataInfo queryPageList(BizLogisticsChannelBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询符合条件的物流商渠道列表
+ *
+ * @param bo 查询条件
+ * @return 物流商渠道列表
+ */
+ List queryList(BizLogisticsChannelBo bo);
+
+ /**
+ * 新增物流商渠道
+ *
+ * @param bo 物流商渠道
+ * @return 是否新增成功
+ */
+ Boolean insertByBo(BizLogisticsChannelBo bo);
+
+ /**
+ * 修改物流商渠道
+ *
+ * @param bo 物流商渠道
+ * @return 是否修改成功
+ */
+ Boolean updateByBo(BizLogisticsChannelBo bo);
+
+ /**
+ * 校验并批量删除物流商渠道信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+
+ TableDataInfo queryListAll();
+}
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
new file mode 100644
index 0000000..1507217
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizLogisticsQuoteService.java
@@ -0,0 +1,77 @@
+package org.asinkj.amz.service;
+
+import jakarta.validation.constraints.NotNull;
+import org.asinkj.amz.domain.BizLogisticsQuote;
+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;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 物流报价Service接口
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+public interface IBizLogisticsQuoteService {
+
+ /**
+ * 查询物流报价
+ *
+ * @param id 主键
+ * @return 物流报价
+ */
+ BizLogisticsQuoteVo queryById(Long id);
+
+ /**
+ * 分页查询物流报价列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 物流报价分页列表
+ */
+ TableDataInfo queryPageList(BizLogisticsQuoteBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询符合条件的物流报价列表
+ *
+ * @param bo 查询条件
+ * @return 物流报价列表
+ */
+ List queryList(BizLogisticsQuoteBo bo);
+
+ /**
+ * 新增物流报价
+ *
+ * @param bo 物流报价
+ * @return 是否新增成功
+ */
+ Boolean insertByBo(BizLogisticsQuoteBo bo);
+
+ /**
+ * 修改物流报价
+ *
+ * @param bo 物流报价
+ * @return 是否修改成功
+ */
+ Boolean updateByBo(BizLogisticsQuoteBo bo);
+
+ /**
+ * 校验并批量删除物流报价信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+
+
+ List queryQuoteWithDestination(String destination, String channel);
+
+ TableDataInfo listWithDesAndChannel(@NotNull(message = "目的地不能为空") String destination, @NotNull(message = "渠道不能为空") String channel);
+
+}
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
new file mode 100644
index 0000000..d5bba4c
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizShipmentItemService.java
@@ -0,0 +1,69 @@
+package org.asinkj.amz.service;
+
+import org.asinkj.amz.domain.BizShipmentItem;
+import org.asinkj.amz.domain.vo.BizShipmentItemVo;
+import org.asinkj.amz.domain.bo.BizShipmentItemBo;
+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-20
+ */
+public interface IBizShipmentItemService {
+
+ /**
+ * 查询货品明细
+ *
+ * @param id 主键
+ * @return 货品明细
+ */
+ BizShipmentItemVo queryById(Long id);
+
+ /**
+ * 分页查询货品明细列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 货品明细分页列表
+ */
+ TableDataInfo queryPageList(BizShipmentItemBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询符合条件的货品明细列表
+ *
+ * @param bo 查询条件
+ * @return 货品明细列表
+ */
+ List queryList(BizShipmentItemBo bo);
+
+ /**
+ * 新增货品明细
+ *
+ * @param bo 货品明细
+ * @return 是否新增成功
+ */
+ Boolean insertByBo(BizShipmentItemBo bo);
+
+ /**
+ * 修改货品明细
+ *
+ * @param bo 货品明细
+ * @return 是否修改成功
+ */
+ Boolean updateByBo(BizShipmentItemBo 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/IBizShipmentPlanService.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizShipmentPlanService.java
new file mode 100644
index 0000000..d57b66f
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizShipmentPlanService.java
@@ -0,0 +1,73 @@
+package org.asinkj.amz.service;
+
+import jakarta.validation.constraints.NotNull;
+import org.asinkj.amz.domain.BizShipmentPlan;
+import org.asinkj.amz.domain.vo.BizLogisticsQuoteVo;
+import org.asinkj.amz.domain.vo.BizShipmentPlanVo;
+import org.asinkj.amz.domain.bo.BizShipmentPlanBo;
+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-19
+ */
+public interface IBizShipmentPlanService {
+
+ /**
+ * 查询货件计划
+ *
+ * @param id 主键
+ * @return 货件计划
+ */
+ BizShipmentPlanVo queryById(Long id);
+
+ /**
+ * 分页查询货件计划列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 货件计划分页列表
+ */
+ TableDataInfo queryPageList(BizShipmentPlanBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询符合条件的货件计划列表
+ *
+ * @param bo 查询条件
+ * @return 货件计划列表
+ */
+ List queryList(BizShipmentPlanBo bo);
+
+ /**
+ * 新增货件计划
+ *
+ * @param bo 货件计划
+ * @return 是否新增成功
+ */
+ Boolean insertByBo(BizShipmentPlanBo bo);
+
+ /**
+ * 修改货件计划
+ *
+ * @param bo 货件计划
+ * @return 是否修改成功
+ */
+ Boolean updateByBo(BizShipmentPlanBo bo);
+
+ /**
+ * 校验并批量删除货件计划信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+
+ List getQuote(@NotNull(message = "主键不能为空") String destination, String channel);
+}
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
new file mode 100644
index 0000000..f8f4ec8
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizShipmentTrackingService.java
@@ -0,0 +1,69 @@
+package org.asinkj.amz.service;
+
+import org.asinkj.amz.domain.BizShipmentTracking;
+import org.asinkj.amz.domain.vo.BizShipmentTrackingVo;
+import org.asinkj.amz.domain.bo.BizShipmentTrackingBo;
+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-20
+ */
+public interface IBizShipmentTrackingService {
+
+ /**
+ * 查询物流追踪
+ *
+ * @param id 主键
+ * @return 物流追踪
+ */
+ BizShipmentTrackingVo queryById(Long id);
+
+ /**
+ * 分页查询物流追踪列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 物流追踪分页列表
+ */
+ TableDataInfo queryPageList(BizShipmentTrackingBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询符合条件的物流追踪列表
+ *
+ * @param bo 查询条件
+ * @return 物流追踪列表
+ */
+ List queryList(BizShipmentTrackingBo bo);
+
+ /**
+ * 新增物流追踪
+ *
+ * @param bo 物流追踪
+ * @return 是否新增成功
+ */
+ Boolean insertByBo(BizShipmentTrackingBo bo);
+
+ /**
+ * 修改物流追踪
+ *
+ * @param bo 物流追踪
+ * @return 是否修改成功
+ */
+ Boolean updateByBo(BizShipmentTrackingBo 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/ISysAmazonStoreService.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/ISysAmazonStoreService.java
new file mode 100644
index 0000000..781e777
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/ISysAmazonStoreService.java
@@ -0,0 +1,78 @@
+package org.asinkj.amz.service;
+
+import org.asinkj.amz.domain.SysAmazonStore;
+import org.asinkj.amz.domain.vo.SysAmazonStoreVo;
+import org.asinkj.amz.domain.bo.SysAmazonStoreBo;
+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-17
+ */
+public interface ISysAmazonStoreService {
+
+ /**
+ * 查询亚马逊店铺信息
+ *
+ * @param id 主键
+ * @return 亚马逊店铺信息
+ */
+ SysAmazonStoreVo queryById(Long id);
+
+ /**
+ * 分页查询亚马逊店铺信息列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 亚马逊店铺信息分页列表
+ */
+ TableDataInfo queryPageList(SysAmazonStoreBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询符合条件的亚马逊店铺信息列表
+ *
+ * @param bo 查询条件
+ * @return 亚马逊店铺信息列表
+ */
+ List queryList(SysAmazonStoreBo bo);
+
+ /**
+ * 新增亚马逊店铺信息
+ *
+ * @param bo 亚马逊店铺信息
+ * @return 是否新增成功
+ */
+ Boolean insertByBo(SysAmazonStoreBo bo);
+
+ /**
+ * 修改亚马逊店铺信息
+ *
+ * @param bo 亚马逊店铺信息
+ * @return 是否修改成功
+ */
+ Boolean updateByBo(SysAmazonStoreBo bo);
+
+ /**
+ * 校验并批量删除亚马逊店铺信息信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+
+
+ void collectAmzStoreData();
+
+ void pullAmzStoreData() throws Exception;
+
+ void pullAmzFBAData(String startDate,String endDate) throws Exception;
+
+ void getAmzStoreTokenData() throws Exception;
+}
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
new file mode 100644
index 0000000..0443945
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizInquiryRequestServiceImpl.java
@@ -0,0 +1,213 @@
+package org.asinkj.amz.service.impl;
+
+import cn.hutool.core.util.NumberUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.asinkj.amz.domain.vo.BizLogisticsChannelVo;
+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;
+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.springframework.stereotype.Service;
+import org.asinkj.amz.domain.bo.BizInquiryRequestBo;
+import org.asinkj.amz.domain.vo.BizInquiryRequestVo;
+import org.asinkj.amz.domain.BizInquiryRequest;
+import org.asinkj.amz.mapper.BizInquiryRequestMapper;
+import org.asinkj.amz.service.IBizInquiryRequestService;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * 物流询价Service业务层处理
+ *
+ * @author shuo hu
+ * @date 2025-03-21
+ */
+@RequiredArgsConstructor
+@Service
+@Slf4j
+public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService {
+
+ private final BizInquiryRequestMapper baseMapper;
+
+
+ private static final AtomicInteger sequence = new AtomicInteger(0);
+
+
+ @Resource
+ private IBizLogisticsChannelService bizLogisticsChannelService;
+
+ @Resource
+ private BizInquiryRequestMapper billingRequestMapper;
+
+ /**
+ * 查询物流询价
+ *
+ * @param id 主键
+ * @return 物流询价
+ */
+ @Override
+ public BizInquiryRequestVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 分页查询物流询价列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 物流询价分页列表
+ */
+ @Override
+ public TableDataInfo queryPageList(BizInquiryRequestBo 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(BizInquiryRequestBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(BizInquiryRequestBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(StringUtils.isNotBlank(bo.getInquiryNo()), BizInquiryRequest::getInquiryNo, bo.getInquiryNo());
+ lqw.eq(bo.getRequesterId() != null, BizInquiryRequest::getRequesterId, bo.getRequesterId());
+ lqw.eq(StringUtils.isNotBlank(bo.getTargetProviders()), BizInquiryRequest::getTargetProviders, bo.getTargetProviders());
+ lqw.eq(StringUtils.isNotBlank(bo.getDestination()), BizInquiryRequest::getDestination, bo.getDestination());
+ lqw.eq(StringUtils.isNotBlank(bo.getTransportChannel()), BizInquiryRequest::getTransportChannel, bo.getTransportChannel());
+ lqw.eq(StringUtils.isNotBlank(bo.getInquiryStatus()), BizInquiryRequest::getInquiryStatus, bo.getInquiryStatus());
+ lqw.eq(bo.getDeadline() != null, BizInquiryRequest::getDeadline, bo.getDeadline());
+ lqw.eq(bo.getChannelId() != null, BizInquiryRequest::getChannelId, bo.getChannelId());
+ lqw.like(StringUtils.isNotBlank(bo.getChannelName()), BizInquiryRequest::getChannelName, bo.getChannelName());
+ lqw.eq(bo.getEffectiveStartTime() != null, BizInquiryRequest::getEffectiveStartTime, bo.getEffectiveStartTime());
+ lqw.eq(bo.getEffectiveEndTime() != null, BizInquiryRequest::getEffectiveEndTime, bo.getEffectiveEndTime());
+ return lqw;
+ }
+
+ /**
+ * 新增物流询价
+ *
+ * @param bo 物流询价
+ * @return 是否新增成功
+ */
+ @Override
+ public Boolean insertByBo(BizInquiryRequestBo bo) {
+ BizInquiryRequest add = MapstructUtils.convert(bo, BizInquiryRequest.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改物流询价
+ *
+ * @param bo 物流询价
+ * @return 是否修改成功
+ */
+ @Override
+ public Boolean updateByBo(BizInquiryRequestBo bo) {
+ BizInquiryRequest update = MapstructUtils.convert(bo, BizInquiryRequest.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(BizInquiryRequest 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 R createWithDesAndChannel(String destination, String channelId) {
+ BizInquiryRequest bizInquiryRequest = new BizInquiryRequest();
+ bizInquiryRequest.setDestination(destination);
+ bizInquiryRequest.setChannelId(NumberUtil.parseLong(channelId));
+ if (bizInquiryRequest.getChannelId() == null) {
+ return R.fail("渠道不能为空");
+ }
+ if (bizInquiryRequest.getDestination() == null) {
+ return R.fail("目的地不能为空");
+ }
+ //询价单号(规则:INQ+年月+6位序列)
+ bizInquiryRequest.setInquiryNo(generateInquiryNo());
+ //查询出渠道信息
+
+ BizLogisticsChannelVo bizLogisticsChannelVo = bizLogisticsChannelService.queryById(bizInquiryRequest.getChannelId());
+ if (bizLogisticsChannelVo == null){
+ log.info("渠道信息为空");
+ }
+ if ("air".equals(bizLogisticsChannelVo.getShippingMethod())){
+ bizInquiryRequest.setEffectiveStartTime(new Date());
+ bizInquiryRequest.setEffectiveEndTime(new Date());
+ }else if("sea".equals(bizLogisticsChannelVo.getShippingMethod())){
+ //获取下周一的日期
+ Calendar calendar = Calendar.getInstance();
+ calendar.add(Calendar.DAY_OF_WEEK, 8 - calendar.get(Calendar.DAY_OF_WEEK));
+ bizInquiryRequest.setEffectiveStartTime(calendar.getTime());
+ //获取下下周一的日期
+ calendar.add(Calendar.DAY_OF_WEEK, 7);
+ bizInquiryRequest.setEffectiveEndTime(calendar.getTime());
+ }
+
+ bizInquiryRequest.setChannelName(bizLogisticsChannelVo.getChannelName());
+ bizInquiryRequest.setTransportChannel(bizLogisticsChannelVo.getShippingMethod());
+ //获取当天上午11点的时间 ?
+ bizInquiryRequest.setDeadline(LocalDate.now()
+ .atTime(11, 0));
+ bizInquiryRequest.setRequesterId(LoginHelper.getUserId());
+
+ billingRequestMapper.insert(bizInquiryRequest);
+
+ return R.ok();
+ }
+
+ private String generateInquiryNo() {
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
+ String datePart = sdf.format(new Date());
+ int seq = sequence.incrementAndGet();
+ if (seq > 999999) { // 处理溢出,例如重置或抛出异常
+ sequence.set(0);
+ seq = 0;
+ }
+ return String.format("INQ%s%06d", datePart, seq);
+ }
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsChannelServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsChannelServiceImpl.java
new file mode 100644
index 0000000..32cf1fa
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsChannelServiceImpl.java
@@ -0,0 +1,156 @@
+package org.asinkj.amz.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+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.system.api.model.LoginUser;
+import org.springframework.stereotype.Service;
+import org.asinkj.amz.domain.bo.BizLogisticsChannelBo;
+import org.asinkj.amz.domain.vo.BizLogisticsChannelVo;
+import org.asinkj.amz.domain.BizLogisticsChannel;
+import org.asinkj.amz.mapper.BizLogisticsChannelMapper;
+import org.asinkj.amz.service.IBizLogisticsChannelService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 物流商渠道Service业务层处理
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+@RequiredArgsConstructor
+@Service
+public class BizLogisticsChannelServiceImpl implements IBizLogisticsChannelService {
+
+ private final BizLogisticsChannelMapper baseMapper;
+
+ /**
+ * 查询物流商渠道
+ *
+ * @param id 主键
+ * @return 物流商渠道
+ */
+ @Override
+ public BizLogisticsChannelVo queryById(Long id) {
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 分页查询物流商渠道列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 物流商渠道分页列表
+ */
+ @Override
+ public TableDataInfo queryPageList(BizLogisticsChannelBo 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(BizLogisticsChannelBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(BizLogisticsChannelBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(bo.getUserId() != null, BizLogisticsChannel::getUserId, bo.getUserId());
+ lqw.like(StringUtils.isNotBlank(bo.getChannelName()), BizLogisticsChannel::getChannelName, bo.getChannelName());
+ lqw.eq(StringUtils.isNotBlank(bo.getDescription()), BizLogisticsChannel::getDescription, bo.getDescription());
+ lqw.eq(StringUtils.isNotBlank(bo.getChannelType()), BizLogisticsChannel::getChannelType, bo.getChannelType());
+ lqw.eq(StringUtils.isNotBlank(bo.getCountry()), BizLogisticsChannel::getCountry, bo.getCountry());
+ lqw.eq(StringUtils.isNotBlank(bo.getShippingMethod()), BizLogisticsChannel::getShippingMethod, bo.getShippingMethod());
+ lqw.in(BizLogisticsChannel::getUserId, LoginHelper.getUserId(), 1L);
+ return lqw;
+ }
+
+ /**
+ * 新增物流商渠道
+ *
+ * @param bo 物流商渠道
+ * @return 是否新增成功
+ */
+ @Override
+ public Boolean insertByBo(BizLogisticsChannelBo bo) {
+ BizLogisticsChannel add = MapstructUtils.convert(bo, BizLogisticsChannel.class);
+ validEntityBeforeSave(add);
+ LoginUser loginUser = LoginHelper.getLoginUser();
+ assert add != null;
+ if (LoginHelper.isSuperAdmin()) {
+ add.setUserId(1L);
+ add.setChannelType("system");
+ } else {
+ add.setUserId(loginUser.getUserId());
+ add.setChannelType("custom");
+ }
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改物流商渠道
+ *
+ * @param bo 物流商渠道
+ * @return 是否修改成功
+ */
+ @Override
+ public Boolean updateByBo(BizLogisticsChannelBo bo) {
+ BizLogisticsChannel update = MapstructUtils.convert(bo, BizLogisticsChannel.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(BizLogisticsChannel 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 TableDataInfo queryListAll() {
+
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(BizLogisticsChannel::getChannelType, "system");
+ return TableDataInfo.build(baseMapper.selectVoList(lqw));
+
+ }
+}
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
new file mode 100644
index 0000000..562dd7e
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsQuoteServiceImpl.java
@@ -0,0 +1,185 @@
+package org.asinkj.amz.service.impl;
+
+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.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;
+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.BizLogisticsQuoteBo;
+import org.asinkj.amz.domain.vo.BizLogisticsQuoteVo;
+import org.asinkj.amz.domain.BizLogisticsQuote;
+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业务层处理
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+@RequiredArgsConstructor
+@Service
+@Slf4j
+public class BizLogisticsQuoteServiceImpl implements IBizLogisticsQuoteService {
+
+ private final BizLogisticsQuoteMapper baseMapper;
+
+
+
+
+ @Resource
+ private IBizLogisticsChannelService bizLogisticsChannelService;
+
+ @Resource
+ private BizInquiryRequestMapper billingRequestMapper;
+
+ /**
+ * 查询物流报价
+ *
+ * @param id 主键
+ * @return 物流报价
+ */
+ @Override
+ public BizLogisticsQuoteVo queryById(Long id) {
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 分页查询物流报价列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 物流报价分页列表
+ */
+ @Override
+ public TableDataInfo queryPageList(BizLogisticsQuoteBo 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(BizLogisticsQuoteBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(BizLogisticsQuoteBo bo) {
+ Map params = bo.getParams();
+ 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(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());
+ lqw.eq(bo.getQuoteDate() != null, BizLogisticsQuote::getQuoteDate, bo.getQuoteDate());
+ lqw.eq(StringUtils.isNotBlank(bo.getIsSubmitted()), BizLogisticsQuote::getIsSubmitted, bo.getIsSubmitted());
+ lqw.eq(StringUtils.isNotBlank(bo.getChannelType()), BizLogisticsQuote::getChannelType, bo.getChannelType());
+ lqw.eq(bo.getChannelId() != null, BizLogisticsQuote::getChannelId, bo.getChannelId());
+ return lqw;
+ }
+
+ /**
+ * 新增物流报价
+ *
+ * @param bo 物流报价
+ * @return 是否新增成功
+ */
+ @Override
+ public Boolean insertByBo(BizLogisticsQuoteBo bo) {
+ BizLogisticsQuote add = MapstructUtils.convert(bo, BizLogisticsQuote.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改物流报价
+ *
+ * @param bo 物流报价
+ * @return 是否修改成功
+ */
+ @Override
+ public Boolean updateByBo(BizLogisticsQuoteBo bo) {
+ BizLogisticsQuote update = MapstructUtils.convert(bo, BizLogisticsQuote.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(BizLogisticsQuote 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 List queryQuoteWithDestination(String destination, String channel) {
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.eq(BizLogisticsQuote::getDestination, destination);
+ queryWrapper.eq(BizLogisticsQuote::getTransportChannel, channel);
+ return baseMapper.selectVoList(queryWrapper);
+ }
+
+ @Override
+ public TableDataInfo listWithDesAndChannel(String destination, String channel) {
+
+
+ if (StringUtils.isNotBlank(destination) && StringUtils.isNotBlank(channel)) {
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.eq(BizLogisticsQuote::getDestination, destination);
+ queryWrapper.eq(BizLogisticsQuote::getChannelId, NumberUtil.parseLong(channel));
+ return TableDataInfo.build(baseMapper.selectVoList(queryWrapper));
+ }
+ return null;
+ }
+
+
+
+
+
+}
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
new file mode 100644
index 0000000..14d25e6
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizShipmentItemServiceImpl.java
@@ -0,0 +1,137 @@
+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.BizShipmentItemBo;
+import org.asinkj.amz.domain.vo.BizShipmentItemVo;
+import org.asinkj.amz.domain.BizShipmentItem;
+import org.asinkj.amz.mapper.BizShipmentItemMapper;
+import org.asinkj.amz.service.IBizShipmentItemService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 货品明细Service业务层处理
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+@RequiredArgsConstructor
+@Service
+public class BizShipmentItemServiceImpl implements IBizShipmentItemService {
+
+ private final BizShipmentItemMapper baseMapper;
+
+ /**
+ * 查询货品明细
+ *
+ * @param id 主键
+ * @return 货品明细
+ */
+ @Override
+ public BizShipmentItemVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 分页查询货品明细列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 货品明细分页列表
+ */
+ @Override
+ public TableDataInfo queryPageList(BizShipmentItemBo 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(BizShipmentItemBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(BizShipmentItemBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(StringUtils.isNotBlank(bo.getShipmentId()), BizShipmentItem::getShipmentId, bo.getShipmentId());
+ lqw.eq(StringUtils.isNotBlank(bo.getMsku()), BizShipmentItem::getMsku, bo.getMsku());
+ lqw.eq(StringUtils.isNotBlank(bo.getFnsku()), BizShipmentItem::getFnsku, bo.getFnsku());
+ lqw.eq(bo.getQuantityShipped() != null, BizShipmentItem::getQuantityShipped, bo.getQuantityShipped());
+ lqw.eq(bo.getQuantityReceived() != null, BizShipmentItem::getQuantityReceived, bo.getQuantityReceived());
+ lqw.eq(StringUtils.isNotBlank(bo.getPrepInstruction()), BizShipmentItem::getPrepInstruction, bo.getPrepInstruction());
+ lqw.eq(StringUtils.isNotBlank(bo.getPrepOwner()), BizShipmentItem::getPrepOwner, bo.getPrepOwner());
+ lqw.eq(StringUtils.isNotBlank(bo.getSku()), BizShipmentItem::getSku, bo.getSku());
+ lqw.eq(bo.getExpiration() != null, BizShipmentItem::getExpiration, bo.getExpiration());
+ return lqw;
+ }
+
+ /**
+ * 新增货品明细
+ *
+ * @param bo 货品明细
+ * @return 是否新增成功
+ */
+ @Override
+ public Boolean insertByBo(BizShipmentItemBo bo) {
+ BizShipmentItem add = MapstructUtils.convert(bo, BizShipmentItem.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改货品明细
+ *
+ * @param bo 货品明细
+ * @return 是否修改成功
+ */
+ @Override
+ public Boolean updateByBo(BizShipmentItemBo bo) {
+ BizShipmentItem update = MapstructUtils.convert(bo, BizShipmentItem.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(BizShipmentItem 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/BizShipmentPlanServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizShipmentPlanServiceImpl.java
new file mode 100644
index 0000000..675a2a7
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizShipmentPlanServiceImpl.java
@@ -0,0 +1,159 @@
+package org.asinkj.amz.service.impl;
+
+import org.asinkj.amz.domain.BizLogisticsQuote;
+import org.asinkj.amz.domain.vo.BizLogisticsQuoteVo;
+import org.asinkj.amz.service.IBizLogisticsQuoteService;
+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.BizShipmentPlanBo;
+import org.asinkj.amz.domain.vo.BizShipmentPlanVo;
+import org.asinkj.amz.domain.BizShipmentPlan;
+import org.asinkj.amz.mapper.BizShipmentPlanMapper;
+import org.asinkj.amz.service.IBizShipmentPlanService;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 货件计划Service业务层处理
+ *
+ * @author shuo hu
+ * @date 2025-03-19
+ */
+@RequiredArgsConstructor
+@Service
+public class BizShipmentPlanServiceImpl implements IBizShipmentPlanService {
+
+ private final BizShipmentPlanMapper baseMapper;
+
+ @Resource
+ private IBizLogisticsQuoteService iLogisticsQuoteService;;
+
+ /**
+ * 查询货件计划
+ *
+ * @param id 主键
+ * @return 货件计划
+ */
+ @Override
+ public BizShipmentPlanVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 分页查询货件计划列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 货件计划分页列表
+ */
+ @Override
+ public TableDataInfo queryPageList(BizShipmentPlanBo 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(BizShipmentPlanBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(BizShipmentPlanBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(bo.getSid() != null, BizShipmentPlan::getSid, bo.getSid());
+ 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());
+ 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.getShippingMode()), BizShipmentPlan::getShippingMode, bo.getShippingMode());
+ lqw.eq(StringUtils.isNotBlank(bo.getShippingSolution()), BizShipmentPlan::getShippingSolution, bo.getShippingSolution());
+ lqw.eq(bo.getGmtModified() != null, BizShipmentPlan::getGmtModified, bo.getGmtModified());
+ lqw.eq(bo.getGmtCreate() != null, BizShipmentPlan::getGmtCreate, bo.getGmtCreate());
+ lqw.eq(bo.getSyncTime() != null, BizShipmentPlan::getSyncTime, bo.getSyncTime());
+ lqw.eq(bo.getStaShipmentDate() != null, BizShipmentPlan::getStaShipmentDate, bo.getStaShipmentDate());
+ lqw.eq(bo.getStaDeliveryStartDate() != null, BizShipmentPlan::getStaDeliveryStartDate, bo.getStaDeliveryStartDate());
+ lqw.eq(bo.getStaDeliveryEndDate() != null, BizShipmentPlan::getStaDeliveryEndDate, bo.getStaDeliveryEndDate());
+// lqw.eq(StringUtils.isNotBlank(bo.getShipFromAddress()), BizShipmentPlan::getShipFromAddress, bo.getShipFromAddress());
+// lqw.eq(StringUtils.isNotBlank(bo.getShipToAddress()), BizShipmentPlan::getShipToAddress, bo.getShipToAddress());
+ lqw.eq(StringUtils.isNotBlank(bo.getReferenceId()), BizShipmentPlan::getReferenceId, bo.getReferenceId());
+ lqw.eq(StringUtils.isNotBlank(bo.getStaInboundPlanId()), BizShipmentPlan::getStaInboundPlanId, bo.getStaInboundPlanId());
+ lqw.eq(StringUtils.isNotBlank(bo.getIsSta()), BizShipmentPlan::getIsSta, bo.getIsSta());
+ return lqw;
+ }
+
+ /**
+ * 新增货件计划
+ *
+ * @param bo 货件计划
+ * @return 是否新增成功
+ */
+ @Override
+ public Boolean insertByBo(BizShipmentPlanBo bo) {
+ BizShipmentPlan add = MapstructUtils.convert(bo, BizShipmentPlan.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改货件计划
+ *
+ * @param bo 货件计划
+ * @return 是否修改成功
+ */
+ @Override
+ public Boolean updateByBo(BizShipmentPlanBo bo) {
+ BizShipmentPlan update = MapstructUtils.convert(bo, BizShipmentPlan.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(BizShipmentPlan 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 List getQuote(String destination, String channel) {
+ return iLogisticsQuoteService.queryQuoteWithDestination(destination, channel);
+ }
+}
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
new file mode 100644
index 0000000..1a0b829
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizShipmentTrackingServiceImpl.java
@@ -0,0 +1,131 @@
+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.BizShipmentTrackingBo;
+import org.asinkj.amz.domain.vo.BizShipmentTrackingVo;
+import org.asinkj.amz.domain.BizShipmentTracking;
+import org.asinkj.amz.mapper.BizShipmentTrackingMapper;
+import org.asinkj.amz.service.IBizShipmentTrackingService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 物流追踪Service业务层处理
+ *
+ * @author shuo hu
+ * @date 2025-03-20
+ */
+@RequiredArgsConstructor
+@Service
+public class BizShipmentTrackingServiceImpl implements IBizShipmentTrackingService {
+
+ private final BizShipmentTrackingMapper baseMapper;
+
+ /**
+ * 查询物流追踪
+ *
+ * @param id 主键
+ * @return 物流追踪
+ */
+ @Override
+ public BizShipmentTrackingVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 分页查询物流追踪列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 物流追踪分页列表
+ */
+ @Override
+ public TableDataInfo queryPageList(BizShipmentTrackingBo 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(BizShipmentTrackingBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(BizShipmentTrackingBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(StringUtils.isNotBlank(bo.getShipmentId()), BizShipmentTracking::getShipmentId, bo.getShipmentId());
+ lqw.eq(StringUtils.isNotBlank(bo.getBoxId()), BizShipmentTracking::getBoxId, bo.getBoxId());
+ lqw.eq(StringUtils.isNotBlank(bo.getTrackingNumber()), BizShipmentTracking::getTrackingNumber, bo.getTrackingNumber());
+ return lqw;
+ }
+
+ /**
+ * 新增物流追踪
+ *
+ * @param bo 物流追踪
+ * @return 是否新增成功
+ */
+ @Override
+ public Boolean insertByBo(BizShipmentTrackingBo bo) {
+ BizShipmentTracking add = MapstructUtils.convert(bo, BizShipmentTracking.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改物流追踪
+ *
+ * @param bo 物流追踪
+ * @return 是否修改成功
+ */
+ @Override
+ public Boolean updateByBo(BizShipmentTrackingBo bo) {
+ BizShipmentTracking update = MapstructUtils.convert(bo, BizShipmentTracking.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(BizShipmentTracking 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/SysAmazonStoreServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/SysAmazonStoreServiceImpl.java
new file mode 100644
index 0000000..da027c5
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/SysAmazonStoreServiceImpl.java
@@ -0,0 +1,430 @@
+package org.asinkj.amz.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.Call;
+import okhttp3.Callback;
+import okhttp3.Response;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.asinkj.amz.domain.BizShipmentItem;
+import org.asinkj.amz.domain.BizShipmentPlan;
+import org.asinkj.amz.domain.BizShipmentTracking;
+import org.asinkj.amz.mapper.BizShipmentItemMapper;
+import org.asinkj.amz.mapper.BizShipmentPlanMapper;
+import org.asinkj.amz.mapper.BizShipmentTrackingMapper;
+import org.asinkj.asinking.entity.FbaShipmentApiResponse;
+import org.asinkj.asinking.entity.Result;
+import org.asinkj.asinking.entity.SellerAccountResponse;
+import org.asinkj.asinking.entity.TokenInfo;
+import org.asinkj.asinking.okhttp.AKRestClientBuild;
+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.redis.utils.RedisUtils;
+import org.asinkj.common.satoken.utils.LoginHelper;
+import org.asinkj.resource.api.RemoteMessageService;
+import org.asinkj.system.api.model.LoginUser;
+import org.asinkj.utils.HttpUtil;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.asinkj.amz.domain.bo.SysAmazonStoreBo;
+import org.asinkj.amz.domain.vo.SysAmazonStoreVo;
+import org.asinkj.amz.domain.SysAmazonStore;
+import org.asinkj.amz.mapper.SysAmazonStoreMapper;
+import org.asinkj.amz.service.ISysAmazonStoreService;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.time.Duration;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 亚马逊店铺信息Service业务层处理
+ *
+ * @author shuo hu
+ * @date 2025-03-17
+ */
+@RequiredArgsConstructor
+@Service
+@Slf4j
+public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService {
+
+ public static final String REFRESH_TOKEN = "refresh_token";
+ public static final String ACCESS_TOKEN = "access_token";
+
+ @DubboReference(stub = "true")
+ private final RemoteMessageService remoteMessageService;
+
+ private final SysAmazonStoreMapper baseMapper;
+
+ @Resource
+ private BizShipmentPlanMapper bizShipmentPlanMapper;
+
+ @Resource
+ private BizShipmentItemMapper bizShipmentItemMapper;
+
+ @Resource
+ private BizShipmentTrackingMapper bizShipmentTrackingMapper;
+
+ @Value("${lingxing.appId}")
+ private String appId;
+
+ @Value("${lingxing.appSecret}")
+ private String appSecret;
+
+ @Value("${lingxing.url}")
+ private String url;
+
+ /**
+ * 查询亚马逊店铺信息
+ *
+ * @param id 主键
+ * @return 亚马逊店铺信息
+ */
+ @Override
+ public SysAmazonStoreVo queryById(Long id) {
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 分页查询亚马逊店铺信息列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 亚马逊店铺信息分页列表
+ */
+ @Override
+ public TableDataInfo queryPageList(SysAmazonStoreBo 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(SysAmazonStoreBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(SysAmazonStoreBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(bo.getUserId() != null, SysAmazonStore::getUserId, bo.getUserId());
+ lqw.eq(bo.getSid() != null, SysAmazonStore::getSid, bo.getSid());
+ lqw.eq(bo.getMid() != null, SysAmazonStore::getMid, bo.getMid());
+ lqw.like(StringUtils.isNotBlank(bo.getStoreName()), SysAmazonStore::getStoreName, bo.getStoreName());
+ lqw.eq(StringUtils.isNotBlank(bo.getSellerId()), SysAmazonStore::getSellerId, bo.getSellerId());
+ lqw.like(StringUtils.isNotBlank(bo.getAccountName()), SysAmazonStore::getAccountName, bo.getAccountName());
+ lqw.eq(bo.getSellerAccountId() != null, SysAmazonStore::getSellerAccountId, bo.getSellerAccountId());
+ lqw.eq(StringUtils.isNotBlank(bo.getRegion()), SysAmazonStore::getRegion, bo.getRegion());
+ lqw.eq(StringUtils.isNotBlank(bo.getCountry()), SysAmazonStore::getCountry, bo.getCountry());
+ lqw.eq(StringUtils.isNotBlank(bo.getMarketplaceId()), SysAmazonStore::getMarketplaceId, bo.getMarketplaceId());
+ lqw.eq(bo.getHasAdsSetting() != null, SysAmazonStore::getHasAdsSetting, bo.getHasAdsSetting());
+ lqw.eq(bo.getStatus() != null, SysAmazonStore::getStatus, bo.getStatus());
+ lqw.orderByDesc(SysAmazonStore::getSid);
+ return lqw;
+ }
+
+ /**
+ * 新增亚马逊店铺信息
+ *
+ * @param bo 亚马逊店铺信息
+ * @return 是否新增成功
+ */
+ @Override
+ public Boolean insertByBo(SysAmazonStoreBo bo) {
+ SysAmazonStore add = MapstructUtils.convert(bo, SysAmazonStore.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改亚马逊店铺信息
+ *
+ * @param bo 亚马逊店铺信息
+ * @return 是否修改成功
+ */
+ @Override
+ public Boolean updateByBo(SysAmazonStoreBo bo) {
+ SysAmazonStore update = MapstructUtils.convert(bo, SysAmazonStore.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(SysAmazonStore 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 collectAmzStoreData() {
+
+
+ try {
+ pullAmzStoreData();
+ } catch (Exception e) {
+ log.error("error", e);
+ }
+ }
+
+
+ @Override
+ public void pullAmzStoreData() throws Exception {
+// if (ObjectUtil.isNull(RedisUtils.getCacheObject(ACCESS_TOKEN))){
+// getAmzStoreTokenData();
+// }
+//
+// Map queryParam = new HashMap<>();
+// queryParam.put("timestamp", System.currentTimeMillis() / 1000 + "");
+// queryParam.put("access_token", RedisUtils.getCacheObject(ACCESS_TOKEN));
+// queryParam.put("app_key", appId);
+//// queryParam.put("offset", 0);
+//// queryParam.put("length", 20);
+//
+// String sign = ApiSign.sign(queryParam, appId);
+// queryParam.put("sign", sign);
+// log.info("sign:{}", sign);
+//
+// HttpRequest