From 615549ed5e5f95aa692dcb0f038dedcfccce67ab Mon Sep 17 00:00:00 2001 From: dev <182542500@qq.com> Date: Sat, 10 May 2025 14:29:20 +0800 Subject: [PATCH] =?UTF-8?q?5.9=E6=96=B0=E9=9C=80=E6=B1=82=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .run/asinkj-auth.run.xml | 2 +- .run/asinkj-system.run.xml | 2 +- .../asinkj/amz/api/RemoteFBADataService.java | 4 + .../asinkj/system/api/RemoteUserService.java | 18 + asinkj-auth/pom.xml | 5 + .../auth/controller/TokenController.java | 39 +- asinkj-biz/asinkj-amz/Dockerfile | 2 + asinkj-biz/asinkj-amz/pom.xml | 5 + .../BizInquiryRequestController.java | 31 +- .../BizLogisticsQuoteController.java | 3 +- .../BizPurchaseOrderController.java | 106 ++++++ .../BizPurchaseOrderItemController.java | 106 ++++++ .../controller/BizShipmentPlanController.java | 12 + .../controller/SysAmazonStoreController.java | 15 + .../asinkj/amz/domain/BizPurchaseOrder.java | 283 +++++++++++++++ .../amz/domain/BizPurchaseOrderItem.java | 178 ++++++++++ .../amz/domain/BizShipmentPlanFileData.java | 63 ++++ .../domain/bo/BizLogisticsQuoteReportBo.java | 2 +- .../amz/domain/bo/BizPurchaseOrderBo.java | 326 +++++++++++++++++ .../amz/domain/bo/BizPurchaseOrderItemBo.java | 200 +++++++++++ .../amz/domain/bo/BizShipmentPlanBo.java | 7 +- .../domain/vo/BizLogisticsOrderDetailVo.java | 48 +-- .../amz/domain/vo/BizPurchaseOrderItemVo.java | 208 +++++++++++ .../amz/domain/vo/BizPurchaseOrderVo.java | 336 ++++++++++++++++++ .../amz/dubbo/RemoteFBADataServiceImpl.java | 20 ++ .../mapper/BizPurchaseOrderItemMapper.java | 15 + .../amz/mapper/BizPurchaseOrderMapper.java | 15 + .../amz/mapper/BizShipmentPlanMapper.java | 2 + .../service/IBizInquiryRequestService.java | 3 + .../service/IBizPurchaseOrderItemService.java | 69 ++++ .../amz/service/IBizPurchaseOrderService.java | 69 ++++ .../amz/service/IBizShipmentPlanService.java | 3 + .../amz/service/ISysAmazonStoreService.java | 4 +- .../impl/BizInquiryRequestServiceImpl.java | 61 +++- .../impl/BizLogisticsQuoteServiceImpl.java | 8 +- .../impl/BizPurchaseOrderItemServiceImpl.java | 155 ++++++++ .../impl/BizPurchaseOrderServiceImpl.java | 189 ++++++++++ .../impl/BizShipmentPlanServiceImpl.java | 47 ++- .../impl/SysAmazonStoreServiceImpl.java | 79 +++- .../entity/PurchaseOrderResponse.java | 301 ++++++++++++++++ .../amz/BizLogisticsOrderDetailMapper.xml | 9 + .../mapper/amz/BizLogisticsOrderMapper.xml | 6 +- .../mapper/amz/BizLogisticsQuoteMapper.xml | 2 +- .../mapper/amz/BizPurchaseOrderItemMapper.xml | 7 + .../mapper/amz/BizPurchaseOrderMapper.xml | 7 + .../mapper/amz/BizShipmentPlanMapper.xml | 24 +- asinkj-common/asinkj-common-bom/pom.xml | 9 +- asinkj-common/asinkj-common-wp/pom.xml | 38 ++ .../common/wp/config/WeChatProperties.java | 19 + .../common/wp/handler/WxMessagesManager.java | 103 ++++++ ...ot.autoconfigure.AutoConfiguration.imports | 2 + asinkj-common/pom.xml | 1 + .../job/snailjob/AmzUpdateFBAJobExecutor.java | 63 ++++ .../job/snailjob/QuoteReminderExecutor.java | 63 ++++ .../org/asinkj/system/domain/SysUser.java | 2 + .../asinkj/system/domain/vo/SysUserVo.java | 2 + .../system/dubbo/RemoteUserServiceImpl.java | 21 ++ .../asinkj/system/mapper/SysUserMapper.java | 1 + .../system/service/ISysUserService.java | 1 + .../service/impl/SysUserServiceImpl.java | 5 + .../resources/mapper/system/SysUserMapper.xml | 10 + pom.xml | 7 + 62 files changed, 3364 insertions(+), 79 deletions(-) create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizPurchaseOrderController.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizPurchaseOrderItemController.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizPurchaseOrder.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizPurchaseOrderItem.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizShipmentPlanFileData.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizPurchaseOrderBo.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizPurchaseOrderItemBo.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizPurchaseOrderItemVo.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizPurchaseOrderVo.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizPurchaseOrderItemMapper.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizPurchaseOrderMapper.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizPurchaseOrderItemService.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizPurchaseOrderService.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizPurchaseOrderItemServiceImpl.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizPurchaseOrderServiceImpl.java create mode 100644 asinkj-biz/asinkj-amz/src/main/java/org/asinkj/asinking/entity/PurchaseOrderResponse.java create mode 100644 asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizPurchaseOrderItemMapper.xml create mode 100644 asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizPurchaseOrderMapper.xml create mode 100644 asinkj-common/asinkj-common-wp/pom.xml create mode 100644 asinkj-common/asinkj-common-wp/src/main/java/org/asinkj/common/wp/config/WeChatProperties.java create mode 100644 asinkj-common/asinkj-common-wp/src/main/java/org/asinkj/common/wp/handler/WxMessagesManager.java create mode 100644 asinkj-common/asinkj-common-wp/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 asinkj-modules/asinkj-job/src/main/java/org/asinkj/job/snailjob/AmzUpdateFBAJobExecutor.java create mode 100644 asinkj-modules/asinkj-job/src/main/java/org/asinkj/job/snailjob/QuoteReminderExecutor.java diff --git a/.run/asinkj-auth.run.xml b/.run/asinkj-auth.run.xml index c4d1850..98eb297 100644 --- a/.run/asinkj-auth.run.xml +++ b/.run/asinkj-auth.run.xml @@ -17,7 +17,7 @@ - \ No newline at end of file diff --git a/.run/asinkj-system.run.xml b/.run/asinkj-system.run.xml index d9c1571..edfa5c7 100644 --- a/.run/asinkj-system.run.xml +++ b/.run/asinkj-system.run.xml @@ -17,7 +17,7 @@ - \ No newline at end of file diff --git a/asinkj-api/asinkj-api-amz/src/main/java/org/asinkj/amz/api/RemoteFBADataService.java b/asinkj-api/asinkj-api-amz/src/main/java/org/asinkj/amz/api/RemoteFBADataService.java index 9b40e3d..ea7cc3f 100644 --- a/asinkj-api/asinkj-api-amz/src/main/java/org/asinkj/amz/api/RemoteFBADataService.java +++ b/asinkj-api/asinkj-api-amz/src/main/java/org/asinkj/amz/api/RemoteFBADataService.java @@ -5,4 +5,8 @@ import org.springframework.stereotype.Service; @Service public interface RemoteFBADataService { void pullAmzFbaDataToken(String startDate, String endDate) throws Exception; + + void updateAmzFbaDataToken() throws Exception; + + void quoteReminder() throws Exception; } diff --git a/asinkj-api/asinkj-api-system/src/main/java/org/asinkj/system/api/RemoteUserService.java b/asinkj-api/asinkj-api-system/src/main/java/org/asinkj/system/api/RemoteUserService.java index 337b7b0..4509da4 100644 --- a/asinkj-api/asinkj-api-system/src/main/java/org/asinkj/system/api/RemoteUserService.java +++ b/asinkj-api/asinkj-api-system/src/main/java/org/asinkj/system/api/RemoteUserService.java @@ -116,6 +116,15 @@ public interface RemoteUserService { */ void recordLoginInfo(Long userId, String ip); + + /** + * 更新用户信息 + * + * @param userId 用户ID + * @param openId openId + */ + void recordOpenId(Long userId, String openId); + /** * 通过用户ID查询用户列表 * @@ -131,4 +140,13 @@ public interface RemoteUserService { * @return 用户ids */ List selectUserIdsByRoleIds(List roleIds); + + + /** + * 通过角色ID查询用户ID + * + * @param roleIds 角色ids + * @return 用户ids + */ + List selectUserOpenIdsByRoleIds(List roleIds); } diff --git a/asinkj-auth/pom.xml b/asinkj-auth/pom.xml index 292f983..964f494 100644 --- a/asinkj-auth/pom.xml +++ b/asinkj-auth/pom.xml @@ -86,6 +86,11 @@ asinkj-api-resource + + org.asinkj + asinkj-common-wp + + diff --git a/asinkj-auth/src/main/java/org/asinkj/auth/controller/TokenController.java b/asinkj-auth/src/main/java/org/asinkj/auth/controller/TokenController.java index 9e15711..7d818c1 100644 --- a/asinkj-auth/src/main/java/org/asinkj/auth/controller/TokenController.java +++ b/asinkj-auth/src/main/java/org/asinkj/auth/controller/TokenController.java @@ -7,6 +7,7 @@ import cn.hutool.core.util.ObjectUtil; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.error.WxErrorException; import me.zhyd.oauth.model.AuthResponse; import me.zhyd.oauth.model.AuthUser; import me.zhyd.oauth.request.AuthRequest; @@ -30,11 +31,9 @@ import org.asinkj.common.social.config.properties.SocialLoginConfigProperties; import org.asinkj.common.social.config.properties.SocialProperties; import org.asinkj.common.social.utils.SocialUtils; import org.asinkj.common.tenant.helper.TenantHelper; +import org.asinkj.common.wp.handler.WxMessagesManager; import org.asinkj.resource.api.RemoteMessageService; -import org.asinkj.system.api.RemoteClientService; -import org.asinkj.system.api.RemoteConfigService; -import org.asinkj.system.api.RemoteSocialService; -import org.asinkj.system.api.RemoteTenantService; +import org.asinkj.system.api.*; import org.asinkj.system.api.domain.vo.RemoteClientVo; import org.asinkj.system.api.domain.vo.RemoteTenantVo; import org.springframework.web.bind.annotation.*; @@ -72,6 +71,9 @@ public class TokenController { @DubboReference(stub = "true") private final RemoteMessageService remoteMessageService; + @DubboReference + private RemoteUserService remoteUserService; + /** * 登录方法 * @@ -129,6 +131,35 @@ public class TokenController { return R.ok("操作成功", authorizeUrl); } + + /** + * 第三方登录请求 + * + * @return 结果 + */ + @GetMapping("/generate-auth-url") + public R generateWeixinAuthUrl() { + String redirectUri = "https://api.amzups.com/auth/auth-callback"; + String authUrl = WxMessagesManager.buildAuthUrl(redirectUri, String.valueOf(LoginHelper.getUserId())); + return R.ok("操作成功", authUrl); + } + + @GetMapping("/auth-callback") + public String handleCallback(@RequestParam String code, @RequestParam String state) { + try { + String openId = WxMessagesManager.getOpenIdByCode(code); + // 将 openId 绑定到 state 对应的用户ID(需自行实现) + + remoteUserService.recordOpenId(Long.valueOf(state), openId); + String nickname = remoteUserService.selectNicknameById(Long.valueOf(state)); + + return "用户: " + nickname + "绑定成功!"; + } catch (WxErrorException e) { + log.error("微信授权失败: {}", e.getMessage()); + return "绑定失败,请重试"; + } + } + /** * 第三方登录回调业务处理 绑定授权 * diff --git a/asinkj-biz/asinkj-amz/Dockerfile b/asinkj-biz/asinkj-amz/Dockerfile index f438305..fab32a2 100644 --- a/asinkj-biz/asinkj-amz/Dockerfile +++ b/asinkj-biz/asinkj-amz/Dockerfile @@ -4,6 +4,8 @@ #FROM findepi/graalvm:java17-native FROM amazoncorretto:17.0.14 +ENV TZ=Asia/Shanghai + LABEL maintainer="Shuo Hu " RUN mkdir -p /asinkj/amz/logs \ diff --git a/asinkj-biz/asinkj-amz/pom.xml b/asinkj-biz/asinkj-amz/pom.xml index 1fe6d20..9729f7c 100644 --- a/asinkj-biz/asinkj-amz/pom.xml +++ b/asinkj-biz/asinkj-amz/pom.xml @@ -49,6 +49,11 @@ asinkj-common-mybatis + + org.asinkj + asinkj-common-wp + + org.asinkj asinkj-common-dubbo diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizInquiryRequestController.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizInquiryRequestController.java index 5676de6..662fc52 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizInquiryRequestController.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizInquiryRequestController.java @@ -7,6 +7,8 @@ import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.*; import cn.dev33.satoken.annotation.SaCheckPermission; import org.asinkj.amz.domain.vo.InquiryRequestItemVo; +import org.asinkj.common.wp.handler.WxMessagesManager; +import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; import org.asinkj.common.idempotent.annotation.RepeatSubmit; @@ -22,6 +24,7 @@ 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; +import org.springframework.web.multipart.MultipartFile; /** * 物流询价 @@ -55,9 +58,9 @@ public class BizInquiryRequestController extends BaseController { @SaCheckPermission("amz:shipmentPlan:edit") @GetMapping("/query/{destination}/{channelId}/{date}") public TableDataInfo queryWithDesAndChannel(@PathVariable("destination") @NotNull(message = "目的地不能为空") String destination, - @PathVariable("channelId") @NotNull(message = "渠道不能为空") String channelId, - @PathVariable("date") @NotNull(message = "日期不能为空") String date) { - return bizInquiryRequestService.queryWithDesAndChannel(destination, channelId,date); + @PathVariable("channelId") @NotNull(message = "渠道不能为空") String channelId, + @PathVariable("date") @NotNull(message = "日期不能为空") String date) { + return bizInquiryRequestService.queryWithDesAndChannel(destination, channelId, date); } @@ -68,9 +71,9 @@ public class BizInquiryRequestController extends BaseController { @SaCheckPermission("amz:shipmentPlan:edit") @GetMapping("/create/{destination}/{channelId}/{date}") public R createWithDesAndChannel(@PathVariable("destination") @NotNull(message = "目的地不能为空") String destination, - @PathVariable("channelId") @NotNull(message = "渠道不能为空") String channelId, - @PathVariable("date") @NotNull(message = "日期不能为空") String date) { - return bizInquiryRequestService.createWithDesAndChannel(destination, channelId,date); + @PathVariable("channelId") @NotNull(message = "渠道不能为空") String channelId, + @PathVariable("date") @NotNull(message = "日期不能为空") String date) { + return bizInquiryRequestService.createWithDesAndChannel(destination, channelId, date); } @SaCheckPermission("amz:shipmentPlan:edit") @@ -99,7 +102,7 @@ public class BizInquiryRequestController extends BaseController { @SaCheckPermission("amz:inquiryRequest:query") @GetMapping("/{id}") public R getInfo(@NotNull(message = "主键不能为空") - @PathVariable Long id) { + @PathVariable Long id) { return R.ok(bizInquiryRequestService.queryById(id)); } @@ -125,6 +128,7 @@ public class BizInquiryRequestController extends BaseController { return toAjax(bizInquiryRequestService.updateByBo(bo)); } + /** * 删除物流询价 * @@ -137,4 +141,17 @@ public class BizInquiryRequestController extends BaseController { @PathVariable Long[] ids) { return toAjax(bizInquiryRequestService.deleteWithValidByIds(List.of(ids), true)); } + + + @GetMapping("/message/test/{key1}/{key2}/{openId}") + public R test( + @PathVariable("key1") String key1, + @PathVariable("key2") String key2, + @PathVariable("openId") String openId + ) throws Exception { + WxMessagesManager.sendWechatTempMessage(key1, key2, openId); + return R.ok(); + } + + } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizLogisticsQuoteController.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizLogisticsQuoteController.java index 75d1bb2..f2bc0c6 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizLogisticsQuoteController.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizLogisticsQuoteController.java @@ -3,6 +3,7 @@ package org.asinkj.amz.controller; import java.util.List; import java.util.Map; +import cn.dev33.satoken.annotation.SaCheckRole; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import jakarta.servlet.http.HttpServletResponse; @@ -166,7 +167,7 @@ public class BizLogisticsQuoteController extends BaseController { * * @return */ - @SaCheckPermission("amz:logisticsQuote:query") + @SaCheckRole("yunying") @PostMapping("/report") public R>> getInfo(@Valid @RequestBody BizLogisticsQuoteReportBo bo) { List> maps = bizLogisticsQuoteService.generateReport(bo); diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizPurchaseOrderController.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizPurchaseOrderController.java new file mode 100644 index 0000000..f3c3ecd --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizPurchaseOrderController.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.BizPurchaseOrderVo; +import org.asinkj.amz.domain.bo.BizPurchaseOrderBo; +import org.asinkj.amz.service.IBizPurchaseOrderService; +import org.asinkj.common.mybatis.core.page.TableDataInfo; + +/** + * 采购单主 + * 前端访问路由地址为:/amz/purchaseOrder + * + * @author shuo hu + * @date 2025-05-10 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/purchaseOrder") +public class BizPurchaseOrderController extends BaseController { + + private final IBizPurchaseOrderService bizPurchaseOrderService; + + /** + * 查询采购单主列表 + */ + @SaCheckPermission("amz:purchaseOrder:list") + @GetMapping("/list") + public TableDataInfo list(BizPurchaseOrderBo bo, PageQuery pageQuery) { + return bizPurchaseOrderService.queryPageList(bo, pageQuery); + } + + /** + * 导出采购单主列表 + */ + @SaCheckPermission("amz:purchaseOrder:export") + @Log(title = "采购单主", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BizPurchaseOrderBo bo, HttpServletResponse response) { + List list = bizPurchaseOrderService.queryList(bo); + ExcelUtil.exportExcel(list, "采购单主", BizPurchaseOrderVo.class, response); + } + + /** + * 获取采购单主详细信息 + * + * @param orderSn 主键 + */ + @SaCheckPermission("amz:purchaseOrder:query") + @GetMapping("/{orderSn}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable String orderSn) { + return R.ok(bizPurchaseOrderService.queryById(orderSn)); + } + + /** + * 新增采购单主 + */ + @SaCheckPermission("amz:purchaseOrder:add") + @Log(title = "采购单主", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BizPurchaseOrderBo bo) { + return toAjax(bizPurchaseOrderService.insertByBo(bo)); + } + + /** + * 修改采购单主 + */ + @SaCheckPermission("amz:purchaseOrder:edit") + @Log(title = "采购单主", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BizPurchaseOrderBo bo) { + return toAjax(bizPurchaseOrderService.updateByBo(bo)); + } + + /** + * 删除采购单主 + * + * @param orderSns 主键串 + */ + @SaCheckPermission("amz:purchaseOrder:remove") + @Log(title = "采购单主", businessType = BusinessType.DELETE) + @DeleteMapping("/{orderSns}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable String[] orderSns) { + return toAjax(bizPurchaseOrderService.deleteWithValidByIds(List.of(orderSns), true)); + } +} diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizPurchaseOrderItemController.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizPurchaseOrderItemController.java new file mode 100644 index 0000000..92a9771 --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizPurchaseOrderItemController.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.BizPurchaseOrderItemVo; +import org.asinkj.amz.domain.bo.BizPurchaseOrderItemBo; +import org.asinkj.amz.service.IBizPurchaseOrderItemService; +import org.asinkj.common.mybatis.core.page.TableDataInfo; + +/** + * 供应商订单产品明细 + * 前端访问路由地址为:/amz/purchaseOrderItem + * + * @author shuo hu + * @date 2025-05-10 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/purchaseOrderItem") +public class BizPurchaseOrderItemController extends BaseController { + + private final IBizPurchaseOrderItemService bizPurchaseOrderItemService; + + /** + * 查询供应商订单产品明细列表 + */ + @SaCheckPermission("amz:purchaseOrderItem:list") + @GetMapping("/list") + public TableDataInfo list(BizPurchaseOrderItemBo bo, PageQuery pageQuery) { + return bizPurchaseOrderItemService.queryPageList(bo, pageQuery); + } + + /** + * 导出供应商订单产品明细列表 + */ + @SaCheckPermission("amz:purchaseOrderItem:export") + @Log(title = "供应商订单产品明细", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BizPurchaseOrderItemBo bo, HttpServletResponse response) { + List list = bizPurchaseOrderItemService.queryList(bo); + ExcelUtil.exportExcel(list, "供应商订单产品明细", BizPurchaseOrderItemVo.class, response); + } + + /** + * 获取供应商订单产品明细详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("amz:purchaseOrderItem:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(bizPurchaseOrderItemService.queryById(id)); + } + + /** + * 新增供应商订单产品明细 + */ + @SaCheckPermission("amz:purchaseOrderItem:add") + @Log(title = "供应商订单产品明细", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BizPurchaseOrderItemBo bo) { + return toAjax(bizPurchaseOrderItemService.insertByBo(bo)); + } + + /** + * 修改供应商订单产品明细 + */ + @SaCheckPermission("amz:purchaseOrderItem:edit") + @Log(title = "供应商订单产品明细", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BizPurchaseOrderItemBo bo) { + return toAjax(bizPurchaseOrderItemService.updateByBo(bo)); + } + + /** + * 删除供应商订单产品明细 + * + * @param ids 主键串 + */ + @SaCheckPermission("amz:purchaseOrderItem:remove") + @Log(title = "供应商订单产品明细", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(bizPurchaseOrderItemService.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 index 1e23736..f44575a 100644 --- 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 @@ -2,12 +2,14 @@ package org.asinkj.amz.controller; import java.util.List; +import cn.dev33.satoken.annotation.SaCheckRole; 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.asinkj.amz.domain.vo.BizShipmentPlanOrderVo; +import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; import org.asinkj.common.idempotent.annotation.RepeatSubmit; @@ -23,6 +25,7 @@ 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; +import org.springframework.web.multipart.MultipartFile; /** * 货件计划 @@ -149,4 +152,13 @@ public class BizShipmentPlanController extends BaseController { return R.ok(); } + @SaCheckRole("yunying") + @Log(title = "更新货件信息", businessType = BusinessType.EXPORT) + @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R importData(@RequestPart("file") MultipartFile file) throws Exception { + bizShipmentPlanService.importExcel(file.getInputStream()); + + return R.ok(); + } + } 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 index 81a408f..a25a746 100644 --- 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 @@ -153,6 +153,21 @@ public class SysAmazonStoreController extends BaseController { return R.ok(); } + @GetMapping("/purchase/{startDate}/{endDate}") + public R pullPurchaseOrderData(@PathVariable String startDate, @PathVariable String endDate) { + try { + sysAmazonStoreService.pullPurchaseOrderData(startDate, endDate, new LingxinCallback() { + @Override + public void onFinished(String result, int status) { + + } + }); + } catch (Exception e) { + throw new RuntimeException(e); + } + return R.ok(); + } + @SaCheckPermission("amz:amazonStore:remove") @Log(title = "亚马逊FBAtest", businessType = BusinessType.OTHER) @GetMapping("/test") diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizPurchaseOrder.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizPurchaseOrder.java new file mode 100644 index 0000000..3e2db58 --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizPurchaseOrder.java @@ -0,0 +1,283 @@ +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_purchase_order + * + * @author shuo hu + * @date 2025-05-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("biz_purchase_order") +public class BizPurchaseOrder extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 采购单号 + */ + private String orderSn; + + /** + * 自定义单号 + */ + private String customOrderSn; + + /** + * 供应商ID + */ + private Long supplierId; + + /** + * 供应商名称 + */ + private String supplierName; + + /** + * 采购员ID + */ + private Long optUid; + + /** + * 审核人姓名 + */ + private String auditorRealname; + + /** + * 操作人姓名 + */ + private String optRealname; + + /** + * 最后操作人姓名 + */ + private String lastRealname; + + /** + * 下单时间 + */ + private Date orderTime; + + /** + * 应付货款(手工) + */ + private String payment; + + /** + * 审核人员ID + */ + private Long auditorUid; + + /** + * 审核时间 + */ + private Date auditorTime; + + /** + * 最后操作人员ID + */ + private Long lastUid; + + /** + * 最后操作时间 + */ + private Date lastTime; + + /** + * 作废原因 + */ + private String reason; + + /** + * 是否含税:0 否,1 是 + */ + private Long isTax; + + /** + * 采购单状态:-1 作废, 3 待提交, 1 待下单, 2 待签收, 9 完成, 121 待审核, 122 驳回, 124 作废 + */ + private Long status; + + /** + * 状态说明 + */ + private String statusText; + + /** + * 支付状态说明 + */ + private String payStatusText; + + /** + * 到货状态:1 未到货, 2 部分到货, 3 全部到货 + */ + private Long statusShipped; + + /** + * 到货状态说明 + */ + private String statusShippedText; + + /** + * 货物总价 + */ + private Long amountTotal; + + /** + * 总金额 + */ + private Long totalPrice; + + /** + * 币种符号 + */ + private String icon; + + /** + * 付款状态:0 未申请, 1 已申请, 2 部分付款, 3 已付款 + */ + private Long payStatus; + + /** + * 备注 + */ + private String remark; + + /** + * 其他费用 + */ + private Long otherFee; + + /** + * 其他费用币种 + */ + private String otherCurrency; + + /** + * 费用分摊方式:0 不分摊, 1 按金额, 2 按数量 + */ + private Long feePartType; + + /** + * 运费 + */ + private Long shippingPrice; + + /** + * 运费币种 + */ + private String shippingCurrency; + + /** + * 采购币种 + */ + private String purchaseCurrency; + + /** + * 采购汇率 + */ + private Long purchaseRate; + + /** + * 采购总量 + */ + private Long quantityTotal; + + /** + * 仓库ID + */ + private Long wid; + + /** + * 仓库名称 + */ + private String wareHouseName; + + /** + * 仓库名(备份) + */ + private String wareHouseBakName; + + /** + * 入库量 + */ + private Long quantityEntry; + + /** + * 实际采购量 + */ + private Long quantityReal; + + /** + * 待到货量 + */ + private Long quantityReceive; + + /** + * 采购方ID + */ + private Long purchaserId; + + /** + * 联系人 + */ + private String contactPerson; + + /** + * 联系方式 + */ + private String contactNumber; + + /** + * 结算方式:7 现结, 8 月结 + */ + private Long settlementMethod; + + /** + * 结算描述 + */ + private String settlementDescription; + + /** + * 支付方式 + */ + private Long paymentMethod; + + /** + * 删除标志(0正常 2删除) + */ + @TableLogic + private String delFlag; + + /** + * 交货天数 + */ + private Long estDlvDays; + + /** + * 订单状态 + */ + private String orderStatus; + + /** + * 交货时间 + */ + private Date deliveryTime; + + /** + * 订单交付变动天数 + */ + private Long dlvTimeVar; + + +} diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizPurchaseOrderItem.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizPurchaseOrderItem.java new file mode 100644 index 0000000..6af665c --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizPurchaseOrderItem.java @@ -0,0 +1,178 @@ +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_purchase_order_item + * + * @author shuo hu + * @date 2025-05-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("biz_purchase_order_item") +public class BizPurchaseOrderItem extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 采购单子项ID + */ + private Long id; + + /** + * 关联采购单号 + */ + private String orderSn; + + /** + * 仓库ID + */ + private Long wid; + + /** + * 仓库名称 + */ + private String wareHouseName; + + /** + * 采购计划号 + */ + private String planSn; + + /** + * 本地产品ID + */ + private Long productId; + + /** + * 品名 + */ + private String productName; + + /** + * SKU + */ + private String sku; + + /** + * FNSKU + */ + private String fnsku; + + /** + * 店铺ID + */ + private String sid; + + /** + * 型号 + */ + private String model; + + /** + * 含税单价 + */ + private Long price; + + /** + * 价税合计 + */ + private Long amount; + + /** + * 计划采购量 + */ + private Long quantityPlan; + + /** + * 实际采购量 + */ + private Long quantityReal; + + /** + * 到货入库量 + */ + private Long quantityEntry; + + /** + * 待到货量 + */ + private Long quantityReceive; + + /** + * 退货数 + */ + private Long quantityReturn; + + /** + * 换货量 + */ + private Long quantityExchange; + + /** + * 质检量 + */ + private Long quantityQc; + + /** + * 待质检量 + */ + private Long quantityQcPrepare; + + /** + * 期待到货时间 + */ + private Date expectArriveTime; + + /** + * 备注 + */ + private String remark; + + /** + * 箱数 + */ + private Long casesNum; + + /** + * 单箱数量 + */ + private Long quantityPerCase; + + /** + * 是否删除:0 否,1 是 + */ + private Long isDelete; + + /** + * 税率 + */ + private String taxRate; + + /** + * SPU + */ + private String spu; + + /** + * 款名 + */ + private String spuName; + + /** + * 删除标志(0正常 2删除) + */ + @TableLogic + private String delFlag; + + +} diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizShipmentPlanFileData.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizShipmentPlanFileData.java new file mode 100644 index 0000000..8445f67 --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizShipmentPlanFileData.java @@ -0,0 +1,63 @@ +package org.asinkj.amz.domain; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.asinkj.amz.hanlder.AddressTypeHandler; +import org.asinkj.asinking.entity.FbaShipmentApiResponse; +import org.asinkj.common.tenant.core.TenantEntity; + +import java.io.Serial; +import java.util.Date; + +/** + * 货件计划对象 biz_shipment_plan + * + * @author shuo hu + * @date 2025-03-19 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("biz_shipment_plan") +public class BizShipmentPlanFileData extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + + /** + * 货件编号 + */ + @ExcelProperty(value = "货件编号") + private String shipmentId; + + + /** + * 总箱子数量 + */ + @ExcelProperty(value = "总箱子数量") + private Long boxQuantity; + + /** + * 箱子尺寸 + */ + @ExcelProperty(value = "箱子尺寸") + private String boxSize; + + /** + * 总的物流商计重(单位:KG,物流商实际测量值) + */ + @ExcelProperty(value = "总的物流商计重") + private Long vendorWeight; + + /** + * 套数(系统中的申报量) + */ + @ExcelProperty(value = "套数") + private Long setTotal; + + +} diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsQuoteReportBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsQuoteReportBo.java index 67924b6..13f8616 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsQuoteReportBo.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsQuoteReportBo.java @@ -33,7 +33,7 @@ public class BizLogisticsQuoteReportBo extends BaseEntity { /** * 目的地(建议使用ISO国家代码如CN/US/GB) */ - @NotBlank(message = "目的地(建议使用ISO国家代码如CN/US/GB)不能为空") + @NotBlank(message = "目的地(4个字母组合)不能为空") private String destination; diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizPurchaseOrderBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizPurchaseOrderBo.java new file mode 100644 index 0000000..723303a --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizPurchaseOrderBo.java @@ -0,0 +1,326 @@ +package org.asinkj.amz.domain.bo; + +import org.asinkj.amz.domain.BizPurchaseOrder; +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_purchase_order + * + * @author shuo hu + * @date 2025-05-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BizPurchaseOrder.class, reverseConvertGenerate = false) +public class BizPurchaseOrderBo extends BaseEntity { + + /** + * 采购单号 + */ + @NotBlank(message = "采购单号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String orderSn; + + /** + * 自定义单号 + */ + @NotBlank(message = "自定义单号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String customOrderSn; + + /** + * 供应商ID + */ + @NotNull(message = "供应商ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long supplierId; + + /** + * 供应商名称 + */ + @NotBlank(message = "供应商名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String supplierName; + + /** + * 采购员ID + */ + @NotNull(message = "采购员ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long optUid; + + /** + * 审核人姓名 + */ + @NotBlank(message = "审核人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String auditorRealname; + + /** + * 操作人姓名 + */ + @NotBlank(message = "操作人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String optRealname; + + /** + * 最后操作人姓名 + */ + @NotBlank(message = "最后操作人姓名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String lastRealname; + + /** + * 下单时间 + */ + @NotNull(message = "下单时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date orderTime; + + /** + * 应付货款(手工) + */ + @NotBlank(message = "应付货款(手工)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payment; + + /** + * 审核人员ID + */ + @NotNull(message = "审核人员ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long auditorUid; + + /** + * 审核时间 + */ + @NotNull(message = "审核时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date auditorTime; + + /** + * 最后操作人员ID + */ + @NotNull(message = "最后操作人员ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long lastUid; + + /** + * 最后操作时间 + */ + @NotNull(message = "最后操作时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date lastTime; + + /** + * 作废原因 + */ + @NotBlank(message = "作废原因不能为空", groups = { AddGroup.class, EditGroup.class }) + private String reason; + + /** + * 是否含税:0 否,1 是 + */ + @NotNull(message = "是否含税:0 否,1 是不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long isTax; + + /** + * 采购单状态:-1 作废, 3 待提交, 1 待下单, 2 待签收, 9 完成, 121 待审核, 122 驳回, 124 作废 + */ + @NotNull(message = "采购单状态:-1 作废, 3 待提交, 1 待下单, 2 待签收, 9 完成, 121 待审核, 122 驳回, 124 作废不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long status; + + /** + * 状态说明 + */ + @NotBlank(message = "状态说明不能为空", groups = { AddGroup.class, EditGroup.class }) + private String statusText; + + /** + * 支付状态说明 + */ + @NotBlank(message = "支付状态说明不能为空", groups = { AddGroup.class, EditGroup.class }) + private String payStatusText; + + /** + * 到货状态:1 未到货, 2 部分到货, 3 全部到货 + */ + @NotNull(message = "到货状态:1 未到货, 2 部分到货, 3 全部到货不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long statusShipped; + + /** + * 到货状态说明 + */ + @NotBlank(message = "到货状态说明不能为空", groups = { AddGroup.class, EditGroup.class }) + private String statusShippedText; + + /** + * 货物总价 + */ + @NotNull(message = "货物总价不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long amountTotal; + + /** + * 总金额 + */ + @NotNull(message = "总金额不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long totalPrice; + + /** + * 币种符号 + */ + @NotBlank(message = "币种符号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String icon; + + /** + * 付款状态:0 未申请, 1 已申请, 2 部分付款, 3 已付款 + */ + @NotNull(message = "付款状态:0 未申请, 1 已申请, 2 部分付款, 3 已付款不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long payStatus; + + /** + * 备注 + */ + @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String remark; + + /** + * 其他费用 + */ + @NotNull(message = "其他费用不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long otherFee; + + /** + * 其他费用币种 + */ + @NotBlank(message = "其他费用币种不能为空", groups = { AddGroup.class, EditGroup.class }) + private String otherCurrency; + + /** + * 费用分摊方式:0 不分摊, 1 按金额, 2 按数量 + */ + @NotNull(message = "费用分摊方式:0 不分摊, 1 按金额, 2 按数量不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long feePartType; + + /** + * 运费 + */ + @NotNull(message = "运费不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long shippingPrice; + + /** + * 运费币种 + */ + @NotBlank(message = "运费币种不能为空", groups = { AddGroup.class, EditGroup.class }) + private String shippingCurrency; + + /** + * 采购币种 + */ + @NotBlank(message = "采购币种不能为空", groups = { AddGroup.class, EditGroup.class }) + private String purchaseCurrency; + + /** + * 采购汇率 + */ + @NotNull(message = "采购汇率不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long purchaseRate; + + /** + * 采购总量 + */ + @NotNull(message = "采购总量不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long quantityTotal; + + /** + * 仓库ID + */ + @NotNull(message = "仓库ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long wid; + + /** + * 仓库名称 + */ + @NotBlank(message = "仓库名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wareHouseName; + + /** + * 仓库名(备份) + */ + @NotBlank(message = "仓库名(备份)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wareHouseBakName; + + /** + * 入库量 + */ + @NotNull(message = "入库量不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long quantityEntry; + + /** + * 实际采购量 + */ + @NotNull(message = "实际采购量不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long quantityReal; + + /** + * 待到货量 + */ + @NotNull(message = "待到货量不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long quantityReceive; + + /** + * 采购方ID + */ + @NotNull(message = "采购方ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long purchaserId; + + /** + * 联系人 + */ + @NotBlank(message = "联系人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String contactPerson; + + /** + * 联系方式 + */ + @NotBlank(message = "联系方式不能为空", groups = { AddGroup.class, EditGroup.class }) + private String contactNumber; + + /** + * 结算方式:7 现结, 8 月结 + */ + @NotNull(message = "结算方式:7 现结, 8 月结不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long settlementMethod; + + /** + * 结算描述 + */ + @NotBlank(message = "结算描述不能为空", groups = { AddGroup.class, EditGroup.class }) + private String settlementDescription; + + /** + * 支付方式 + */ + @NotNull(message = "支付方式不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long paymentMethod; + + /** + * 交货天数 + */ + @NotNull(message = "交货天数不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long estDlvDays; + + /** + * 订单状态 + */ + @NotBlank(message = "订单状态不能为空", groups = { AddGroup.class, EditGroup.class }) + private String orderStatus; + + /** + * 交货时间 + */ + @NotNull(message = "交货时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date deliveryTime; + + /** + * 订单交付变动天数 + */ + @NotNull(message = "订单交付变动天数不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long dlvTimeVar; + + +} diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizPurchaseOrderItemBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizPurchaseOrderItemBo.java new file mode 100644 index 0000000..64d0cce --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizPurchaseOrderItemBo.java @@ -0,0 +1,200 @@ +package org.asinkj.amz.domain.bo; + +import org.asinkj.amz.domain.BizPurchaseOrderItem; +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_purchase_order_item + * + * @author shuo hu + * @date 2025-05-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BizPurchaseOrderItem.class, reverseConvertGenerate = false) +public class BizPurchaseOrderItemBo extends BaseEntity { + + /** + * 采购单子项ID + */ + @NotNull(message = "采购单子项ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long id; + + /** + * 关联采购单号 + */ + @NotBlank(message = "关联采购单号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String orderSn; + + /** + * 仓库ID + */ + @NotNull(message = "仓库ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long wid; + + /** + * 仓库名称 + */ + @NotBlank(message = "仓库名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String wareHouseName; + + /** + * 采购计划号 + */ + @NotBlank(message = "采购计划号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String planSn; + + /** + * 本地产品ID + */ + @NotNull(message = "本地产品ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long productId; + + /** + * 品名 + */ + @NotBlank(message = "品名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String productName; + + /** + * SKU + */ + @NotBlank(message = "SKU不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sku; + + /** + * FNSKU + */ + @NotBlank(message = "FNSKU不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fnsku; + + /** + * 店铺ID + */ + @NotBlank(message = "店铺ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private String sid; + + /** + * 型号 + */ + @NotBlank(message = "型号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String model; + + /** + * 含税单价 + */ + @NotNull(message = "含税单价不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long price; + + /** + * 价税合计 + */ + @NotNull(message = "价税合计不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long amount; + + /** + * 计划采购量 + */ + @NotNull(message = "计划采购量不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long quantityPlan; + + /** + * 实际采购量 + */ + @NotNull(message = "实际采购量不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long quantityReal; + + /** + * 到货入库量 + */ + @NotNull(message = "到货入库量不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long quantityEntry; + + /** + * 待到货量 + */ + @NotNull(message = "待到货量不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long quantityReceive; + + /** + * 退货数 + */ + @NotNull(message = "退货数不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long quantityReturn; + + /** + * 换货量 + */ + @NotNull(message = "换货量不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long quantityExchange; + + /** + * 质检量 + */ + @NotNull(message = "质检量不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long quantityQc; + + /** + * 待质检量 + */ + @NotNull(message = "待质检量不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long quantityQcPrepare; + + /** + * 期待到货时间 + */ + @NotNull(message = "期待到货时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date expectArriveTime; + + /** + * 备注 + */ + @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String remark; + + /** + * 箱数 + */ + @NotNull(message = "箱数不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long casesNum; + + /** + * 单箱数量 + */ + @NotNull(message = "单箱数量不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long quantityPerCase; + + /** + * 是否删除:0 否,1 是 + */ + @NotNull(message = "是否删除:0 否,1 是不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long isDelete; + + /** + * 税率 + */ + @NotBlank(message = "税率不能为空", groups = { AddGroup.class, EditGroup.class }) + private String taxRate; + + /** + * SPU + */ + @NotBlank(message = "SPU不能为空", groups = { AddGroup.class, EditGroup.class }) + private String spu; + + /** + * 款名 + */ + @NotBlank(message = "款名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String spuName; + + +} diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizShipmentPlanBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizShipmentPlanBo.java index a82045f..e8883f4 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizShipmentPlanBo.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizShipmentPlanBo.java @@ -13,7 +13,9 @@ import jakarta.validation.constraints.*; import java.math.BigDecimal; import java.util.Date; + import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; /** * 货件计划业务对象 biz_shipment_plan @@ -29,7 +31,7 @@ public class BizShipmentPlanBo extends BaseEntity { /** * 主键ID */ - @NotNull(message = "主键ID不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotNull(message = "主键ID不能为空", groups = {AddGroup.class, EditGroup.class}) private Long id; /** @@ -90,6 +92,7 @@ public class BizShipmentPlanBo extends BaseEntity { * 创建时间 */ // @NotNull(message = "创建时间不能为空", groups = { AddGroup.class, EditGroup.class }) + @DateTimeFormat(pattern = "yyyy-MM-dd") private Date gmtCreate; /** @@ -185,7 +188,7 @@ public class BizShipmentPlanBo extends BaseEntity { /** * 物流渠道 */ - // @NotBlank(message = "物流渠道不能为空", groups = { AddGroup.class, EditGroup.class }) + // @NotBlank(message = "物流渠道不能为空", groups = { AddGroup.class, EditGroup.class }) private String channelName; } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsOrderDetailVo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsOrderDetailVo.java index 79023f8..c4c4134 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsOrderDetailVo.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsOrderDetailVo.java @@ -69,21 +69,21 @@ public class BizLogisticsOrderDetailVo implements Serializable { /** * 物流商ID(冗余存储) */ - @ExcelProperty(value = "物流商ID") +// @ExcelProperty(value = "物流商ID") // @ExcelDictFormat(readConverterExp = "冗=余存储") private Long logisticsProviderId; /** * 物流商名称(冗余存储) */ - @ExcelProperty(value = "物流商名称") +// @ExcelProperty(value = "物流商名称") // @ExcelDictFormat(readConverterExp = "冗=余存储") private String logisticsProviderName; /** * 物流渠道(与主表一致) */ - @ExcelProperty(value = "物流渠道") +// @ExcelProperty(value = "物流渠道") // @ExcelDictFormat(readConverterExp = "与=主表一致") private String logisticsChannel; @@ -97,14 +97,14 @@ public class BizLogisticsOrderDetailVo implements Serializable { /** * 计划数量(该箱子预计装载的商品数量) */ - @ExcelProperty(value = "计划数量") +// @ExcelProperty(value = "计划数量") // @ExcelDictFormat(readConverterExp = "该=箱子预计装载的商品数量") private Long plannedQuantity; /** * 实际货件数量(该箱子实际装载的商品数量) */ - @ExcelProperty(value = "实际货件数量") + @ExcelProperty(value = "数量") // @ExcelDictFormat(readConverterExp = "该=箱子实际装载的商品数量") private Long shipmentQuantity; @@ -118,7 +118,7 @@ public class BizLogisticsOrderDetailVo implements Serializable { /** * 供应商称重(单位:KG,由供应商提供) */ - @ExcelProperty(value = "供应商称重") +// @ExcelProperty(value = "供应商称重") // @ExcelDictFormat(readConverterExp = "单=位:KG,由供应商提供") private Long supplierWeight; @@ -132,49 +132,49 @@ public class BizLogisticsOrderDetailVo implements Serializable { /** * 称重差异(应用层计算:物流商计重 - 供应商称重) */ - @ExcelProperty(value = "称重差异") +// @ExcelProperty(value = "称重差异") // @ExcelDictFormat(readConverterExp = "应=用层计算:物流商计重,-=,供=应商称重") private Long weightDiff; /** * 物流单价(单位:元/KG,由合同或报价确定) */ - @ExcelProperty(value = "物流单价") +// @ExcelProperty(value = "物流单价") // @ExcelDictFormat(readConverterExp = "单=位:元/KG,由合同或报价确定") private Long pricePerKg; /** * 物流计价重量(应用层根据业务规则计算) */ - @ExcelProperty(value = "物流计价重量") +// @ExcelProperty(value = "物流计价重量") // @ExcelDictFormat(readConverterExp = "应=用层根据业务规则计算") private Long logisticsCalculationPrice; /** * 其他物流费用(如报关费、保险费等) */ - @ExcelProperty(value = "其他物流费用") +// @ExcelProperty(value = "其他物流费用") // @ExcelDictFormat(readConverterExp = "如=报关费、保险费等") private Long otherFee; /** * 费用合计(应用层计算:物流计价 + 其他费用) */ - @ExcelProperty(value = "费用合计") +// @ExcelProperty(value = "费用合计") // @ExcelDictFormat(readConverterExp = "应=用层计算:物流计价,+=,其=他费用") private Long totalFee; /** * 物流状态(pending:待发运/in_transit:运输中/delivered:已签收) */ - @ExcelProperty(value = "物流状态") -// @ExcelDictFormat(readConverterExp = "pending=待发运,in_transit=运输中,delivered=已签收") + @ExcelProperty(value = "物流状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "biz_logistics_status") private String logisticsStatus; /** * 预计签收日期(物流商提供的预估日期) */ - @ExcelProperty(value = "预计签收日期") +// @ExcelProperty(value = "预计签收日期") // @ExcelDictFormat(readConverterExp = "物=流商提供的预估日期") @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") private Date estimatedDeliveryDate; @@ -190,7 +190,7 @@ public class BizLogisticsOrderDetailVo implements Serializable { /** * 运输时效(单位:天,实际签收日期 - 发货日期) */ - @ExcelProperty(value = "运输时效") +// @ExcelProperty(value = "运输时效") // @ExcelDictFormat(readConverterExp = "单=位:天,实际签收日期,-=,发=货日期") private Long timeliness; @@ -198,55 +198,55 @@ public class BizLogisticsOrderDetailVo implements Serializable { /** * 物流商确认接收时间 */ - @ExcelProperty(value = "物流商确认接收时间") +// @ExcelProperty(value = "物流商确认接收时间") private Date carrierConfirmTime; /** * 已提货时间 */ - @ExcelProperty(value = "物流商已提货时间") +// @ExcelProperty(value = "物流商已提货时间") private Date goodsReceiptTime; /** * 转运开始时间 */ - @ExcelProperty(value = "转运开始时间") +// @ExcelProperty(value = "转运开始时间") private Date transferStartTime; /** * 最终签收时间 */ - @ExcelProperty(value = "最终签收时间") +// @ExcelProperty(value = "最终签收时间") private Date signedTime; /** * 排仓时间 */ - @ExcelProperty(value = "排仓时间") +// @ExcelProperty(value = "排仓时间") private Date scheduleTime; /** * 船舶离港时间 */ - @ExcelProperty(value = "船舶离港时间") +// @ExcelProperty(value = "船舶离港时间") private Date vesselDepartTime; /** * 目的港到达时间 */ - @ExcelProperty(value = "目的港到达时间") +// @ExcelProperty(value = "目的港到达时间") private Date portArrivalTime; /** * 查验开始时间 */ - @ExcelProperty(value = "查验开始时间") +// @ExcelProperty(value = "查验开始时间") private Date inspectionTime; /** * 末端提取时间 */ - @ExcelProperty(value = "末端提取时间") +// @ExcelProperty(value = "末端提取时间") private Date deliveryPickupTime; diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizPurchaseOrderItemVo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizPurchaseOrderItemVo.java new file mode 100644 index 0000000..1cb4317 --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizPurchaseOrderItemVo.java @@ -0,0 +1,208 @@ +package org.asinkj.amz.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.asinkj.amz.domain.BizPurchaseOrderItem; +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_purchase_order_item + * + * @author shuo hu + * @date 2025-05-10 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BizPurchaseOrderItem.class) +public class BizPurchaseOrderItemVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 采购单子项ID + */ + @ExcelProperty(value = "采购单子项ID") + private Long id; + + /** + * 关联采购单号 + */ + @ExcelProperty(value = "关联采购单号") + private String orderSn; + + /** + * 仓库ID + */ + @ExcelProperty(value = "仓库ID") + private Long wid; + + /** + * 仓库名称 + */ + @ExcelProperty(value = "仓库名称") + private String wareHouseName; + + /** + * 采购计划号 + */ + @ExcelProperty(value = "采购计划号") + private String planSn; + + /** + * 本地产品ID + */ + @ExcelProperty(value = "本地产品ID") + private Long productId; + + /** + * 品名 + */ + @ExcelProperty(value = "品名") + private String productName; + + /** + * SKU + */ + @ExcelProperty(value = "SKU") + private String sku; + + /** + * FNSKU + */ + @ExcelProperty(value = "FNSKU") + private String fnsku; + + /** + * 店铺ID + */ + @ExcelProperty(value = "店铺ID") + private String sid; + + /** + * 型号 + */ + @ExcelProperty(value = "型号") + private String model; + + /** + * 含税单价 + */ + @ExcelProperty(value = "含税单价") + private Long price; + + /** + * 价税合计 + */ + @ExcelProperty(value = "价税合计") + private Long amount; + + /** + * 计划采购量 + */ + @ExcelProperty(value = "计划采购量") + private Long quantityPlan; + + /** + * 实际采购量 + */ + @ExcelProperty(value = "实际采购量") + private Long quantityReal; + + /** + * 到货入库量 + */ + @ExcelProperty(value = "到货入库量") + private Long quantityEntry; + + /** + * 待到货量 + */ + @ExcelProperty(value = "待到货量") + private Long quantityReceive; + + /** + * 退货数 + */ + @ExcelProperty(value = "退货数") + private Long quantityReturn; + + /** + * 换货量 + */ + @ExcelProperty(value = "换货量") + private Long quantityExchange; + + /** + * 质检量 + */ + @ExcelProperty(value = "质检量") + private Long quantityQc; + + /** + * 待质检量 + */ + @ExcelProperty(value = "待质检量") + private Long quantityQcPrepare; + + /** + * 期待到货时间 + */ + @ExcelProperty(value = "期待到货时间") + private Date expectArriveTime; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 箱数 + */ + @ExcelProperty(value = "箱数") + private Long casesNum; + + /** + * 单箱数量 + */ + @ExcelProperty(value = "单箱数量") + private Long quantityPerCase; + + /** + * 是否删除:0 否,1 是 + */ + @ExcelProperty(value = "是否删除:0 否,1 是") + private Long isDelete; + + /** + * 税率 + */ + @ExcelProperty(value = "税率") + private String taxRate; + + /** + * SPU + */ + @ExcelProperty(value = "SPU") + private String spu; + + /** + * 款名 + */ + @ExcelProperty(value = "款名") + private String spuName; + + +} diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizPurchaseOrderVo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizPurchaseOrderVo.java new file mode 100644 index 0000000..04f4534 --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizPurchaseOrderVo.java @@ -0,0 +1,336 @@ +package org.asinkj.amz.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.asinkj.amz.domain.BizPurchaseOrder; +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_purchase_order + * + * @author shuo hu + * @date 2025-05-10 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BizPurchaseOrder.class) +public class BizPurchaseOrderVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 采购单号 + */ + @ExcelProperty(value = "采购单号") + private String orderSn; + + /** + * 自定义单号 + */ + @ExcelProperty(value = "自定义单号") + private String customOrderSn; + + /** + * 供应商ID + */ + @ExcelProperty(value = "供应商ID") + private Long supplierId; + + /** + * 供应商名称 + */ + @ExcelProperty(value = "供应商名称") + private String supplierName; + + /** + * 采购员ID + */ + @ExcelProperty(value = "采购员ID") + private Long optUid; + + /** + * 审核人姓名 + */ + @ExcelProperty(value = "审核人姓名") + private String auditorRealname; + + /** + * 操作人姓名 + */ + @ExcelProperty(value = "操作人姓名") + private String optRealname; + + /** + * 最后操作人姓名 + */ + @ExcelProperty(value = "最后操作人姓名") + private String lastRealname; + + /** + * 下单时间 + */ + @ExcelProperty(value = "下单时间") + private Date orderTime; + + /** + * 应付货款(手工) + */ + @ExcelProperty(value = "应付货款", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "手=工") + private String payment; + + /** + * 审核人员ID + */ + @ExcelProperty(value = "审核人员ID") + private Long auditorUid; + + /** + * 审核时间 + */ + @ExcelProperty(value = "审核时间") + private Date auditorTime; + + /** + * 最后操作人员ID + */ + @ExcelProperty(value = "最后操作人员ID") + private Long lastUid; + + /** + * 最后操作时间 + */ + @ExcelProperty(value = "最后操作时间") + private Date lastTime; + + /** + * 作废原因 + */ + @ExcelProperty(value = "作废原因") + private String reason; + + /** + * 是否含税:0 否,1 是 + */ + @ExcelProperty(value = "是否含税:0 否,1 是") + private Long isTax; + + /** + * 采购单状态:-1 作废, 3 待提交, 1 待下单, 2 待签收, 9 完成, 121 待审核, 122 驳回, 124 作废 + */ + @ExcelProperty(value = "采购单状态:-1 作废, 3 待提交, 1 待下单, 2 待签收, 9 完成, 121 待审核, 122 驳回, 124 作废") + private Long status; + + /** + * 状态说明 + */ + @ExcelProperty(value = "状态说明") + private String statusText; + + /** + * 支付状态说明 + */ + @ExcelProperty(value = "支付状态说明") + private String payStatusText; + + /** + * 到货状态:1 未到货, 2 部分到货, 3 全部到货 + */ + @ExcelProperty(value = "到货状态:1 未到货, 2 部分到货, 3 全部到货") + private Long statusShipped; + + /** + * 到货状态说明 + */ + @ExcelProperty(value = "到货状态说明") + private String statusShippedText; + + /** + * 货物总价 + */ + @ExcelProperty(value = "货物总价") + private Long amountTotal; + + /** + * 总金额 + */ + @ExcelProperty(value = "总金额") + private Long totalPrice; + + /** + * 币种符号 + */ + @ExcelProperty(value = "币种符号") + private String icon; + + /** + * 付款状态:0 未申请, 1 已申请, 2 部分付款, 3 已付款 + */ + @ExcelProperty(value = "付款状态:0 未申请, 1 已申请, 2 部分付款, 3 已付款") + private Long payStatus; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 其他费用 + */ + @ExcelProperty(value = "其他费用") + private Long otherFee; + + /** + * 其他费用币种 + */ + @ExcelProperty(value = "其他费用币种") + private String otherCurrency; + + /** + * 费用分摊方式:0 不分摊, 1 按金额, 2 按数量 + */ + @ExcelProperty(value = "费用分摊方式:0 不分摊, 1 按金额, 2 按数量") + private Long feePartType; + + /** + * 运费 + */ + @ExcelProperty(value = "运费") + private Long shippingPrice; + + /** + * 运费币种 + */ + @ExcelProperty(value = "运费币种") + private String shippingCurrency; + + /** + * 采购币种 + */ + @ExcelProperty(value = "采购币种") + private String purchaseCurrency; + + /** + * 采购汇率 + */ + @ExcelProperty(value = "采购汇率") + private Long purchaseRate; + + /** + * 采购总量 + */ + @ExcelProperty(value = "采购总量") + private Long quantityTotal; + + /** + * 仓库ID + */ + @ExcelProperty(value = "仓库ID") + private Long wid; + + /** + * 仓库名称 + */ + @ExcelProperty(value = "仓库名称") + private String wareHouseName; + + /** + * 仓库名(备份) + */ + @ExcelProperty(value = "仓库名(备份)") + private String wareHouseBakName; + + /** + * 入库量 + */ + @ExcelProperty(value = "入库量") + private Long quantityEntry; + + /** + * 实际采购量 + */ + @ExcelProperty(value = "实际采购量") + private Long quantityReal; + + /** + * 待到货量 + */ + @ExcelProperty(value = "待到货量") + private Long quantityReceive; + + /** + * 采购方ID + */ + @ExcelProperty(value = "采购方ID") + private Long purchaserId; + + /** + * 联系人 + */ + @ExcelProperty(value = "联系人") + private String contactPerson; + + /** + * 联系方式 + */ + @ExcelProperty(value = "联系方式") + private String contactNumber; + + /** + * 结算方式:7 现结, 8 月结 + */ + @ExcelProperty(value = "结算方式:7 现结, 8 月结") + private Long settlementMethod; + + /** + * 结算描述 + */ + @ExcelProperty(value = "结算描述") + private String settlementDescription; + + /** + * 支付方式 + */ + @ExcelProperty(value = "支付方式") + private Long paymentMethod; + + /** + * 交货天数 + */ + @ExcelProperty(value = "交货天数") + private Long estDlvDays; + + /** + * 订单状态 + */ + @ExcelProperty(value = "订单状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "vendor_order_status") + private String orderStatus; + + /** + * 交货时间 + */ + @ExcelProperty(value = "交货时间") + private Date deliveryTime; + + /** + * 订单交付变动天数 + */ + @ExcelProperty(value = "订单交付变动天数") + private Long dlvTimeVar; + + +} diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/dubbo/RemoteFBADataServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/dubbo/RemoteFBADataServiceImpl.java index 5016971..422cebc 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/dubbo/RemoteFBADataServiceImpl.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/dubbo/RemoteFBADataServiceImpl.java @@ -3,6 +3,7 @@ package org.asinkj.amz.dubbo; import lombok.RequiredArgsConstructor; import org.apache.dubbo.config.annotation.DubboService; import org.asinkj.amz.api.RemoteFBADataService; +import org.asinkj.amz.service.IBizInquiryRequestService; import org.asinkj.amz.service.ISysAmazonStoreService; import org.asinkj.amz.service.LingxinCallback; import org.springframework.stereotype.Service; @@ -17,10 +18,29 @@ public class RemoteFBADataServiceImpl implements RemoteFBADataService { @Resource private ISysAmazonStoreService sysAmazonStoreService; + @Resource + private IBizInquiryRequestService ibizInquiryRequestService; + @Override public void pullAmzFbaDataToken(String startDate, String endDate) throws Exception { sysAmazonStoreService.pullAmzStaData(startDate, endDate, (result, status) -> { }); } + + @Override + public void updateAmzFbaDataToken() throws Exception { + sysAmazonStoreService.updateAmzFBAData(new LingxinCallback() { + @Override + public void onFinished(String result, int status) { + + } + }); + } + + + @Override + public void quoteReminder() throws Exception { + ibizInquiryRequestService.quoteReminder(); + } } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizPurchaseOrderItemMapper.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizPurchaseOrderItemMapper.java new file mode 100644 index 0000000..03cd974 --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizPurchaseOrderItemMapper.java @@ -0,0 +1,15 @@ +package org.asinkj.amz.mapper; + +import org.asinkj.amz.domain.BizPurchaseOrderItem; +import org.asinkj.amz.domain.vo.BizPurchaseOrderItemVo; +import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 供应商订单产品明细Mapper接口 + * + * @author shuo hu + * @date 2025-05-10 + */ +public interface BizPurchaseOrderItemMapper extends BaseMapperPlus { + +} diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizPurchaseOrderMapper.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizPurchaseOrderMapper.java new file mode 100644 index 0000000..2ceacbb --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizPurchaseOrderMapper.java @@ -0,0 +1,15 @@ +package org.asinkj.amz.mapper; + +import org.asinkj.amz.domain.BizPurchaseOrder; +import org.asinkj.amz.domain.vo.BizPurchaseOrderVo; +import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 采购单主Mapper接口 + * + * @author shuo hu + * @date 2025-05-10 + */ +public interface BizPurchaseOrderMapper 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 index 989abf7..05d3ce1 100644 --- 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 @@ -3,6 +3,7 @@ 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.BizShipmentPlanFileData; import org.asinkj.amz.domain.vo.BizShipmentPlanVo; import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus; @@ -20,4 +21,5 @@ public interface BizShipmentPlanMapper extends BaseMapperPlus selectExistingShipmentIds(@Param("batchIds") Collection batchIds); + void updateByFbaShipmentId(List bizShipmentPlanFileDataList); } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizInquiryRequestService.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizInquiryRequestService.java index 4801d6d..8023688 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizInquiryRequestService.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizInquiryRequestService.java @@ -9,6 +9,7 @@ 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.io.InputStream; import java.util.Collection; import java.util.List; @@ -76,4 +77,6 @@ public interface IBizInquiryRequestService { R batchCreateWithItems(List items); TableDataInfo queryWithDesAndChannel(@NotNull(message = "目的地不能为空") String destination, @NotNull(message = "渠道不能为空") String channelId, @NotNull(message = "日期不能为空") String date); + + void quoteReminder(); } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizPurchaseOrderItemService.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizPurchaseOrderItemService.java new file mode 100644 index 0000000..21b1550 --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizPurchaseOrderItemService.java @@ -0,0 +1,69 @@ +package org.asinkj.amz.service; + +import org.asinkj.amz.domain.BizPurchaseOrderItem; +import org.asinkj.amz.domain.vo.BizPurchaseOrderItemVo; +import org.asinkj.amz.domain.bo.BizPurchaseOrderItemBo; +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-05-10 + */ +public interface IBizPurchaseOrderItemService { + + /** + * 查询供应商订单产品明细 + * + * @param id 主键 + * @return 供应商订单产品明细 + */ + BizPurchaseOrderItemVo queryById(Long id); + + /** + * 分页查询供应商订单产品明细列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 供应商订单产品明细分页列表 + */ + TableDataInfo queryPageList(BizPurchaseOrderItemBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的供应商订单产品明细列表 + * + * @param bo 查询条件 + * @return 供应商订单产品明细列表 + */ + List queryList(BizPurchaseOrderItemBo bo); + + /** + * 新增供应商订单产品明细 + * + * @param bo 供应商订单产品明细 + * @return 是否新增成功 + */ + Boolean insertByBo(BizPurchaseOrderItemBo bo); + + /** + * 修改供应商订单产品明细 + * + * @param bo 供应商订单产品明细 + * @return 是否修改成功 + */ + Boolean updateByBo(BizPurchaseOrderItemBo 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/IBizPurchaseOrderService.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizPurchaseOrderService.java new file mode 100644 index 0000000..fa85649 --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizPurchaseOrderService.java @@ -0,0 +1,69 @@ +package org.asinkj.amz.service; + +import org.asinkj.amz.domain.BizPurchaseOrder; +import org.asinkj.amz.domain.vo.BizPurchaseOrderVo; +import org.asinkj.amz.domain.bo.BizPurchaseOrderBo; +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-05-10 + */ +public interface IBizPurchaseOrderService { + + /** + * 查询采购单主 + * + * @param orderSn 主键 + * @return 采购单主 + */ + BizPurchaseOrderVo queryById(String orderSn); + + /** + * 分页查询采购单主列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 采购单主分页列表 + */ + TableDataInfo queryPageList(BizPurchaseOrderBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的采购单主列表 + * + * @param bo 查询条件 + * @return 采购单主列表 + */ + List queryList(BizPurchaseOrderBo bo); + + /** + * 新增采购单主 + * + * @param bo 采购单主 + * @return 是否新增成功 + */ + Boolean insertByBo(BizPurchaseOrderBo bo); + + /** + * 修改采购单主 + * + * @param bo 采购单主 + * @return 是否修改成功 + */ + Boolean updateByBo(BizPurchaseOrderBo 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 index bd482bf..55a5db1 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizShipmentPlanService.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizShipmentPlanService.java @@ -9,6 +9,7 @@ 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.io.InputStream; import java.util.Collection; import java.util.List; @@ -81,4 +82,6 @@ public interface IBizShipmentPlanService { void updateStatusbyFbaShipmentIds(List fbaShipmentids); void updateList(Collection list, String status); + + void importExcel(InputStream inputStream); } 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 index b427548..8550c47 100644 --- 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 @@ -76,7 +76,9 @@ public interface ISysAmazonStoreService { void pullAmzFBAData(String startDate,String endDate) throws Exception; - void updateAmzFBAData(String startDate, String endDate) throws Exception; + void updateAmzFBAData(LingxinCallback lingxinCallback) throws Exception; + + void pullPurchaseOrderData(String startDate, String endDate, LingxinCallback lingxinCallback); void pullAmzStaData(String startDate, String endDate, LingxinCallback lingxinCallback); diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizInquiryRequestServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizInquiryRequestServiceImpl.java index 3d3fe9b..b8d8a0b 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizInquiryRequestServiceImpl.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizInquiryRequestServiceImpl.java @@ -1,20 +1,28 @@ package org.asinkj.amz.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.asinkj.amz.domain.BizLogisticsQuote; import org.asinkj.amz.domain.vo.BizLogisticsChannelVo; +import org.asinkj.amz.domain.vo.BizLogisticsOrderDetailVo; import org.asinkj.amz.domain.vo.InquiryRequestItemVo; import org.asinkj.amz.mapper.BizLogisticsQuoteMapper; import org.asinkj.amz.service.IBizInquiryBlacklistService; import org.asinkj.amz.service.IBizLogisticsChannelService; import org.asinkj.amz.service.IBizShipmentPlanService; import org.asinkj.common.core.domain.R; +import org.asinkj.common.core.exception.ServiceException; import org.asinkj.common.core.utils.MapstructUtils; import org.asinkj.common.core.utils.StringUtils; +import org.asinkj.common.excel.utils.ExcelUtil; import org.asinkj.common.mybatis.core.page.TableDataInfo; import org.asinkj.common.mybatis.core.page.PageQuery; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -24,7 +32,9 @@ import lombok.RequiredArgsConstructor; import org.asinkj.common.redis.annotation.DistributedLock; import org.asinkj.common.redis.utils.RedisUtils; import org.asinkj.common.satoken.utils.LoginHelper; +import org.asinkj.common.wp.handler.WxMessagesManager; import org.asinkj.resource.api.RemoteMessageService; +import org.asinkj.system.api.RemoteUserService; import org.asinkj.utils.SerialNoGenerator; import org.redisson.api.RLock; import org.springframework.dao.DuplicateKeyException; @@ -36,10 +46,13 @@ import org.asinkj.amz.mapper.BizInquiryRequestMapper; import org.asinkj.amz.service.IBizInquiryRequestService; import javax.annotation.Resource; +import java.io.InputStream; import java.time.DayOfWeek; import java.time.LocalDate; import java.time.temporal.TemporalAdjusters; import java.util.*; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @@ -56,6 +69,8 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService { private final BizInquiryRequestMapper baseMapper; + private final ScheduledExecutorService scheduledExecutorService; + private static final AtomicInteger sequence = new AtomicInteger(0); @@ -68,7 +83,8 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService { @Resource private BizLogisticsQuoteMapper logisticsQuoteMapper; - @Resource + + @DubboReference(stub = "true") private RemoteMessageService remoteMessageService; @Resource @@ -77,6 +93,13 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService { @Resource private IBizInquiryBlacklistService bizInquiryBlacklistService; + @DubboReference + private RemoteUserService remoteUserService; + + + + + /** * 查询物流询价 @@ -131,6 +154,12 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService { lqw.eq(bo.getEffectiveEndTime() != null, BizInquiryRequest::getEffectiveEndTime, bo.getEffectiveEndTime()); List ids = bizInquiryBlacklistService.queryByUserid(LoginHelper.getUserId()); lqw.notIn(CollectionUtil.isNotEmpty(ids), BizInquiryRequest::getId, ids); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(BizLogisticsQuote::getUserId, LoginHelper.getUserId()); + + List bizLogisticsQuotes = logisticsQuoteMapper.selectList(queryWrapper); + Set collect = bizLogisticsQuotes.stream().map(BizLogisticsQuote::getInquiryId).collect(Collectors.toSet()); + lqw.notIn(CollectionUtil.isNotEmpty(collect), BizInquiryRequest::getId, collect); return lqw; } @@ -234,8 +263,17 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService { billingRequestMapper.insert(bizInquiryRequest); - remoteMessageService.publishMessage(LoginHelper.getUserId(), "您好,您的询价单创建成功。具体询价单号为:" + bizInquiryRequest.getInquiryNo()); - +// remoteMessageService.publishMessage(LoginHelper.getUserId(), "您好,您的询价单创建成功。具体询价单号为:" + bizInquiryRequest.getInquiryNo()); +// Set collect = remoteUserService.selectUserOpenIdsByRoleIds(List.of(3L)).stream().filter(StrUtil::isNotBlank).collect(Collectors.toSet()); +// log.info("{}", collect); +// if (CollectionUtil.isNotEmpty(collect)) { +// +// scheduledExecutorService.schedule(() -> { +// WxMessagesManager.sendWechatTempMessage("有新的物流信息需要报价了", +// DateUtil.offsetMinute(DateUtil.date(), 30).toString(DatePattern.NORM_DATETIME_PATTERN), +// collect.toArray(new String[0])); +// }, 3, TimeUnit.SECONDS); +// } return R.ok(bizInquiryRequest.getInquiryNo()); } @@ -400,6 +438,17 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService { // String inquiryNo = bizInquiryRequests.get(0).getInquiryNo(); // remoteMessageService.publishMessage(LoginHelper.getUserId(), "询价单创建成功,单号:" + inquiryNo); + Set collect = remoteUserService.selectUserOpenIdsByRoleIds(List.of(3L)).stream().filter(StrUtil::isNotBlank).collect(Collectors.toSet()); + log.info("发送通知openId:{}", collect); + if (CollectionUtil.isNotEmpty(collect)) { + + scheduledExecutorService.schedule(() -> { + WxMessagesManager.sendWechatTempMessage("有新的物流信息需要报价了", + DateUtil.offsetMinute(DateUtil.date(), 30).toString(DatePattern.NORM_DATETIME_PATTERN), + collect.toArray(new String[0])); + }, 3, TimeUnit.SECONDS); + } + return R.ok(); } @@ -444,4 +493,10 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService { return TableDataInfo.build(bizInquiryRequestVos); } + @Override + public void quoteReminder() { + + } + + } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsQuoteServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsQuoteServiceImpl.java index fe59e0f..613ce6b 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsQuoteServiceImpl.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsQuoteServiceImpl.java @@ -6,6 +6,7 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.NumberUtil; import lombok.extern.slf4j.Slf4j; import org.asinkj.amz.domain.BizInquiryRequest; +import org.asinkj.amz.domain.BizLogisticsOrder; import org.asinkj.amz.domain.bo.BizLogisticsQuoteMostBo; import org.asinkj.amz.domain.bo.BizLogisticsQuoteReportBo; import org.asinkj.amz.domain.vo.InquiryQuoteStatusDTO; @@ -139,6 +140,9 @@ public class BizLogisticsQuoteServiceImpl implements IBizLogisticsQuoteService { 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()); + if (!LoginHelper.isSuperAdmin() && !LoginHelper.isManagerAdmin()) { + lqw.and(wrapper -> wrapper.eq(BizLogisticsQuote::getCreateBy, LoginHelper.getUserId()).or().eq(BizLogisticsQuote::getUserId, LoginHelper.getUserId())); + } return lqw; } @@ -292,7 +296,6 @@ public class BizLogisticsQuoteServiceImpl implements IBizLogisticsQuoteService { LocalDate today = LocalDate.now(); List inquiries = bizInquiryRequestMapper.selectOpenAndEffectiveInquiries(today); - // 2. 收集所有物流商ID Map> inquiryProvidersMap = new HashMap<>(); Set allProviderIds = new HashSet<>(); for (BizInquiryRequest inquiry : inquiries) { @@ -301,19 +304,16 @@ public class BizLogisticsQuoteServiceImpl implements IBizLogisticsQuoteService { allProviderIds.addAll(providerIds); } - // 3. 查询当日报价记录(即使 allProviderIds 为空也会执行) List quotes = baseMapper.selectQuotesByProvidersAndDate( new ArrayList<>(allProviderIds), today ); - // 4. 构建报价状态映射表 Map, BizLogisticsQuote> quoteMap = quotes.stream() .collect(Collectors.toMap( quote -> Pair.of(quote.getInquiryId(), quote.getChannelId()), Function.identity() )); - // 5. 组合结果 List result = new ArrayList<>(); for (BizInquiryRequest inquiry : inquiries) { List providerIds = inquiryProvidersMap.get(inquiry.getId()); diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizPurchaseOrderItemServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizPurchaseOrderItemServiceImpl.java new file mode 100644 index 0000000..f4d79fd --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizPurchaseOrderItemServiceImpl.java @@ -0,0 +1,155 @@ +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.BizPurchaseOrderItemBo; +import org.asinkj.amz.domain.vo.BizPurchaseOrderItemVo; +import org.asinkj.amz.domain.BizPurchaseOrderItem; +import org.asinkj.amz.mapper.BizPurchaseOrderItemMapper; +import org.asinkj.amz.service.IBizPurchaseOrderItemService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 供应商订单产品明细Service业务层处理 + * + * @author shuo hu + * @date 2025-05-10 + */ +@RequiredArgsConstructor +@Service +public class BizPurchaseOrderItemServiceImpl implements IBizPurchaseOrderItemService { + + private final BizPurchaseOrderItemMapper baseMapper; + + /** + * 查询供应商订单产品明细 + * + * @param id 主键 + * @return 供应商订单产品明细 + */ + @Override + public BizPurchaseOrderItemVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询供应商订单产品明细列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 供应商订单产品明细分页列表 + */ + @Override + public TableDataInfo queryPageList(BizPurchaseOrderItemBo 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(BizPurchaseOrderItemBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BizPurchaseOrderItemBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getOrderSn()), BizPurchaseOrderItem::getOrderSn, bo.getOrderSn()); + lqw.eq(bo.getWid() != null, BizPurchaseOrderItem::getWid, bo.getWid()); + lqw.like(StringUtils.isNotBlank(bo.getWareHouseName()), BizPurchaseOrderItem::getWareHouseName, bo.getWareHouseName()); + lqw.eq(StringUtils.isNotBlank(bo.getPlanSn()), BizPurchaseOrderItem::getPlanSn, bo.getPlanSn()); + lqw.eq(bo.getProductId() != null, BizPurchaseOrderItem::getProductId, bo.getProductId()); + lqw.like(StringUtils.isNotBlank(bo.getProductName()), BizPurchaseOrderItem::getProductName, bo.getProductName()); + lqw.eq(StringUtils.isNotBlank(bo.getSku()), BizPurchaseOrderItem::getSku, bo.getSku()); + lqw.eq(StringUtils.isNotBlank(bo.getFnsku()), BizPurchaseOrderItem::getFnsku, bo.getFnsku()); + lqw.eq(StringUtils.isNotBlank(bo.getSid()), BizPurchaseOrderItem::getSid, bo.getSid()); + lqw.eq(StringUtils.isNotBlank(bo.getModel()), BizPurchaseOrderItem::getModel, bo.getModel()); + lqw.eq(bo.getPrice() != null, BizPurchaseOrderItem::getPrice, bo.getPrice()); + lqw.eq(bo.getAmount() != null, BizPurchaseOrderItem::getAmount, bo.getAmount()); + lqw.eq(bo.getQuantityPlan() != null, BizPurchaseOrderItem::getQuantityPlan, bo.getQuantityPlan()); + lqw.eq(bo.getQuantityReal() != null, BizPurchaseOrderItem::getQuantityReal, bo.getQuantityReal()); + lqw.eq(bo.getQuantityEntry() != null, BizPurchaseOrderItem::getQuantityEntry, bo.getQuantityEntry()); + lqw.eq(bo.getQuantityReceive() != null, BizPurchaseOrderItem::getQuantityReceive, bo.getQuantityReceive()); + lqw.eq(bo.getQuantityReturn() != null, BizPurchaseOrderItem::getQuantityReturn, bo.getQuantityReturn()); + lqw.eq(bo.getQuantityExchange() != null, BizPurchaseOrderItem::getQuantityExchange, bo.getQuantityExchange()); + lqw.eq(bo.getQuantityQc() != null, BizPurchaseOrderItem::getQuantityQc, bo.getQuantityQc()); + lqw.eq(bo.getQuantityQcPrepare() != null, BizPurchaseOrderItem::getQuantityQcPrepare, bo.getQuantityQcPrepare()); + lqw.eq(bo.getExpectArriveTime() != null, BizPurchaseOrderItem::getExpectArriveTime, bo.getExpectArriveTime()); + lqw.eq(bo.getCasesNum() != null, BizPurchaseOrderItem::getCasesNum, bo.getCasesNum()); + lqw.eq(bo.getQuantityPerCase() != null, BizPurchaseOrderItem::getQuantityPerCase, bo.getQuantityPerCase()); + lqw.eq(bo.getIsDelete() != null, BizPurchaseOrderItem::getIsDelete, bo.getIsDelete()); + lqw.eq(StringUtils.isNotBlank(bo.getTaxRate()), BizPurchaseOrderItem::getTaxRate, bo.getTaxRate()); + lqw.eq(StringUtils.isNotBlank(bo.getSpu()), BizPurchaseOrderItem::getSpu, bo.getSpu()); + lqw.like(StringUtils.isNotBlank(bo.getSpuName()), BizPurchaseOrderItem::getSpuName, bo.getSpuName()); + return lqw; + } + + /** + * 新增供应商订单产品明细 + * + * @param bo 供应商订单产品明细 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(BizPurchaseOrderItemBo bo) { + BizPurchaseOrderItem add = MapstructUtils.convert(bo, BizPurchaseOrderItem.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改供应商订单产品明细 + * + * @param bo 供应商订单产品明细 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(BizPurchaseOrderItemBo bo) { + BizPurchaseOrderItem update = MapstructUtils.convert(bo, BizPurchaseOrderItem.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BizPurchaseOrderItem 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/BizPurchaseOrderServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizPurchaseOrderServiceImpl.java new file mode 100644 index 0000000..1bc641b --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizPurchaseOrderServiceImpl.java @@ -0,0 +1,189 @@ +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.BizPurchaseOrderBo; +import org.asinkj.amz.domain.vo.BizPurchaseOrderVo; +import org.asinkj.amz.domain.BizPurchaseOrder; +import org.asinkj.amz.mapper.BizPurchaseOrderMapper; +import org.asinkj.amz.service.IBizPurchaseOrderService; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.Collection; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 采购单主Service业务层处理 + * + * @author shuo hu + * @date 2025-05-10 + */ +@RequiredArgsConstructor +@Service +public class BizPurchaseOrderServiceImpl implements IBizPurchaseOrderService { + + private final BizPurchaseOrderMapper baseMapper; + +// @Resource +// private MapstructUtils mapstructUtils; + + /** + * 查询采购单主 + * + * @param orderSn 主键 + * @return 采购单主 + */ + @Override + public BizPurchaseOrderVo queryById(String orderSn){ + return baseMapper.selectVoById(orderSn); + } + + /** + * 分页查询采购单主列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 采购单主分页列表 + */ + @Override + public TableDataInfo queryPageList(BizPurchaseOrderBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + List records = result.getRecords(); + Set orderSnSet = records.stream().map(BizPurchaseOrderVo::getOrderSn).collect(Collectors.toSet()); + + for (BizPurchaseOrderVo record : records) { + + } + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的采购单主列表 + * + * @param bo 查询条件 + * @return 采购单主列表 + */ + @Override + public List queryList(BizPurchaseOrderBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BizPurchaseOrderBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getOrderSn()), BizPurchaseOrder::getOrderSn, bo.getOrderSn()); + lqw.eq(StringUtils.isNotBlank(bo.getCustomOrderSn()), BizPurchaseOrder::getCustomOrderSn, bo.getCustomOrderSn()); + lqw.eq(bo.getSupplierId() != null, BizPurchaseOrder::getSupplierId, bo.getSupplierId()); + lqw.like(StringUtils.isNotBlank(bo.getSupplierName()), BizPurchaseOrder::getSupplierName, bo.getSupplierName()); + lqw.eq(bo.getOptUid() != null, BizPurchaseOrder::getOptUid, bo.getOptUid()); + lqw.like(StringUtils.isNotBlank(bo.getAuditorRealname()), BizPurchaseOrder::getAuditorRealname, bo.getAuditorRealname()); + lqw.like(StringUtils.isNotBlank(bo.getOptRealname()), BizPurchaseOrder::getOptRealname, bo.getOptRealname()); + lqw.like(StringUtils.isNotBlank(bo.getLastRealname()), BizPurchaseOrder::getLastRealname, bo.getLastRealname()); + lqw.eq(bo.getOrderTime() != null, BizPurchaseOrder::getOrderTime, bo.getOrderTime()); + lqw.eq(StringUtils.isNotBlank(bo.getPayment()), BizPurchaseOrder::getPayment, bo.getPayment()); + lqw.eq(bo.getAuditorUid() != null, BizPurchaseOrder::getAuditorUid, bo.getAuditorUid()); + lqw.eq(bo.getAuditorTime() != null, BizPurchaseOrder::getAuditorTime, bo.getAuditorTime()); + lqw.eq(bo.getLastUid() != null, BizPurchaseOrder::getLastUid, bo.getLastUid()); + lqw.eq(bo.getLastTime() != null, BizPurchaseOrder::getLastTime, bo.getLastTime()); + lqw.eq(StringUtils.isNotBlank(bo.getReason()), BizPurchaseOrder::getReason, bo.getReason()); + lqw.eq(bo.getIsTax() != null, BizPurchaseOrder::getIsTax, bo.getIsTax()); + lqw.eq(bo.getStatus() != null, BizPurchaseOrder::getStatus, bo.getStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getStatusText()), BizPurchaseOrder::getStatusText, bo.getStatusText()); + lqw.eq(StringUtils.isNotBlank(bo.getPayStatusText()), BizPurchaseOrder::getPayStatusText, bo.getPayStatusText()); + lqw.eq(bo.getStatusShipped() != null, BizPurchaseOrder::getStatusShipped, bo.getStatusShipped()); + lqw.eq(StringUtils.isNotBlank(bo.getStatusShippedText()), BizPurchaseOrder::getStatusShippedText, bo.getStatusShippedText()); + lqw.eq(bo.getAmountTotal() != null, BizPurchaseOrder::getAmountTotal, bo.getAmountTotal()); + lqw.eq(bo.getTotalPrice() != null, BizPurchaseOrder::getTotalPrice, bo.getTotalPrice()); + lqw.eq(StringUtils.isNotBlank(bo.getIcon()), BizPurchaseOrder::getIcon, bo.getIcon()); + lqw.eq(bo.getPayStatus() != null, BizPurchaseOrder::getPayStatus, bo.getPayStatus()); + lqw.eq(bo.getOtherFee() != null, BizPurchaseOrder::getOtherFee, bo.getOtherFee()); + lqw.eq(StringUtils.isNotBlank(bo.getOtherCurrency()), BizPurchaseOrder::getOtherCurrency, bo.getOtherCurrency()); + lqw.eq(bo.getFeePartType() != null, BizPurchaseOrder::getFeePartType, bo.getFeePartType()); + lqw.eq(bo.getShippingPrice() != null, BizPurchaseOrder::getShippingPrice, bo.getShippingPrice()); + lqw.eq(StringUtils.isNotBlank(bo.getShippingCurrency()), BizPurchaseOrder::getShippingCurrency, bo.getShippingCurrency()); + lqw.eq(StringUtils.isNotBlank(bo.getPurchaseCurrency()), BizPurchaseOrder::getPurchaseCurrency, bo.getPurchaseCurrency()); + lqw.eq(bo.getPurchaseRate() != null, BizPurchaseOrder::getPurchaseRate, bo.getPurchaseRate()); + lqw.eq(bo.getQuantityTotal() != null, BizPurchaseOrder::getQuantityTotal, bo.getQuantityTotal()); + lqw.eq(bo.getWid() != null, BizPurchaseOrder::getWid, bo.getWid()); + lqw.like(StringUtils.isNotBlank(bo.getWareHouseName()), BizPurchaseOrder::getWareHouseName, bo.getWareHouseName()); + lqw.like(StringUtils.isNotBlank(bo.getWareHouseBakName()), BizPurchaseOrder::getWareHouseBakName, bo.getWareHouseBakName()); + lqw.eq(bo.getQuantityEntry() != null, BizPurchaseOrder::getQuantityEntry, bo.getQuantityEntry()); + lqw.eq(bo.getQuantityReal() != null, BizPurchaseOrder::getQuantityReal, bo.getQuantityReal()); + lqw.eq(bo.getQuantityReceive() != null, BizPurchaseOrder::getQuantityReceive, bo.getQuantityReceive()); + lqw.eq(bo.getPurchaserId() != null, BizPurchaseOrder::getPurchaserId, bo.getPurchaserId()); + lqw.eq(StringUtils.isNotBlank(bo.getContactPerson()), BizPurchaseOrder::getContactPerson, bo.getContactPerson()); + lqw.eq(StringUtils.isNotBlank(bo.getContactNumber()), BizPurchaseOrder::getContactNumber, bo.getContactNumber()); + lqw.eq(bo.getSettlementMethod() != null, BizPurchaseOrder::getSettlementMethod, bo.getSettlementMethod()); + lqw.eq(StringUtils.isNotBlank(bo.getSettlementDescription()), BizPurchaseOrder::getSettlementDescription, bo.getSettlementDescription()); + lqw.eq(bo.getPaymentMethod() != null, BizPurchaseOrder::getPaymentMethod, bo.getPaymentMethod()); + lqw.eq(bo.getEstDlvDays() != null, BizPurchaseOrder::getEstDlvDays, bo.getEstDlvDays()); + lqw.eq(StringUtils.isNotBlank(bo.getOrderStatus()), BizPurchaseOrder::getOrderStatus, bo.getOrderStatus()); + lqw.eq(bo.getDeliveryTime() != null, BizPurchaseOrder::getDeliveryTime, bo.getDeliveryTime()); + lqw.eq(bo.getDlvTimeVar() != null, BizPurchaseOrder::getDlvTimeVar, bo.getDlvTimeVar()); + return lqw; + } + + /** + * 新增采购单主 + * + * @param bo 采购单主 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(BizPurchaseOrderBo bo) { + BizPurchaseOrder add = MapstructUtils.convert(bo, BizPurchaseOrder.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setOrderSn(add.getOrderSn()); + } + return flag; + } + + /** + * 修改采购单主 + * + * @param bo 采购单主 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(BizPurchaseOrderBo bo) { + BizPurchaseOrder update = MapstructUtils.convert(bo, BizPurchaseOrder.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BizPurchaseOrder 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 index bcb0677..18a6d5b 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizShipmentPlanServiceImpl.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizShipmentPlanServiceImpl.java @@ -4,19 +4,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; import org.asinkj.amz.domain.*; import org.asinkj.amz.domain.bo.SysAmazonStoreBo; -import org.asinkj.amz.domain.vo.BizLogisticsQuoteVo; -import org.asinkj.amz.domain.vo.BizShipmentPlanOrderVo; -import org.asinkj.amz.domain.vo.SysAmazonStoreVo; +import org.asinkj.amz.domain.vo.*; import org.asinkj.amz.mapper.*; import org.asinkj.amz.service.IBizLogisticsQuoteService; import org.asinkj.amz.service.ISysAmazonStoreService; import org.asinkj.amz.service.LingxinCallback; +import org.asinkj.common.core.exception.ServiceException; import org.asinkj.common.core.utils.MapstructUtils; import org.asinkj.common.core.utils.StringUtils; +import org.asinkj.common.excel.utils.ExcelUtil; import org.asinkj.common.mybatis.core.page.TableDataInfo; import org.asinkj.common.mybatis.core.page.PageQuery; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -27,10 +29,10 @@ import org.asinkj.common.satoken.utils.LoginHelper; import org.asinkj.resource.api.RemoteMessageService; import org.springframework.stereotype.Service; import org.asinkj.amz.domain.bo.BizShipmentPlanBo; -import org.asinkj.amz.domain.vo.BizShipmentPlanVo; import org.asinkj.amz.service.IBizShipmentPlanService; import javax.annotation.Resource; +import java.io.InputStream; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -61,7 +63,7 @@ public class BizShipmentPlanServiceImpl implements IBizShipmentPlanService { @Resource private BizShipmentItemMapper bizShipmentItemMapper; - @Resource + @DubboReference(stub = "true") private RemoteMessageService remoteMessageService; @@ -172,7 +174,11 @@ public class BizShipmentPlanServiceImpl implements IBizShipmentPlanService { 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.getGmtCreate() != null, BizShipmentPlan::getGmtCreate, bo.getGmtCreate()); + if (bo.getGmtCreate() != null) { + lqw.ge(BizShipmentPlan::getGmtCreate, DateUtil.beginOfDay(bo.getGmtCreate())) + .lt(BizShipmentPlan::getGmtCreate, DateUtil.endOfDay(bo.getGmtCreate())); + } lqw.eq(bo.getReceivingTime() != null, BizShipmentPlan::getReceivingTime, bo.getReceivingTime()); lqw.eq(bo.getStaShipmentDate() != null, BizShipmentPlan::getStaShipmentDate, bo.getStaShipmentDate()); lqw.eq(bo.getStaDeliveryStartDate() != null, BizShipmentPlan::getStaDeliveryStartDate, bo.getStaDeliveryStartDate()); @@ -378,18 +384,39 @@ public class BizShipmentPlanServiceImpl implements IBizShipmentPlanService { @Override public void updateStatusbyFbaShipmentIds(List fbaShipmentids) { - LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); lambdaUpdateWrapper.in(BizShipmentPlan::getShipmentId, fbaShipmentids) .set(BizShipmentPlan::getFbaStatus, "ask"); - baseMapper.update(null,lambdaUpdateWrapper); + baseMapper.update(null, lambdaUpdateWrapper); } @Override public void updateList(Collection list, String status) { - LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); lambdaUpdateWrapper.in(BizShipmentPlan::getShipmentId, list) .set(BizShipmentPlan::getFbaStatus, "send"); - baseMapper.update(null,lambdaUpdateWrapper); + baseMapper.update(null, lambdaUpdateWrapper); } + + @Override + public void importExcel(InputStream inputStream) { + List bizShipmentPlanFileDataList = ExcelUtil.importExcel(inputStream, BizShipmentPlanFileData.class); +// checkData(bizShipmentPlanFileDataList); + log.info("导入数据条数:{}", JSONObject.toJSONString(bizShipmentPlanFileDataList)); + + baseMapper.updateByFbaShipmentId(bizShipmentPlanFileDataList); + } + + private void checkData(List bizShipmentPlanFileDataList) { + boolean isAllSame = bizShipmentPlanFileDataList.stream() + .map(BizShipmentPlanFileData::getShipmentId) + .collect(Collectors.toSet()) + .size() == 1; + if (!isAllSame) { + throw new ServiceException("FBA货件编号不一致,请检查后重新导入"); + } + + } + } diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/SysAmazonStoreServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/SysAmazonStoreServiceImpl.java index 862317f..2bce17d 100644 --- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/SysAmazonStoreServiceImpl.java +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/SysAmazonStoreServiceImpl.java @@ -322,6 +322,7 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService { } + @Override public void pullAmzFBAData(String startDate, String endDate) throws Exception { @@ -418,15 +419,21 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService { @Override - public void updateAmzFBAData(String startDate, String endDate) throws Exception { + public void updateAmzFBAData(LingxinCallback lingxinCallback) throws Exception { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(BizShipmentPlan::getShipmentStatus, "READY_TO_SHIP"); + + List bizShipmentPlans = bizShipmentPlanMapper.selectList(lambdaQueryWrapper); + Set shipmentIds = bizShipmentPlans.stream().map(BizShipmentPlan::getShipmentId).collect(Collectors.toSet()); Map queryParam = new HashMap<>(); List sysAmazonStores = baseMapper.selectList(); String sids = sysAmazonStores.stream().map(item -> String.valueOf(item.getSid())).collect(Collectors.joining(",")); log.info("sids:{}", sids); - queryParam.put("sid", "153"); - queryParam.put("start_date", startDate); - queryParam.put("end_date", endDate); + queryParam.put("sid", sids); + queryParam.put("start_date", DateUtil.offsetMonth(DateUtil.date(), -1).toString("yyyy-MM-dd")); + queryParam.put("end_date", DateUtil.date().toString("yyyy-MM-dd")); +// queryParam.put("shipment_id", String.join(",", shipmentIds)); queryParam.put("shipment_status", "RECEIVING"); RequestAttributes ra = RequestContextHolder.getRequestAttributes(); @@ -463,24 +470,28 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService { log.info("fbaShipmentApiResponse:{}", listData); Set shipmentIds = listData.stream().map(FbaShipmentApiResponse.ShipmentPlan::getShipmentId).collect(Collectors.toSet()); // 查询数据库中存在的shipmentId 使用mybatis-plus批量查询 - List bizShipmentPlans = bizShipmentPlanMapper.selectList(new LambdaQueryWrapper().in(BizShipmentPlan::getShipmentId, shipmentIds)); - Set selectExistingShipmentIds = bizShipmentPlans.stream().map(BizShipmentPlan::getShipmentId).collect(Collectors.toSet()); + List bizShipmentPlans = bizShipmentPlanMapper.selectList(new LambdaQueryWrapper().in(BizShipmentPlan::getShipmentId, shipmentIds).ne(BizShipmentPlan::getShipmentStatus, "RECEIVING")); + if (CollectionUtil.isNotEmpty(bizShipmentPlans)) { + Set selectExistingShipmentIds = bizShipmentPlans.stream().map(BizShipmentPlan::getShipmentId).collect(Collectors.toSet()); - listData.removeIf(shipmentPlan -> !selectExistingShipmentIds.contains(shipmentPlan.getShipmentId())); + listData.removeIf(shipmentPlan -> !selectExistingShipmentIds.contains(shipmentPlan.getShipmentId())); - Map collect = listData.stream().collect(Collectors.toMap(FbaShipmentApiResponse.ShipmentPlan::getShipmentId, Function.identity())); + Map collect = listData.stream().collect(Collectors.toMap(FbaShipmentApiResponse.ShipmentPlan::getShipmentId, Function.identity())); - for (BizShipmentPlan bizShipmentPlan : bizShipmentPlans) { - FbaShipmentApiResponse.ShipmentPlan shipmentPlan = collect.get(bizShipmentPlan.getShipmentId()); - if (ObjectUtil.isNotEmpty(shipmentPlan)) { - bizShipmentPlan.setShipmentStatus(shipmentPlan.getShipmentStatus()); - if (StrUtil.isNotEmpty(shipmentPlan.getReceivingTime())) { - bizShipmentPlan.setReceivingTime(DateUtil.parseTime(shipmentPlan.getReceivingTime())); + for (BizShipmentPlan bizShipmentPlan : bizShipmentPlans) { + FbaShipmentApiResponse.ShipmentPlan shipmentPlan = collect.get(bizShipmentPlan.getShipmentId()); + if (ObjectUtil.isNotEmpty(shipmentPlan)) { + bizShipmentPlan.setShipmentStatus(shipmentPlan.getShipmentStatus()); + if (StrUtil.isNotEmpty(shipmentPlan.getReceivingTime())) { + bizShipmentPlan.setReceivingTime(DateUtil.parse(shipmentPlan.getReceivingTime(), "yyyy-MM-dd HH:mm")); + } } } + bizShipmentPlanMapper.updateById(bizShipmentPlans); + } else { + log.info("未查询到需要更新的数据"); } - bizShipmentPlanMapper.updateById(bizShipmentPlans); } finally { RequestContextHolder.resetRequestAttributes(); @@ -491,6 +502,44 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService { } + + /** + * 查询采购订单 + * + * @param startDate + * @param endDate + * @param lingxinCallback + */ + @Override + public void pullPurchaseOrderData(String startDate, String endDate, LingxinCallback lingxinCallback) { + + Map queryParam = new HashMap<>(); + queryParam.put("start_date", startDate); + queryParam.put("end_date", endDate); + + + HttpUtil.postWithParams("/erp/sc/routing/data/local_inventory/purchaseOrderList", queryParam, new Callback() { + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + + } + + @Override + public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { + String string = response.body().string(); + log.info("onResponse+{}", string); + + JSONObject jsonObject = JSONObject.parse(string); + JSONArray data = jsonObject.getJSONArray("data"); + + + List list = data.toList(PurchaseOrderResponse.OrderData.class); + log.info("list:{}", list); + + } + }); + } + /** * 通过STA查询STA任务 * diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/asinking/entity/PurchaseOrderResponse.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/asinking/entity/PurchaseOrderResponse.java new file mode 100644 index 0000000..6df64b9 --- /dev/null +++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/asinking/entity/PurchaseOrderResponse.java @@ -0,0 +1,301 @@ +package org.asinkj.asinking.entity; + +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.math.BigDecimal; +import java.util.List; + +@Data +public class PurchaseOrderResponse { + private Integer code; + private String message; + + @JsonProperty("error_details") + private List errorDetails; + + @JsonProperty("request_id") + private String requestId; + + @JsonProperty("response_time") + private String responseTime; + + private List data; + + @Data + public static class OrderData { + @JsonProperty("order_sn") + private String orderSn; + + @JsonProperty("custom_order_sn") + private String customOrderSn; + + @JsonProperty("supplier_id") + private Integer supplierId; + + @JsonProperty("supplier_name") + private String supplierName; + + @JsonProperty("opt_uid") + private Integer optUid; + + + @JsonProperty("auditor_realname") + private String auditorRealname; + + @JsonProperty("opt_realname") + private String optRealname; + + @JsonProperty("last_realname") + private String lastRealname; + + @JsonProperty("create_time") + private String createTime; + + @JsonProperty("order_time") + private String orderTime; + + @JsonProperty("payment") + private String payment; + + @JsonProperty("auditor_uid") + private Integer auditorUid; + + @JsonProperty("auditor_time") + private String auditorTime; + + @JsonProperty("last_uid") + private Integer lastUid; + + @JsonProperty("last_time") + private String lastTime; + + @JsonProperty("reason") + private String reason; + + @JsonProperty("is_tax") + private Integer isTax; + + @JsonProperty("status") + private Integer status; + + @JsonProperty("status_text") + private String statusText; + + @JsonProperty("pay_status_text") + private String payStatusText; + + @JsonProperty("status_shipped") + private Integer statusShipped; + + @JsonProperty("status_shipped_text") + private String statusShippedText; + + @JsonProperty("amount_total") + private BigDecimal amountTotal; + + @JsonProperty("total_price") + private BigDecimal totalPrice; + + @JsonProperty("icon") + private String icon; + + @JsonProperty("pay_status") + private Integer payStatus; + + @JsonProperty("remark") + private String remark; + + @JsonProperty("other_fee") + private BigDecimal otherFee; + + @JsonProperty("other_currency") + private String otherCurrency; + + @JsonProperty("fee_part_type") + private Integer feePartType; + + @JsonProperty("shipping_price") + private BigDecimal shippingPrice; + + @JsonProperty("shipping_currency") + private String shippingCurrency; + + @JsonProperty("purchase_currency") + private String purchaseCurrency; + + @JsonProperty("purchase_rate") + private BigDecimal purchaseRate; + + @JsonProperty("quantity_total") + private BigDecimal quantityTotal; + + @JsonProperty("wid") + private Integer wid; + + @JsonProperty("ware_house_name") + private String wareHouseName; + + @JsonProperty("ware_house_bak_name") + private String wareHouseBakName; + + @JsonProperty("quantity_entry") + private Integer quantityEntry; + + @JsonProperty("quantity_real") + private Integer quantityReal; + + @JsonProperty("quantity_receive") + private Integer quantityReceive; + + @JsonProperty("update_time") + private String updateTime; + + @JsonProperty("purchaser_id") + private Integer purchaserId; + + @JsonProperty("contact_person") + private String contactPerson; + + @JsonProperty("contact_number") + private String contactNumber; + + @JsonProperty("settlement_method") + private Integer settlementMethod; + + @JsonProperty("settlement_description") + private String settlementDescription; + + @JsonProperty("payment_method") + private Integer paymentMethod; + + + @JsonProperty("principal_uids") + private List principalUids; + + @JsonProperty("item_list") + private List itemList; + + @JsonProperty("logistics_info") + private List logisticsInfo; + + @Data + public static class PrincipalUid { + @JsonProperty("id") + private String id; + + @JsonProperty("name") + private String name; + } + + @Data + public static class ItemListItem { + @JsonProperty("id") + private Integer id; + + @JsonProperty("wid") + private Integer wid; + + @JsonProperty("ware_house_name") + private String wareHouseName; + + @JsonProperty("plan_sn") + private String planSn; + + @JsonProperty("product_id") + private Integer productId; + + @JsonProperty("product_name") + private String productName; + + @JsonProperty("sku") + private String sku; + + @JsonProperty("fnsku") + private String fnsku; + + @JsonProperty("sid") + private String sid; + + @JsonProperty("model") + private String model; + + @JsonProperty("price") + private BigDecimal price; + + @JsonProperty("amount") + private BigDecimal amount; + + @JsonProperty("quantity_plan") + private Integer quantityPlan; + + @JsonProperty("quantity_real") + private Integer quantityReal; + + @JsonProperty("quantity_entry") + private Integer quantityEntry; + + @JsonProperty("quantity_receive") + private Integer quantityReceive; + + @JsonProperty("quantity_return") + private Integer quantityReturn; + + @JsonProperty("quantity_exchange") + private Integer quantityExchange; + + @JsonProperty("quantity_qc") + private Integer quantityQc; + + @JsonProperty("quantity_qc_prepare") + private Integer quantityQcPrepare; + + @JsonProperty("expect_arrive_time") + private String expectArriveTime; + + @JsonProperty("remark") + private String remark; + + @JsonProperty("cases_num") + private Integer casesNum; + + @JsonProperty("quantity_per_case") + private Integer quantityPerCase; + + @JsonProperty("is_delete") + private Integer isDelete; + + @JsonProperty("msku") + private List msku; + + @JsonProperty("attribute") + private String attribute; + + @JsonProperty("tax_rate") + private String taxRate; + + @JsonProperty("spu") + private String spu; + + @JsonProperty("spu_name") + private String spuName; + } + + @Data + public static class LogisticsInfo { + @JsonProperty("logistics_company") + private String logisticsCompany; + + @JsonProperty("logistics_order_no") + private String logisticsOrderNo; + + @JsonProperty("pol_id") + private String polId; + + @JsonProperty("purchase_order_id") + private String purchaseOrderId; + + @JsonProperty("purchase_order_sn") + private String purchaseOrderSn; + } + } +} diff --git a/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizLogisticsOrderDetailMapper.xml b/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizLogisticsOrderDetailMapper.xml index a710a2f..f134f71 100644 --- a/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizLogisticsOrderDetailMapper.xml +++ b/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizLogisticsOrderDetailMapper.xml @@ -14,6 +14,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" logistics_provider_name = #{item.logisticsProviderName}, + + tracking_number = #{item.trackingNumber}, + + + logistics_weight = #{item.logisticsWeight}, + + + actual_delivery_date = #{item.actualDeliveryDate}, + WHERE fba_box_number = #{item.fbaBoxNumber} diff --git a/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizLogisticsOrderMapper.xml b/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizLogisticsOrderMapper.xml index 3276972..9084fdd 100644 --- a/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizLogisticsOrderMapper.xml +++ b/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizLogisticsOrderMapper.xml @@ -7,7 +7,10 @@ + diff --git a/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizLogisticsQuoteMapper.xml b/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizLogisticsQuoteMapper.xml index e292b8b..16e5de3 100644 --- a/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizLogisticsQuoteMapper.xml +++ b/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizLogisticsQuoteMapper.xml @@ -38,7 +38,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - SELECT shipmentid + SELECT shipment_id FROM biz_shipment_plan WHERE del_flag = '0' - WHERE shipmentid IN + WHERE shipment_id IN #{id} diff --git a/asinkj-common/asinkj-common-bom/pom.xml b/asinkj-common/asinkj-common-bom/pom.xml index 1ca1b1e..ec5a7f1 100644 --- a/asinkj-common/asinkj-common-bom/pom.xml +++ b/asinkj-common/asinkj-common-bom/pom.xml @@ -145,6 +145,9 @@ ${revision} + + + org.asinkj @@ -256,7 +259,11 @@ asinkj-common-sse ${revision} - + + org.asinkj + asinkj-common-wp + ${revision} + diff --git a/asinkj-common/asinkj-common-wp/pom.xml b/asinkj-common/asinkj-common-wp/pom.xml new file mode 100644 index 0000000..bc94079 --- /dev/null +++ b/asinkj-common/asinkj-common-wp/pom.xml @@ -0,0 +1,38 @@ + + + + + org.asinkj + asinkj-common + ${revision} + + 4.0.0 + + asinkj-common-wp + + + asinkj-common-mp 微信公众号相关 + + + + + + + org.asinkj + asinkj-common-core + + + com.github.binarywang + weixin-java-mp + + + javax.annotation + javax.annotation-api + 1.3.2 + compile + + + + diff --git a/asinkj-common/asinkj-common-wp/src/main/java/org/asinkj/common/wp/config/WeChatProperties.java b/asinkj-common/asinkj-common-wp/src/main/java/org/asinkj/common/wp/config/WeChatProperties.java new file mode 100644 index 0000000..794ecd6 --- /dev/null +++ b/asinkj-common/asinkj-common-wp/src/main/java/org/asinkj/common/wp/config/WeChatProperties.java @@ -0,0 +1,19 @@ +package org.asinkj.common.wp.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@ConfigurationProperties(prefix = "wechat.public") +@Component +@Data +public class WeChatProperties { + + private String appId; + + private String appSecret; + + private String callBackUrl; + + private String orderTemplateId; +} diff --git a/asinkj-common/asinkj-common-wp/src/main/java/org/asinkj/common/wp/handler/WxMessagesManager.java b/asinkj-common/asinkj-common-wp/src/main/java/org/asinkj/common/wp/handler/WxMessagesManager.java new file mode 100644 index 0000000..9f1d1ca --- /dev/null +++ b/asinkj-common/asinkj-common-wp/src/main/java/org/asinkj/common/wp/handler/WxMessagesManager.java @@ -0,0 +1,103 @@ +package org.asinkj.common.wp.handler; + +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl; +import me.chanjar.weixin.mp.bean.template.WxMpTemplateData; +import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage; +import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl; +import org.asinkj.common.wp.config.WeChatProperties; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.net.URLEncoder; +import java.util.Arrays; +import java.util.List; + +@Component +@Slf4j +public class WxMessagesManager { + + private static WxMpService wxMpService; + private static WeChatProperties weChatProperties; + + @Autowired + private WeChatProperties tempProperties; + + /** + * 初始化微信配置 + */ + @PostConstruct + private void init() { + // 解决静态变量无法直接注入的问题 + weChatProperties = tempProperties; + + WxMpDefaultConfigImpl config = new WxMpDefaultConfigImpl(); + config.setAppId(weChatProperties.getAppId()); + config.setSecret(weChatProperties.getAppSecret()); + wxMpService = new WxMpServiceImpl(); + wxMpService.setWxMpConfigStorage(config); + } + + /** + * 生成微信授权链接(静默授权) + * + * @param redirectUri 回调地址(需与公众号配置的域名一致) + * @param state 用户标识(如用户ID) + */ + public static String buildAuthUrl(String redirectUri, String state) { + return wxMpService.getOAuth2Service().buildAuthorizationUrl( + redirectUri, + WxConsts.OAuth2Scope.SNSAPI_BASE, + URLEncoder.encode(state) // 需编码防止特殊字符 + ); + } + + /** + * 通过 code 换取 OpenID(适配 4.1.0 版本) + * + * @param code 微信回调的授权码 + */ + public static String getOpenIdByCode(String code) throws WxErrorException { + WxOAuth2AccessToken accessToken = wxMpService.getOAuth2Service().getAccessToken(code); + return accessToken.getOpenId(); // 注意 4.1.0 版方法名为 getOpenid() + } + + /** + * 发送微信模板消息(优化后) + */ + public static void sendWechatTempMessage(String keyword1, String keyword2, String... openIds) { + for (String openId : openIds) { + try { + // 根据用户ID获取已绑定的 OpenID(需自行实现) + + log.info("微信消息推送 => openid:{}", openId); + WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder() + .toUser(openId) + .url("https://amzups.com/") + .templateId(weChatProperties.getOrderTemplateId()) + .data(buildTemplateData(keyword1, keyword2)) + .build(); + + wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage); + } catch (Exception e) { + log.error("微信消息推送失败,用户ID: {},错误信息: {}", openId, e.getMessage()); + } + } + } + + /** + * 构建模板消息数据 + */ + private static List buildTemplateData(String keyword1, String keyword2) { + return Arrays.asList( + new WxMpTemplateData("thing1", keyword1), + new WxMpTemplateData("time9", keyword2) + ); + } + +} diff --git a/asinkj-common/asinkj-common-wp/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/asinkj-common/asinkj-common-wp/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..64c9724 --- /dev/null +++ b/asinkj-common/asinkj-common-wp/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,2 @@ +org.asinkj.common.wp.config.WeChatProperties +org.asinkj.common.wp.handler.WxMessagesManager diff --git a/asinkj-common/pom.xml b/asinkj-common/pom.xml index 2b7fd15..0148138 100644 --- a/asinkj-common/pom.xml +++ b/asinkj-common/pom.xml @@ -45,6 +45,7 @@ asinkj-common-nacos asinkj-common-bus asinkj-common-sse + asinkj-common-wp asinkj-common diff --git a/asinkj-modules/asinkj-job/src/main/java/org/asinkj/job/snailjob/AmzUpdateFBAJobExecutor.java b/asinkj-modules/asinkj-job/src/main/java/org/asinkj/job/snailjob/AmzUpdateFBAJobExecutor.java new file mode 100644 index 0000000..ff0db6c --- /dev/null +++ b/asinkj-modules/asinkj-job/src/main/java/org/asinkj/job/snailjob/AmzUpdateFBAJobExecutor.java @@ -0,0 +1,63 @@ +package org.asinkj.job.snailjob; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import com.aizuda.snailjob.client.job.core.annotation.JobExecutor; +import com.aizuda.snailjob.client.job.core.dto.JobArgs; +import com.aizuda.snailjob.client.model.ExecuteResult; +import com.aizuda.snailjob.common.core.util.JsonUtil; +import com.aizuda.snailjob.common.log.SnailJobLog; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.asinkj.amz.api.RemoteFBADataService; +import org.springframework.stereotype.Component; + +/** + * @author opensnail + * @date 2024-05-17 + */ +@Component +@JobExecutor(name = "amzUpdateFBAJobExecutor") +@Slf4j +public class AmzUpdateFBAJobExecutor { + + @DubboReference + private RemoteFBADataService remoteFBADataService; + + public ExecuteResult jobExecute(JobArgs jobArgs) throws Exception { + SnailJobLog.LOCAL.info("amzUpdateFBAJobExecutor. jobArgs:{}", JsonUtil.toJsonString(jobArgs)); + remoteFBADataService.updateAmzFbaDataToken(); + return ExecuteResult.success("请指定参数yesterday或者today"); + } + + + +// public ExecuteResult jobExecute(JobArgs jobArgs) throws Exception { +// SnailJobLog.LOCAL.info("amzPullFBAJobExecutor. jobArgs:{}", JsonUtil.toJsonString(jobArgs)); +// SnailJobLog.REMOTE.info("amzPullFBAJobExecutor. jobArgs:{}", JsonUtil.toJsonString(jobArgs)); +// log.info("amzPullFBAJobExecutor {}", jobArgs.getJobParams()); +// //昨天的日期yyyy-MM-dd +// // 获取昨天的日期 +// if ("yesterday".equals(jobArgs.getJobParams())) { +// DateTime yesterday = DateUtil.yesterday(); +// String yesterdayString = yesterday.toString("yyyy-MM-dd"); +// SnailJobLog.LOCAL.info("yesterdayString. yesterdayString:{}", yesterdayString); +// //获取今天的日期 +// DateTime tomorrow = DateUtil.tomorrow(); +// String tomorrowString = tomorrow.toString("yyyy-MM-dd"); +// SnailJobLog.LOCAL.info("todayString. todayString:{}", tomorrowString); +// remoteFBADataService.pullAmzFbaDataToken(yesterdayString, tomorrowString); +// return ExecuteResult.success("获取从昨天开始的FBA货件数据"); +// } else if ("today".equals(jobArgs.getJobParams())) { +// DateTime today = DateUtil.date(); +// String todayString = today.toString("yyyy-MM-dd"); +// SnailJobLog.LOCAL.info("yesterdayString. yesterdayString:{}", todayString); +// //获取今天的日期 +// DateTime tomorrow = DateUtil.tomorrow(); +// String tomorrowString = tomorrow.toString("yyyy-MM-dd"); +// SnailJobLog.LOCAL.info("todayString. todayString:{}", tomorrowString); +// remoteFBADataService.pullAmzFbaDataToken(todayString, tomorrowString); +// } +// return ExecuteResult.success("请指定参数yesterday或者today"); +// } +} diff --git a/asinkj-modules/asinkj-job/src/main/java/org/asinkj/job/snailjob/QuoteReminderExecutor.java b/asinkj-modules/asinkj-job/src/main/java/org/asinkj/job/snailjob/QuoteReminderExecutor.java new file mode 100644 index 0000000..a7887d8 --- /dev/null +++ b/asinkj-modules/asinkj-job/src/main/java/org/asinkj/job/snailjob/QuoteReminderExecutor.java @@ -0,0 +1,63 @@ +package org.asinkj.job.snailjob; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import com.aizuda.snailjob.client.job.core.annotation.JobExecutor; +import com.aizuda.snailjob.client.job.core.dto.JobArgs; +import com.aizuda.snailjob.client.model.ExecuteResult; +import com.aizuda.snailjob.common.core.util.JsonUtil; +import com.aizuda.snailjob.common.log.SnailJobLog; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.asinkj.amz.api.RemoteFBADataService; +import org.springframework.stereotype.Component; + +/** + * @author opensnail + * @date 2024-05-17 + */ +@Component +@JobExecutor(name = "QuoteReminderExecutor") +@Slf4j +public class QuoteReminderExecutor { + + @DubboReference + private RemoteFBADataService remoteFBADataService; + + public ExecuteResult jobExecute(JobArgs jobArgs) throws Exception { + SnailJobLog.LOCAL.info("QuoteReminderExecutor. jobArgs:{}", JsonUtil.toJsonString(jobArgs)); + + return ExecuteResult.success("报价提醒"); + } + + + +// public ExecuteResult jobExecute(JobArgs jobArgs) throws Exception { +// SnailJobLog.LOCAL.info("amzPullFBAJobExecutor. jobArgs:{}", JsonUtil.toJsonString(jobArgs)); +// SnailJobLog.REMOTE.info("amzPullFBAJobExecutor. jobArgs:{}", JsonUtil.toJsonString(jobArgs)); +// log.info("amzPullFBAJobExecutor {}", jobArgs.getJobParams()); +// //昨天的日期yyyy-MM-dd +// // 获取昨天的日期 +// if ("yesterday".equals(jobArgs.getJobParams())) { +// DateTime yesterday = DateUtil.yesterday(); +// String yesterdayString = yesterday.toString("yyyy-MM-dd"); +// SnailJobLog.LOCAL.info("yesterdayString. yesterdayString:{}", yesterdayString); +// //获取今天的日期 +// DateTime tomorrow = DateUtil.tomorrow(); +// String tomorrowString = tomorrow.toString("yyyy-MM-dd"); +// SnailJobLog.LOCAL.info("todayString. todayString:{}", tomorrowString); +// remoteFBADataService.pullAmzFbaDataToken(yesterdayString, tomorrowString); +// return ExecuteResult.success("获取从昨天开始的FBA货件数据"); +// } else if ("today".equals(jobArgs.getJobParams())) { +// DateTime today = DateUtil.date(); +// String todayString = today.toString("yyyy-MM-dd"); +// SnailJobLog.LOCAL.info("yesterdayString. yesterdayString:{}", todayString); +// //获取今天的日期 +// DateTime tomorrow = DateUtil.tomorrow(); +// String tomorrowString = tomorrow.toString("yyyy-MM-dd"); +// SnailJobLog.LOCAL.info("todayString. todayString:{}", tomorrowString); +// remoteFBADataService.pullAmzFbaDataToken(todayString, tomorrowString); +// } +// return ExecuteResult.success("请指定参数yesterday或者today"); +// } +} diff --git a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/domain/SysUser.java b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/domain/SysUser.java index d6b8b70..672234b 100644 --- a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/domain/SysUser.java +++ b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/domain/SysUser.java @@ -93,6 +93,8 @@ public class SysUser extends TenantEntity { */ private String loginIp; + private String openId; + /** * 最后登录时间 */ diff --git a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/domain/vo/SysUserVo.java b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/domain/vo/SysUserVo.java index 50b2bd6..9f7bc77 100644 --- a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/domain/vo/SysUserVo.java +++ b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/domain/vo/SysUserVo.java @@ -108,6 +108,8 @@ public class SysUserVo implements Serializable { */ private String remark; + private String openId; + /** * 创建时间 */ diff --git a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/dubbo/RemoteUserServiceImpl.java b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/dubbo/RemoteUserServiceImpl.java index 84e897a..472d233 100644 --- a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/dubbo/RemoteUserServiceImpl.java +++ b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/dubbo/RemoteUserServiceImpl.java @@ -1,6 +1,7 @@ package org.asinkj.system.dubbo; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Opt; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -11,6 +12,7 @@ import org.asinkj.common.core.exception.ServiceException; import org.asinkj.common.core.exception.user.UserException; import org.asinkj.common.core.utils.DateUtils; import org.asinkj.common.core.utils.MapstructUtils; +import org.asinkj.common.core.utils.StreamUtils; import org.asinkj.common.core.utils.StringUtils; import org.asinkj.common.mybatis.helper.DataPermissionHelper; import org.asinkj.common.tenant.helper.TenantHelper; @@ -285,6 +287,19 @@ public class RemoteUserServiceImpl implements RemoteUserService { DataPermissionHelper.ignore(() -> userMapper.updateById(sysUser)); } + + + + @Override + public void recordOpenId(Long userId, String openId){ + SysUser sysUser = new SysUser(); + sysUser.setUserId(userId); + sysUser.setOpenId(openId); + sysUser.setLoginDate(DateUtils.getNowDate()); + sysUser.setUpdateBy(userId); + DataPermissionHelper.ignore(() -> userMapper.updateById(sysUser)); + } + /** * 通过用户ID查询用户列表 * @@ -308,4 +323,10 @@ public class RemoteUserServiceImpl implements RemoteUserService { return userService.selectUserIdsByRoleIds(roleIds); } + @Override + public List selectUserOpenIdsByRoleIds(List roleIds) { + return userService.selectUserOpenIdsByRoleIds(roleIds); + } + + } diff --git a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/mapper/SysUserMapper.java b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/mapper/SysUserMapper.java index 5938e56..1fe075a 100644 --- a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/mapper/SysUserMapper.java +++ b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/mapper/SysUserMapper.java @@ -88,4 +88,5 @@ public interface SysUserMapper extends BaseMapperPlus { }) int updateById(@Param(Constants.ENTITY) SysUser user); + List selectUserOpenIdsByRoleIds(@Param("roleIds") List roleIds); } diff --git a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/service/ISysUserService.java b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/service/ISysUserService.java index a9db7bb..3e75d9a 100644 --- a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/service/ISysUserService.java +++ b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/service/ISysUserService.java @@ -268,4 +268,5 @@ public interface ISysUserService { */ List selectUserIdsByRoleIds(List roleIds); + List selectUserOpenIdsByRoleIds(List roleIds); } diff --git a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/service/impl/SysUserServiceImpl.java b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/service/impl/SysUserServiceImpl.java index ba7e661..d76613b 100644 --- a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/service/impl/SysUserServiceImpl.java +++ b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/service/impl/SysUserServiceImpl.java @@ -559,6 +559,11 @@ public class SysUserServiceImpl implements ISysUserService { return StreamUtils.toList(userRoles, SysUserRole::getUserId); } + @Override + public List selectUserOpenIdsByRoleIds(List roleIds) { + return baseMapper.selectUserOpenIdsByRoleIds(roleIds); + } + /** * 通过用户ID查询用户账户 * diff --git a/asinkj-modules/asinkj-system/src/main/resources/mapper/system/SysUserMapper.xml b/asinkj-modules/asinkj-system/src/main/resources/mapper/system/SysUserMapper.xml index 2cc80cc..7b59066 100644 --- a/asinkj-modules/asinkj-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/asinkj-modules/asinkj-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -68,6 +68,16 @@ + diff --git a/pom.xml b/pom.xml index c4f9db1..529111a 100644 --- a/pom.xml +++ b/pom.xml @@ -60,6 +60,7 @@ 7.0.1 2.3.0 + 4.7.0 3.11.0 @@ -375,6 +376,12 @@ ${rocketmq.version} + + com.github.binarywang + weixin-java-mp + ${weixin-java-mp.version} + +