From 1ecc50b3c94a712289f385e4d9cbae6758760a28 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Wed, 17 Jul 2024 18:36:48 +0800 Subject: [PATCH 01/26] =?UTF-8?q?mall:=20=E5=AE=8C=E5=96=84=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E7=AB=AF=E8=8E=B7=E5=BE=97=E5=95=86=E5=93=81=E6=B5=8F?= =?UTF-8?q?=E8=A7=88=E8=AE=B0=E5=BD=95=E5=88=86=E9=A1=B5=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProductBrowseHistoryController.java | 22 ++++++++++++++- .../vo/ProductBrowseHistoryRespVO.java | 28 +++++++++---------- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/history/ProductBrowseHistoryController.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/history/ProductBrowseHistoryController.java index b87e4ee44e..b97c360014 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/history/ProductBrowseHistoryController.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/history/ProductBrowseHistoryController.java @@ -1,12 +1,15 @@ package cn.iocoder.yudao.module.product.controller.admin.history; +import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.product.controller.admin.history.vo.ProductBrowseHistoryPageReqVO; import cn.iocoder.yudao.module.product.controller.admin.history.vo.ProductBrowseHistoryRespVO; import cn.iocoder.yudao.module.product.dal.dataobject.history.ProductBrowseHistoryDO; +import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; import cn.iocoder.yudao.module.product.service.history.ProductBrowseHistoryService; +import cn.iocoder.yudao.module.product.service.spu.ProductSpuService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; @@ -17,7 +20,13 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; @Tag(name = "管理后台 - 商品浏览记录") @RestController @@ -27,13 +36,24 @@ public class ProductBrowseHistoryController { @Resource private ProductBrowseHistoryService browseHistoryService; + @Resource + private ProductSpuService productSpuService; @GetMapping("/page") @Operation(summary = "获得商品浏览记录分页") @PreAuthorize("@ss.hasPermission('product:browse-history:query')") public CommonResult> getBrowseHistoryPage(@Valid ProductBrowseHistoryPageReqVO pageReqVO) { PageResult pageResult = browseHistoryService.getBrowseHistoryPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, ProductBrowseHistoryRespVO.class)); + if (CollUtil.isEmpty(pageResult.getList())) { + return success(PageResult.empty()); + } + + // 得到商品 spu 信息 + Set spuIds = convertSet(pageResult.getList(), ProductBrowseHistoryDO::getSpuId); + Map spuMap = convertMap(productSpuService.getSpuList(spuIds), ProductSpuDO::getId); + return success(BeanUtils.toBean(pageResult, ProductBrowseHistoryRespVO.class, + vo -> Optional.ofNullable(spuMap.get(vo.getSpuId())) + .ifPresent(spu -> vo.setSpuName(spu.getName()).setPicUrl(spu.getPicUrl()).setPrice(spu.getPrice())))); } } \ No newline at end of file diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/history/vo/ProductBrowseHistoryRespVO.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/history/vo/ProductBrowseHistoryRespVO.java index 0e2e0cbede..012f1602c6 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/history/vo/ProductBrowseHistoryRespVO.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/history/vo/ProductBrowseHistoryRespVO.java @@ -7,28 +7,28 @@ import lombok.Data; import java.time.LocalDateTime; +import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; + @Schema(description = "管理后台 - 商品浏览记录 Response VO") @Data @ExcelIgnoreUnannotated public class ProductBrowseHistoryRespVO { - @Schema(description = "记录编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "26055") - @ExcelProperty("记录编号") + @Schema(description = "编号", requiredMode = REQUIRED, example = "1") private Long id; - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4314") - @ExcelProperty("用户编号") - private Long userId; - - @Schema(description = "用户是否删除", example = "false") - private Boolean userDeleted; - - @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "42") - @ExcelProperty("商品 SPU 编号") + @Schema(description = "商品 SPU 编号", requiredMode = REQUIRED, example = "29502") private Long spuId; - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("创建时间") - private LocalDateTime createTime; + // ========== 商品相关字段 ========== + + @Schema(description = "商品 SPU 名称", example = "赵六") + private String spuName; + + @Schema(description = "商品封面图", example = "https://domain/pic.png") + private String picUrl; + + @Schema(description = "商品单价", example = "100") + private Integer price; } \ No newline at end of file From c4ab00eabbf83a5d7a3f8464a856893fe9e3ea3f Mon Sep 17 00:00:00 2001 From: puhui999 Date: Wed, 17 Jul 2024 18:42:45 +0800 Subject: [PATCH 02/26] =?UTF-8?q?mall:=20kefu=20=E5=8C=85=E5=90=8D?= =?UTF-8?q?=E6=9B=B4=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enums/{kehu => kefu}/KeFuMessageContentTypeEnum.java | 2 +- .../promotion/dal/dataobject/kefu/KeFuConversationDO.java | 2 +- .../module/promotion/dal/dataobject/kefu/KeFuMessageDO.java | 2 +- .../promotion/service/kefu/KeFuConversationServiceImpl.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/{kehu => kefu}/KeFuMessageContentTypeEnum.java (94%) diff --git a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/kehu/KeFuMessageContentTypeEnum.java b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/kefu/KeFuMessageContentTypeEnum.java similarity index 94% rename from yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/kehu/KeFuMessageContentTypeEnum.java rename to yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/kefu/KeFuMessageContentTypeEnum.java index 51ee59332b..4a058ab56f 100644 --- a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/kehu/KeFuMessageContentTypeEnum.java +++ b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/kefu/KeFuMessageContentTypeEnum.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.promotion.enums.kehu; +package cn.iocoder.yudao.module.promotion.enums.kefu; import cn.iocoder.yudao.framework.common.core.IntArrayValuable; import lombok.AllArgsConstructor; diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/kefu/KeFuConversationDO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/kefu/KeFuConversationDO.java index e9a73284f7..482b6cd824 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/kefu/KeFuConversationDO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/kefu/KeFuConversationDO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.promotion.dal.dataobject.kefu; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; -import cn.iocoder.yudao.module.promotion.enums.kehu.KeFuMessageContentTypeEnum; +import cn.iocoder.yudao.module.promotion.enums.kefu.KeFuMessageContentTypeEnum; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/kefu/KeFuMessageDO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/kefu/KeFuMessageDO.java index bd542f890a..b36f3eeec9 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/kefu/KeFuMessageDO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/kefu/KeFuMessageDO.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.promotion.dal.dataobject.kefu; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.module.promotion.enums.kehu.KeFuMessageContentTypeEnum; +import cn.iocoder.yudao.module.promotion.enums.kefu.KeFuMessageContentTypeEnum; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuConversationServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuConversationServiceImpl.java index fbc658abcc..48aff5b03d 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuConversationServiceImpl.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuConversationServiceImpl.java @@ -6,7 +6,7 @@ import cn.iocoder.yudao.module.promotion.controller.admin.kefu.vo.conversation.K import cn.iocoder.yudao.module.promotion.dal.dataobject.kefu.KeFuConversationDO; import cn.iocoder.yudao.module.promotion.dal.dataobject.kefu.KeFuMessageDO; import cn.iocoder.yudao.module.promotion.dal.mysql.kefu.KeFuConversationMapper; -import cn.iocoder.yudao.module.promotion.enums.kehu.KeFuMessageContentTypeEnum; +import cn.iocoder.yudao.module.promotion.enums.kefu.KeFuMessageContentTypeEnum; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; From 401de3034479bf8787b22fc4e9f6c6b7f9f03c73 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 17 Jul 2024 20:07:01 +0800 Subject: [PATCH 03/26] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E3=80=91MALL=EF=BC=9A=E5=AE=8C=E5=96=84=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E7=AB=AF=E8=8E=B7=E5=BE=97=E5=95=86=E5=93=81=E6=B5=8F?= =?UTF-8?q?=E8=A7=88=E8=AE=B0=E5=BD=95=E5=88=86=E9=A1=B5=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../history/ProductBrowseHistoryController.java | 6 ++---- .../product/service/spu/ProductSpuService.java | 12 ++++++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/history/ProductBrowseHistoryController.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/history/ProductBrowseHistoryController.java index b97c360014..0b9e6a13b8 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/history/ProductBrowseHistoryController.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/history/ProductBrowseHistoryController.java @@ -22,10 +22,8 @@ import org.springframework.web.bind.annotation.RestController; import java.util.Map; import java.util.Optional; -import java.util.Set; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; @Tag(name = "管理后台 - 商品浏览记录") @@ -49,8 +47,8 @@ public class ProductBrowseHistoryController { } // 得到商品 spu 信息 - Set spuIds = convertSet(pageResult.getList(), ProductBrowseHistoryDO::getSpuId); - Map spuMap = convertMap(productSpuService.getSpuList(spuIds), ProductSpuDO::getId); + Map spuMap = productSpuService.getSpuMap( + convertSet(pageResult.getList(), ProductBrowseHistoryDO::getSpuId)); return success(BeanUtils.toBean(pageResult, ProductBrowseHistoryRespVO.class, vo -> Optional.ofNullable(spuMap.get(vo.getSpuId())) .ifPresent(spu -> vo.setSpuName(spu.getName()).setPicUrl(spu.getPicUrl()).setPrice(spu.getPrice())))); diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuService.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuService.java index c288a76cad..d7403c159b 100755 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuService.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuService.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.product.service.spu; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuPageReqVO; import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuSaveReqVO; import cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuUpdateStatusReqVO; @@ -58,6 +59,17 @@ public interface ProductSpuService { */ List getSpuList(Collection ids); + /** + * 获得商品 SPU Map + * + * @param ids 编号数组 + * @return 商品 SPU Map + */ + default Map getSpuMap(Collection ids) { + List list = getSpuList(ids); + return CollectionUtils.convertMap(list, ProductSpuDO::getId); + } + /** * 获得指定状态的商品 SPU 列表 * From 9a263f8dab735d8b8ba3829b0ac08c2adf09e351 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Mon, 22 Jul 2024 15:40:20 +0800 Subject: [PATCH 04/26] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91SYSTE?= =?UTF-8?q?M:=20=E5=BE=AE=E4=BF=A1=E5=B0=8F=E7=A8=8B=E5=BA=8F=E8=AE=A2?= =?UTF-8?q?=E9=98=85=E6=B6=88=E6=81=AF=E6=A8=A1=E7=89=88=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/social/AppSocialUserController.java | 13 +++++-- .../AppSocialWxSubscribeTemplateRespVO.java | 25 ++++++++++++ .../system/api/social/SocialClientApi.java | 18 +++++++-- .../dto/SocialWxSubscribeTemplateRespDTO.java | 39 +++++++++++++++++++ .../system/enums/ErrorCodeConstants.java | 5 ++- .../api/social/SocialClientApiImpl.java | 11 +++++- .../service/social/SocialClientService.java | 10 +++++ .../social/SocialClientServiceImpl.java | 15 +++++++ 8 files changed, 125 insertions(+), 11 deletions(-) create mode 100644 yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/vo/AppSocialWxSubscribeTemplateRespVO.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeTemplateRespDTO.java diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/AppSocialUserController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/AppSocialUserController.java index de76856c3e..326460fe81 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/AppSocialUserController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/AppSocialUserController.java @@ -5,10 +5,7 @@ import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated; -import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserBindReqVO; -import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserRespVO; -import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserUnbindReqVO; -import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialWxQrcodeReqVO; +import cn.iocoder.yudao.module.member.controller.app.social.vo.*; import cn.iocoder.yudao.module.system.api.social.SocialClientApi; import cn.iocoder.yudao.module.system.api.social.SocialUserApi; import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO; @@ -23,6 +20,8 @@ import jakarta.validation.Valid; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.List; + import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @@ -72,4 +71,10 @@ public class AppSocialUserController { return success(Base64.encode(wxQrcode)); } + @GetMapping("/get-subscribe-template") + @Operation(summary = "获得微信小程订阅模板") + public CommonResult> getSubscribeTemplate() { + return success(BeanUtils.toBean(socialClientApi.getSubscribeTemplate(), AppSocialWxSubscribeTemplateRespVO.class)); + } + } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/vo/AppSocialWxSubscribeTemplateRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/vo/AppSocialWxSubscribeTemplateRespVO.java new file mode 100644 index 0000000000..2aad4fdda8 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/vo/AppSocialWxSubscribeTemplateRespVO.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.module.member.controller.app.social.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "用户 APP - 获得小程序订阅模版 Response VO") +@Data +public class AppSocialWxSubscribeTemplateRespVO { + + @Schema(description = "添加至账号下的模板 id,发送小程序订阅消息时所需", requiredMode = Schema.RequiredMode.REQUIRED, example = "9Aw5ZV1j9xdWTFEkqCpZ7mIBbSC34khK55OtzUPl0rU") + private String priTmplId; + + @Schema(description = "模版标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "订单支付通知") + private String title; + + @Schema(description = "模版内容", requiredMode = Schema.RequiredMode.REQUIRED) + private String content; + + @Schema(description = "模板内容示例", requiredMode = Schema.RequiredMode.REQUIRED, example = "下单时间:2016年8月8日") + private String example; + + @Schema(description = "模版类型,2 为一次性订阅,3 为长期订阅", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + private Integer type; + +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java index cdc609b3ff..1db894fb13 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java @@ -3,9 +3,12 @@ package cn.iocoder.yudao.module.system.api.social; import cn.iocoder.yudao.module.system.api.social.dto.SocialWxJsapiSignatureRespDTO; import cn.iocoder.yudao.module.system.api.social.dto.SocialWxPhoneNumberInfoRespDTO; import cn.iocoder.yudao.module.system.api.social.dto.SocialWxQrcodeReqDTO; +import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeTemplateRespDTO; import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; import jakarta.validation.Valid; +import java.util.List; + /** * 社交应用的 API 接口 * @@ -16,8 +19,8 @@ public interface SocialClientApi { /** * 获得社交平台的授权 URL * - * @param socialType 社交平台的类型 {@link SocialTypeEnum} - * @param userType 用户类型 + * @param socialType 社交平台的类型 {@link SocialTypeEnum} + * @param userType 用户类型 * @param redirectUri 重定向 URL * @return 社交平台的授权 URL */ @@ -27,7 +30,7 @@ public interface SocialClientApi { * 创建微信公众号 JS SDK 初始化所需的签名 * * @param userType 用户类型 - * @param url 访问的 URL 地址 + * @param url 访问的 URL 地址 * @return 签名 */ SocialWxJsapiSignatureRespDTO createWxMpJsapiSignature(Integer userType, String url); @@ -35,7 +38,7 @@ public interface SocialClientApi { /** * 获得微信小程序的手机信息 * - * @param userType 用户类型 + * @param userType 用户类型 * @param phoneCode 手机授权码 * @return 手机信息 */ @@ -49,4 +52,11 @@ public interface SocialClientApi { */ byte[] getWxaQrcode(@Valid SocialWxQrcodeReqDTO reqVO); + /** + * 获得微信小程订阅模板 + * + * @return 小程序订阅消息模版 + */ + List getSubscribeTemplate(); + } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeTemplateRespDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeTemplateRespDTO.java new file mode 100644 index 0000000000..5959f5b143 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeTemplateRespDTO.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.system.api.social.dto; + +import lombok.Data; + + +/** + * 小程序订阅消息模版 Response DTO + * + * @author HUIHUI + */ +@Data +public class SocialWxSubscribeTemplateRespDTO { + + /** + * 添加至账号下的模板 id,发送小程序订阅消息时所需 + */ + private String priTmplId; + + /** + * 模版标题 + */ + private String title; + + /** + * 模版内容 + */ + private String content; + + /** + * 模板内容示例 + */ + private String example; + + /** + * 模版类型,2 为一次性订阅,3 为长期订阅 + */ + private Integer type; + +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index 412ac413ef..c7d09823fb 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -121,8 +121,9 @@ public interface ErrorCodeConstants { ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_PHONE_CODE_ERROR = new ErrorCode(1_002_018_200, "获得手机号失败"); ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_QRCODE_ERROR = new ErrorCode(1_002_018_201, "获得小程序码失败"); - ErrorCode SOCIAL_CLIENT_NOT_EXISTS = new ErrorCode(1_002_018_202, "社交客户端不存在"); - ErrorCode SOCIAL_CLIENT_UNIQUE = new ErrorCode(1_002_018_203, "社交客户端已存在配置"); + ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_TEMPLATE_ERROR = new ErrorCode(1_002_018_202, "获得小程序订阅消息模版失败"); + ErrorCode SOCIAL_CLIENT_NOT_EXISTS = new ErrorCode(1_002_018_210, "社交客户端不存在"); + ErrorCode SOCIAL_CLIENT_UNIQUE = new ErrorCode(1_002_018_211, "社交客户端已存在配置"); // ========== OAuth2 客户端 1-002-020-000 ========= diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java index 2a7b69cfe6..605907bc26 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java @@ -5,12 +5,15 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.system.api.social.dto.SocialWxJsapiSignatureRespDTO; import cn.iocoder.yudao.module.system.api.social.dto.SocialWxPhoneNumberInfoRespDTO; import cn.iocoder.yudao.module.system.api.social.dto.SocialWxQrcodeReqDTO; +import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeTemplateRespDTO; import cn.iocoder.yudao.module.system.service.social.SocialClientService; +import jakarta.annotation.Resource; import me.chanjar.weixin.common.bean.WxJsapiSignature; +import me.chanjar.weixin.common.bean.subscribemsg.TemplateInfo; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import jakarta.annotation.Resource; +import java.util.List; /** * 社交应用的 API 实现类 @@ -46,4 +49,10 @@ public class SocialClientApiImpl implements SocialClientApi { return socialClientService.getWxaQrcode(reqVO); } + @Override + public List getSubscribeTemplate() { + List subscribeTemplate = socialClientService.getSubscribeTemplate(); + return BeanUtils.toBean(subscribeTemplate, SocialWxSubscribeTemplateRespDTO.class); + } + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java index 7757d35d15..edfe930ce9 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java @@ -10,6 +10,9 @@ import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; import com.xingyuv.jushauth.model.AuthUser; import jakarta.validation.Valid; import me.chanjar.weixin.common.bean.WxJsapiSignature; +import me.chanjar.weixin.common.bean.subscribemsg.TemplateInfo; + +import java.util.List; /** * 社交应用 Service 接口 @@ -109,4 +112,11 @@ public interface SocialClientService { */ PageResult getSocialClientPage(SocialClientPageReqVO pageReqVO); + /** + * 获得微信小程订阅模板 + * + * @return 微信小程订阅模板 + */ + List getSubscribeTemplate(); + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java index b9a3392231..6a8295c20b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.system.service.social; import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.api.WxMaSubscribeService; import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; import cn.binarywang.wx.miniapp.config.impl.WxMaRedisBetterConfigImpl; @@ -36,6 +37,7 @@ import jakarta.annotation.Resource; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.bean.WxJsapiSignature; +import me.chanjar.weixin.common.bean.subscribemsg.TemplateInfo; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.redis.RedisTemplateWxRedisOps; import me.chanjar.weixin.mp.api.WxMpService; @@ -46,6 +48,7 @@ import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import java.time.Duration; +import java.util.List; import java.util.Objects; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -364,4 +367,16 @@ public class SocialClientServiceImpl implements SocialClientService { return socialClientMapper.selectPage(pageReqVO); } + @Override + public List getSubscribeTemplate() { + WxMaService service = getWxMaService(UserTypeEnum.MEMBER.getValue()); + try { + WxMaSubscribeService subscribeService = service.getSubscribeService(); + return subscribeService.getTemplateList(); + }catch (WxErrorException e) { + log.error("[getSubscribeTemplate][获得小程序订阅消息模版]", e); + throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_TEMPLATE_ERROR); + } + } + } From 878b56a7d60ea5dbaabd2d53719c36cf826353c1 Mon Sep 17 00:00:00 2001 From: yinyilong <195332105@qq.com> Date: Tue, 23 Jul 2024 14:43:57 +0800 Subject: [PATCH 05/26] =?UTF-8?q?bugfix-=E5=AF=BC=E5=85=A5=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E7=94=A8=E6=88=B7=E6=97=B6=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=B3=A8=E8=A7=A3=E6=A0=A1=E9=AA=8C=E8=BF=87=E7=A8=8B=EF=BC=8C?= =?UTF-8?q?=E4=B8=8E=E7=95=8C=E9=9D=A2=E6=B7=BB=E5=8A=A0=E5=92=8C=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E7=94=A8=E6=88=B7=E4=BF=9D=E6=8C=81=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/test/core/util/RandomUtils.java | 4 ++ .../service/user/AdminUserServiceImpl.java | 38 +++++++++++++++++-- .../user/AdminUserServiceImplTest.java | 6 +++ 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/util/RandomUtils.java b/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/util/RandomUtils.java index 66d15c5bfa..0952697514 100644 --- a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/util/RandomUtils.java +++ b/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/util/RandomUtils.java @@ -103,6 +103,10 @@ public class RandomUtils { return randomString() + "@qq.com"; } + public static String randomMobile() { + return "13800138" + RandomUtil.randomNumbers(3); + } + public static String randomURL() { return "https://www.iocoder.cn/" + randomString(); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java index 1f99899db4..2edff89cfe 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java @@ -9,6 +9,7 @@ import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils; import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils; import cn.iocoder.yudao.module.infra.api.config.ConfigApi; import cn.iocoder.yudao.module.infra.api.file.FileApi; @@ -32,6 +33,7 @@ import com.mzt.logapi.context.LogRecordContext; import com.mzt.logapi.service.impl.DiffParseFunction; import com.mzt.logapi.starter.annotation.LogRecord; import jakarta.annotation.Resource; +import jakarta.validation.ConstraintViolationException; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; import org.springframework.security.crypto.password.PasswordEncoder; @@ -40,13 +42,36 @@ import org.springframework.transaction.annotation.Transactional; import java.io.InputStream; import java.time.LocalDateTime; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; -import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.*; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_COUNT_MAX; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_EMAIL_EXISTS; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_IMPORT_INIT_PASSWORD; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_IMPORT_LIST_IS_EMPTY; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_IS_DISABLE; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_MOBILE_EXISTS; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_NOT_EXISTS; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_PASSWORD_FAILED; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_USERNAME_EXISTS; +import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.SYSTEM_USER_CREATE_SUB_TYPE; +import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.SYSTEM_USER_CREATE_SUCCESS; +import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.SYSTEM_USER_DELETE_SUB_TYPE; +import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.SYSTEM_USER_DELETE_SUCCESS; +import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.SYSTEM_USER_TYPE; +import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.SYSTEM_USER_UPDATE_PASSWORD_SUB_TYPE; +import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.SYSTEM_USER_UPDATE_PASSWORD_SUCCESS; +import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.SYSTEM_USER_UPDATE_SUB_TYPE; +import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.SYSTEM_USER_UPDATE_SUCCESS; /** * 后台用户 Service 实现类 @@ -451,6 +476,13 @@ public class AdminUserServiceImpl implements AdminUserService { respVO.getFailureUsernames().put(importUser.getUsername(), ex.getMessage()); return; } + // 校验字段是否符合要求 + try { + ValidationUtils.validate(BeanUtils.toBean(importUser, UserSaveReqVO.class).setPassword(initPassword)); + }catch (ConstraintViolationException ex){ + respVO.getFailureUsernames().put(importUser.getUsername(), ex.getMessage()); + return; + } // 判断如果不存在,在进行插入 AdminUserDO existUser = userMapper.selectByUsername(importUser.getUsername()); if (existUser == null) { diff --git a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java index 4d9ca78560..73f54d1517 100644 --- a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java @@ -452,6 +452,8 @@ public class AdminUserServiceImplTest extends BaseDbUnitTest { UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class, o -> { o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 o.setSex(randomEle(SexEnum.values()).getSex()); // 保证 sex 的范围 + o.setEmail(randomEmail()); + o.setMobile(randomMobile()); }); // mock deptService 的方法 DeptDO dept = randomPojo(DeptDO.class, o -> { @@ -486,6 +488,8 @@ public class AdminUserServiceImplTest extends BaseDbUnitTest { o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 o.setSex(randomEle(SexEnum.values()).getSex()); // 保证 sex 的范围 o.setUsername(dbUser.getUsername()); + o.setEmail(randomEmail()); + o.setMobile(randomMobile()); }); // mock deptService 的方法 DeptDO dept = randomPojo(DeptDO.class, o -> { @@ -516,6 +520,8 @@ public class AdminUserServiceImplTest extends BaseDbUnitTest { o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 o.setSex(randomEle(SexEnum.values()).getSex()); // 保证 sex 的范围 o.setUsername(dbUser.getUsername()); + o.setEmail(randomEmail()); + o.setMobile(randomMobile()); }); // mock deptService 的方法 DeptDO dept = randomPojo(DeptDO.class, o -> { From 63e319e6639c4ac387f98fb85d5e6835b3c2af2c Mon Sep 17 00:00:00 2001 From: puhui999 Date: Tue, 23 Jul 2024 17:46:41 +0800 Subject: [PATCH 06/26] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91SYSTE?= =?UTF-8?q?M:=20=E5=8F=91=E9=80=81=E5=BE=AE=E4=BF=A1=E5=B0=8F=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E8=AE=A2=E9=98=85=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/api/social/SocialClientApi.java | 12 ++-- .../dto/SocialWxSubscribeMessageReqDTO.java | 70 +++++++++++++++++++ .../system/enums/ErrorCodeConstants.java | 1 + .../api/social/SocialClientApiImpl.java | 10 +-- .../service/social/SocialClientService.java | 22 ++++-- .../social/SocialClientServiceImpl.java | 40 +++++++---- 6 files changed, 128 insertions(+), 27 deletions(-) create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageReqDTO.java diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java index 1db894fb13..3a91c92a40 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java @@ -1,9 +1,6 @@ package cn.iocoder.yudao.module.system.api.social; -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxJsapiSignatureRespDTO; -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxPhoneNumberInfoRespDTO; -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxQrcodeReqDTO; -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeTemplateRespDTO; +import cn.iocoder.yudao.module.system.api.social.dto.*; import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; import jakarta.validation.Valid; @@ -59,4 +56,11 @@ public interface SocialClientApi { */ List getSubscribeTemplate(); + /** + * 发送订阅消息 + * + * @param reqDTO 请求 + */ + void sendSubscribeMessage(SocialWxSubscribeMessageReqDTO reqDTO); + } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageReqDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageReqDTO.java new file mode 100644 index 0000000000..6bcb6397da --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageReqDTO.java @@ -0,0 +1,70 @@ +package cn.iocoder.yudao.module.system.api.social.dto; + +import cn.iocoder.yudao.framework.common.core.KeyValue; +import lombok.Data; + +import java.util.List; + +/** + * 微信小程序订阅消息 Request DTO + * + * @author HUIHUI + */ +@Data +public class SocialWxSubscribeMessageReqDTO { + + /** + * 接收者(用户)的 openid. + *
+     * 参数:touser
+     * 是否必填: 是
+     * 描述: 接收者(用户)的 openid
+     * 
+ */ + private String toUser; + + /** + * 所需下发的模板消息的id. + *
+     * 参数:template_id
+     * 是否必填: 是
+     * 描述: 所需下发的模板消息的id
+     * 
+ */ + private String templateId; + + /** + * 点击模板卡片后的跳转页面,仅限本小程序内的页面. + *
+     * 参数:page
+     * 是否必填: 否
+     * 描述: 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
+     * 
+ */ + private String page; + + /** + * 跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版 + * + * 枚举 WxMaConstants.MiniProgramState + */ + private String miniprogramState; + + /** + * 进入小程序查看的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN + * + * 枚举 WxMaConstants.MiniProgramLang + */ + private String lang; + + /** + * 模板内容,不填则下发空模板. + *
+     * 参数:data
+     * 是否必填: 是
+     * 描述: 模板内容,不填则下发空模板
+     * 
+ */ + private List> data; + +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index c7d09823fb..d34adc7dce 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -122,6 +122,7 @@ public interface ErrorCodeConstants { ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_PHONE_CODE_ERROR = new ErrorCode(1_002_018_200, "获得手机号失败"); ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_QRCODE_ERROR = new ErrorCode(1_002_018_201, "获得小程序码失败"); ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_TEMPLATE_ERROR = new ErrorCode(1_002_018_202, "获得小程序订阅消息模版失败"); + ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_MESSAGE_ERROR = new ErrorCode(1_002_018_203, "发送小程序订阅消息失败"); ErrorCode SOCIAL_CLIENT_NOT_EXISTS = new ErrorCode(1_002_018_210, "社交客户端不存在"); ErrorCode SOCIAL_CLIENT_UNIQUE = new ErrorCode(1_002_018_211, "社交客户端已存在配置"); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java index 605907bc26..1656524a76 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java @@ -2,10 +2,7 @@ package cn.iocoder.yudao.module.system.api.social; import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxJsapiSignatureRespDTO; -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxPhoneNumberInfoRespDTO; -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxQrcodeReqDTO; -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeTemplateRespDTO; +import cn.iocoder.yudao.module.system.api.social.dto.*; import cn.iocoder.yudao.module.system.service.social.SocialClientService; import jakarta.annotation.Resource; import me.chanjar.weixin.common.bean.WxJsapiSignature; @@ -55,4 +52,9 @@ public class SocialClientApiImpl implements SocialClientApi { return BeanUtils.toBean(subscribeTemplate, SocialWxSubscribeTemplateRespDTO.class); } + @Override + public void sendSubscribeMessage(SocialWxSubscribeMessageReqDTO reqDTO) { + socialClientService.sendSubscribeMessage(reqDTO); + } + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java index edfe930ce9..2f58732bbc 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.system.service.social; import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.api.social.dto.SocialWxQrcodeReqDTO; +import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeMessageReqDTO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialClientDO; @@ -72,6 +73,20 @@ public interface SocialClientService { */ byte[] getWxaQrcode(SocialWxQrcodeReqDTO reqVO); + /** + * 获得微信小程订阅模板 + * + * @return 微信小程订阅模板 + */ + List getSubscribeTemplate(); + + /** + * 发送订阅消息 + * + * @param reqDTO 请求 + */ + void sendSubscribeMessage(SocialWxSubscribeMessageReqDTO reqDTO); + // =================== 客户端管理 =================== /** @@ -112,11 +127,4 @@ public interface SocialClientService { */ PageResult getSocialClientPage(SocialClientPageReqVO pageReqVO); - /** - * 获得微信小程订阅模板 - * - * @return 微信小程订阅模板 - */ - List getSubscribeTemplate(); - } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java index 6a8295c20b..9e05f3a23c 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java @@ -4,6 +4,7 @@ import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.api.WxMaSubscribeService; import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; +import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage; import cn.binarywang.wx.miniapp.config.impl.WxMaRedisBetterConfigImpl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.lang.Assert; @@ -16,6 +17,7 @@ import cn.iocoder.yudao.framework.common.util.cache.CacheUtils; import cn.iocoder.yudao.framework.common.util.http.HttpUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.system.api.social.dto.SocialWxQrcodeReqDTO; +import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeMessageReqDTO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialClientDO; @@ -258,6 +260,32 @@ public class SocialClientServiceImpl implements SocialClientService { } } + @Override + public List getSubscribeTemplate() { + WxMaService service = getWxMaService(UserTypeEnum.MEMBER.getValue()); + try { + WxMaSubscribeService subscribeService = service.getSubscribeService(); + return subscribeService.getTemplateList(); + }catch (WxErrorException e) { + log.error("[getSubscribeTemplate][获得小程序订阅消息模版]", e); + throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_TEMPLATE_ERROR); + } + } + + @Override + public void sendSubscribeMessage(SocialWxSubscribeMessageReqDTO reqDTO) { + WxMaService service = getWxMaService(UserTypeEnum.MEMBER.getValue()); + try { + WxMaSubscribeService subscribeService = service.getSubscribeService(); + WxMaSubscribeMessage message = BeanUtils.toBean(reqDTO, WxMaSubscribeMessage.class); + reqDTO.getData().forEach(item-> message.addData(new WxMaSubscribeMessage.MsgData(item.getKey(), item.getValue()))); + subscribeService.sendSubscribeMsg(message); + }catch (WxErrorException e) { + log.error("[sendSubscribeMessage][发送小程序订阅消息]", e); + throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_MESSAGE_ERROR); + } + } + /** * 获得 clientId + clientSecret 对应的 WxMpService 对象 * @@ -367,16 +395,4 @@ public class SocialClientServiceImpl implements SocialClientService { return socialClientMapper.selectPage(pageReqVO); } - @Override - public List getSubscribeTemplate() { - WxMaService service = getWxMaService(UserTypeEnum.MEMBER.getValue()); - try { - WxMaSubscribeService subscribeService = service.getSubscribeService(); - return subscribeService.getTemplateList(); - }catch (WxErrorException e) { - log.error("[getSubscribeTemplate][获得小程序订阅消息模版]", e); - throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_TEMPLATE_ERROR); - } - } - } From 8054847b05bb10f6e9fc0f934c2c257a29dd7e86 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Wed, 24 Jul 2024 17:18:48 +0800 Subject: [PATCH 07/26] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91SYSTE?= =?UTF-8?q?M:=20=E5=8F=91=E9=80=81=E5=BE=AE=E4=BF=A1=E5=B0=8F=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E8=AE=A2=E9=98=85=E6=B6=88=E6=81=AF=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../trade/enums/MessageTemplateConstants.java | 5 +++++ .../dto/SocialWxSubscribeMessageReqDTO.java | 11 ++++++++++- .../admin/socail/SocialClientController.http | 5 +++++ .../admin/socail/SocialClientController.java | 18 +++++++++++++++--- .../social/SocialClientServiceImpl.java | 2 +- 5 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.http diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java index 5041139b46..7275986369 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java @@ -13,4 +13,9 @@ public interface MessageTemplateConstants { String BROKERAGE_WITHDRAW_AUDIT_APPROVE = "brokerage_withdraw_audit_approve"; // 佣金提现(审核通过) String BROKERAGE_WITHDRAW_AUDIT_REJECT = "brokerage_withdraw_audit_reject"; // 佣金提现(审核不通过) + //======================= 订阅消息模版 ======================= + + String ORDER_AFTERSALE_CHANGE = "售后进度通知"; + String MONEY_CHANGE = "充值成功通知"; + } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageReqDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageReqDTO.java index 6bcb6397da..4f7ecd7a04 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageReqDTO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageReqDTO.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.system.api.social.dto; import cn.iocoder.yudao.framework.common.core.KeyValue; import lombok.Data; +import java.util.ArrayList; import java.util.List; /** @@ -65,6 +66,14 @@ public class SocialWxSubscribeMessageReqDTO { * 描述: 模板内容,不填则下发空模板 * */ - private List> data; + private List> messages; + + public SocialWxSubscribeMessageReqDTO addData(String key, String value) { + if (messages == null) { + messages = new ArrayList<>(); + } + messages.add(new KeyValue<>(key, value)); + return this; + } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.http b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.http new file mode 100644 index 0000000000..b1390a7438 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.http @@ -0,0 +1,5 @@ +### 请求 /system/social-client/send-subscribe-message 接口 => 发送测试订阅消息 +POST {{baseUrl}}/system/social-client/send-subscribe-message +Authorization: Bearer {{token}} +#Authorization: Bearer test100 +tenant-id: {{adminTenentId}} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.java index a029ca29bd..f0fc6d8363 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.system.controller.admin.socail; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeMessageReqDTO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientRespVO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientSaveReqVO; @@ -11,13 +12,12 @@ import cn.iocoder.yudao.module.system.service.social.SocialClientService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; - import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @Tag(name = "管理后台 - 社交客户端") @@ -70,4 +70,16 @@ public class SocialClientController { return success(BeanUtils.toBean(pageResult, SocialClientRespVO.class)); } + //======================= TODO 测试发送订阅消息 ======================= + + @PostMapping("/send-subscribe-message") + public void testSendSubscribeMessage() { + SocialWxSubscribeMessageReqDTO reqDTO = new SocialWxSubscribeMessageReqDTO().setLang("zh_CN") + .setMiniprogramState("developer").setTemplateId("W4ybDTIwCfKHtMKR7fSfx83DtmVKEeXQo3Ti7GCw4_4") + .setToUser("oKNkb4xxw2H135-MVPKtEMkumK08"); + reqDTO.addData("character_string1", "11111111").addData("amount2", "6666").addData("time3", "2024-01-01 10:10:10") + .addData("phrase4", "成功"); + socialClientService.sendSubscribeMessage(reqDTO); + } + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java index 9e05f3a23c..7f793f27ee 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java @@ -278,7 +278,7 @@ public class SocialClientServiceImpl implements SocialClientService { try { WxMaSubscribeService subscribeService = service.getSubscribeService(); WxMaSubscribeMessage message = BeanUtils.toBean(reqDTO, WxMaSubscribeMessage.class); - reqDTO.getData().forEach(item-> message.addData(new WxMaSubscribeMessage.MsgData(item.getKey(), item.getValue()))); + reqDTO.getMessages().forEach(item-> message.addData(new WxMaSubscribeMessage.MsgData(item.getKey(), item.getValue()))); subscribeService.sendSubscribeMsg(message); }catch (WxErrorException e) { log.error("[sendSubscribeMessage][发送小程序订阅消息]", e); From 7f87f26f3a09fbcba5dfca7fa51af9362605aa13 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 24 Jul 2024 19:30:28 +0800 Subject: [PATCH 08/26] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91SYSTEM=EF=BC=9A=E5=BE=AE=E4=BF=A1=E5=B0=8F?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=9A=84=E8=AE=A2=E9=98=85=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/trade/enums/MessageTemplateConstants.java | 3 +++ .../app/social/AppSocialUserController.java | 8 +++----- .../social/vo/AppSocialWxSubscribeTemplateRespVO.java | 11 +++++++---- .../module/system/api/social/SocialClientApi.java | 2 +- .../social/dto/SocialWxSubscribeMessageReqDTO.java | 3 +++ .../social/dto/SocialWxSubscribeTemplateRespDTO.java | 7 ++++++- .../admin/socail/SocialClientController.java | 1 + .../system/service/social/SocialClientService.java | 2 +- .../service/social/SocialClientServiceImpl.java | 8 ++++++-- 9 files changed, 31 insertions(+), 14 deletions(-) diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java index 7275986369..d6ab00f03f 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java @@ -15,7 +15,10 @@ public interface MessageTemplateConstants { //======================= 订阅消息模版 ======================= + // TODO @puhui999:建议 TRADE_AFTER_SALE_CHANGE String ORDER_AFTERSALE_CHANGE = "售后进度通知"; + + // TODO @puhui999:是不是改成 PAY_WALLET_CHANGE 放在 PAY 模块 String MONEY_CHANGE = "充值成功通知"; } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/AppSocialUserController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/AppSocialUserController.java index 326460fe81..da5536989e 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/AppSocialUserController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/AppSocialUserController.java @@ -8,10 +8,7 @@ import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated; import cn.iocoder.yudao.module.member.controller.app.social.vo.*; import cn.iocoder.yudao.module.system.api.social.SocialClientApi; import cn.iocoder.yudao.module.system.api.social.SocialUserApi; -import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO; -import cn.iocoder.yudao.module.system.api.social.dto.SocialUserRespDTO; -import cn.iocoder.yudao.module.system.api.social.dto.SocialUserUnbindReqDTO; -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxQrcodeReqDTO; +import cn.iocoder.yudao.module.system.api.social.dto.*; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -74,7 +71,8 @@ public class AppSocialUserController { @GetMapping("/get-subscribe-template") @Operation(summary = "获得微信小程订阅模板") public CommonResult> getSubscribeTemplate() { - return success(BeanUtils.toBean(socialClientApi.getSubscribeTemplate(), AppSocialWxSubscribeTemplateRespVO.class)); + List template = socialClientApi.getSubscribeTemplate(); + return success(BeanUtils.toBean(template, AppSocialWxSubscribeTemplateRespVO.class)); } } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/vo/AppSocialWxSubscribeTemplateRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/vo/AppSocialWxSubscribeTemplateRespVO.java index 2aad4fdda8..095d39d933 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/vo/AppSocialWxSubscribeTemplateRespVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/vo/AppSocialWxSubscribeTemplateRespVO.java @@ -7,19 +7,22 @@ import lombok.Data; @Data public class AppSocialWxSubscribeTemplateRespVO { - @Schema(description = "添加至账号下的模板 id,发送小程序订阅消息时所需", requiredMode = Schema.RequiredMode.REQUIRED, example = "9Aw5ZV1j9xdWTFEkqCpZ7mIBbSC34khK55OtzUPl0rU") + // TODO @puhui999:是不是使用 id 作为字段,更干净些哈; + @Schema(description = "模版编号", requiredMode = Schema.RequiredMode.REQUIRED, + example = "9Aw5ZV1j9xdWTFEkqCpZ7mIBbSC34khK55OtzUPl0rU") private String priTmplId; @Schema(description = "模版标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "订单支付通知") private String title; - @Schema(description = "模版内容", requiredMode = Schema.RequiredMode.REQUIRED) + @Schema(description = "模版内容", requiredMode = Schema.RequiredMode.REQUIRED, + example = "{ {result.DATA} }\\n\\n领奖金额:{ {withdrawMoney.DATA} }\\n领奖时间: { {withdrawTime.DATA} }") private String content; @Schema(description = "模板内容示例", requiredMode = Schema.RequiredMode.REQUIRED, example = "下单时间:2016年8月8日") private String example; - @Schema(description = "模版类型,2 为一次性订阅,3 为长期订阅", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") - private Integer type; + @Schema(description = "模版类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + private Integer type; // 2 为一次性订阅,3 为长期订阅 } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java index 3a91c92a40..ca65d04865 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java @@ -57,7 +57,7 @@ public interface SocialClientApi { List getSubscribeTemplate(); /** - * 发送订阅消息 + * 发送微信小程序订阅消息 * * @param reqDTO 请求 */ diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageReqDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageReqDTO.java index 4f7ecd7a04..5fb13b9522 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageReqDTO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageReqDTO.java @@ -6,6 +6,7 @@ import lombok.Data; import java.util.ArrayList; import java.util.List; +// TODO @puhui99:1)参考 SocialWxQrcodeReqDTO,可以 @see 文档。这样,注释会更见见一点。2)是不是少了 Send:SocialWxSubscribeMessageSendReqDTO /** * 微信小程序订阅消息 Request DTO * @@ -14,6 +15,7 @@ import java.util.List; @Data public class SocialWxSubscribeMessageReqDTO { + // TODO @puhui999:参数校验 /** * 接收者(用户)的 openid. *
@@ -58,6 +60,7 @@ public class SocialWxSubscribeMessageReqDTO {
      */
     private String lang;
 
+    // TODO @puhui999:是必须 List>,还是 Map
diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeTemplateRespDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeTemplateRespDTO.java
index 5959f5b143..69cc4e62ef 100644
--- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeTemplateRespDTO.java
+++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeTemplateRespDTO.java
@@ -11,6 +11,7 @@ import lombok.Data;
 @Data
 public class SocialWxSubscribeTemplateRespDTO {
 
+    // TODO @puhui999:建议搞成 id
     /**
      * 添加至账号下的模板 id,发送小程序订阅消息时所需
      */
@@ -31,8 +32,12 @@ public class SocialWxSubscribeTemplateRespDTO {
      */
     private String example;
 
+    // TODO @puhui999:这个在 wxjava 里面,有枚举字段么?
     /**
-     * 模版类型,2 为一次性订阅,3 为长期订阅
+     * 模版类型
+     *
+     * 2 为一次性订阅
+     * 3 为长期订阅
      */
     private Integer type;
 
diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.java
index f0fc6d8363..6ff6aff7cd 100644
--- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.java
+++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.java
@@ -72,6 +72,7 @@ public class SocialClientController {
 
     //======================= TODO 测试发送订阅消息 =======================
 
+    // TODO @puhui999:这个接口,其实可以留着。然后把参数挪到 .http 文件。先直接用 SocialWxSubscribeMessageReqDTO 接参数
     @PostMapping("/send-subscribe-message")
     public void testSendSubscribeMessage() {
         SocialWxSubscribeMessageReqDTO reqDTO = new SocialWxSubscribeMessageReqDTO().setLang("zh_CN")
diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java
index 2f58732bbc..0fe4adf20a 100644
--- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java
+++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java
@@ -81,7 +81,7 @@ public interface SocialClientService {
     List getSubscribeTemplate();
 
     /**
-     * 发送订阅消息
+     * 发送微信小程序订阅消息
      *
      * @param reqDTO 请求
      */
diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java
index 7f793f27ee..34fd831363 100644
--- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java
+++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java
@@ -236,6 +236,7 @@ public class SocialClientServiceImpl implements SocialClientService {
         try {
             return service.getUserService().getPhoneNoInfo(phoneCode);
         } catch (WxErrorException e) {
+            // TODO @puhui999:这里的日志,reqDTO 要打进去
             log.error("[getPhoneNoInfo][userType({}) phoneCode({}) 获得手机号失败]", userType, phoneCode, e);
             throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_PHONE_CODE_ERROR);
         }
@@ -262,11 +263,12 @@ public class SocialClientServiceImpl implements SocialClientService {
 
     @Override
     public List getSubscribeTemplate() {
+        // TODO @puhui999:这个 userType 最好通过参数,传递过来;然后这个方法名,貌似叫 getSubscribeTemplateList 更合适哈;
         WxMaService service = getWxMaService(UserTypeEnum.MEMBER.getValue());
         try {
             WxMaSubscribeService subscribeService = service.getSubscribeService();
             return subscribeService.getTemplateList();
-        }catch (WxErrorException e) {
+        } catch (WxErrorException e) {
             log.error("[getSubscribeTemplate][获得小程序订阅消息模版]", e);
             throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_TEMPLATE_ERROR);
         }
@@ -274,13 +276,15 @@ public class SocialClientServiceImpl implements SocialClientService {
 
     @Override
     public void sendSubscribeMessage(SocialWxSubscribeMessageReqDTO reqDTO) {
+        // TODO @puhui999:这个 userType 最好通过参数,
         WxMaService service = getWxMaService(UserTypeEnum.MEMBER.getValue());
         try {
             WxMaSubscribeService subscribeService = service.getSubscribeService();
             WxMaSubscribeMessage message = BeanUtils.toBean(reqDTO, WxMaSubscribeMessage.class);
             reqDTO.getMessages().forEach(item-> message.addData(new WxMaSubscribeMessage.MsgData(item.getKey(), item.getValue())));
             subscribeService.sendSubscribeMsg(message);
-        }catch (WxErrorException e) {
+        } catch (WxErrorException e) {
+            // TODO @puhui999:这里的日志,reqDTO 要打进去
             log.error("[sendSubscribeMessage][发送小程序订阅消息]", e);
             throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_MESSAGE_ERROR);
         }

From 469610521054d9b38bc78221a5b07fd7ca1ffb75 Mon Sep 17 00:00:00 2001
From: puhui999 
Date: Thu, 25 Jul 2024 17:37:50 +0800
Subject: [PATCH 09/26] =?UTF-8?q?=E3=80=90=E4=BC=98=E5=8C=96=E3=80=91SYSTE?=
 =?UTF-8?q?M:=20=E6=A0=B9=E6=8D=AE=E4=BB=A3=E7=A0=81=E8=AF=84=E5=AE=A1?=
 =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=B0=8F=E7=A8=8B=E5=BA=8F=E7=9A=84=E8=AE=A2?=
 =?UTF-8?q?=E9=98=85=E6=B6=88=E6=81=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../trade/enums/MessageTemplateConstants.java |  8 ++---
 .../app/social/AppSocialUserController.java   |  8 ++---
 .../AppSocialWxSubscribeTemplateRespVO.java   |  3 +-
 .../pay/enums/MessageTemplateConstants.java   | 15 +++++++++
 .../system/api/social/SocialClientApi.java    |  4 +--
 ...> SocialWxSubscribeMessageSendReqDTO.java} | 26 ++++++++-------
 .../dto/SocialWxSubscribeTemplateRespDTO.java |  5 ++-
 .../api/social/SocialClientApiImpl.java       | 11 ++++---
 .../admin/socail/SocialClientController.http  | 14 ++++++++
 .../admin/socail/SocialClientController.java  | 13 +++-----
 .../convert/social/SocialUserConvert.java     | 32 +++++++++++++++++++
 .../service/social/SocialClientService.java   |  6 ++--
 .../social/SocialClientServiceImpl.java       | 26 ++++++---------
 13 files changed, 109 insertions(+), 62 deletions(-)
 create mode 100644 yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java
 rename yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/{SocialWxSubscribeMessageReqDTO.java => SocialWxSubscribeMessageSendReqDTO.java} (67%)

diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java
index d6ab00f03f..c9e20cbe01 100644
--- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java
+++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java
@@ -13,12 +13,8 @@ public interface MessageTemplateConstants {
     String BROKERAGE_WITHDRAW_AUDIT_APPROVE = "brokerage_withdraw_audit_approve"; // 佣金提现(审核通过)
     String BROKERAGE_WITHDRAW_AUDIT_REJECT = "brokerage_withdraw_audit_reject"; // 佣金提现(审核不通过)
 
-    //======================= 订阅消息模版 =======================
+    //======================= 小程序订阅消息模版 =======================
 
-    // TODO @puhui999:建议 TRADE_AFTER_SALE_CHANGE
-    String ORDER_AFTERSALE_CHANGE = "售后进度通知";
-
-    // TODO @puhui999:是不是改成 PAY_WALLET_CHANGE 放在 PAY 模块
-    String MONEY_CHANGE = "充值成功通知";
+    String TRADE_AFTER_SALE_CHANGE = "售后进度通知";
 
 }
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/AppSocialUserController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/AppSocialUserController.java
index da5536989e..b3b045171c 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/AppSocialUserController.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/AppSocialUserController.java
@@ -68,10 +68,10 @@ public class AppSocialUserController {
         return success(Base64.encode(wxQrcode));
     }
 
-    @GetMapping("/get-subscribe-template")
-    @Operation(summary = "获得微信小程订阅模板")
-    public CommonResult> getSubscribeTemplate() {
-        List template = socialClientApi.getSubscribeTemplate();
+    @GetMapping("/get-subscribe-template-list")
+    @Operation(summary = "获得微信小程订阅模板列表")
+    public CommonResult> getSubscribeTemplateList() {
+        List template = socialClientApi.getSubscribeTemplateList(UserTypeEnum.MEMBER.getValue());
         return success(BeanUtils.toBean(template, AppSocialWxSubscribeTemplateRespVO.class));
     }
 
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/vo/AppSocialWxSubscribeTemplateRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/vo/AppSocialWxSubscribeTemplateRespVO.java
index 095d39d933..3fdc38b698 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/vo/AppSocialWxSubscribeTemplateRespVO.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/vo/AppSocialWxSubscribeTemplateRespVO.java
@@ -7,10 +7,9 @@ import lombok.Data;
 @Data
 public class AppSocialWxSubscribeTemplateRespVO {
 
-    // TODO @puhui999:是不是使用 id 作为字段,更干净些哈;
     @Schema(description = "模版编号", requiredMode = Schema.RequiredMode.REQUIRED,
             example = "9Aw5ZV1j9xdWTFEkqCpZ7mIBbSC34khK55OtzUPl0rU")
-    private String priTmplId;
+    private String id;
 
     @Schema(description = "模版标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "订单支付通知")
     private String title;
diff --git a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java
new file mode 100644
index 0000000000..f6b727aef1
--- /dev/null
+++ b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java
@@ -0,0 +1,15 @@
+package cn.iocoder.yudao.module.pay.enums;
+
+// TODO @芋艿:枚举
+/**
+ * 通知模板枚举类
+ *
+ * @author HUIHUI
+ */
+public interface MessageTemplateConstants {
+
+    //======================= 小程序订阅消息 =======================
+
+    String PAY_WALLET_CHANGE = "充值成功通知";
+
+}
diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java
index ca65d04865..a75c398a73 100644
--- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java
+++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java
@@ -54,13 +54,13 @@ public interface SocialClientApi {
      *
      * @return 小程序订阅消息模版
      */
-    List getSubscribeTemplate();
+    List getSubscribeTemplateList(Integer userType);
 
     /**
      * 发送微信小程序订阅消息
      *
      * @param reqDTO 请求
      */
-    void sendSubscribeMessage(SocialWxSubscribeMessageReqDTO reqDTO);
+    void sendSubscribeMessage(SocialWxSubscribeMessageSendReqDTO reqDTO, Integer userType);
 
 }
diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageReqDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageSendReqDTO.java
similarity index 67%
rename from yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageReqDTO.java
rename to yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageSendReqDTO.java
index 5fb13b9522..0698642726 100644
--- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageReqDTO.java
+++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageSendReqDTO.java
@@ -1,21 +1,20 @@
 package cn.iocoder.yudao.module.system.api.social.dto;
 
-import cn.iocoder.yudao.framework.common.core.KeyValue;
+import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashMap;
+import java.util.Map;
 
-// TODO @puhui99:1)参考 SocialWxQrcodeReqDTO,可以 @see 文档。这样,注释会更见见一点。2)是不是少了 Send:SocialWxSubscribeMessageSendReqDTO
 /**
- * 微信小程序订阅消息 Request DTO
+ * 微信小程序订阅消息发送 Request DTO
  *
+ * @see 接口文档
  * @author HUIHUI
  */
 @Data
-public class SocialWxSubscribeMessageReqDTO {
+public class SocialWxSubscribeMessageSendReqDTO {
 
-    // TODO @puhui999:参数校验
     /**
      * 接收者(用户)的 openid.
      * 
@@ -24,6 +23,7 @@ public class SocialWxSubscribeMessageReqDTO {
      * 描述: 接收者(用户)的 openid
      * 
*/ + @NotNull(message = "接收者(用户)的 openid不能为空") private String toUser; /** @@ -34,6 +34,7 @@ public class SocialWxSubscribeMessageReqDTO { * 描述: 所需下发的模板消息的id *
*/ + @NotNull(message = "模板消息的id不能为空") private String templateId; /** @@ -51,6 +52,7 @@ public class SocialWxSubscribeMessageReqDTO { * * 枚举 WxMaConstants.MiniProgramState */ + @NotNull(message = "跳转小程序类型不能为空") private String miniprogramState; /** @@ -58,9 +60,9 @@ public class SocialWxSubscribeMessageReqDTO { * * 枚举 WxMaConstants.MiniProgramLang */ + @NotNull(message = "进入小程序查看的语言类型不能为空") private String lang; - // TODO @puhui999:是必须 List>,还是 Map @@ -69,13 +71,13 @@ public class SocialWxSubscribeMessageReqDTO { * 描述: 模板内容,不填则下发空模板 * */ - private List> messages; + private Map messages; - public SocialWxSubscribeMessageReqDTO addData(String key, String value) { + public SocialWxSubscribeMessageSendReqDTO addData(String key, String value) { if (messages == null) { - messages = new ArrayList<>(); + messages = new HashMap<>(); } - messages.add(new KeyValue<>(key, value)); + messages.put(key, value); return this; } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeTemplateRespDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeTemplateRespDTO.java index 69cc4e62ef..0802ca9acb 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeTemplateRespDTO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeTemplateRespDTO.java @@ -11,11 +11,10 @@ import lombok.Data; @Data public class SocialWxSubscribeTemplateRespDTO { - // TODO @puhui999:建议搞成 id /** * 添加至账号下的模板 id,发送小程序订阅消息时所需 */ - private String priTmplId; + private String id; /** * 模版标题 @@ -32,7 +31,7 @@ public class SocialWxSubscribeTemplateRespDTO { */ private String example; - // TODO @puhui999:这个在 wxjava 里面,有枚举字段么? + // TODO @puhui999:这个在 wxjava 里面,有枚举字段么?没得🤣 /** * 模版类型 * diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java index 1656524a76..77d676d965 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.system.api.social; import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.system.api.social.dto.*; +import cn.iocoder.yudao.module.system.convert.social.SocialUserConvert; import cn.iocoder.yudao.module.system.service.social.SocialClientService; import jakarta.annotation.Resource; import me.chanjar.weixin.common.bean.WxJsapiSignature; @@ -47,14 +48,14 @@ public class SocialClientApiImpl implements SocialClientApi { } @Override - public List getSubscribeTemplate() { - List subscribeTemplate = socialClientService.getSubscribeTemplate(); - return BeanUtils.toBean(subscribeTemplate, SocialWxSubscribeTemplateRespDTO.class); + public List getSubscribeTemplateList(Integer userType) { + List subscribeTemplate = socialClientService.getSubscribeTemplateList(userType); + return SocialUserConvert.INSTANCE.convertList(subscribeTemplate); } @Override - public void sendSubscribeMessage(SocialWxSubscribeMessageReqDTO reqDTO) { - socialClientService.sendSubscribeMessage(reqDTO); + public void sendSubscribeMessage(SocialWxSubscribeMessageSendReqDTO reqDTO, Integer userType) { + socialClientService.sendSubscribeMessage(reqDTO, userType); } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.http b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.http index b1390a7438..b4ba43a097 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.http +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.http @@ -1,5 +1,19 @@ ### 请求 /system/social-client/send-subscribe-message 接口 => 发送测试订阅消息 POST {{baseUrl}}/system/social-client/send-subscribe-message Authorization: Bearer {{token}} +Content-Type: application/json #Authorization: Bearer test100 tenant-id: {{adminTenentId}} + +{ + "toUser": "oKNkb4xxw2H135-MVPKtEMkumK08", + "templateId": "W4ybDTIwCfKHtMKR7fSfx83DtmVKEeXQo3Ti7GCw4_4", + "miniprogramState": "developer", + "lang": "zh_CN", + "messages": { + "character_string1":"5616122165165", + "amount2":"1000.00", + "time3":"2024-01-01 10:10:10", + "phrase4":"成功" + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.java index 6ff6aff7cd..e7b7c5511d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.java @@ -1,9 +1,10 @@ package cn.iocoder.yudao.module.system.controller.admin.socail; +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeMessageReqDTO; +import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeMessageSendReqDTO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientRespVO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientSaveReqVO; @@ -72,15 +73,9 @@ public class SocialClientController { //======================= TODO 测试发送订阅消息 ======================= - // TODO @puhui999:这个接口,其实可以留着。然后把参数挪到 .http 文件。先直接用 SocialWxSubscribeMessageReqDTO 接参数 @PostMapping("/send-subscribe-message") - public void testSendSubscribeMessage() { - SocialWxSubscribeMessageReqDTO reqDTO = new SocialWxSubscribeMessageReqDTO().setLang("zh_CN") - .setMiniprogramState("developer").setTemplateId("W4ybDTIwCfKHtMKR7fSfx83DtmVKEeXQo3Ti7GCw4_4") - .setToUser("oKNkb4xxw2H135-MVPKtEMkumK08"); - reqDTO.addData("character_string1", "11111111").addData("amount2", "6666").addData("time3", "2024-01-01 10:10:10") - .addData("phrase4", "成功"); - socialClientService.sendSubscribeMessage(reqDTO); + public void testSendSubscribeMessage(@RequestBody SocialWxSubscribeMessageSendReqDTO reqDTO) { + socialClientService.sendSubscribeMessage(reqDTO, UserTypeEnum.MEMBER.getValue()); } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/social/SocialUserConvert.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/social/SocialUserConvert.java index 9e679a2427..0eb0012828 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/social/SocialUserConvert.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/social/SocialUserConvert.java @@ -1,11 +1,23 @@ package cn.iocoder.yudao.module.system.convert.social; +import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage; +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO; +import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeMessageSendReqDTO; +import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeTemplateRespDTO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.user.SocialUserBindReqVO; +import me.chanjar.weixin.common.bean.subscribemsg.TemplateInfo; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen; + @Mapper public interface SocialUserConvert { @@ -14,4 +26,24 @@ public interface SocialUserConvert { @Mapping(source = "reqVO.type", target = "socialType") SocialUserBindReqDTO convert(Long userId, Integer userType, SocialUserBindReqVO reqVO); + default WxMaSubscribeMessage convert(SocialWxSubscribeMessageSendReqDTO reqDTO) { + WxMaSubscribeMessage message = BeanUtils.toBean(reqDTO, WxMaSubscribeMessage.class); + Map messages = reqDTO.getMessages(); + if (CollUtil.isNotEmpty(messages)) { + messages.keySet().forEach(key -> { + findAndThen(messages, key, value -> message.addData(new WxMaSubscribeMessage.MsgData(key, value))); + }); + } + return message; + } + + @Mapping(target = "id", source = "priTmplId") + SocialWxSubscribeTemplateRespDTO convert(TemplateInfo templateInfo); + + default List convertList(List subscribeTemplate) { + List list = new ArrayList<>(); + subscribeTemplate.forEach(templateInfo -> list.add(convert(templateInfo))); + return list; + } + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java index 0fe4adf20a..5d39680eaf 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.system.service.social; import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.api.social.dto.SocialWxQrcodeReqDTO; -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeMessageReqDTO; +import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeMessageSendReqDTO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialClientDO; @@ -78,14 +78,14 @@ public interface SocialClientService { * * @return 微信小程订阅模板 */ - List getSubscribeTemplate(); + List getSubscribeTemplateList(Integer userType); /** * 发送微信小程序订阅消息 * * @param reqDTO 请求 */ - void sendSubscribeMessage(SocialWxSubscribeMessageReqDTO reqDTO); + void sendSubscribeMessage(SocialWxSubscribeMessageSendReqDTO reqDTO, Integer userType); // =================== 客户端管理 =================== diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java index 34fd831363..ab888b8018 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java @@ -4,7 +4,6 @@ import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.api.WxMaSubscribeService; import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; -import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage; import cn.binarywang.wx.miniapp.config.impl.WxMaRedisBetterConfigImpl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.lang.Assert; @@ -17,9 +16,10 @@ import cn.iocoder.yudao.framework.common.util.cache.CacheUtils; import cn.iocoder.yudao.framework.common.util.http.HttpUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.system.api.social.dto.SocialWxQrcodeReqDTO; -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeMessageReqDTO; +import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeMessageSendReqDTO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientSaveReqVO; +import cn.iocoder.yudao.module.system.convert.social.SocialUserConvert; import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialClientDO; import cn.iocoder.yudao.module.system.dal.mysql.social.SocialClientMapper; import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; @@ -236,7 +236,6 @@ public class SocialClientServiceImpl implements SocialClientService { try { return service.getUserService().getPhoneNoInfo(phoneCode); } catch (WxErrorException e) { - // TODO @puhui999:这里的日志,reqDTO 要打进去 log.error("[getPhoneNoInfo][userType({}) phoneCode({}) 获得手机号失败]", userType, phoneCode, e); throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_PHONE_CODE_ERROR); } @@ -256,36 +255,31 @@ public class SocialClientServiceImpl implements SocialClientService { null, ObjUtil.defaultIfNull(reqVO.getHyaline(), SocialWxQrcodeReqDTO.HYALINE)); } catch (WxErrorException e) { - log.error("[getWxQrcode][reqVO({})) 获得小程序码失败]", reqVO, e); + log.error("[getWxQrcode][reqVO({}) 获得小程序码失败]", reqVO, e); throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_QRCODE_ERROR); } } @Override - public List getSubscribeTemplate() { - // TODO @puhui999:这个 userType 最好通过参数,传递过来;然后这个方法名,貌似叫 getSubscribeTemplateList 更合适哈; - WxMaService service = getWxMaService(UserTypeEnum.MEMBER.getValue()); + public List getSubscribeTemplateList(Integer userType) { + WxMaService service = getWxMaService(userType); try { WxMaSubscribeService subscribeService = service.getSubscribeService(); return subscribeService.getTemplateList(); } catch (WxErrorException e) { - log.error("[getSubscribeTemplate][获得小程序订阅消息模版]", e); + log.error("[getSubscribeTemplate][userType({}) 获得小程序订阅消息模版]", userType, e); throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_TEMPLATE_ERROR); } } @Override - public void sendSubscribeMessage(SocialWxSubscribeMessageReqDTO reqDTO) { - // TODO @puhui999:这个 userType 最好通过参数, - WxMaService service = getWxMaService(UserTypeEnum.MEMBER.getValue()); + public void sendSubscribeMessage(SocialWxSubscribeMessageSendReqDTO reqDTO, Integer userType) { + WxMaService service = getWxMaService(userType); try { WxMaSubscribeService subscribeService = service.getSubscribeService(); - WxMaSubscribeMessage message = BeanUtils.toBean(reqDTO, WxMaSubscribeMessage.class); - reqDTO.getMessages().forEach(item-> message.addData(new WxMaSubscribeMessage.MsgData(item.getKey(), item.getValue()))); - subscribeService.sendSubscribeMsg(message); + subscribeService.sendSubscribeMsg(SocialUserConvert.INSTANCE.convert(reqDTO)); } catch (WxErrorException e) { - // TODO @puhui999:这里的日志,reqDTO 要打进去 - log.error("[sendSubscribeMessage][发送小程序订阅消息]", e); + log.error("[sendSubscribeMessage][reqVO({}) userType({}) 发送小程序订阅消息]", reqDTO, userType, e); throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_MESSAGE_ERROR); } } From 9a926e251be96d0813b121ca05ca9acbc0db4c14 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Mon, 29 Jul 2024 17:14:41 +0800 Subject: [PATCH 10/26] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91mall:?= =?UTF-8?q?=20=E9=92=B1=E5=8C=85=E5=85=85=E5=80=BC=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E5=8F=91=E9=80=81=E8=AE=A2=E9=98=85=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../trade/enums/MessageTemplateConstants.java | 12 +++ .../pay/enums/MessageTemplateConstants.java | 15 ++++ .../module/pay/message/package-info.java | 1 + .../subscribe/SubscribeMessageClient.java | 55 +++++++++++++ .../wallet/PayWalletRechargeServiceImpl.java | 29 ++++++- .../system/api/social/SocialClientApi.java | 14 ++++ .../SocialWxSubscribeMessageSendReqDTO.java | 8 -- .../api/social/SocialClientApiImpl.java | 80 +++++++++++++++++++ 8 files changed, 203 insertions(+), 11 deletions(-) create mode 100644 yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/message/package-info.java create mode 100644 yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/message/subscribe/SubscribeMessageClient.java diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java index c9e20cbe01..aae6c9d334 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.trade.enums; // TODO @芋艿:枚举 + /** * 通知模板枚举类 * @@ -17,4 +18,15 @@ public interface MessageTemplateConstants { String TRADE_AFTER_SALE_CHANGE = "售后进度通知"; + /** + * 售后进度通知相关参数枚举 + * + * @author HUIHUI + */ + class TradeAfterSaleChangeReqParams { + + public static final String ORDER_DELIVERY = "order_delivery"; + + } + } diff --git a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java index f6b727aef1..8863de3355 100644 --- a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java +++ b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.pay.enums; // TODO @芋艿:枚举 + /** * 通知模板枚举类 * @@ -12,4 +13,18 @@ public interface MessageTemplateConstants { String PAY_WALLET_CHANGE = "充值成功通知"; + /** + * 充值成功通知模版参数 + * + * @author HUIHUI + */ + class PayWalletChangeTemplateParams { + + public static final String NO = "character_string1"; // 流水编号 + public static final String PRICE = "amount2"; // 充值金额 + public static final String PAY_TIME = "time3"; // 充值时间 + public static final String STATUS = "phrase4"; // 充值状态 + + } + } diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/message/package-info.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/message/package-info.java new file mode 100644 index 0000000000..2e26571ef3 --- /dev/null +++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/message/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.module.pay.message; \ No newline at end of file diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/message/subscribe/SubscribeMessageClient.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/message/subscribe/SubscribeMessageClient.java new file mode 100644 index 0000000000..cdb42a5193 --- /dev/null +++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/message/subscribe/SubscribeMessageClient.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.pay.message.subscribe; + +import cn.iocoder.yudao.module.system.api.social.SocialClientApi; +import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import java.util.Map; + +import static cn.iocoder.yudao.module.pay.enums.MessageTemplateConstants.PAY_WALLET_CHANGE; + +/** + * 订阅消息 + * + * @author HUIHUI + */ +@Component +@Slf4j +public class SubscribeMessageClient { + + public static final String WALLET_MONEY_PATH = "pages/user/wallet/money"; // 钱包详情页 + + @Resource + public SocialClientApi socialClientApi; + + /** + * 发送钱包充值通知 + * + * @param messages 消息 + * @param userType 用户类型 + * @param userId 用户编号 + */ + @Async + public void sendPayWalletChangeMessage(Map messages, Integer userType, Long userId) { + sendWxMessage(PAY_WALLET_CHANGE, messages, userType, userId, WALLET_MONEY_PATH); + } + + + /** + * 发送微信订阅消息 + * + * @param templateTitle 模版标题 + * @param messages 消息 + * @param userType 用户类型 + * @param userId 用户编号 + * @param path 点击模板卡片后的跳转页面,仅限本小程序内的页面 + */ + private void sendWxMessage(String templateTitle, Map messages, Integer userType, Long userId, + String path) { + socialClientApi.sendSubscribeMessage(templateTitle, messages, userType, userId, SocialTypeEnum.WECHAT_MINI_APP.getType(), path); + } + +} diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java index b263189222..d801aa262c 100644 --- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java +++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java @@ -1,6 +1,8 @@ package cn.iocoder.yudao.module.pay.service.wallet; +import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.lang.Assert; +import cn.hutool.core.map.MapUtil; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.pay.core.enums.refund.PayRefundStatusRespEnum; @@ -13,24 +15,28 @@ import cn.iocoder.yudao.module.pay.dal.dataobject.wallet.PayWalletDO; import cn.iocoder.yudao.module.pay.dal.dataobject.wallet.PayWalletRechargeDO; import cn.iocoder.yudao.module.pay.dal.dataobject.wallet.PayWalletRechargePackageDO; import cn.iocoder.yudao.module.pay.dal.mysql.wallet.PayWalletRechargeMapper; -import cn.iocoder.yudao.module.pay.enums.wallet.PayWalletBizTypeEnum; +import cn.iocoder.yudao.module.pay.enums.MessageTemplateConstants; import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum; import cn.iocoder.yudao.module.pay.enums.refund.PayRefundStatusEnum; +import cn.iocoder.yudao.module.pay.enums.wallet.PayWalletBizTypeEnum; +import cn.iocoder.yudao.module.pay.message.subscribe.SubscribeMessageClient; import cn.iocoder.yudao.module.pay.service.order.PayOrderService; import cn.iocoder.yudao.module.pay.service.refund.PayRefundService; +import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import jakarta.annotation.Resource; import java.time.Duration; import java.time.LocalDateTime; +import java.util.Map; import java.util.Objects; import static cn.hutool.core.util.ObjectUtil.notEqual; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.addTime; import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString; +import static cn.iocoder.yudao.framework.common.util.number.MoneyUtils.fenToYuanStr; import static cn.iocoder.yudao.module.pay.convert.wallet.PayWalletRechargeConvert.INSTANCE; import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.module.pay.enums.refund.PayRefundStatusEnum.*; @@ -61,6 +67,8 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService { private PayRefundService payRefundService; @Resource private PayWalletRechargePackageService payWalletRechargePackageService; + @Resource + private SubscribeMessageClient subscribeMessageClient; @Override @Transactional(rollbackFor = Exception.class) @@ -96,7 +104,7 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService { @Override public PageResult getWalletRechargePackagePage(Long userId, Integer userType, - PageParam pageReqVO, Boolean payStatus) { + PageParam pageReqVO, Boolean payStatus) { PayWalletDO wallet = payWalletService.getOrCreateWallet(userId, userType); return walletRechargeMapper.selectPage(pageReqVO, wallet.getId(), payStatus); } @@ -126,6 +134,21 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService { // TODO 需要钱包中加个可提现余额 payWalletService.addWalletBalance(walletRecharge.getWalletId(), String.valueOf(id), PayWalletBizTypeEnum.RECHARGE, walletRecharge.getTotalPrice()); + + // 4. 发送订阅消息 + sendPayWalletChangeMessage(payOrderId, walletRecharge); + } + + private void sendPayWalletChangeMessage(Long payOrderId, PayWalletRechargeDO walletRecharge) { + PayWalletDO wallet = payWalletService.getWallet(walletRecharge.getWalletId()); + Map messages = MapUtil.newConcurrentHashMap(4); + messages.put(MessageTemplateConstants.PayWalletChangeTemplateParams.NO, String.valueOf(payOrderId)); + messages.put(MessageTemplateConstants.PayWalletChangeTemplateParams.PRICE, + fenToYuanStr(walletRecharge.getTotalPrice())); + messages.put(MessageTemplateConstants.PayWalletChangeTemplateParams.STATUS, "充值成功"); + messages.put(MessageTemplateConstants.PayWalletChangeTemplateParams.PAY_TIME, + LocalDateTimeUtil.formatNormal(LocalDateTime.now())); + subscribeMessageClient.sendPayWalletChangeMessage(messages, wallet.getUserType(), wallet.getUserId()); } @Override diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java index a75c398a73..e91b136d16 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java @@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; import jakarta.validation.Valid; import java.util.List; +import java.util.Map; /** * 社交应用的 API 接口 @@ -63,4 +64,17 @@ public interface SocialClientApi { */ void sendSubscribeMessage(SocialWxSubscribeMessageSendReqDTO reqDTO, Integer userType); + /** + * 发送微信小程序订阅消息 + * + * @param templateTitle 模版标题 + * @param messages 消息 + * @param userType 用户类型 + * @param userId 用户编号 + * @param socialType 社交客服端类型 + * @param path 点击模板卡片后的跳转页面,仅限本小程序内的页面 + */ + void sendSubscribeMessage(String templateTitle, Map messages, Integer userType, Long userId, + Integer socialType, String path); + } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageSendReqDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageSendReqDTO.java index 0698642726..d6e7b9a78b 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageSendReqDTO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageSendReqDTO.java @@ -73,12 +73,4 @@ public class SocialWxSubscribeMessageSendReqDTO { */ private Map messages; - public SocialWxSubscribeMessageSendReqDTO addData(String key, String value) { - if (messages == null) { - messages = new HashMap<>(); - } - messages.put(key, value); - return this; - } - } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java index 77d676d965..2885f19eba 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java @@ -1,17 +1,24 @@ package cn.iocoder.yudao.module.system.api.social; import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjUtil; +import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.system.api.social.dto.*; import cn.iocoder.yudao.module.system.convert.social.SocialUserConvert; import cn.iocoder.yudao.module.system.service.social.SocialClientService; import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.bean.WxJsapiSignature; import me.chanjar.weixin.common.bean.subscribemsg.TemplateInfo; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.util.List; +import java.util.Map; /** * 社交应用的 API 实现类 @@ -20,10 +27,18 @@ import java.util.List; */ @Service @Validated +@Slf4j public class SocialClientApiImpl implements SocialClientApi { + /** + * 小程序版本 + */ + @Value("${yudao.wxa-code.env-version}") + public String envVersion; @Resource private SocialClientService socialClientService; + @Resource + public SocialUserApi socialUserApi; @Override public String getAuthorizeUrl(Integer socialType, Integer userType, String redirectUri) { @@ -58,4 +73,69 @@ public class SocialClientApiImpl implements SocialClientApi { socialClientService.sendSubscribeMessage(reqDTO, userType); } + public void sendSubscribeMessage(String templateTitle, Map messages, Integer userType, Long userId, + Integer socialType, String path) { + // 1.1 获得订阅模版 + SocialWxSubscribeTemplateRespDTO template = getTemplate(templateTitle, userType); + if (template == null) { + return; + } + // 1.2 获得发送对象的 openId + String openId = getUserOpenId(userType, userId, socialType); + if (StrUtil.isBlankIfStr(openId)) { + return; + } + + // 2. 发送消息 + sendSubscribeMessage(buildMessageSendReqDTO(openId, path, template).setMessages(messages), userType); + } + + /** + * 构建发送消息请求参数 + * + * @param openId 接收者(用户)的 openid + * @param path 点击模板卡片后的跳转页面,仅限本小程序内的页面 + * @param template 订阅模版 + * @return 微信小程序订阅消息发送 + */ + private SocialWxSubscribeMessageSendReqDTO buildMessageSendReqDTO(String openId, String path, + SocialWxSubscribeTemplateRespDTO template) { + return new SocialWxSubscribeMessageSendReqDTO().setLang("zh_CN").setMiniprogramState(envVersion) + .setTemplateId(template.getId()).setToUser(openId).setPage(path); + } + + /** + * 获得小程序订阅消息模版 + * + * @param templateTitle 模版标题 + * @param userType 用户类型 + * @return 小程序订阅消息模版 + */ + private SocialWxSubscribeTemplateRespDTO getTemplate(String templateTitle, Integer userType) { + List templateList = getSubscribeTemplateList(userType); + if (CollUtil.isEmpty(templateList)) { + log.warn("[getTemplate][templateTitle({}) userType({}) 没有找到订阅模板]", templateTitle, userType); + return null; + } + return CollectionUtil.findOne(templateList, item -> ObjUtil.equal(item.getTitle(), templateTitle)); + } + + /** + * 获得用户 openId + * + * @param userType 用户类型 + * @param userId 用户编号 + * @param socialType 社交类型 + * @return 用户 openId + */ + private String getUserOpenId(Integer userType, Long userId, Integer socialType) { + SocialUserRespDTO socialUser = socialUserApi.getSocialUserByUserId(userType, userId, socialType); + if (StrUtil.isBlankIfStr(socialUser.getOpenid())) { + log.warn("[getUserOpenId][userType({}) userId({}) socialType({}) 会员 openid 缺失]", + userType, userId, socialType); + return null; + } + return socialUser.getOpenid(); + } + } From 18cf9e55e186c7114a99f924bce5e79630a8b69a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B8=B8=E6=9F=AF=E6=9F=AF?= <88455621@qq.com> Date: Mon, 29 Jul 2024 09:40:13 +0000 Subject: [PATCH 11/26] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E3=80=91=E5=85=A8=E5=B1=80=EF=BC=9AArea=20=E5=9C=A8?= =?UTF-8?q?=20IDEA=20debug=20=E6=97=B6=20toString=20=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E6=8A=A5=E9=94=99StackOverflowError=E3=80=81=E6=8C=87=E5=AE=9A?= =?UTF-8?q?=20jackson=20=E9=BB=98=E8=AE=A4=E5=BA=8F=E5=88=97=E5=8C=96?= =?UTF-8?q?=E6=97=B6=E5=8F=8C=E5=90=91=E5=BC=95=E7=94=A8=E7=9A=84=E5=89=8D?= =?UTF-8?q?=E5=90=91=E3=80=81=E5=90=8E=E5=90=91=E5=87=BA=E5=8F=A3=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E6=AD=BB=E5=BE=AA=E7=8E=AF=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 常柯柯 <88455621@qq.com> --- .../src/main/java/cn/iocoder/yudao/framework/ip/core/Area.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/yudao-framework/yudao-spring-boot-starter-biz-ip/src/main/java/cn/iocoder/yudao/framework/ip/core/Area.java b/yudao-framework/yudao-spring-boot-starter-biz-ip/src/main/java/cn/iocoder/yudao/framework/ip/core/Area.java index 262bc263ce..3027085871 100644 --- a/yudao-framework/yudao-spring-boot-starter-biz-ip/src/main/java/cn/iocoder/yudao/framework/ip/core/Area.java +++ b/yudao-framework/yudao-spring-boot-starter-biz-ip/src/main/java/cn/iocoder/yudao/framework/ip/core/Area.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.framework.ip.core; import cn.iocoder.yudao.framework.ip.core.enums.AreaTypeEnum; +import com.fasterxml.jackson.annotation.JsonBackReference; import com.fasterxml.jackson.annotation.JsonManagedReference; import lombok.AllArgsConstructor; import lombok.Data; @@ -54,7 +55,7 @@ public class Area { /** * 子节点 */ - @JsonManagedReference + @JsonBackReference private List children; } From 512d68f79317290ba565b0a15080201823c7f73c Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 29 Jul 2024 19:03:18 +0800 Subject: [PATCH 12/26] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91SYSTEM=EF=BC=9A=E8=AE=A2=E9=98=85=E6=B6=88?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../trade/enums/MessageTemplateConstants.java | 3 +- .../pay/enums/MessageTemplateConstants.java | 1 - .../SocialWxSubscribeMessageSendReqDTO.java | 45 +++++++------------ .../dto/SocialWxSubscribeTemplateRespDTO.java | 7 ++- .../admin/socail/SocialClientController.java | 6 +-- .../convert/social/SocialUserConvert.java | 7 +-- 6 files changed, 27 insertions(+), 42 deletions(-) diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java index c9e20cbe01..74e36a816a 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java @@ -1,6 +1,5 @@ package cn.iocoder.yudao.module.trade.enums; -// TODO @芋艿:枚举 /** * 通知模板枚举类 * @@ -8,6 +7,8 @@ package cn.iocoder.yudao.module.trade.enums; */ public interface MessageTemplateConstants { + //======================= 短信消息模版 ======================= + String ORDER_DELIVERY = "order_delivery"; // 短信模版编号 String BROKERAGE_WITHDRAW_AUDIT_APPROVE = "brokerage_withdraw_audit_approve"; // 佣金提现(审核通过) diff --git a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java index f6b727aef1..bf28724dce 100644 --- a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java +++ b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java @@ -1,6 +1,5 @@ package cn.iocoder.yudao.module.pay.enums; -// TODO @芋艿:枚举 /** * 通知模板枚举类 * diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageSendReqDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageSendReqDTO.java index 0698642726..8ebb70b454 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageSendReqDTO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageSendReqDTO.java @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.system.api.social.dto; import jakarta.validation.constraints.NotNull; import lombok.Data; -import java.util.HashMap; import java.util.Map; /** @@ -15,6 +14,7 @@ import java.util.Map; @Data public class SocialWxSubscribeMessageSendReqDTO { + // TODO @puhui999:貌似使用 userId + userType 会不会更合理哈。这样,后端进行查询三方用户的绑定表~ /** * 接收者(用户)的 openid. *
@@ -27,58 +27,43 @@ public class SocialWxSubscribeMessageSendReqDTO {
     private String toUser;
 
     /**
-     * 所需下发的模板消息的id.
-     * 
-     * 参数:template_id
-     * 是否必填: 是
-     * 描述: 所需下发的模板消息的id
-     * 
+ * 模版消息编号 */ - @NotNull(message = "模板消息的id不能为空") + @NotNull(message = "模版消息编号不能为空") private String templateId; /** - * 点击模板卡片后的跳转页面,仅限本小程序内的页面. - *
-     * 参数:page
-     * 是否必填: 否
-     * 描述: 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
-     * 
+ * 点击模板卡片后的跳转页面,仅限本小程序内的页面 + * + * 支持带参数,(示例 index?foo=bar )。该字段不填则模板无跳转。 */ private String page; /** - * 跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版 + * 跳转小程序类型 + * + * developer 为开发版;trial 为体验版;formal 为正式版【默认】 * * 枚举 WxMaConstants.MiniProgramState */ + // TODO @puhui999:这个非必填。如果没有,代码里去默认下; @NotNull(message = "跳转小程序类型不能为空") private String miniprogramState; /** - * 进入小程序查看的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN + * 进入小程序查看的语言类型 + * + * zh_CN(简体中文)【默认】、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文) * * 枚举 WxMaConstants.MiniProgramLang */ + // TODO @puhui999:这个非必填。如果没有,代码里去默认下; @NotNull(message = "进入小程序查看的语言类型不能为空") private String lang; /** - * 模板内容,不填则下发空模板. - *
-     * 参数:data
-     * 是否必填: 是
-     * 描述: 模板内容,不填则下发空模板
-     * 
+ * 模板内容的参数 */ private Map messages; - public SocialWxSubscribeMessageSendReqDTO addData(String key, String value) { - if (messages == null) { - messages = new HashMap<>(); - } - messages.put(key, value); - return this; - } - } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeTemplateRespDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeTemplateRespDTO.java index 0802ca9acb..d4b7bdde2d 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeTemplateRespDTO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeTemplateRespDTO.java @@ -12,7 +12,7 @@ import lombok.Data; public class SocialWxSubscribeTemplateRespDTO { /** - * 添加至账号下的模板 id,发送小程序订阅消息时所需 + * 模版编号 */ private String id; @@ -31,12 +31,11 @@ public class SocialWxSubscribeTemplateRespDTO { */ private String example; - // TODO @puhui999:这个在 wxjava 里面,有枚举字段么?没得🤣 /** * 模版类型 * - * 2 为一次性订阅 - * 3 为长期订阅 + * 2:为一次性订阅 + * 3:为长期订阅 */ private Integer type; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.java index e7b7c5511d..08fba16fed 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.java @@ -71,10 +71,10 @@ public class SocialClientController { return success(BeanUtils.toBean(pageResult, SocialClientRespVO.class)); } - //======================= TODO 测试发送订阅消息 ======================= - @PostMapping("/send-subscribe-message") - public void testSendSubscribeMessage(@RequestBody SocialWxSubscribeMessageSendReqDTO reqDTO) { + @Operation(summary = "发送订阅消息") // 用于测试 + @PreAuthorize("@ss.hasPermission('system:social-client:query')") + public void sendSubscribeMessage(@RequestBody SocialWxSubscribeMessageSendReqDTO reqDTO) { socialClientService.sendSubscribeMessage(reqDTO, UserTypeEnum.MEMBER.getValue()); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/social/SocialUserConvert.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/social/SocialUserConvert.java index 0eb0012828..f0d8c4c182 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/social/SocialUserConvert.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/social/SocialUserConvert.java @@ -26,20 +26,21 @@ public interface SocialUserConvert { @Mapping(source = "reqVO.type", target = "socialType") SocialUserBindReqDTO convert(Long userId, Integer userType, SocialUserBindReqVO reqVO); + // TODO @puhui999:要不 convert 直接放到 service 里。 default WxMaSubscribeMessage convert(SocialWxSubscribeMessageSendReqDTO reqDTO) { WxMaSubscribeMessage message = BeanUtils.toBean(reqDTO, WxMaSubscribeMessage.class); Map messages = reqDTO.getMessages(); if (CollUtil.isNotEmpty(messages)) { - messages.keySet().forEach(key -> { - findAndThen(messages, key, value -> message.addData(new WxMaSubscribeMessage.MsgData(key, value))); - }); + messages.keySet().forEach(key -> findAndThen(messages, key, value -> message.addData(new WxMaSubscribeMessage.MsgData(key, value)))); } return message; } + // TODO @puhui999:要不 convert 直接放到 service 里。其实可以 BeanUtils.toBean(reqDTO, WxMaSubscribeMessage.class) 来搞的呀。 @Mapping(target = "id", source = "priTmplId") SocialWxSubscribeTemplateRespDTO convert(TemplateInfo templateInfo); + // TODO @puhui999:是不是用 CollectionUtils.convertList 就 ok 啦。 default List convertList(List subscribeTemplate) { List list = new ArrayList<>(); subscribeTemplate.forEach(templateInfo -> list.add(convert(templateInfo))); From 345f41b1535d8ec7ead8b312259e70fbce028ff2 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 29 Jul 2024 19:18:23 +0800 Subject: [PATCH 13/26] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91SYSTEM=EF=BC=9A=E8=AE=A2=E9=98=85=E6=B6=88?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/module/pay/enums/MessageTemplateConstants.java | 1 + .../module/pay/message/subscribe/SubscribeMessageClient.java | 1 + .../pay/service/wallet/PayWalletRechargeServiceImpl.java | 2 ++ .../yudao/module/system/api/social/SocialClientApi.java | 1 + .../yudao/module/system/api/social/SocialClientApiImpl.java | 3 +++ 5 files changed, 8 insertions(+) diff --git a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java index ca4c948af1..197b08ad54 100644 --- a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java +++ b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java @@ -11,6 +11,7 @@ public interface MessageTemplateConstants { String PAY_WALLET_CHANGE = "充值成功通知"; + // TODO @puhui999:这种建议不枚举,直接写~嘿嘿。 /** * 充值成功通知模版参数 * diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/message/subscribe/SubscribeMessageClient.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/message/subscribe/SubscribeMessageClient.java index cdb42a5193..3ef26156d1 100644 --- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/message/subscribe/SubscribeMessageClient.java +++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/message/subscribe/SubscribeMessageClient.java @@ -11,6 +11,7 @@ import java.util.Map; import static cn.iocoder.yudao.module.pay.enums.MessageTemplateConstants.PAY_WALLET_CHANGE; +// TODO @puhui999:建议可以先直接调用,不要新建一个 client。 /** * 订阅消息 * diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java index d801aa262c..40050ac017 100644 --- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java +++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java @@ -139,8 +139,10 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService { sendPayWalletChangeMessage(payOrderId, walletRecharge); } + // TODO @puhui999:发送,使用异步发送;@Async private void sendPayWalletChangeMessage(Long payOrderId, PayWalletRechargeDO walletRecharge) { PayWalletDO wallet = payWalletService.getWallet(walletRecharge.getWalletId()); + // TODO @puhui999:可以使用 MapUtil.builder();另外,不应该是并发 hashmap 哈 Map messages = MapUtil.newConcurrentHashMap(4); messages.put(MessageTemplateConstants.PayWalletChangeTemplateParams.NO, String.valueOf(payOrderId)); messages.put(MessageTemplateConstants.PayWalletChangeTemplateParams.PRICE, diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java index e91b136d16..72534768a1 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java @@ -57,6 +57,7 @@ public interface SocialClientApi { */ List getSubscribeTemplateList(Integer userType); + // TODO @puhui999:sendSubscribeMessage 两个方法,可以融合成一个么? /** * 发送微信小程序订阅消息 * diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java index 2885f19eba..fe72d97067 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java @@ -75,6 +75,7 @@ public class SocialClientApiImpl implements SocialClientApi { public void sendSubscribeMessage(String templateTitle, Map messages, Integer userType, Long userId, Integer socialType, String path) { + // TODO @puhui999:建议是,先不拆小方法。因为逻辑的复杂度其实不高哈。合在一个方法里,因为咱写了 1.1 1.2 2. 这样的逻辑,也能一下子看懂。 // 1.1 获得订阅模版 SocialWxSubscribeTemplateRespDTO template = getTemplate(templateTitle, userType); if (template == null) { @@ -104,6 +105,7 @@ public class SocialClientApiImpl implements SocialClientApi { .setTemplateId(template.getId()).setToUser(openId).setPage(path); } + // TODO @puhui999:建议下沉到 service 实现。 /** * 获得小程序订阅消息模版 * @@ -120,6 +122,7 @@ public class SocialClientApiImpl implements SocialClientApi { return CollectionUtil.findOne(templateList, item -> ObjUtil.equal(item.getTitle(), templateTitle)); } + // TODO @puhui999:建议下沉到 service 实现。 /** * 获得用户 openId * From d0cec28bfdcecf114a3b43e32b2316b7c26052f2 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 29 Jul 2024 19:43:08 +0800 Subject: [PATCH 14/26] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E3=80=91SYSTEM=EF=BC=9A=E4=BC=98=E5=8C=96=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=AF=BC=E5=85=A5=E7=9A=84=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/user/AdminUserServiceImpl.java | 50 ++++++------------- .../user/AdminUserServiceImplTest.java | 2 + 2 files changed, 16 insertions(+), 36 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java index 2edff89cfe..7ef0073864 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java @@ -42,36 +42,13 @@ import org.springframework.transaction.annotation.Transactional; import java.io.InputStream; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_COUNT_MAX; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_EMAIL_EXISTS; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_IMPORT_INIT_PASSWORD; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_IMPORT_LIST_IS_EMPTY; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_IS_DISABLE; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_MOBILE_EXISTS; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_NOT_EXISTS; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_PASSWORD_FAILED; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_USERNAME_EXISTS; -import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.SYSTEM_USER_CREATE_SUB_TYPE; -import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.SYSTEM_USER_CREATE_SUCCESS; -import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.SYSTEM_USER_DELETE_SUB_TYPE; -import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.SYSTEM_USER_DELETE_SUCCESS; -import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.SYSTEM_USER_TYPE; -import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.SYSTEM_USER_UPDATE_PASSWORD_SUB_TYPE; -import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.SYSTEM_USER_UPDATE_PASSWORD_SUCCESS; -import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.SYSTEM_USER_UPDATE_SUB_TYPE; -import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.SYSTEM_USER_UPDATE_SUCCESS; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.*; /** * 后台用户 Service 实现类 @@ -468,7 +445,14 @@ public class AdminUserServiceImpl implements AdminUserService { UserImportRespVO respVO = UserImportRespVO.builder().createUsernames(new ArrayList<>()) .updateUsernames(new ArrayList<>()).failureUsernames(new LinkedHashMap<>()).build(); importUsers.forEach(importUser -> { - // 校验,判断是否有不符合的原因 + // 2.1.1 校验字段是否符合要求 + try { + ValidationUtils.validate(BeanUtils.toBean(importUser, UserSaveReqVO.class).setPassword(initPassword)); + } catch (ConstraintViolationException ex){ + respVO.getFailureUsernames().put(importUser.getUsername(), ex.getMessage()); + return; + } + // 2.1.2 校验,判断是否有不符合的原因 try { validateUserForCreateOrUpdate(null, null, importUser.getMobile(), importUser.getEmail(), importUser.getDeptId(), null); @@ -476,14 +460,8 @@ public class AdminUserServiceImpl implements AdminUserService { respVO.getFailureUsernames().put(importUser.getUsername(), ex.getMessage()); return; } - // 校验字段是否符合要求 - try { - ValidationUtils.validate(BeanUtils.toBean(importUser, UserSaveReqVO.class).setPassword(initPassword)); - }catch (ConstraintViolationException ex){ - respVO.getFailureUsernames().put(importUser.getUsername(), ex.getMessage()); - return; - } - // 判断如果不存在,在进行插入 + + // 2.2.1 判断如果不存在,在进行插入 AdminUserDO existUser = userMapper.selectByUsername(importUser.getUsername()); if (existUser == null) { userMapper.insert(BeanUtils.toBean(importUser, AdminUserDO.class) @@ -491,7 +469,7 @@ public class AdminUserServiceImpl implements AdminUserService { respVO.getCreateUsernames().add(importUser.getUsername()); return; } - // 如果存在,判断是否允许更新 + // 2.2.2 如果存在,判断是否允许更新 if (!isUpdateSupport) { respVO.getFailureUsernames().put(importUser.getUsername(), USER_USERNAME_EXISTS.getMsg()); return; diff --git a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java index 73f54d1517..c811c3c741 100644 --- a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java @@ -430,6 +430,8 @@ public class AdminUserServiceImplTest extends BaseDbUnitTest { public void testImportUserList_01() { // 准备参数 UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class, o -> { + o.setEmail(randomEmail()); + o.setMobile(randomMobile()); }); // mock 方法,模拟失败 doThrow(new ServiceException(DEPT_NOT_FOUND)).when(deptService).validateDeptList(any()); From 29ade63f873f45c448d8f337cf6c3493aa150fe9 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 30 Jul 2024 00:01:08 +0800 Subject: [PATCH 15/26] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E3=80=91AI=EF=BC=9Aimage=20=E4=BD=9C=E5=93=81?= =?UTF-8?q?=E4=B8=AD=E5=BF=83=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/image/AiImageController.java | 3 +-- .../controller/admin/image/vo/AiImagePageReqVO.java | 5 +++-- .../module/ai/dal/mysql/image/AiImageMapper.java | 13 ++++++++----- .../module/ai/service/image/AiImageService.java | 3 +-- .../module/ai/service/image/AiImageServiceImpl.java | 5 ++--- .../ai/service/mindmap/AiMindMapServiceImpl.java | 2 +- .../module/ai/service/write/AiWriteServiceImpl.java | 2 +- .../src/main/resources/application-local.yaml | 1 + 8 files changed, 18 insertions(+), 16 deletions(-) diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/AiImageController.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/AiImageController.java index de12ee1e05..fd3cdf7869 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/AiImageController.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/AiImageController.java @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.ai.controller.admin.image; import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.ai.core.model.midjourney.api.MidjourneyApi; import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageDrawReqVO; @@ -41,7 +40,7 @@ public class AiImageController { @GetMapping("/my-page") @Operation(summary = "获取【我的】绘图分页") - public CommonResult> getImagePageMy(@Validated PageParam pageReqVO) { + public CommonResult> getImagePageMy(@Validated AiImagePageReqVO pageReqVO) { PageResult pageResult = imageService.getImagePageMy(getLoginUserId(), pageReqVO); return success(BeanUtils.toBean(pageResult, AiImageRespVO.class)); } diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImagePageReqVO.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImagePageReqVO.java index bdf329c618..3b48686b9c 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImagePageReqVO.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImagePageReqVO.java @@ -3,8 +3,6 @@ package cn.iocoder.yudao.module.ai.controller.admin.image.vo; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; @@ -21,6 +19,9 @@ public class AiImagePageReqVO extends PageParam { @Schema(description = "平台", example = "OpenAI") private String platform; + @Schema(description = "提示词", example = "1") + private String prompt; + @Schema(description = "绘画状态", example = "1") private Integer status; diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/image/AiImageMapper.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/image/AiImageMapper.java index fd6e4b398c..847a5c2042 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/image/AiImageMapper.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/image/AiImageMapper.java @@ -1,6 +1,5 @@ package cn.iocoder.yudao.module.ai.dal.mysql.image; -import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; @@ -19,7 +18,7 @@ import java.util.List; public interface AiImageMapper extends BaseMapperX { default AiImageDO selectByTaskId(String taskId) { - return this.selectOne(AiImageDO::getTaskId, taskId); + return selectOne(AiImageDO::getTaskId, taskId); } default PageResult selectPage(AiImagePageReqVO reqVO) { @@ -32,9 +31,13 @@ public interface AiImageMapper extends BaseMapperX { .orderByDesc(AiImageDO::getId)); } - default PageResult selectPage(Long userId, PageParam pageReqVO) { - return selectPage(pageReqVO, new LambdaQueryWrapperX() - .eq(AiImageDO::getUserId, userId) + default PageResult selectPageMy(Long userId, AiImagePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(AiImageDO::getPrompt, reqVO.getPrompt()) + // 情况一:公开 + .eq(Boolean.TRUE.equals(reqVO.getPublicStatus()), AiImageDO::getPublicStatus, reqVO.getPublicStatus()) + // 情况二:私有 + .eq(Boolean.FALSE.equals(reqVO.getPublicStatus()), AiImageDO::getUserId, userId) .orderByDesc(AiImageDO::getId)); } diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/image/AiImageService.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/image/AiImageService.java index 716c7ea8af..b4d76b315a 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/image/AiImageService.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/image/AiImageService.java @@ -1,7 +1,6 @@ package cn.iocoder.yudao.module.ai.service.image; import cn.iocoder.yudao.framework.ai.core.model.midjourney.api.MidjourneyApi; -import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageDrawReqVO; import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImagePageReqVO; @@ -27,7 +26,7 @@ public interface AiImageService { * @param pageReqVO 分页条件 * @return 绘图分页 */ - PageResult getImagePageMy(Long userId, PageParam pageReqVO); + PageResult getImagePageMy(Long userId, AiImagePageReqVO pageReqVO); /** * 获得绘图记录 diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/image/AiImageServiceImpl.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/image/AiImageServiceImpl.java index 3a8ff83460..020546ae96 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/image/AiImageServiceImpl.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/image/AiImageServiceImpl.java @@ -10,7 +10,6 @@ import cn.hutool.extra.spring.SpringUtil; import cn.hutool.http.HttpUtil; import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum; import cn.iocoder.yudao.framework.ai.core.model.midjourney.api.MidjourneyApi; -import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageDrawReqVO; @@ -67,8 +66,8 @@ public class AiImageServiceImpl implements AiImageService { private AiApiKeyService apiKeyService; @Override - public PageResult getImagePageMy(Long userId, PageParam pageReqVO) { - return imageMapper.selectPage(userId, pageReqVO); + public PageResult getImagePageMy(Long userId, AiImagePageReqVO pageReqVO) { + return imageMapper.selectPageMy(userId, pageReqVO); } @Override diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/mindmap/AiMindMapServiceImpl.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/mindmap/AiMindMapServiceImpl.java index 72be20c547..df5296df29 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/mindmap/AiMindMapServiceImpl.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/mindmap/AiMindMapServiceImpl.java @@ -124,7 +124,7 @@ public class AiMindMapServiceImpl implements AiMindMapService { if (role != null && role.getModelId() != null) { model = chatModalService.getChatModel(role.getModelId()); } - if (model != null) { + if (model == null) { model = chatModalService.getRequiredDefaultChatModel(); } Assert.notNull(model, "[AI] 获取不到模型"); diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/write/AiWriteServiceImpl.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/write/AiWriteServiceImpl.java index 2fae31d590..b8f22a2fa6 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/write/AiWriteServiceImpl.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/write/AiWriteServiceImpl.java @@ -114,7 +114,7 @@ public class AiWriteServiceImpl implements AiWriteService { if (Objects.nonNull(writeRole) && Objects.nonNull(writeRole.getModelId())) { model = chatModalService.getChatModel(writeRole.getModelId()); } - if (Objects.isNull(model)) { + if (model == null) { model = chatModalService.getRequiredDefaultChatModel(); } Assert.notNull(model, "[AI] 获取不到模型"); diff --git a/yudao-server/src/main/resources/application-local.yaml b/yudao-server/src/main/resources/application-local.yaml index 935ca80641..5e81da101e 100644 --- a/yudao-server/src/main/resources/application-local.yaml +++ b/yudao-server/src/main/resources/application-local.yaml @@ -174,6 +174,7 @@ logging: cn.iocoder.yudao.module.statistics.dal.mysql: debug cn.iocoder.yudao.module.crm.dal.mysql: debug cn.iocoder.yudao.module.erp.dal.mysql: debug + cn.iocoder.yudao.module.ai.dal.mysql: debug org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR # TODO 芋艿:先禁用,Spring Boot 3.X 存在部分错误的 WARN 提示 debug: false From f10840afb88a4c3676eee968390d8ad95a9ae233 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Tue, 30 Jul 2024 12:19:31 +0800 Subject: [PATCH 16/26] =?UTF-8?q?=E3=80=90=E4=BC=98=E5=8C=96=E3=80=91SYSTE?= =?UTF-8?q?M:=20=E6=A0=B9=E6=8D=AE=E4=BB=A3=E7=A0=81=E8=AF=84=E5=AE=A1?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=AE=A2=E9=98=85=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pay/enums/MessageTemplateConstants.java | 15 --- .../module/pay/message/package-info.java | 1 - .../subscribe/SubscribeMessageClient.java | 56 ----------- .../wallet/PayWalletRechargeServiceImpl.java | 47 ++++++---- .../system/api/social/SocialClientApi.java | 17 +--- .../SocialWxSubscribeMessageSendReqDTO.java | 67 ++++++------- .../api/social/SocialClientApiImpl.java | 94 +++++-------------- .../admin/socail/SocialClientController.http | 11 ++- .../admin/socail/SocialClientController.java | 6 +- .../convert/social/SocialUserConvert.java | 33 ------- .../service/social/SocialClientService.java | 6 +- .../social/SocialClientServiceImpl.java | 35 ++++++- 12 files changed, 131 insertions(+), 257 deletions(-) delete mode 100644 yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/message/package-info.java delete mode 100644 yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/message/subscribe/SubscribeMessageClient.java diff --git a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java index 197b08ad54..bf28724dce 100644 --- a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java +++ b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java @@ -11,19 +11,4 @@ public interface MessageTemplateConstants { String PAY_WALLET_CHANGE = "充值成功通知"; - // TODO @puhui999:这种建议不枚举,直接写~嘿嘿。 - /** - * 充值成功通知模版参数 - * - * @author HUIHUI - */ - class PayWalletChangeTemplateParams { - - public static final String NO = "character_string1"; // 流水编号 - public static final String PRICE = "amount2"; // 充值金额 - public static final String PAY_TIME = "time3"; // 充值时间 - public static final String STATUS = "phrase4"; // 充值状态 - - } - } diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/message/package-info.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/message/package-info.java deleted file mode 100644 index 2e26571ef3..0000000000 --- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/message/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.yudao.module.pay.message; \ No newline at end of file diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/message/subscribe/SubscribeMessageClient.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/message/subscribe/SubscribeMessageClient.java deleted file mode 100644 index 3ef26156d1..0000000000 --- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/message/subscribe/SubscribeMessageClient.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.iocoder.yudao.module.pay.message.subscribe; - -import cn.iocoder.yudao.module.system.api.social.SocialClientApi; -import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Component; - -import java.util.Map; - -import static cn.iocoder.yudao.module.pay.enums.MessageTemplateConstants.PAY_WALLET_CHANGE; - -// TODO @puhui999:建议可以先直接调用,不要新建一个 client。 -/** - * 订阅消息 - * - * @author HUIHUI - */ -@Component -@Slf4j -public class SubscribeMessageClient { - - public static final String WALLET_MONEY_PATH = "pages/user/wallet/money"; // 钱包详情页 - - @Resource - public SocialClientApi socialClientApi; - - /** - * 发送钱包充值通知 - * - * @param messages 消息 - * @param userType 用户类型 - * @param userId 用户编号 - */ - @Async - public void sendPayWalletChangeMessage(Map messages, Integer userType, Long userId) { - sendWxMessage(PAY_WALLET_CHANGE, messages, userType, userId, WALLET_MONEY_PATH); - } - - - /** - * 发送微信订阅消息 - * - * @param templateTitle 模版标题 - * @param messages 消息 - * @param userType 用户类型 - * @param userId 用户编号 - * @param path 点击模板卡片后的跳转页面,仅限本小程序内的页面 - */ - private void sendWxMessage(String templateTitle, Map messages, Integer userType, Long userId, - String path) { - socialClientApi.sendSubscribeMessage(templateTitle, messages, userType, userId, SocialTypeEnum.WECHAT_MINI_APP.getType(), path); - } - -} diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java index 40050ac017..b7ba2eb7aa 100644 --- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java +++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.pay.service.wallet; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.lang.Assert; -import cn.hutool.core.map.MapUtil; +import cn.hutool.extra.spring.SpringUtil; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.pay.core.enums.refund.PayRefundStatusRespEnum; @@ -15,21 +15,22 @@ import cn.iocoder.yudao.module.pay.dal.dataobject.wallet.PayWalletDO; import cn.iocoder.yudao.module.pay.dal.dataobject.wallet.PayWalletRechargeDO; import cn.iocoder.yudao.module.pay.dal.dataobject.wallet.PayWalletRechargePackageDO; import cn.iocoder.yudao.module.pay.dal.mysql.wallet.PayWalletRechargeMapper; -import cn.iocoder.yudao.module.pay.enums.MessageTemplateConstants; import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum; import cn.iocoder.yudao.module.pay.enums.refund.PayRefundStatusEnum; import cn.iocoder.yudao.module.pay.enums.wallet.PayWalletBizTypeEnum; -import cn.iocoder.yudao.module.pay.message.subscribe.SubscribeMessageClient; import cn.iocoder.yudao.module.pay.service.order.PayOrderService; import cn.iocoder.yudao.module.pay.service.refund.PayRefundService; +import cn.iocoder.yudao.module.system.api.social.SocialClientApi; +import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeMessageSendReqDTO; +import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.Duration; import java.time.LocalDateTime; -import java.util.Map; import java.util.Objects; import static cn.hutool.core.util.ObjectUtil.notEqual; @@ -39,6 +40,7 @@ import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString import static cn.iocoder.yudao.framework.common.util.number.MoneyUtils.fenToYuanStr; import static cn.iocoder.yudao.module.pay.convert.wallet.PayWalletRechargeConvert.INSTANCE; import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.*; +import static cn.iocoder.yudao.module.pay.enums.MessageTemplateConstants.PAY_WALLET_CHANGE; import static cn.iocoder.yudao.module.pay.enums.refund.PayRefundStatusEnum.*; /** @@ -57,6 +59,8 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService { private static final String WALLET_RECHARGE_ORDER_SUBJECT = "钱包余额充值"; + public static final String WALLET_MONEY_PATH = "pages/user/wallet/money"; // 钱包详情页 + @Resource private PayWalletRechargeMapper walletRechargeMapper; @Resource @@ -68,7 +72,7 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService { @Resource private PayWalletRechargePackageService payWalletRechargePackageService; @Resource - private SubscribeMessageClient subscribeMessageClient; + public SocialClientApi socialClientApi; @Override @Transactional(rollbackFor = Exception.class) @@ -136,21 +140,21 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService { PayWalletBizTypeEnum.RECHARGE, walletRecharge.getTotalPrice()); // 4. 发送订阅消息 - sendPayWalletChangeMessage(payOrderId, walletRecharge); + getSelf().sendPayWalletChangeMessage(payOrderId, walletRecharge); } - // TODO @puhui999:发送,使用异步发送;@Async - private void sendPayWalletChangeMessage(Long payOrderId, PayWalletRechargeDO walletRecharge) { + @Async + public void sendPayWalletChangeMessage(Long payOrderId, PayWalletRechargeDO walletRecharge) { + // 1. 获得会员钱包信息 PayWalletDO wallet = payWalletService.getWallet(walletRecharge.getWalletId()); - // TODO @puhui999:可以使用 MapUtil.builder();另外,不应该是并发 hashmap 哈 - Map messages = MapUtil.newConcurrentHashMap(4); - messages.put(MessageTemplateConstants.PayWalletChangeTemplateParams.NO, String.valueOf(payOrderId)); - messages.put(MessageTemplateConstants.PayWalletChangeTemplateParams.PRICE, - fenToYuanStr(walletRecharge.getTotalPrice())); - messages.put(MessageTemplateConstants.PayWalletChangeTemplateParams.STATUS, "充值成功"); - messages.put(MessageTemplateConstants.PayWalletChangeTemplateParams.PAY_TIME, - LocalDateTimeUtil.formatNormal(LocalDateTime.now())); - subscribeMessageClient.sendPayWalletChangeMessage(messages, wallet.getUserType(), wallet.getUserId()); + // 2. 构建并发送模版消息 + socialClientApi.sendSubscribeMessage(new SocialWxSubscribeMessageSendReqDTO().setPage(WALLET_MONEY_PATH) + .setUserId(wallet.getUserId()).setUserType(wallet.getUserType()).setTemplateTitle(PAY_WALLET_CHANGE) + .setSocialType(SocialTypeEnum.WECHAT_MINI_APP.getType()) + // 添加模版消息 + .addMessage("phrase4", "充值成功").addMessage("character_string1", String.valueOf(payOrderId)) + .addMessage("amount2", fenToYuanStr(walletRecharge.getTotalPrice())) + .addMessage("time3", LocalDateTimeUtil.formatNormal(LocalDateTime.now()))); } @Override @@ -307,4 +311,13 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService { return payOrder; } + /** + * 获得自身的代理对象,解决 AOP 生效问题 + * + * @return 自己 + */ + private PayWalletRechargeServiceImpl getSelf() { + return SpringUtil.getBean(getClass()); + } + } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java index 72534768a1..03cbde57d6 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java @@ -5,7 +5,6 @@ import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; import jakarta.validation.Valid; import java.util.List; -import java.util.Map; /** * 社交应用的 API 接口 @@ -57,25 +56,11 @@ public interface SocialClientApi { */ List getSubscribeTemplateList(Integer userType); - // TODO @puhui999:sendSubscribeMessage 两个方法,可以融合成一个么? /** * 发送微信小程序订阅消息 * * @param reqDTO 请求 */ - void sendSubscribeMessage(SocialWxSubscribeMessageSendReqDTO reqDTO, Integer userType); - - /** - * 发送微信小程序订阅消息 - * - * @param templateTitle 模版标题 - * @param messages 消息 - * @param userType 用户类型 - * @param userId 用户编号 - * @param socialType 社交客服端类型 - * @param path 点击模板卡片后的跳转页面,仅限本小程序内的页面 - */ - void sendSubscribeMessage(String templateTitle, Map messages, Integer userType, Long userId, - Integer socialType, String path); + void sendSubscribeMessage(SocialWxSubscribeMessageSendReqDTO reqDTO); } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageSendReqDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageSendReqDTO.java index 8ebb70b454..9799d69bd0 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageSendReqDTO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageSendReqDTO.java @@ -1,36 +1,45 @@ package cn.iocoder.yudao.module.system.api.social.dto; -import jakarta.validation.constraints.NotNull; +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; +import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; import lombok.Data; +import java.util.HashMap; import java.util.Map; /** * 微信小程序订阅消息发送 Request DTO * - * @see 接口文档 * @author HUIHUI */ @Data public class SocialWxSubscribeMessageSendReqDTO { - // TODO @puhui999:貌似使用 userId + userType 会不会更合理哈。这样,后端进行查询三方用户的绑定表~ /** - * 接收者(用户)的 openid. - *
-     * 参数:touser
-     * 是否必填: 是
-     * 描述: 接收者(用户)的 openid
-     * 
+ * 用户 id + * + * 关联 MemberUserDO 的 id 编号 + * 关联 AdminUserDO 的 id 编号 */ - @NotNull(message = "接收者(用户)的 openid不能为空") - private String toUser; + private Long userId; + /** + * 用户类型, 预留 多商户转帐可能需要用到 + * + * 关联 {@link UserTypeEnum} + */ + private Integer userType; /** - * 模版消息编号 + * 社交类型 + * + * 枚举 {@link SocialTypeEnum} */ - @NotNull(message = "模版消息编号不能为空") - private String templateId; + private Integer socialType; + + /** + * 消息模版标题 + */ + private String templateTitle; /** * 点击模板卡片后的跳转页面,仅限本小程序内的页面 @@ -39,31 +48,17 @@ public class SocialWxSubscribeMessageSendReqDTO { */ private String page; - /** - * 跳转小程序类型 - * - * developer 为开发版;trial 为体验版;formal 为正式版【默认】 - * - * 枚举 WxMaConstants.MiniProgramState - */ - // TODO @puhui999:这个非必填。如果没有,代码里去默认下; - @NotNull(message = "跳转小程序类型不能为空") - private String miniprogramState; - - /** - * 进入小程序查看的语言类型 - * - * zh_CN(简体中文)【默认】、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文) - * - * 枚举 WxMaConstants.MiniProgramLang - */ - // TODO @puhui999:这个非必填。如果没有,代码里去默认下; - @NotNull(message = "进入小程序查看的语言类型不能为空") - private String lang; - /** * 模板内容的参数 */ private Map messages; + public SocialWxSubscribeMessageSendReqDTO addMessage(String key, String value) { + if (messages == null) { + messages = new HashMap<>(); + } + messages.put(key, value); + return this; + } + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java index fe72d97067..1313815520 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java @@ -2,12 +2,10 @@ package cn.iocoder.yudao.module.system.api.social; import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.system.api.social.dto.*; -import cn.iocoder.yudao.module.system.convert.social.SocialUserConvert; import cn.iocoder.yudao.module.system.service.social.SocialClientService; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; @@ -18,7 +16,9 @@ import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.util.List; -import java.util.Map; + +import static cn.hutool.core.collection.CollUtil.findOne; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; /** * 社交应用的 API 实现类 @@ -65,80 +65,36 @@ public class SocialClientApiImpl implements SocialClientApi { @Override public List getSubscribeTemplateList(Integer userType) { List subscribeTemplate = socialClientService.getSubscribeTemplateList(userType); - return SocialUserConvert.INSTANCE.convertList(subscribeTemplate); + return convertList(subscribeTemplate, item -> BeanUtils.toBean(item, SocialWxSubscribeTemplateRespDTO.class) + .setId(item.getPriTmplId())); } @Override - public void sendSubscribeMessage(SocialWxSubscribeMessageSendReqDTO reqDTO, Integer userType) { - socialClientService.sendSubscribeMessage(reqDTO, userType); - } - - public void sendSubscribeMessage(String templateTitle, Map messages, Integer userType, Long userId, - Integer socialType, String path) { - // TODO @puhui999:建议是,先不拆小方法。因为逻辑的复杂度其实不高哈。合在一个方法里,因为咱写了 1.1 1.2 2. 这样的逻辑,也能一下子看懂。 - // 1.1 获得订阅模版 - SocialWxSubscribeTemplateRespDTO template = getTemplate(templateTitle, userType); - if (template == null) { - return; - } - // 1.2 获得发送对象的 openId - String openId = getUserOpenId(userType, userId, socialType); - if (StrUtil.isBlankIfStr(openId)) { - return; - } - - // 2. 发送消息 - sendSubscribeMessage(buildMessageSendReqDTO(openId, path, template).setMessages(messages), userType); - } - - /** - * 构建发送消息请求参数 - * - * @param openId 接收者(用户)的 openid - * @param path 点击模板卡片后的跳转页面,仅限本小程序内的页面 - * @param template 订阅模版 - * @return 微信小程序订阅消息发送 - */ - private SocialWxSubscribeMessageSendReqDTO buildMessageSendReqDTO(String openId, String path, - SocialWxSubscribeTemplateRespDTO template) { - return new SocialWxSubscribeMessageSendReqDTO().setLang("zh_CN").setMiniprogramState(envVersion) - .setTemplateId(template.getId()).setToUser(openId).setPage(path); - } - - // TODO @puhui999:建议下沉到 service 实现。 - /** - * 获得小程序订阅消息模版 - * - * @param templateTitle 模版标题 - * @param userType 用户类型 - * @return 小程序订阅消息模版 - */ - private SocialWxSubscribeTemplateRespDTO getTemplate(String templateTitle, Integer userType) { - List templateList = getSubscribeTemplateList(userType); + public void sendSubscribeMessage(SocialWxSubscribeMessageSendReqDTO reqDTO) { + // 1.1 获得订阅模版列表 + List templateList = getSubscribeTemplateList(reqDTO.getUserType()); if (CollUtil.isEmpty(templateList)) { - log.warn("[getTemplate][templateTitle({}) userType({}) 没有找到订阅模板]", templateTitle, userType); - return null; + log.warn("[sendSubscribeMessage][reqDTO({}) 发送订阅消息失败,原因:没有找到订阅模板]", reqDTO); + return; + } + // 1.2 获得需要使用的模版 + SocialWxSubscribeTemplateRespDTO template = findOne(templateList, item -> + ObjUtil.equal(item.getTitle(), reqDTO.getTemplateTitle())); + if (template == null) { + log.warn("[sendSubscribeMessage][reqDTO({}) 发送订阅消息失败,原因:没有找到订阅模板]", reqDTO); + return; } - return CollectionUtil.findOne(templateList, item -> ObjUtil.equal(item.getTitle(), templateTitle)); - } - // TODO @puhui999:建议下沉到 service 实现。 - /** - * 获得用户 openId - * - * @param userType 用户类型 - * @param userId 用户编号 - * @param socialType 社交类型 - * @return 用户 openId - */ - private String getUserOpenId(Integer userType, Long userId, Integer socialType) { - SocialUserRespDTO socialUser = socialUserApi.getSocialUserByUserId(userType, userId, socialType); + // 2. 获得社交用户 + SocialUserRespDTO socialUser = socialUserApi.getSocialUserByUserId(reqDTO.getUserType(), reqDTO.getUserId(), + reqDTO.getSocialType()); if (StrUtil.isBlankIfStr(socialUser.getOpenid())) { - log.warn("[getUserOpenId][userType({}) userId({}) socialType({}) 会员 openid 缺失]", - userType, userId, socialType); - return null; + log.warn("[sendSubscribeMessage][reqDTO({}) 发送订阅消息失败,原因:会员 openid 缺失]", reqDTO); + return; } - return socialUser.getOpenid(); + + // 3. 发送订阅消息 + socialClientService.sendSubscribeMessage(reqDTO, template.getId(), socialUser.getOpenid()); } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.http b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.http index b4ba43a097..5ab64392a7 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.http +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.http @@ -6,14 +6,15 @@ Content-Type: application/json tenant-id: {{adminTenentId}} { - "toUser": "oKNkb4xxw2H135-MVPKtEMkumK08", - "templateId": "W4ybDTIwCfKHtMKR7fSfx83DtmVKEeXQo3Ti7GCw4_4", - "miniprogramState": "developer", - "lang": "zh_CN", + "userId": 247, + "userType": 1, + "socialType": 34, + "templateTitle": "充值成功通知", + "page": "", "messages": { "character_string1":"5616122165165", "amount2":"1000.00", "time3":"2024-01-01 10:10:10", - "phrase4":"成功" + "phrase4": "充值成功" } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.java index 08fba16fed..aedc3282ce 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.module.system.controller.admin.socail; -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.system.api.social.SocialClientApi; import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeMessageSendReqDTO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientRespVO; @@ -29,6 +29,8 @@ public class SocialClientController { @Resource private SocialClientService socialClientService; + @Resource + private SocialClientApi socialClientApi; @PostMapping("/create") @Operation(summary = "创建社交客户端") @@ -75,7 +77,7 @@ public class SocialClientController { @Operation(summary = "发送订阅消息") // 用于测试 @PreAuthorize("@ss.hasPermission('system:social-client:query')") public void sendSubscribeMessage(@RequestBody SocialWxSubscribeMessageSendReqDTO reqDTO) { - socialClientService.sendSubscribeMessage(reqDTO, UserTypeEnum.MEMBER.getValue()); + socialClientApi.sendSubscribeMessage(reqDTO); } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/social/SocialUserConvert.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/social/SocialUserConvert.java index f0d8c4c182..9e679a2427 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/social/SocialUserConvert.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/social/SocialUserConvert.java @@ -1,23 +1,11 @@ package cn.iocoder.yudao.module.system.convert.social; -import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage; -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO; -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeMessageSendReqDTO; -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeTemplateRespDTO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.user.SocialUserBindReqVO; -import me.chanjar.weixin.common.bean.subscribemsg.TemplateInfo; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen; - @Mapper public interface SocialUserConvert { @@ -26,25 +14,4 @@ public interface SocialUserConvert { @Mapping(source = "reqVO.type", target = "socialType") SocialUserBindReqDTO convert(Long userId, Integer userType, SocialUserBindReqVO reqVO); - // TODO @puhui999:要不 convert 直接放到 service 里。 - default WxMaSubscribeMessage convert(SocialWxSubscribeMessageSendReqDTO reqDTO) { - WxMaSubscribeMessage message = BeanUtils.toBean(reqDTO, WxMaSubscribeMessage.class); - Map messages = reqDTO.getMessages(); - if (CollUtil.isNotEmpty(messages)) { - messages.keySet().forEach(key -> findAndThen(messages, key, value -> message.addData(new WxMaSubscribeMessage.MsgData(key, value)))); - } - return message; - } - - // TODO @puhui999:要不 convert 直接放到 service 里。其实可以 BeanUtils.toBean(reqDTO, WxMaSubscribeMessage.class) 来搞的呀。 - @Mapping(target = "id", source = "priTmplId") - SocialWxSubscribeTemplateRespDTO convert(TemplateInfo templateInfo); - - // TODO @puhui999:是不是用 CollectionUtils.convertList 就 ok 啦。 - default List convertList(List subscribeTemplate) { - List list = new ArrayList<>(); - subscribeTemplate.forEach(templateInfo -> list.add(convert(templateInfo))); - return list; - } - } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java index 5d39680eaf..6f34808693 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java @@ -83,9 +83,11 @@ public interface SocialClientService { /** * 发送微信小程序订阅消息 * - * @param reqDTO 请求 + * @param reqDTO 请求 + * @param templateId 模版编号 + * @param openId 会员 openId */ - void sendSubscribeMessage(SocialWxSubscribeMessageSendReqDTO reqDTO, Integer userType); + void sendSubscribeMessage(SocialWxSubscribeMessageSendReqDTO reqDTO, String templateId, String openId); // =================== 客户端管理 =================== diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java index ab888b8018..106a6dda3a 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java @@ -4,8 +4,10 @@ import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.api.WxMaSubscribeService; import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; +import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage; import cn.binarywang.wx.miniapp.config.impl.WxMaRedisBetterConfigImpl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ReflectUtil; @@ -19,7 +21,6 @@ import cn.iocoder.yudao.module.system.api.social.dto.SocialWxQrcodeReqDTO; import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeMessageSendReqDTO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientSaveReqVO; -import cn.iocoder.yudao.module.system.convert.social.SocialUserConvert; import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialClientDO; import cn.iocoder.yudao.module.system.dal.mysql.social.SocialClientMapper; import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; @@ -51,9 +52,11 @@ import org.springframework.stereotype.Service; import java.time.Duration; import java.util.List; +import java.util.Map; import java.util.Objects; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen; import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString; import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; @@ -273,17 +276,39 @@ public class SocialClientServiceImpl implements SocialClientService { } @Override - public void sendSubscribeMessage(SocialWxSubscribeMessageSendReqDTO reqDTO, Integer userType) { - WxMaService service = getWxMaService(userType); + public void sendSubscribeMessage(SocialWxSubscribeMessageSendReqDTO reqDTO, String templateId, String openId) { + WxMaService service = getWxMaService(reqDTO.getUserType()); try { WxMaSubscribeService subscribeService = service.getSubscribeService(); - subscribeService.sendSubscribeMsg(SocialUserConvert.INSTANCE.convert(reqDTO)); + subscribeService.sendSubscribeMsg(buildMessageSendReqDTO(reqDTO, templateId, openId)); } catch (WxErrorException e) { - log.error("[sendSubscribeMessage][reqVO({}) userType({}) 发送小程序订阅消息]", reqDTO, userType, e); + log.error("[sendSubscribeMessage][reqVO({}) templateId({}) openId({}) 发送小程序订阅消息失败]", reqDTO, templateId, openId, e); throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_MESSAGE_ERROR); } } + /** + * 构建发送消息请求参数 + * + * @param openId 接收者(用户)的 openid + * @param path 点击模板卡片后的跳转页面,仅限本小程序内的页面 + * @param template 订阅模版 + * @return 微信小程序订阅消息发送 + */ + private WxMaSubscribeMessage buildMessageSendReqDTO(SocialWxSubscribeMessageSendReqDTO reqDTO, + String templateId, String openId) { + // 1.1 设置订阅消息基本参数 + WxMaSubscribeMessage subscribeMessage = new WxMaSubscribeMessage().setLang("zh_CN").setMiniprogramState(envVersion) + .setTemplateId(templateId).setToUser(openId).setPage(reqDTO.getPage()); + // 1.2 设置具体消息参数 + Map messages = reqDTO.getMessages(); + if (CollUtil.isNotEmpty(messages)) { + messages.keySet().forEach(key -> findAndThen(messages, key, value -> + subscribeMessage.addData(new WxMaSubscribeMessage.MsgData(key, value)))); + } + return subscribeMessage; + } + /** * 获得 clientId + clientSecret 对应的 WxMpService 对象 * From ab4e10ccf89cef628acefceda9eda9768a73377e Mon Sep 17 00:00:00 2001 From: puhui999 Date: Tue, 30 Jul 2024 12:22:06 +0800 Subject: [PATCH 17/26] =?UTF-8?q?=E3=80=90=E4=BC=98=E5=8C=96=E3=80=91SYSTE?= =?UTF-8?q?M:=20=E6=A0=B9=E6=8D=AE=E4=BB=A3=E7=A0=81=E8=AF=84=E5=AE=A1?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=AE=A2=E9=98=85=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pay/service/wallet/PayWalletRechargeServiceImpl.java | 4 ++-- .../system/service/social/SocialClientServiceImpl.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java index b7ba2eb7aa..ca750ae943 100644 --- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java +++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java @@ -145,9 +145,9 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService { @Async public void sendPayWalletChangeMessage(Long payOrderId, PayWalletRechargeDO walletRecharge) { - // 1. 获得会员钱包信息 + // 1.1 获得会员钱包信息 PayWalletDO wallet = payWalletService.getWallet(walletRecharge.getWalletId()); - // 2. 构建并发送模版消息 + // 1.2 构建并发送模版消息 socialClientApi.sendSubscribeMessage(new SocialWxSubscribeMessageSendReqDTO().setPage(WALLET_MONEY_PATH) .setUserId(wallet.getUserId()).setUserType(wallet.getUserType()).setTemplateTitle(PAY_WALLET_CHANGE) .setSocialType(SocialTypeEnum.WECHAT_MINI_APP.getType()) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java index 106a6dda3a..0b3a4bc8fd 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java @@ -290,9 +290,9 @@ public class SocialClientServiceImpl implements SocialClientService { /** * 构建发送消息请求参数 * - * @param openId 接收者(用户)的 openid - * @param path 点击模板卡片后的跳转页面,仅限本小程序内的页面 - * @param template 订阅模版 + * @param reqDTO 请求 + * @param templateId 模版编号 + * @param openId 会员 openId * @return 微信小程序订阅消息发送 */ private WxMaSubscribeMessage buildMessageSendReqDTO(SocialWxSubscribeMessageSendReqDTO reqDTO, From a9862b798d44622e3086fd7a753f57921d2c5772 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 30 Jul 2024 12:57:32 +0800 Subject: [PATCH 18/26] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=E3=80=91SYSTEM=EF=BC=9A=E5=BE=AE=E4=BF=A1=E5=B0=8F?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=9A=84=E8=AE=A2=E9=98=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wallet/PayWalletRechargeServiceImpl.java | 14 +++++++------- .../module/system/api/social/SocialClientApi.java | 2 ++ .../dto/SocialWxSubscribeMessageSendReqDTO.java | 10 ++++++++-- .../system/api/social/SocialClientApiImpl.java | 5 ++--- .../service/social/SocialClientServiceImpl.java | 6 +++--- 5 files changed, 22 insertions(+), 15 deletions(-) diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java index ca750ae943..6213b90787 100644 --- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java +++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java @@ -145,16 +145,16 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService { @Async public void sendPayWalletChangeMessage(Long payOrderId, PayWalletRechargeDO walletRecharge) { - // 1.1 获得会员钱包信息 + // 1. 获得会员钱包信息 PayWalletDO wallet = payWalletService.getWallet(walletRecharge.getWalletId()); - // 1.2 构建并发送模版消息 + // 2. 构建并发送模版消息 socialClientApi.sendSubscribeMessage(new SocialWxSubscribeMessageSendReqDTO().setPage(WALLET_MONEY_PATH) - .setUserId(wallet.getUserId()).setUserType(wallet.getUserType()).setTemplateTitle(PAY_WALLET_CHANGE) - .setSocialType(SocialTypeEnum.WECHAT_MINI_APP.getType()) - // 添加模版消息 - .addMessage("phrase4", "充值成功").addMessage("character_string1", String.valueOf(payOrderId)) + .setUserId(wallet.getUserId()).setUserType(wallet.getUserType()) + .setTemplateTitle(PAY_WALLET_CHANGE).setSocialType(SocialTypeEnum.WECHAT_MINI_APP.getType()) + .addMessage("character_string1", String.valueOf(payOrderId)) .addMessage("amount2", fenToYuanStr(walletRecharge.getTotalPrice())) - .addMessage("time3", LocalDateTimeUtil.formatNormal(LocalDateTime.now()))); + .addMessage("time3", LocalDateTimeUtil.formatNormal(LocalDateTime.now())) + .addMessage("phrase4", "充值成功")); } @Override diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java index 03cbde57d6..07aedd3bac 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java @@ -49,6 +49,7 @@ public interface SocialClientApi { */ byte[] getWxaQrcode(@Valid SocialWxQrcodeReqDTO reqVO); + // TODO @puhui999:要不是统一都叫 getWxaSubscribeTemplateList、SocialWxaSubscribeTemplateRespDTO /** * 获得微信小程订阅模板 * @@ -56,6 +57,7 @@ public interface SocialClientApi { */ List getSubscribeTemplateList(Integer userType); + // TODO @puhui999:sendWxaSubscribeMessage、SocialWxaSubscribeMessageSendReqDTO;然后不传递 socialType;就是专门给微信小程序的 /** * 发送微信小程序订阅消息 * diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageSendReqDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageSendReqDTO.java index 9799d69bd0..66ef781efc 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageSendReqDTO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageSendReqDTO.java @@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.system.api.social.dto; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; import lombok.Data; import java.util.HashMap; @@ -16,17 +18,19 @@ import java.util.Map; public class SocialWxSubscribeMessageSendReqDTO { /** - * 用户 id + * 用户编号 * * 关联 MemberUserDO 的 id 编号 * 关联 AdminUserDO 的 id 编号 */ + @NotNull(message = "用户编号不能为空") private Long userId; /** - * 用户类型, 预留 多商户转帐可能需要用到 + * 用户类型 * * 关联 {@link UserTypeEnum} */ + @NotNull(message = "用户类型不能为空") private Integer userType; /** @@ -34,11 +38,13 @@ public class SocialWxSubscribeMessageSendReqDTO { * * 枚举 {@link SocialTypeEnum} */ + @NotNull(message = "社交类型不能为空") private Integer socialType; /** * 消息模版标题 */ + @NotEmpty(message = "消息模版标题不能为空") private String templateTitle; /** diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java index 1313815520..71af73f473 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java @@ -64,9 +64,8 @@ public class SocialClientApiImpl implements SocialClientApi { @Override public List getSubscribeTemplateList(Integer userType) { - List subscribeTemplate = socialClientService.getSubscribeTemplateList(userType); - return convertList(subscribeTemplate, item -> BeanUtils.toBean(item, SocialWxSubscribeTemplateRespDTO.class) - .setId(item.getPriTmplId())); + List list = socialClientService.getSubscribeTemplateList(userType); + return convertList(list, item -> BeanUtils.toBean(item, SocialWxSubscribeTemplateRespDTO.class).setId(item.getPriTmplId())); } @Override diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java index 0b3a4bc8fd..ac115448f8 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java @@ -297,13 +297,13 @@ public class SocialClientServiceImpl implements SocialClientService { */ private WxMaSubscribeMessage buildMessageSendReqDTO(SocialWxSubscribeMessageSendReqDTO reqDTO, String templateId, String openId) { - // 1.1 设置订阅消息基本参数 + // 设置订阅消息基本参数 WxMaSubscribeMessage subscribeMessage = new WxMaSubscribeMessage().setLang("zh_CN").setMiniprogramState(envVersion) .setTemplateId(templateId).setToUser(openId).setPage(reqDTO.getPage()); - // 1.2 设置具体消息参数 + // 设置具体消息参数 Map messages = reqDTO.getMessages(); if (CollUtil.isNotEmpty(messages)) { - messages.keySet().forEach(key -> findAndThen(messages, key, value -> + reqDTO.getMessages().keySet().forEach(key -> findAndThen(messages, key, value -> subscribeMessage.addData(new WxMaSubscribeMessage.MsgData(key, value)))); } return subscribeMessage; From 4c846ef4ce4567dd7ea7c14eda70a888d5e73cda Mon Sep 17 00:00:00 2001 From: puhui999 Date: Tue, 30 Jul 2024 15:40:21 +0800 Subject: [PATCH 19/26] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91MALL:?= =?UTF-8?q?=20=E6=96=B0=E5=A2=9E=E9=80=80=E6=AC=BE=E8=AE=A2=E9=98=85?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E5=8F=91=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/social/AppSocialUserController.java | 2 +- .../pay/enums/MessageTemplateConstants.java | 3 +- .../wallet/PayWalletRechargeServiceImpl.java | 41 +++++++++++++------ .../system/api/social/SocialClientApi.java | 8 ++-- ... SocialWxaSubscribeMessageSendReqDTO.java} | 13 +----- ...=> SocialWxaSubscribeTemplateRespDTO.java} | 2 +- .../api/social/SocialClientApiImpl.java | 21 ++++------ .../admin/socail/SocialClientController.java | 6 +-- .../service/social/SocialClientService.java | 4 +- .../social/SocialClientServiceImpl.java | 13 +++--- 10 files changed, 60 insertions(+), 53 deletions(-) rename yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/{SocialWxSubscribeMessageSendReqDTO.java => SocialWxaSubscribeMessageSendReqDTO.java} (78%) rename yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/{SocialWxSubscribeTemplateRespDTO.java => SocialWxaSubscribeTemplateRespDTO.java} (91%) diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/AppSocialUserController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/AppSocialUserController.java index b3b045171c..e8de23c2b6 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/AppSocialUserController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/AppSocialUserController.java @@ -71,7 +71,7 @@ public class AppSocialUserController { @GetMapping("/get-subscribe-template-list") @Operation(summary = "获得微信小程订阅模板列表") public CommonResult> getSubscribeTemplateList() { - List template = socialClientApi.getSubscribeTemplateList(UserTypeEnum.MEMBER.getValue()); + List template = socialClientApi.getWxaSubscribeTemplateList(UserTypeEnum.MEMBER.getValue()); return success(BeanUtils.toBean(template, AppSocialWxSubscribeTemplateRespVO.class)); } diff --git a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java index bf28724dce..7031f1d427 100644 --- a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java +++ b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java @@ -9,6 +9,7 @@ public interface MessageTemplateConstants { //======================= 小程序订阅消息 ======================= - String PAY_WALLET_CHANGE = "充值成功通知"; + String WALLET_RECHARGER_PAID = "充值成功通知"; + String WALLET_RECHARGE_REFUNDED = "退款申请通知"; } diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java index 6213b90787..a5d1cec3d2 100644 --- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java +++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java @@ -21,8 +21,7 @@ import cn.iocoder.yudao.module.pay.enums.wallet.PayWalletBizTypeEnum; import cn.iocoder.yudao.module.pay.service.order.PayOrderService; import cn.iocoder.yudao.module.pay.service.refund.PayRefundService; import cn.iocoder.yudao.module.system.api.social.SocialClientApi; -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeMessageSendReqDTO; -import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; +import cn.iocoder.yudao.module.system.api.social.dto.SocialWxaSubscribeMessageSendReqDTO; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; @@ -40,7 +39,8 @@ import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString import static cn.iocoder.yudao.framework.common.util.number.MoneyUtils.fenToYuanStr; import static cn.iocoder.yudao.module.pay.convert.wallet.PayWalletRechargeConvert.INSTANCE; import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.*; -import static cn.iocoder.yudao.module.pay.enums.MessageTemplateConstants.PAY_WALLET_CHANGE; +import static cn.iocoder.yudao.module.pay.enums.MessageTemplateConstants.WALLET_RECHARGER_PAID; +import static cn.iocoder.yudao.module.pay.enums.MessageTemplateConstants.WALLET_RECHARGE_REFUNDED; import static cn.iocoder.yudao.module.pay.enums.refund.PayRefundStatusEnum.*; /** @@ -140,21 +140,20 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService { PayWalletBizTypeEnum.RECHARGE, walletRecharge.getTotalPrice()); // 4. 发送订阅消息 - getSelf().sendPayWalletChangeMessage(payOrderId, walletRecharge); + getSelf().sendWalletRechargerPaidMessage(payOrderId, walletRecharge); } @Async - public void sendPayWalletChangeMessage(Long payOrderId, PayWalletRechargeDO walletRecharge) { + public void sendWalletRechargerPaidMessage(Long payOrderId, PayWalletRechargeDO walletRecharge) { // 1. 获得会员钱包信息 PayWalletDO wallet = payWalletService.getWallet(walletRecharge.getWalletId()); // 2. 构建并发送模版消息 - socialClientApi.sendSubscribeMessage(new SocialWxSubscribeMessageSendReqDTO().setPage(WALLET_MONEY_PATH) - .setUserId(wallet.getUserId()).setUserType(wallet.getUserType()) - .setTemplateTitle(PAY_WALLET_CHANGE).setSocialType(SocialTypeEnum.WECHAT_MINI_APP.getType()) - .addMessage("character_string1", String.valueOf(payOrderId)) - .addMessage("amount2", fenToYuanStr(walletRecharge.getTotalPrice())) - .addMessage("time3", LocalDateTimeUtil.formatNormal(LocalDateTime.now())) - .addMessage("phrase4", "充值成功")); + socialClientApi.sendWxaSubscribeMessage(new SocialWxaSubscribeMessageSendReqDTO().setPage(WALLET_MONEY_PATH) + .setUserId(wallet.getUserId()).setUserType(wallet.getUserType()).setTemplateTitle(WALLET_RECHARGER_PAID) + .addMessage("character_string1", String.valueOf(payOrderId)) // 支付单编号 + .addMessage("amount2", fenToYuanStr(walletRecharge.getTotalPrice())) // 充值金额 + .addMessage("time3", LocalDateTimeUtil.formatNormal(walletRecharge.getCreateTime())) // 充值时间 + .addMessage("phrase4", "充值成功")); // 充值状态 } @Override @@ -219,6 +218,24 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService { } // 3. 更新钱包充值的退款字段 walletRechargeMapper.updateByIdAndRefunded(id, WAITING.getStatus(), updateObj); + + // 4. 发送订阅消息 + getSelf().sendWalletRechargeRefundedMessage(walletRecharge.getWalletId(), payRefund); + } + + @Async + public void sendWalletRechargeRefundedMessage(Long walletId, PayRefundDO payRefund) { + // 1. 获得会员钱包信息 + PayWalletDO wallet = payWalletService.getWallet(walletId); + // 2. 构建并发送模版消息 + String thing8 = PayRefundStatusEnum.isSuccess(payRefund.getStatus()) ? SUCCESS.getName() : FAILURE.getName(); + socialClientApi.sendWxaSubscribeMessage(new SocialWxaSubscribeMessageSendReqDTO().setPage(WALLET_MONEY_PATH) + .setUserId(wallet.getUserId()).setUserType(wallet.getUserType()).setTemplateTitle(WALLET_RECHARGE_REFUNDED) + .addMessage("character_string1", String.valueOf(payRefund.getId())) // 退款订单编号 + .addMessage("time7", LocalDateTimeUtil.formatNormal(payRefund.getCreateTime())) // 申请时间 + .addMessage("amount3", fenToYuanStr(payRefund.getRefundPrice())) // 退款金额 + .addMessage("thing4", payRefund.getReason()) // 退款原因 + .addMessage("thing8", thing8 + ",点击卡片查看详情")); // 温馨提示 } private PayRefundDO validateWalletRechargeCanRefunded(PayWalletRechargeDO walletRecharge, Long payRefundId) { diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java index 07aedd3bac..3324eea09d 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java @@ -32,6 +32,8 @@ public interface SocialClientApi { */ SocialWxJsapiSignatureRespDTO createWxMpJsapiSignature(Integer userType, String url); + //======================= 微信小程序独有 ======================= + /** * 获得微信小程序的手机信息 * @@ -49,20 +51,18 @@ public interface SocialClientApi { */ byte[] getWxaQrcode(@Valid SocialWxQrcodeReqDTO reqVO); - // TODO @puhui999:要不是统一都叫 getWxaSubscribeTemplateList、SocialWxaSubscribeTemplateRespDTO /** * 获得微信小程订阅模板 * * @return 小程序订阅消息模版 */ - List getSubscribeTemplateList(Integer userType); + List getWxaSubscribeTemplateList(Integer userType); - // TODO @puhui999:sendWxaSubscribeMessage、SocialWxaSubscribeMessageSendReqDTO;然后不传递 socialType;就是专门给微信小程序的 /** * 发送微信小程序订阅消息 * * @param reqDTO 请求 */ - void sendSubscribeMessage(SocialWxSubscribeMessageSendReqDTO reqDTO); + void sendWxaSubscribeMessage(SocialWxaSubscribeMessageSendReqDTO reqDTO); } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageSendReqDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxaSubscribeMessageSendReqDTO.java similarity index 78% rename from yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageSendReqDTO.java rename to yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxaSubscribeMessageSendReqDTO.java index 66ef781efc..2677a3485a 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeMessageSendReqDTO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxaSubscribeMessageSendReqDTO.java @@ -1,7 +1,6 @@ package cn.iocoder.yudao.module.system.api.social.dto; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; -import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.Data; @@ -15,7 +14,7 @@ import java.util.Map; * @author HUIHUI */ @Data -public class SocialWxSubscribeMessageSendReqDTO { +public class SocialWxaSubscribeMessageSendReqDTO { /** * 用户编号 @@ -33,14 +32,6 @@ public class SocialWxSubscribeMessageSendReqDTO { @NotNull(message = "用户类型不能为空") private Integer userType; - /** - * 社交类型 - * - * 枚举 {@link SocialTypeEnum} - */ - @NotNull(message = "社交类型不能为空") - private Integer socialType; - /** * 消息模版标题 */ @@ -59,7 +50,7 @@ public class SocialWxSubscribeMessageSendReqDTO { */ private Map messages; - public SocialWxSubscribeMessageSendReqDTO addMessage(String key, String value) { + public SocialWxaSubscribeMessageSendReqDTO addMessage(String key, String value) { if (messages == null) { messages = new HashMap<>(); } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeTemplateRespDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxaSubscribeTemplateRespDTO.java similarity index 91% rename from yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeTemplateRespDTO.java rename to yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxaSubscribeTemplateRespDTO.java index d4b7bdde2d..ae14cc5432 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxSubscribeTemplateRespDTO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialWxaSubscribeTemplateRespDTO.java @@ -9,7 +9,7 @@ import lombok.Data; * @author HUIHUI */ @Data -public class SocialWxSubscribeTemplateRespDTO { +public class SocialWxaSubscribeTemplateRespDTO { /** * 模版编号 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java index 71af73f473..b69221a0c6 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java @@ -6,12 +6,12 @@ import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.system.api.social.dto.*; +import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; import cn.iocoder.yudao.module.system.service.social.SocialClientService; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.bean.WxJsapiSignature; import me.chanjar.weixin.common.bean.subscribemsg.TemplateInfo; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -30,11 +30,6 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. @Slf4j public class SocialClientApiImpl implements SocialClientApi { - /** - * 小程序版本 - */ - @Value("${yudao.wxa-code.env-version}") - public String envVersion; @Resource private SocialClientService socialClientService; @Resource @@ -51,6 +46,8 @@ public class SocialClientApiImpl implements SocialClientApi { return BeanUtils.toBean(signature, SocialWxJsapiSignatureRespDTO.class); } + //======================= 微信小程序独有 ======================= + @Override public SocialWxPhoneNumberInfoRespDTO getWxMaPhoneNumberInfo(Integer userType, String phoneCode) { WxMaPhoneNumberInfo info = socialClientService.getWxMaPhoneNumberInfo(userType, phoneCode); @@ -63,21 +60,21 @@ public class SocialClientApiImpl implements SocialClientApi { } @Override - public List getSubscribeTemplateList(Integer userType) { + public List getWxaSubscribeTemplateList(Integer userType) { List list = socialClientService.getSubscribeTemplateList(userType); - return convertList(list, item -> BeanUtils.toBean(item, SocialWxSubscribeTemplateRespDTO.class).setId(item.getPriTmplId())); + return convertList(list, item -> BeanUtils.toBean(item, SocialWxaSubscribeTemplateRespDTO.class).setId(item.getPriTmplId())); } @Override - public void sendSubscribeMessage(SocialWxSubscribeMessageSendReqDTO reqDTO) { + public void sendWxaSubscribeMessage(SocialWxaSubscribeMessageSendReqDTO reqDTO) { // 1.1 获得订阅模版列表 - List templateList = getSubscribeTemplateList(reqDTO.getUserType()); + List templateList = getWxaSubscribeTemplateList(reqDTO.getUserType()); if (CollUtil.isEmpty(templateList)) { log.warn("[sendSubscribeMessage][reqDTO({}) 发送订阅消息失败,原因:没有找到订阅模板]", reqDTO); return; } // 1.2 获得需要使用的模版 - SocialWxSubscribeTemplateRespDTO template = findOne(templateList, item -> + SocialWxaSubscribeTemplateRespDTO template = findOne(templateList, item -> ObjUtil.equal(item.getTitle(), reqDTO.getTemplateTitle())); if (template == null) { log.warn("[sendSubscribeMessage][reqDTO({}) 发送订阅消息失败,原因:没有找到订阅模板]", reqDTO); @@ -86,7 +83,7 @@ public class SocialClientApiImpl implements SocialClientApi { // 2. 获得社交用户 SocialUserRespDTO socialUser = socialUserApi.getSocialUserByUserId(reqDTO.getUserType(), reqDTO.getUserId(), - reqDTO.getSocialType()); + SocialTypeEnum.WECHAT_MINI_APP.getType()); if (StrUtil.isBlankIfStr(socialUser.getOpenid())) { log.warn("[sendSubscribeMessage][reqDTO({}) 发送订阅消息失败,原因:会员 openid 缺失]", reqDTO); return; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.java index aedc3282ce..e91a3d8a0b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.java @@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.system.api.social.SocialClientApi; -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeMessageSendReqDTO; +import cn.iocoder.yudao.module.system.api.social.dto.SocialWxaSubscribeMessageSendReqDTO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientRespVO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientSaveReqVO; @@ -76,8 +76,8 @@ public class SocialClientController { @PostMapping("/send-subscribe-message") @Operation(summary = "发送订阅消息") // 用于测试 @PreAuthorize("@ss.hasPermission('system:social-client:query')") - public void sendSubscribeMessage(@RequestBody SocialWxSubscribeMessageSendReqDTO reqDTO) { - socialClientApi.sendSubscribeMessage(reqDTO); + public void sendSubscribeMessage(@RequestBody SocialWxaSubscribeMessageSendReqDTO reqDTO) { + socialClientApi.sendWxaSubscribeMessage(reqDTO); } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java index 6f34808693..ff4e95a982 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.system.service.social; import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.api.social.dto.SocialWxQrcodeReqDTO; -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeMessageSendReqDTO; +import cn.iocoder.yudao.module.system.api.social.dto.SocialWxaSubscribeMessageSendReqDTO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialClientDO; @@ -87,7 +87,7 @@ public interface SocialClientService { * @param templateId 模版编号 * @param openId 会员 openId */ - void sendSubscribeMessage(SocialWxSubscribeMessageSendReqDTO reqDTO, String templateId, String openId); + void sendSubscribeMessage(SocialWxaSubscribeMessageSendReqDTO reqDTO, String templateId, String openId); // =================== 客户端管理 =================== diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java index ac115448f8..552faf8655 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java @@ -6,6 +6,7 @@ import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage; import cn.binarywang.wx.miniapp.config.impl.WxMaRedisBetterConfigImpl; +import cn.binarywang.wx.miniapp.constant.WxMaConstants; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; @@ -18,7 +19,7 @@ import cn.iocoder.yudao.framework.common.util.cache.CacheUtils; import cn.iocoder.yudao.framework.common.util.http.HttpUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.system.api.social.dto.SocialWxQrcodeReqDTO; -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxSubscribeMessageSendReqDTO; +import cn.iocoder.yudao.module.system.api.social.dto.SocialWxaSubscribeMessageSendReqDTO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialClientDO; @@ -276,7 +277,7 @@ public class SocialClientServiceImpl implements SocialClientService { } @Override - public void sendSubscribeMessage(SocialWxSubscribeMessageSendReqDTO reqDTO, String templateId, String openId) { + public void sendSubscribeMessage(SocialWxaSubscribeMessageSendReqDTO reqDTO, String templateId, String openId) { WxMaService service = getWxMaService(reqDTO.getUserType()); try { WxMaSubscribeService subscribeService = service.getSubscribeService(); @@ -293,13 +294,13 @@ public class SocialClientServiceImpl implements SocialClientService { * @param reqDTO 请求 * @param templateId 模版编号 * @param openId 会员 openId - * @return 微信小程序订阅消息发送 + * @return 微信小程序订阅消息请求参数 */ - private WxMaSubscribeMessage buildMessageSendReqDTO(SocialWxSubscribeMessageSendReqDTO reqDTO, + private WxMaSubscribeMessage buildMessageSendReqDTO(SocialWxaSubscribeMessageSendReqDTO reqDTO, String templateId, String openId) { // 设置订阅消息基本参数 - WxMaSubscribeMessage subscribeMessage = new WxMaSubscribeMessage().setLang("zh_CN").setMiniprogramState(envVersion) - .setTemplateId(templateId).setToUser(openId).setPage(reqDTO.getPage()); + WxMaSubscribeMessage subscribeMessage = new WxMaSubscribeMessage().setLang(WxMaConstants.MiniProgramLang.ZH_CN) + .setMiniprogramState(envVersion).setTemplateId(templateId).setToUser(openId).setPage(reqDTO.getPage()); // 设置具体消息参数 Map messages = reqDTO.getMessages(); if (CollUtil.isNotEmpty(messages)) { From 5307852fb2c826c07ca06d207d9ce665d18fca2e Mon Sep 17 00:00:00 2001 From: puhui999 Date: Tue, 30 Jul 2024 16:05:25 +0800 Subject: [PATCH 20/26] =?UTF-8?q?=E3=80=90=E4=BC=98=E5=8C=96=E3=80=91SYSTE?= =?UTF-8?q?M:=20=E5=B0=8F=E7=A8=8B=E5=BA=8F=E8=AE=A2=E9=98=85=E6=A8=A1?= =?UTF-8?q?=E7=89=88=E8=8E=B7=E5=8F=96=E5=A2=9E=E5=8A=A0=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/module/system/dal/redis/RedisKeyConstants.java | 9 +++++++++ .../system/service/social/SocialClientService.java | 3 +++ .../system/service/social/SocialClientServiceImpl.java | 3 +++ 3 files changed, 15 insertions(+) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/redis/RedisKeyConstants.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/redis/RedisKeyConstants.java index 4964a2be24..1cd58306b6 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/redis/RedisKeyConstants.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/redis/RedisKeyConstants.java @@ -98,4 +98,13 @@ public interface RedisKeyConstants { * VALUE 数据格式:String 模版信息 */ String SMS_TEMPLATE = "sms_template"; + + /** + * 小程序订阅模版的缓存 + * + * KEY 格式:wxa_subscribe_template:{userType} + * VALUE 数据格式 String, 模版信息 + */ + String WXA_SUBSCRIBE_TEMPLATE = "wxa_subscribe_template"; + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java index ff4e95a982..5b293c41c9 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java @@ -76,6 +76,9 @@ public interface SocialClientService { /** * 获得微信小程订阅模板 * + * 缓存的目的:考虑到微信小程序订阅消息选择好模版后几乎不会变动,缓存增加查询效率 + * + * @param userType 用户类型 * @return 微信小程订阅模板 */ List getSubscribeTemplateList(Integer userType); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java index 552faf8655..e6474c23d1 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java @@ -24,6 +24,7 @@ import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialCl import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialClientDO; import cn.iocoder.yudao.module.system.dal.mysql.social.SocialClientMapper; +import cn.iocoder.yudao.module.system.dal.redis.RedisKeyConstants; import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; import com.binarywang.spring.starter.wxjava.miniapp.properties.WxMaProperties; import com.binarywang.spring.starter.wxjava.mp.properties.WxMpProperties; @@ -48,6 +49,7 @@ import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl; import me.chanjar.weixin.mp.config.impl.WxMpRedisConfigImpl; import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.annotation.Cacheable; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; @@ -265,6 +267,7 @@ public class SocialClientServiceImpl implements SocialClientService { } @Override + @Cacheable(cacheNames = RedisKeyConstants.WXA_SUBSCRIBE_TEMPLATE, key = "#userType", condition = "#result != null") public List getSubscribeTemplateList(Integer userType) { WxMaService service = getWxMaService(userType); try { From 0cca6be63a22f8a3e625356ed3b3daa5f7b1fbaa Mon Sep 17 00:00:00 2001 From: puhui999 Date: Tue, 30 Jul 2024 16:55:58 +0800 Subject: [PATCH 21/26] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91MALL:?= =?UTF-8?q?=20=E8=AE=A2=E5=8D=95=E5=8F=91=E8=B4=A7=E8=AE=A2=E9=98=85?= =?UTF-8?q?=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../trade/enums/MessageTemplateConstants.java | 12 +--------- .../order/TradeOrderUpdateServiceImpl.java | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java index 0aebe56137..1bed7864d3 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java @@ -17,16 +17,6 @@ public interface MessageTemplateConstants { //======================= 小程序订阅消息模版 ======================= String TRADE_AFTER_SALE_CHANGE = "售后进度通知"; - - /** - * 售后进度通知相关参数枚举 - * - * @author HUIHUI - */ - class TradeAfterSaleChangeReqParams { - - public static final String ORDER_DELIVERY = "order_delivery"; - - } + String DELIVERY_ORDER = "订单发货通知"; } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java index c5ab35d62f..a6b206798e 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.trade.service.order; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjUtil; @@ -19,6 +20,8 @@ import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderRespDTO; import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum; import cn.iocoder.yudao.module.product.api.comment.ProductCommentApi; import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDTO; +import cn.iocoder.yudao.module.system.api.social.SocialClientApi; +import cn.iocoder.yudao.module.system.api.social.dto.SocialWxaSubscribeMessageSendReqDTO; import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderDeliveryReqVO; import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderRemarkReqVO; import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderUpdateAddressReqVO; @@ -52,6 +55,7 @@ import cn.iocoder.yudao.module.trade.service.price.calculator.TradePriceCalculat import jakarta.annotation.Resource; import jakarta.validation.constraints.NotNull; import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -67,6 +71,7 @@ import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.min import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP; import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getTerminal; import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*; +import static cn.iocoder.yudao.module.trade.enums.MessageTemplateConstants.DELIVERY_ORDER; /** * 交易订单【写】Service 实现类 @@ -78,6 +83,8 @@ import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*; @Slf4j public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { + public static final String ORDER_DETAIL_PATH = "pages/order/detail"; // 订单详情页 + @Resource private TradeOrderMapper tradeOrderMapper; @Resource @@ -103,6 +110,8 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { private MemberAddressApi addressApi; @Resource private ProductCommentApi productCommentApi; + @Resource + public SocialClientApi socialClientApi; @Resource private TradeOrderProperties tradeOrderProperties; @@ -367,6 +376,21 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { // 4. 发送站内信 tradeMessageService.sendMessageWhenDeliveryOrder(new TradeOrderMessageWhenDeliveryOrderReqBO() .setOrderId(order.getId()).setUserId(order.getUserId()).setMessage(null)); + // 5. 发送订阅消息 + getSelf().sendDeliveryOrderMessage(order, deliveryReqVO); + } + + @Async + public void sendDeliveryOrderMessage(TradeOrderDO order, TradeOrderDeliveryReqVO deliveryReqVO) { + // 构建并发送模版消息 + Long orderId = order.getId(); + socialClientApi.sendWxaSubscribeMessage(new SocialWxaSubscribeMessageSendReqDTO().setPage(ORDER_DETAIL_PATH + "?id=" + orderId) + .setUserId(order.getUserId()).setUserType(UserTypeEnum.MEMBER.getValue()).setTemplateTitle(DELIVERY_ORDER) + .addMessage("character_string3", String.valueOf(orderId)) // 订单编号 + .addMessage("phrase6", TradeOrderStatusEnum.DELIVERED.getName()) // 订单状态 + .addMessage("date4", LocalDateTimeUtil.formatNormal(LocalDateTime.now()))// 发货时间 + .addMessage("character_string5", deliveryReqVO.getLogisticsNo()) // 快递单号 + .addMessage("thing9", order.getReceiverDetailAddress())); // 收货地址 } /** From 7782b36f90dc907e894645fdff03dc069c5cb7fe Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 30 Jul 2024 23:12:06 +0800 Subject: [PATCH 22/26] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E3=80=91SYSTEM=EF=BC=9A=E5=BE=AE=E4=BF=A1=E5=B0=8F?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=9A=84=E8=AE=A2=E9=98=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../combination/CombinationRecordServiceImpl.java | 2 +- .../service/aftersale/AfterSaleServiceImpl.java | 2 ++ .../service/order/TradeOrderUpdateServiceImpl.java | 9 +++++---- .../handler/TradeCombinationOrderHandler.java | 3 +++ .../module/pay/enums/MessageTemplateConstants.java | 1 + .../wallet/PayWalletRechargeServiceImpl.java | 14 ++++++++------ .../src/main/resources/application-local.yaml | 6 ++++-- 7 files changed, 24 insertions(+), 13 deletions(-) diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java index e4d2fdb30d..9512852612 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java @@ -66,7 +66,7 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { private ProductSkuApi productSkuApi; @Resource - @Lazy + @Lazy // 延迟加载,避免循环依赖 private TradeOrderApi tradeOrderApi; // TODO @芋艿:在详细预览下; diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/AfterSaleServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/AfterSaleServiceImpl.java index cd6b6a13ce..df3d2db607 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/AfterSaleServiceImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/AfterSaleServiceImpl.java @@ -33,6 +33,7 @@ import cn.iocoder.yudao.module.trade.service.delivery.DeliveryExpressService; import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService; import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.TransactionSynchronization; @@ -56,6 +57,7 @@ import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*; public class AfterSaleServiceImpl implements AfterSaleService { @Resource + @Lazy // 延迟加载,避免循环依赖 private TradeOrderUpdateService tradeOrderUpdateService; @Resource private TradeOrderQueryService tradeOrderQueryService; diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java index a6b206798e..504c55e78a 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java @@ -83,8 +83,6 @@ import static cn.iocoder.yudao.module.trade.enums.MessageTemplateConstants.DELIV @Slf4j public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { - public static final String ORDER_DETAIL_PATH = "pages/order/detail"; // 订单详情页 - @Resource private TradeOrderMapper tradeOrderMapper; @Resource @@ -373,6 +371,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { MapUtil.builder().put("expressName", express != null ? express.getName() : "") .put("logisticsNo", express != null ? deliveryReqVO.getLogisticsNo() : "").build()); + // TODO @puhui999:可以改成 4.1 4.2。因为都算通知哈; // 4. 发送站内信 tradeMessageService.sendMessageWhenDeliveryOrder(new TradeOrderMessageWhenDeliveryOrderReqBO() .setOrderId(order.getId()).setUserId(order.getUserId()).setMessage(null)); @@ -384,8 +383,10 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { public void sendDeliveryOrderMessage(TradeOrderDO order, TradeOrderDeliveryReqVO deliveryReqVO) { // 构建并发送模版消息 Long orderId = order.getId(); - socialClientApi.sendWxaSubscribeMessage(new SocialWxaSubscribeMessageSendReqDTO().setPage(ORDER_DETAIL_PATH + "?id=" + orderId) - .setUserId(order.getUserId()).setUserType(UserTypeEnum.MEMBER.getValue()).setTemplateTitle(DELIVERY_ORDER) + socialClientApi.sendWxaSubscribeMessage(new SocialWxaSubscribeMessageSendReqDTO() + .setUserId(order.getUserId()).setUserType(UserTypeEnum.MEMBER.getValue()) + .setTemplateTitle(DELIVERY_ORDER) + .setPage("pages/order/detail?id=" + orderId) // 订单详情页 .addMessage("character_string3", String.valueOf(orderId)) // 订单编号 .addMessage("phrase6", TradeOrderStatusEnum.DELIVERED.getName()) // 订单状态 .addMessage("date4", LocalDateTimeUtil.formatNormal(LocalDateTime.now()))// 发货时间 diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeCombinationOrderHandler.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeCombinationOrderHandler.java index e3892dcd59..9216258db7 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeCombinationOrderHandler.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeCombinationOrderHandler.java @@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum; import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum; import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService; import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import jakarta.annotation.Resource; @@ -28,11 +29,13 @@ import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_DELIV public class TradeCombinationOrderHandler implements TradeOrderHandler { @Resource + @Lazy // 延迟加载,避免循环依赖 private TradeOrderUpdateService orderUpdateService; @Resource private TradeOrderQueryService orderQueryService; @Resource + @Lazy // 延迟加载,避免循环依赖 private CombinationRecordApi combinationRecordApi; @Override diff --git a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java index 7031f1d427..5f2cf8965d 100644 --- a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java +++ b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java @@ -10,6 +10,7 @@ public interface MessageTemplateConstants { //======================= 小程序订阅消息 ======================= String WALLET_RECHARGER_PAID = "充值成功通知"; + // TODO @puhui999:这个放在售后那。aftersale String WALLET_RECHARGE_REFUNDED = "退款申请通知"; } diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java index a5d1cec3d2..4414c88813 100644 --- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java +++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java @@ -59,8 +59,6 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService { private static final String WALLET_RECHARGE_ORDER_SUBJECT = "钱包余额充值"; - public static final String WALLET_MONEY_PATH = "pages/user/wallet/money"; // 钱包详情页 - @Resource private PayWalletRechargeMapper walletRechargeMapper; @Resource @@ -148,8 +146,10 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService { // 1. 获得会员钱包信息 PayWalletDO wallet = payWalletService.getWallet(walletRecharge.getWalletId()); // 2. 构建并发送模版消息 - socialClientApi.sendWxaSubscribeMessage(new SocialWxaSubscribeMessageSendReqDTO().setPage(WALLET_MONEY_PATH) - .setUserId(wallet.getUserId()).setUserType(wallet.getUserType()).setTemplateTitle(WALLET_RECHARGER_PAID) + socialClientApi.sendWxaSubscribeMessage(new SocialWxaSubscribeMessageSendReqDTO() + .setUserId(wallet.getUserId()).setUserType(wallet.getUserType()) + .setTemplateTitle(WALLET_RECHARGER_PAID) + .setPage("pages/user/wallet/money") // 钱包详情界面 .addMessage("character_string1", String.valueOf(payOrderId)) // 支付单编号 .addMessage("amount2", fenToYuanStr(walletRecharge.getTotalPrice())) // 充值金额 .addMessage("time3", LocalDateTimeUtil.formatNormal(walletRecharge.getCreateTime())) // 充值时间 @@ -229,8 +229,10 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService { PayWalletDO wallet = payWalletService.getWallet(walletId); // 2. 构建并发送模版消息 String thing8 = PayRefundStatusEnum.isSuccess(payRefund.getStatus()) ? SUCCESS.getName() : FAILURE.getName(); - socialClientApi.sendWxaSubscribeMessage(new SocialWxaSubscribeMessageSendReqDTO().setPage(WALLET_MONEY_PATH) - .setUserId(wallet.getUserId()).setUserType(wallet.getUserType()).setTemplateTitle(WALLET_RECHARGE_REFUNDED) + socialClientApi.sendWxaSubscribeMessage(new SocialWxaSubscribeMessageSendReqDTO() + .setUserId(wallet.getUserId()).setUserType(wallet.getUserType()) + .setTemplateTitle(WALLET_RECHARGE_REFUNDED) + .setPage("pages/user/wallet/money") // 钱包详情界面 .addMessage("character_string1", String.valueOf(payRefund.getId())) // 退款订单编号 .addMessage("time7", LocalDateTimeUtil.formatNormal(payRefund.getCreateTime())) // 申请时间 .addMessage("amount3", fenToYuanStr(payRefund.getRefundPrice())) // 退款金额 diff --git a/yudao-server/src/main/resources/application-local.yaml b/yudao-server/src/main/resources/application-local.yaml index 269e20e834..9c0e5f57d3 100644 --- a/yudao-server/src/main/resources/application-local.yaml +++ b/yudao-server/src/main/resources/application-local.yaml @@ -195,10 +195,12 @@ wx: miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档 # appid: wx62056c0d5e8db250 # 测试号(牛希尧提供的) # secret: 333ae72f41552af1e998fe1f54e1584a - appid: wx63c280fe3248a3e7 # wenhualian的接口测试号 - secret: 6f270509224a7ae1296bbf1c8cb97aed +# appid: wx63c280fe3248a3e7 # wenhualian的接口测试号 +# secret: 6f270509224a7ae1296bbf1c8cb97aed # appid: wxc4598c446f8a9cb3 # 测试号(Kongdy 提供的) # secret: 4a1a04e07f6a4a0751b39c3064a92c8b + appid: wx66186af0759f47c9 # 测试号(puhui 提供的) + secret: 3218bcbd112cbc614c7264ceb20144ac config-storage: type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取 key-prefix: wa # Redis Key 的前缀 From 2bc96fe5216dd8413532701c6277ddd6482ffbeb Mon Sep 17 00:00:00 2001 From: puhui999 Date: Wed, 31 Jul 2024 12:58:06 +0800 Subject: [PATCH 23/26] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E3=80=91SYSTEM=EF=BC=9A=E8=AE=A2=E9=98=85=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E8=B7=B3=E8=BD=AC=E5=B0=8F=E7=A8=8B=E5=BA=8F=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../trade/service/order/TradeOrderUpdateServiceImpl.java | 5 ++--- .../system/service/social/SocialClientServiceImpl.java | 9 +++++++-- yudao-server/src/main/resources/application-local.yaml | 2 ++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java index 504c55e78a..4bba58f4e1 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java @@ -371,11 +371,10 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { MapUtil.builder().put("expressName", express != null ? express.getName() : "") .put("logisticsNo", express != null ? deliveryReqVO.getLogisticsNo() : "").build()); - // TODO @puhui999:可以改成 4.1 4.2。因为都算通知哈; - // 4. 发送站内信 + // 4.1 发送站内信 tradeMessageService.sendMessageWhenDeliveryOrder(new TradeOrderMessageWhenDeliveryOrderReqBO() .setOrderId(order.getId()).setUserId(order.getUserId()).setMessage(null)); - // 5. 发送订阅消息 + // 4.2 发送订阅消息 getSelf().sendDeliveryOrderMessage(order, deliveryReqVO); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java index 273f6616ff..46993b622b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java @@ -73,7 +73,7 @@ import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; public class SocialClientServiceImpl implements SocialClientService { /** - * 小程序版本 + * 小程序码要打开的小程序版本 * * 1. release:正式版 * 2. trial:体验版 @@ -81,6 +81,11 @@ public class SocialClientServiceImpl implements SocialClientService { */ @Value("${yudao.wxa-code.env-version:release}") public String envVersion; + /** + * 订阅消息跳转小程序类型:developer为开发版;trial为体验版;formal为正式版; + */ + @Value("${yudao.wxa-subscribe-message.miniprogram-state:formal}") + public String miniprogramState; @Resource private AuthRequestFactory authRequestFactory; @@ -307,7 +312,7 @@ public class SocialClientServiceImpl implements SocialClientService { String templateId, String openId) { // 设置订阅消息基本参数 WxMaSubscribeMessage subscribeMessage = new WxMaSubscribeMessage().setLang(WxMaConstants.MiniProgramLang.ZH_CN) - .setMiniprogramState(envVersion).setTemplateId(templateId).setToUser(openId).setPage(reqDTO.getPage()); + .setMiniprogramState(miniprogramState).setTemplateId(templateId).setToUser(openId).setPage(reqDTO.getPage()); // 设置具体消息参数 Map messages = reqDTO.getMessages(); if (CollUtil.isNotEmpty(messages)) { diff --git a/yudao-server/src/main/resources/application-local.yaml b/yudao-server/src/main/resources/application-local.yaml index a3a7700804..bd33bd33b3 100644 --- a/yudao-server/src/main/resources/application-local.yaml +++ b/yudao-server/src/main/resources/application-local.yaml @@ -223,6 +223,8 @@ yudao: demo: false # 关闭演示模式 wxa-code: env-version: develop # 小程序版本: 正式版为 "release";体验版为 "trial";开发版为 "develop" + wxa-subscribe-message: + miniprogram-state: developer # 跳转小程序类型:developer为开发版;trial为体验版;formal为正式版; tencent-lbs-key: TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E # QQ 地图的密钥 https://lbs.qq.com/service/staticV2/staticGuide/staticDoc justauth: From b678da810e922c0dc080f3678e99179d27953845 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Wed, 31 Jul 2024 16:26:08 +0800 Subject: [PATCH 24/26] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91MALL?= =?UTF-8?q?=EF=BC=9A=E6=8B=BC=E5=9B=A2=E7=BB=93=E6=9E=9C=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E8=AE=A2=E9=98=85=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enums/MessageTemplateConstants.java | 14 ++++++++++ .../CombinationRecordServiceImpl.java | 27 ++++++++++++++++++- .../trade/enums/MessageTemplateConstants.java | 1 - .../pay/enums/MessageTemplateConstants.java | 2 -- .../wallet/PayWalletRechargeServiceImpl.java | 21 --------------- 5 files changed, 40 insertions(+), 25 deletions(-) create mode 100644 yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/MessageTemplateConstants.java diff --git a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/MessageTemplateConstants.java b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/MessageTemplateConstants.java new file mode 100644 index 0000000000..83e6ecde85 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/MessageTemplateConstants.java @@ -0,0 +1,14 @@ +package cn.iocoder.yudao.module.promotion.enums; + +/** + * 通知模板枚举类 + * + * @author HUIHUI + */ +public interface MessageTemplateConstants { + + //======================= 小程序订阅消息模版 ======================= + + String COMBINATION_RESULT = "拼团结果通知"; + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java index 9512852612..10022ad6ca 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjUtil; import cn.hutool.extra.spring.SpringUtil; import cn.iocoder.yudao.framework.common.core.KeyValue; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.module.member.api.user.MemberUserApi; @@ -23,11 +24,14 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationP import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationRecordDO; import cn.iocoder.yudao.module.promotion.dal.mysql.combination.CombinationRecordMapper; import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum; +import cn.iocoder.yudao.module.system.api.social.SocialClientApi; +import cn.iocoder.yudao.module.system.api.social.dto.SocialWxaSubscribeMessageSendReqDTO; import cn.iocoder.yudao.module.trade.api.order.TradeOrderApi; import jakarta.annotation.Nullable; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -40,6 +44,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.afterNow; import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.beforeNow; import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; +import static cn.iocoder.yudao.module.promotion.enums.MessageTemplateConstants.COMBINATION_RESULT; // TODO 芋艿:等拼团记录做完,完整 review 下 @@ -68,6 +73,8 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { @Resource @Lazy // 延迟加载,避免循环依赖 private TradeOrderApi tradeOrderApi; + @Resource + public SocialClientApi socialClientApi; // TODO @芋艿:在详细预览下; @Override @@ -205,7 +212,25 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { } updateRecords.add(updateRecord); }); - combinationRecordMapper.updateBatch(updateRecords); + Boolean result = combinationRecordMapper.updateBatch(updateRecords); + + // 3. 拼团成功发送订阅消息 + if (result && isFull) { + records.forEach(item -> { + getSelf().sendCombinationResultMessage(item); + }); + } + } + + @Async + public void sendCombinationResultMessage(CombinationRecordDO record) { + // 构建并发送模版消息 + socialClientApi.sendWxaSubscribeMessage(new SocialWxaSubscribeMessageSendReqDTO() + .setUserId(record.getUserId()).setUserType(UserTypeEnum.MEMBER.getValue()) + .setTemplateTitle(COMBINATION_RESULT) + .setPage("pages/order/detail?id=" + record.getOrderId()) // 订单详情页 + .addMessage("thing1", "商品拼团活动") // 活动标题 + .addMessage("thing2", "恭喜您拼团成功!我们将尽快为您发货。")); // 温馨提示 } @Override diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java index 1bed7864d3..195a9fde24 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java @@ -16,7 +16,6 @@ public interface MessageTemplateConstants { //======================= 小程序订阅消息模版 ======================= - String TRADE_AFTER_SALE_CHANGE = "售后进度通知"; String DELIVERY_ORDER = "订单发货通知"; } diff --git a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java index 5f2cf8965d..b25d7645d2 100644 --- a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java +++ b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java @@ -10,7 +10,5 @@ public interface MessageTemplateConstants { //======================= 小程序订阅消息 ======================= String WALLET_RECHARGER_PAID = "充值成功通知"; - // TODO @puhui999:这个放在售后那。aftersale - String WALLET_RECHARGE_REFUNDED = "退款申请通知"; } diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java index 4414c88813..1d334d1b5f 100644 --- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java +++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java @@ -40,7 +40,6 @@ import static cn.iocoder.yudao.framework.common.util.number.MoneyUtils.fenToYuan import static cn.iocoder.yudao.module.pay.convert.wallet.PayWalletRechargeConvert.INSTANCE; import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.module.pay.enums.MessageTemplateConstants.WALLET_RECHARGER_PAID; -import static cn.iocoder.yudao.module.pay.enums.MessageTemplateConstants.WALLET_RECHARGE_REFUNDED; import static cn.iocoder.yudao.module.pay.enums.refund.PayRefundStatusEnum.*; /** @@ -218,26 +217,6 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService { } // 3. 更新钱包充值的退款字段 walletRechargeMapper.updateByIdAndRefunded(id, WAITING.getStatus(), updateObj); - - // 4. 发送订阅消息 - getSelf().sendWalletRechargeRefundedMessage(walletRecharge.getWalletId(), payRefund); - } - - @Async - public void sendWalletRechargeRefundedMessage(Long walletId, PayRefundDO payRefund) { - // 1. 获得会员钱包信息 - PayWalletDO wallet = payWalletService.getWallet(walletId); - // 2. 构建并发送模版消息 - String thing8 = PayRefundStatusEnum.isSuccess(payRefund.getStatus()) ? SUCCESS.getName() : FAILURE.getName(); - socialClientApi.sendWxaSubscribeMessage(new SocialWxaSubscribeMessageSendReqDTO() - .setUserId(wallet.getUserId()).setUserType(wallet.getUserType()) - .setTemplateTitle(WALLET_RECHARGE_REFUNDED) - .setPage("pages/user/wallet/money") // 钱包详情界面 - .addMessage("character_string1", String.valueOf(payRefund.getId())) // 退款订单编号 - .addMessage("time7", LocalDateTimeUtil.formatNormal(payRefund.getCreateTime())) // 申请时间 - .addMessage("amount3", fenToYuanStr(payRefund.getRefundPrice())) // 退款金额 - .addMessage("thing4", payRefund.getReason()) // 退款原因 - .addMessage("thing8", thing8 + ",点击卡片查看详情")); // 温馨提示 } private PayRefundDO validateWalletRechargeCanRefunded(PayWalletRechargeDO walletRecharge, Long payRefundId) { From ba187885172e42054231103760560dd8c8ddde0d Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 31 Jul 2024 19:48:02 +0800 Subject: [PATCH 25/26] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E3=80=91SYSTEM=EF=BC=9A=E5=BE=AE=E4=BF=A1=E5=B0=8F?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=9A=84=E8=AE=A2=E9=98=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../promotion/enums/MessageTemplateConstants.java | 2 +- .../combination/CombinationRecordServiceImpl.java | 8 ++++---- .../module/trade/enums/MessageTemplateConstants.java | 12 ++++++------ .../brokerage/BrokerageWithdrawServiceImpl.java | 4 ++-- .../service/message/TradeMessageServiceImpl.java | 2 +- .../service/order/TradeOrderUpdateServiceImpl.java | 4 ++-- .../module/pay/enums/MessageTemplateConstants.java | 4 ++-- .../service/wallet/PayWalletRechargeServiceImpl.java | 4 ++-- .../service/social/SocialClientServiceImpl.java | 6 +++++- .../src/main/resources/application-local.yaml | 2 +- 10 files changed, 26 insertions(+), 22 deletions(-) diff --git a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/MessageTemplateConstants.java b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/MessageTemplateConstants.java index 83e6ecde85..9a6bdd41df 100644 --- a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/MessageTemplateConstants.java +++ b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/MessageTemplateConstants.java @@ -9,6 +9,6 @@ public interface MessageTemplateConstants { //======================= 小程序订阅消息模版 ======================= - String COMBINATION_RESULT = "拼团结果通知"; + String COMBINATION_SUCCESS = "拼团结果通知"; } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java index 10022ad6ca..1f7c9a073b 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java @@ -44,7 +44,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.afterNow; import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.beforeNow; import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; -import static cn.iocoder.yudao.module.promotion.enums.MessageTemplateConstants.COMBINATION_RESULT; +import static cn.iocoder.yudao.module.promotion.enums.MessageTemplateConstants.COMBINATION_SUCCESS; // TODO 芋艿:等拼团记录做完,完整 review 下 @@ -212,10 +212,10 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { } updateRecords.add(updateRecord); }); - Boolean result = combinationRecordMapper.updateBatch(updateRecords); + Boolean updateSuccess = combinationRecordMapper.updateBatch(updateRecords); // 3. 拼团成功发送订阅消息 - if (result && isFull) { + if (updateSuccess && isFull) { records.forEach(item -> { getSelf().sendCombinationResultMessage(item); }); @@ -227,7 +227,7 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { // 构建并发送模版消息 socialClientApi.sendWxaSubscribeMessage(new SocialWxaSubscribeMessageSendReqDTO() .setUserId(record.getUserId()).setUserType(UserTypeEnum.MEMBER.getValue()) - .setTemplateTitle(COMBINATION_RESULT) + .setTemplateTitle(COMBINATION_SUCCESS) .setPage("pages/order/detail?id=" + record.getOrderId()) // 订单详情页 .addMessage("thing1", "商品拼团活动") // 活动标题 .addMessage("thing2", "恭喜您拼团成功!我们将尽快为您发货。")); // 温馨提示 diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java index 195a9fde24..56c4c90055 100644 --- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java +++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java @@ -7,15 +7,15 @@ package cn.iocoder.yudao.module.trade.enums; */ public interface MessageTemplateConstants { - //======================= 短信消息模版 ======================= + // ======================= 短信消息模版 ======================= - String ORDER_DELIVERY = "order_delivery"; // 短信模版编号 + String SMS_ORDER_DELIVERY = "order_delivery"; // 短信模版编号 - String BROKERAGE_WITHDRAW_AUDIT_APPROVE = "brokerage_withdraw_audit_approve"; // 佣金提现(审核通过) - String BROKERAGE_WITHDRAW_AUDIT_REJECT = "brokerage_withdraw_audit_reject"; // 佣金提现(审核不通过) + String SMS_BROKERAGE_WITHDRAW_AUDIT_APPROVE = "brokerage_withdraw_audit_approve"; // 佣金提现(审核通过) + String SMS_BROKERAGE_WITHDRAW_AUDIT_REJECT = "brokerage_withdraw_audit_reject"; // 佣金提现(审核不通过) - //======================= 小程序订阅消息模版 ======================= + // ======================= 小程序订阅消息模版 ======================= - String DELIVERY_ORDER = "订单发货通知"; + String WXA_ORDER_DELIVERY = "订单发货通知"; } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawServiceImpl.java index 0560c33d84..c735163a52 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawServiceImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawServiceImpl.java @@ -77,14 +77,14 @@ public class BrokerageWithdrawServiceImpl implements BrokerageWithdrawService { String templateCode; if (BrokerageWithdrawStatusEnum.AUDIT_SUCCESS.equals(status)) { - templateCode = MessageTemplateConstants.BROKERAGE_WITHDRAW_AUDIT_APPROVE; + templateCode = MessageTemplateConstants.SMS_BROKERAGE_WITHDRAW_AUDIT_APPROVE; // 3.1 通过时佣金转余额 if (BrokerageWithdrawTypeEnum.WALLET.getType().equals(withdraw.getType())) { // todo 疯狂: } // TODO 疯狂:调用转账接口 } else if (BrokerageWithdrawStatusEnum.AUDIT_FAIL.equals(status)) { - templateCode = MessageTemplateConstants.BROKERAGE_WITHDRAW_AUDIT_REJECT; + templateCode = MessageTemplateConstants.SMS_BROKERAGE_WITHDRAW_AUDIT_REJECT; // 3.2 驳回时需要退还用户佣金 brokerageRecordService.addBrokerage(withdraw.getUserId(), BrokerageRecordBizTypeEnum.WITHDRAW_REJECT, String.valueOf(withdraw.getId()), withdraw.getPrice(), BrokerageRecordBizTypeEnum.WITHDRAW_REJECT.getTitle()); diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/message/TradeMessageServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/message/TradeMessageServiceImpl.java index eefd26c6e1..a06c069064 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/message/TradeMessageServiceImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/message/TradeMessageServiceImpl.java @@ -37,7 +37,7 @@ public class TradeMessageServiceImpl implements TradeMessageService { notifyMessageSendApi.sendSingleMessageToMember( new NotifySendSingleToUserReqDTO() .setUserId(reqBO.getUserId()) - .setTemplateCode(MessageTemplateConstants.ORDER_DELIVERY) + .setTemplateCode(MessageTemplateConstants.SMS_ORDER_DELIVERY) .setTemplateParams(msgMap)); } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java index 4bba58f4e1..3c31d13b58 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java @@ -71,7 +71,7 @@ import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.min import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP; import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getTerminal; import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*; -import static cn.iocoder.yudao.module.trade.enums.MessageTemplateConstants.DELIVERY_ORDER; +import static cn.iocoder.yudao.module.trade.enums.MessageTemplateConstants.WXA_ORDER_DELIVERY; /** * 交易订单【写】Service 实现类 @@ -384,7 +384,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { Long orderId = order.getId(); socialClientApi.sendWxaSubscribeMessage(new SocialWxaSubscribeMessageSendReqDTO() .setUserId(order.getUserId()).setUserType(UserTypeEnum.MEMBER.getValue()) - .setTemplateTitle(DELIVERY_ORDER) + .setTemplateTitle(WXA_ORDER_DELIVERY) .setPage("pages/order/detail?id=" + orderId) // 订单详情页 .addMessage("character_string3", String.valueOf(orderId)) // 订单编号 .addMessage("phrase6", TradeOrderStatusEnum.DELIVERED.getName()) // 订单状态 diff --git a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java index b25d7645d2..9497d776b2 100644 --- a/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java +++ b/yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/MessageTemplateConstants.java @@ -7,8 +7,8 @@ package cn.iocoder.yudao.module.pay.enums; */ public interface MessageTemplateConstants { - //======================= 小程序订阅消息 ======================= + // ======================= 小程序订阅消息 ======================= - String WALLET_RECHARGER_PAID = "充值成功通知"; + String WXA_WALLET_RECHARGER_PAID = "充值成功通知"; } diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java index 1d334d1b5f..94c9fa6116 100644 --- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java +++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/wallet/PayWalletRechargeServiceImpl.java @@ -39,7 +39,7 @@ import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString import static cn.iocoder.yudao.framework.common.util.number.MoneyUtils.fenToYuanStr; import static cn.iocoder.yudao.module.pay.convert.wallet.PayWalletRechargeConvert.INSTANCE; import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.*; -import static cn.iocoder.yudao.module.pay.enums.MessageTemplateConstants.WALLET_RECHARGER_PAID; +import static cn.iocoder.yudao.module.pay.enums.MessageTemplateConstants.WXA_WALLET_RECHARGER_PAID; import static cn.iocoder.yudao.module.pay.enums.refund.PayRefundStatusEnum.*; /** @@ -147,7 +147,7 @@ public class PayWalletRechargeServiceImpl implements PayWalletRechargeService { // 2. 构建并发送模版消息 socialClientApi.sendWxaSubscribeMessage(new SocialWxaSubscribeMessageSendReqDTO() .setUserId(wallet.getUserId()).setUserType(wallet.getUserType()) - .setTemplateTitle(WALLET_RECHARGER_PAID) + .setTemplateTitle(WXA_WALLET_RECHARGER_PAID) .setPage("pages/user/wallet/money") // 钱包详情界面 .addMessage("character_string1", String.valueOf(payOrderId)) // 支付单编号 .addMessage("amount2", fenToYuanStr(walletRecharge.getTotalPrice())) // 充值金额 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java index 46993b622b..ba86165c33 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java @@ -82,7 +82,11 @@ public class SocialClientServiceImpl implements SocialClientService { @Value("${yudao.wxa-code.env-version:release}") public String envVersion; /** - * 订阅消息跳转小程序类型:developer为开发版;trial为体验版;formal为正式版; + * 订阅消息跳转小程序类型 + * + * 1. developer:开发版 + * 2. trial:体验版 + * 3. formal:正式版 */ @Value("${yudao.wxa-subscribe-message.miniprogram-state:formal}") public String miniprogramState; diff --git a/yudao-server/src/main/resources/application-local.yaml b/yudao-server/src/main/resources/application-local.yaml index bd33bd33b3..0c27aeac83 100644 --- a/yudao-server/src/main/resources/application-local.yaml +++ b/yudao-server/src/main/resources/application-local.yaml @@ -224,7 +224,7 @@ yudao: wxa-code: env-version: develop # 小程序版本: 正式版为 "release";体验版为 "trial";开发版为 "develop" wxa-subscribe-message: - miniprogram-state: developer # 跳转小程序类型:developer为开发版;trial为体验版;formal为正式版; + miniprogram-state: developer # 跳转小程序类型:开发版为 “developer”;体验版为 “trial”为;正式版为 “formal” tencent-lbs-key: TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E # QQ 地图的密钥 https://lbs.qq.com/service/staticV2/staticGuide/staticDoc justauth: From abe2f8580b3340e2064cca81696c02931b641c84 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 31 Jul 2024 23:47:02 +0800 Subject: [PATCH 26/26] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E3=80=91SYSTEM=EF=BC=9A=E5=BE=AE=E4=BF=A1=E5=B0=8F?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=9A=84=E8=AE=A2=E9=98=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../trade/service/order/TradeOrderUpdateServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java index 3c31d13b58..7acba7ddef 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java @@ -7,6 +7,7 @@ import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.extra.spring.SpringUtil; import cn.iocoder.yudao.framework.common.core.KeyValue; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; @@ -389,7 +390,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { .addMessage("character_string3", String.valueOf(orderId)) // 订单编号 .addMessage("phrase6", TradeOrderStatusEnum.DELIVERED.getName()) // 订单状态 .addMessage("date4", LocalDateTimeUtil.formatNormal(LocalDateTime.now()))// 发货时间 - .addMessage("character_string5", deliveryReqVO.getLogisticsNo()) // 快递单号 + .addMessage("character_string5", StrUtil.blankToDefault(deliveryReqVO.getLogisticsNo(), "-")) // 快递单号 .addMessage("thing9", order.getReceiverDetailAddress())); // 收货地址 }