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
+
+
+
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}
+
+