From a09c3224edabacddf8aff6b170a318123a50b037 Mon Sep 17 00:00:00 2001 From: Wang Date: Wed, 21 Jan 2026 09:53:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9C=8D=E5=8A=A1=E5=8F=B7?= =?UTF-8?q?=E7=9A=84=E6=89=AB=E6=8F=8F=E5=90=8E=E8=87=AA=E5=8A=A8=E5=9B=9E?= =?UTF-8?q?=E5=A4=8D=E6=B6=88=E6=81=AF=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...iProgramApi.java => MpMiniProgramApi.java} | 2 +- ...ountApi.java => MpOfficialAccountApi.java} | 2 +- .../AdminMpAccountMenuController.java | 77 +++++++++ .../controller/req/MpActivityQueryReq.java | 2 +- .../service/AdminMpAccountMenuService.java | 161 ++++++++++++++++++ .../admin/service/AdminMpAccountService.java | 6 +- .../AppAgentActivityRelationController.java | 4 +- .../controller/req/AppActivityQueryReq.java | 2 +- .../resp/AgentActivityParticipantResp.java | 14 ++ .../app/controller/resp/AppActivityResp.java | 2 +- ... => IAppAgentActivityRelationService.java} | 2 +- ... AppAgentActivityRelationServiceImpl.java} | 33 +++- .../teach/mp/api/AppMiniProgramApiImpl.java | 2 +- .../mp/api/AppOfficialAccountApiImpl.java | 2 +- .../teach/mp/service/IMpActivityService.java | 11 +- .../service/impl/MpActivityServiceImpl.java | 16 +- .../strategy/MiniProgramLoginStrategy.java | 6 +- .../OfficialAccountLoginStrategy.java | 6 +- ...OfficialOauthWithAccountLoginStrategy.java | 6 +- .../WarehouseAccountLoginStrategy.java | 6 +- .../WechatChildrenAccountLoginStrategy.java | 6 +- 21 files changed, 323 insertions(+), 45 deletions(-) rename seer-mp/seer-mp-api/src/main/java/com/seer/teach/mp/api/{WechatMiniProgramApi.java => MpMiniProgramApi.java} (95%) rename seer-mp/seer-mp-api/src/main/java/com/seer/teach/mp/api/{WechatOfficialAccountApi.java => MpOfficialAccountApi.java} (96%) create mode 100644 seer-mp/seer-mp-service-admin/src/main/java/com/seer/teach/mp/admin/controller/AdminMpAccountMenuController.java create mode 100644 seer-mp/seer-mp-service-admin/src/main/java/com/seer/teach/mp/admin/service/AdminMpAccountMenuService.java rename seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/service/{IAppAgentActivityParticipantService.java => IAppAgentActivityRelationService.java} (93%) rename seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/service/impl/{AppAgentActivityParticipantServiceImpl.java => AppAgentActivityRelationServiceImpl.java} (77%) diff --git a/seer-mp/seer-mp-api/src/main/java/com/seer/teach/mp/api/WechatMiniProgramApi.java b/seer-mp/seer-mp-api/src/main/java/com/seer/teach/mp/api/MpMiniProgramApi.java similarity index 95% rename from seer-mp/seer-mp-api/src/main/java/com/seer/teach/mp/api/WechatMiniProgramApi.java rename to seer-mp/seer-mp-api/src/main/java/com/seer/teach/mp/api/MpMiniProgramApi.java index a978923..1270a73 100644 --- a/seer-mp/seer-mp-api/src/main/java/com/seer/teach/mp/api/WechatMiniProgramApi.java +++ b/seer-mp/seer-mp-api/src/main/java/com/seer/teach/mp/api/MpMiniProgramApi.java @@ -7,7 +7,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; @FeignClient(name = ApiConstants.SERVER_NAME, contextId = "wechatMiniProgramApi", path = "/seer/mp") -public interface WechatMiniProgramApi { +public interface MpMiniProgramApi { @GetMapping("/wechat/sns/jscode2session") WxMiniProgramSessionDTO code2Session(@RequestParam("code") String code); diff --git a/seer-mp/seer-mp-api/src/main/java/com/seer/teach/mp/api/WechatOfficialAccountApi.java b/seer-mp/seer-mp-api/src/main/java/com/seer/teach/mp/api/MpOfficialAccountApi.java similarity index 96% rename from seer-mp/seer-mp-api/src/main/java/com/seer/teach/mp/api/WechatOfficialAccountApi.java rename to seer-mp/seer-mp-api/src/main/java/com/seer/teach/mp/api/MpOfficialAccountApi.java index 3ac0548..3e8144f 100644 --- a/seer-mp/seer-mp-api/src/main/java/com/seer/teach/mp/api/WechatOfficialAccountApi.java +++ b/seer-mp/seer-mp-api/src/main/java/com/seer/teach/mp/api/MpOfficialAccountApi.java @@ -8,7 +8,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; @FeignClient(name = ApiConstants.SERVER_NAME, contextId = "wechatOfficialAccountApi", path = "/seer/mp") -public interface WechatOfficialAccountApi { +public interface MpOfficialAccountApi { /** * 获取用户用户信息和授权 Token diff --git a/seer-mp/seer-mp-service-admin/src/main/java/com/seer/teach/mp/admin/controller/AdminMpAccountMenuController.java b/seer-mp/seer-mp-service-admin/src/main/java/com/seer/teach/mp/admin/controller/AdminMpAccountMenuController.java new file mode 100644 index 0000000..4f74f57 --- /dev/null +++ b/seer-mp/seer-mp-service-admin/src/main/java/com/seer/teach/mp/admin/controller/AdminMpAccountMenuController.java @@ -0,0 +1,77 @@ +package com.seer.teach.mp.admin.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.seer.teach.common.PageListBean; +import com.seer.teach.common.ResultBean; +import com.seer.teach.mp.admin.controller.req.MpAccountPageReq; +import com.seer.teach.mp.admin.controller.req.MpAccountReq; +import com.seer.teach.mp.admin.controller.resp.AdminMpAccountResp; +import com.seer.teach.mp.admin.service.AdminMpAccountMenuService; +import com.seer.teach.mp.admin.service.AdminMpAccountService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + *

+ * 公众号菜单表 前端控制器 + *

+ * + * @author Wang + * @since 2025-08-02 15:45:13 + */ +@Tag(name = "管理端 - 公众号菜单") +@RequiredArgsConstructor +@RestController +@RequestMapping("/mp/account") +public class AdminMpAccountMenuController { + + private final AdminMpAccountMenuService adminMpAccountMenuService; + + @PostMapping("/create/menu") + @Operation(summary = "创建公众号菜单") + @SaCheckPermission("admin:mp:account:menu:create") + public ResultBean createAccountMenu(@Valid @RequestBody MpAccountReq createReqVO) { + return ResultBean.success(adminMpAccountMenuService.createAccount(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新公众号菜单") + @SaCheckPermission("admin:mp:account:menu:update") + public ResultBean updateAccountMenu(@Valid @RequestBody MpAccountReq updateReqVO) { + return ResultBean.success(adminMpAccountMenuService.updateAccount(updateReqVO)); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除公众号菜单") + @SaCheckPermission("admin:mp:account:menu:delete") + public ResultBean deleteAccountMenu(@RequestParam("id") Integer id) { + return ResultBean.success(adminMpAccountMenuService.deleteAccount(id)); + } + + @GetMapping("/detail") + @Operation(summary = "获得公众号菜单") + @SaCheckPermission("admin:mp:account:menu:query") + public ResultBean getAccountMenu(@RequestParam("id") Integer id) { + return ResultBean.success(adminMpAccountMenuService.getAccount(id)); + } + + + @GetMapping("/list") + @Operation(summary = "获取公众号菜单信息列表") + @SaCheckPermission("admin:mp:account:menu:list") + public ResultBean> getAccountMenuList() { + return ResultBean.success(adminMpAccountMenuService.getAccountList()); + } +} \ No newline at end of file diff --git a/seer-mp/seer-mp-service-admin/src/main/java/com/seer/teach/mp/admin/controller/req/MpActivityQueryReq.java b/seer-mp/seer-mp-service-admin/src/main/java/com/seer/teach/mp/admin/controller/req/MpActivityQueryReq.java index 5666250..0c708a5 100644 --- a/seer-mp/seer-mp-service-admin/src/main/java/com/seer/teach/mp/admin/controller/req/MpActivityQueryReq.java +++ b/seer-mp/seer-mp-service-admin/src/main/java/com/seer/teach/mp/admin/controller/req/MpActivityQueryReq.java @@ -11,6 +11,6 @@ public class MpActivityQueryReq extends PageRequest { @Schema(description = "活动名称") private String activityName; - @Schema(description = "活动状态:0-禁用,1-启用") + @Schema(description = "活动状态:-1-未开始,1-进行中,2-已结束") private Integer status; } \ No newline at end of file diff --git a/seer-mp/seer-mp-service-admin/src/main/java/com/seer/teach/mp/admin/service/AdminMpAccountMenuService.java b/seer-mp/seer-mp-service-admin/src/main/java/com/seer/teach/mp/admin/service/AdminMpAccountMenuService.java new file mode 100644 index 0000000..dc6a38a --- /dev/null +++ b/seer-mp/seer-mp-service-admin/src/main/java/com/seer/teach/mp/admin/service/AdminMpAccountMenuService.java @@ -0,0 +1,161 @@ + +package com.seer.teach.mp.admin.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.seer.teach.common.PageListBean; +import com.seer.teach.common.utils.PageConverterUtils; +import com.seer.teach.mp.admin.controller.req.MpAccountPageReq; +import com.seer.teach.mp.admin.controller.req.MpAccountReq; +import com.seer.teach.mp.admin.controller.resp.AdminMpAccountResp; +import com.seer.teach.mp.admin.convert.AdminMpAccountConvert; +import com.seer.teach.mp.api.MpOfficialAccountApi; +import com.seer.teach.mp.entity.MpAccountEntity; +import com.seer.teach.mp.factory.MpServiceFactory; +import com.seer.teach.mp.service.IMpAccountService; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.result.WxMpQrCodeTicket; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.List; + +@RequiredArgsConstructor +@Slf4j +@Validated +@Service +public class AdminMpAccountMenuService { + + private final IMpAccountService mpAccountService; + + private final MpOfficialAccountApi mpOfficialAccountApi; + + @Resource + @Lazy + private MpServiceFactory mpServiceFactory; + + public void loadCache() { + mpServiceFactory.init(); + mpOfficialAccountApi.initMpAccountCache(); + } + + /** + * 创建公众号账号 + * + * @param createReqVO 创建信息 + * @return 公众号账号ID + */ + public boolean createAccount(@Valid MpAccountReq createReqVO) { + MpAccountEntity mpAccount = AdminMpAccountConvert.INSTANCE.convertOne(createReqVO); + boolean result = mpAccountService.save(mpAccount); + log.info("[createAccount][创建公众号账号成功,结果为:{}]", result); + loadCache(); + log.info("[createAccount][刷新公众号緩存成功]"); + return result; + } + + /** + * 更新公众号账号 + * + * @param updateReqVO 更新信息 + * @return 是否更新成功 + */ + public Boolean updateAccount(@Valid MpAccountReq updateReqVO) { + MpAccountEntity mpAccount = AdminMpAccountConvert.INSTANCE.convertOne(updateReqVO); + boolean updated = mpAccountService.updateById(mpAccount); + log.info("[updateAccount][更新公众号账号成功,结果为:{}]", updated); + loadCache(); + log.info("[updateAccount][刷新公众号緩存成功]"); + return updated; + } + + /** + * 删除公众号账号 + * + * @param id 公众号账号ID + * @return 是否删除成功 + */ + public Boolean deleteAccount(Integer id) { + boolean removed = mpAccountService.removeById(id); + log.info("[deleteAccount][删除公众号账号成功,结果为:{}]", removed); + loadCache(); + log.info("[deleteAccount][刷新公众号緩存成功]"); + return removed; + } + + /** + * 获取公众号账号详情 + * + * @param id 公众号账号ID + * @return 公众号账号信息 + */ + public AdminMpAccountResp getAccount(Integer id) { + MpAccountEntity mpAccount = mpAccountService.getById(id); + return AdminMpAccountConvert.INSTANCE.convertOne(mpAccount); + } + + /** + * 分页获取公众号账号列表 + * + * @param pageReq 分页查询条件 + * @return 公众号账号分页结果 + */ + public PageListBean getAccountPage(MpAccountPageReq pageReq) { + Page pageParm = new Page<>(pageReq.getPageNo(), pageReq.getPageSize()); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (StringUtils.isNotBlank(pageReq.getAppId())) { + wrapper.like(MpAccountEntity::getAppId, pageReq.getAppId()); + } + if (StringUtils.isNotBlank(pageReq.getName())) { + wrapper.like(MpAccountEntity::getName, pageReq.getName()); + } + if (StringUtils.isNotBlank(pageReq.getAccount())) { + wrapper.like(MpAccountEntity::getAccount, pageReq.getAccount()); + } + IPage resultPage = mpAccountService.page(pageParm, wrapper); + + return PageConverterUtils.convertPageListBean(resultPage, AdminMpAccountConvert.INSTANCE::convertRespList); + } + + /** + * 获取所有公众号账号列表 + * + * @return 公众号账号列表 + */ + public List getAccountList() { + List accountList = mpAccountService.list(); + return AdminMpAccountConvert.INSTANCE.convertRespList(accountList); + } + + /** + * 生成公众号二维码 + * + * @param id 公众号账号ID + * @return 是否生成成功 + */ + public Boolean generateAccountQrCode(Integer id,String sceneStr) { + MpAccountEntity account = mpAccountService.getById(id); + WxMpService mpService = mpServiceFactory.getRequiredMpService(account.getAppId()); + String qrCodeUrl; + try { + WxMpQrCodeTicket qrCodeTicket = mpService.getQrcodeService().qrCodeCreateLastTicket(sceneStr); + qrCodeUrl = mpService.getQrcodeService().qrCodePictureUrl(qrCodeTicket.getTicket()); + } catch (WxErrorException e) { + log.error("生成公众号二维码失败", e); + return false; + } + MpAccountEntity updateAccount = new MpAccountEntity(); + updateAccount.setId(id); + updateAccount.setQrCodeUrl(qrCodeUrl); + + return mpAccountService.updateById(updateAccount); + } +} \ No newline at end of file diff --git a/seer-mp/seer-mp-service-admin/src/main/java/com/seer/teach/mp/admin/service/AdminMpAccountService.java b/seer-mp/seer-mp-service-admin/src/main/java/com/seer/teach/mp/admin/service/AdminMpAccountService.java index df97661..43e4dc1 100644 --- a/seer-mp/seer-mp-service-admin/src/main/java/com/seer/teach/mp/admin/service/AdminMpAccountService.java +++ b/seer-mp/seer-mp-service-admin/src/main/java/com/seer/teach/mp/admin/service/AdminMpAccountService.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.seer.teach.common.PageListBean; import com.seer.teach.common.utils.PageConverterUtils; -import com.seer.teach.mp.api.WechatOfficialAccountApi; +import com.seer.teach.mp.api.MpOfficialAccountApi; import com.seer.teach.mp.admin.controller.req.MpAccountPageReq; import com.seer.teach.mp.admin.controller.req.MpAccountReq; import com.seer.teach.mp.admin.controller.resp.AdminMpAccountResp; @@ -36,7 +36,7 @@ public class AdminMpAccountService { private final IMpAccountService mpAccountService; - private final WechatOfficialAccountApi wechatOfficialAccountApi; + private final MpOfficialAccountApi mpOfficialAccountApi; @Resource @Lazy @@ -44,7 +44,7 @@ public class AdminMpAccountService { public void loadCache() { mpServiceFactory.init(); - wechatOfficialAccountApi.initMpAccountCache(); + mpOfficialAccountApi.initMpAccountCache(); } /** diff --git a/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/AppAgentActivityRelationController.java b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/AppAgentActivityRelationController.java index 2caa311..74c30d3 100644 --- a/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/AppAgentActivityRelationController.java +++ b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/AppAgentActivityRelationController.java @@ -8,7 +8,7 @@ import com.seer.teach.common.annotation.EncryptionAnnotation; import com.seer.teach.common.annotation.LogPrint; import com.seer.teach.mp.app.controller.req.AppMpAgentActivityQrCodeQueryReq; import com.seer.teach.mp.app.controller.resp.AgentActivityParticipantResp; -import com.seer.teach.mp.app.service.IAppAgentActivityParticipantService; +import com.seer.teach.mp.app.service.IAppAgentActivityRelationService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; @@ -38,7 +38,7 @@ import java.util.List; @RequiredArgsConstructor public class AppAgentActivityRelationController { - private final IAppAgentActivityParticipantService agentActivityParticipantService; + private final IAppAgentActivityRelationService agentActivityParticipantService; @Operation(summary = "获取代理商参加的活动列表") @GetMapping() diff --git a/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/req/AppActivityQueryReq.java b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/req/AppActivityQueryReq.java index 6a34c67..bb6cdfe 100644 --- a/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/req/AppActivityQueryReq.java +++ b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/req/AppActivityQueryReq.java @@ -11,6 +11,6 @@ public class AppActivityQueryReq extends PageRequest { @Schema(description = "活动名称") private String activityName; - @Schema(description = "活动状态:0-禁用,1-启用") + @Schema(description = "活动状态:-1-未开始,1-进行中,2-已结束") private Integer status; } \ No newline at end of file diff --git a/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/resp/AgentActivityParticipantResp.java b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/resp/AgentActivityParticipantResp.java index 2c50ec5..61f3145 100644 --- a/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/resp/AgentActivityParticipantResp.java +++ b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/resp/AgentActivityParticipantResp.java @@ -3,6 +3,8 @@ package com.seer.teach.mp.app.controller.resp; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import java.time.LocalDateTime; + @Schema(name = "AgentActivityParticipant", description = "代理商活动参与记录") @Data public class AgentActivityParticipantResp { @@ -15,7 +17,19 @@ public class AgentActivityParticipantResp { @Schema(description = "代理商ID") private Integer agentId; + @Schema(description = "活动名称") private String activityName; + @Schema(description = "活动描述") + private String description; + + @Schema(description = "活动开始时间") + private LocalDateTime startTime; + + @Schema(description = "活动结束时间") + private LocalDateTime endTime; + + @Schema(description = "活动状态:-1-未开始,1-进行中,2-已结束") + private Integer status; } \ No newline at end of file diff --git a/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/resp/AppActivityResp.java b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/resp/AppActivityResp.java index 9be7d43..dd37e23 100644 --- a/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/resp/AppActivityResp.java +++ b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/controller/resp/AppActivityResp.java @@ -23,7 +23,7 @@ public class AppActivityResp { @Schema(description = "活动结束时间") private LocalDateTime endTime; - @Schema(description = "活动状态:0-禁用,1-启用") + @Schema(description = "活动状态:-1-未开始,1-进行中,2-已结束") private Integer status; @Schema(description = "创建时间") diff --git a/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/service/IAppAgentActivityParticipantService.java b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/service/IAppAgentActivityRelationService.java similarity index 93% rename from seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/service/IAppAgentActivityParticipantService.java rename to seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/service/IAppAgentActivityRelationService.java index 7713807..4d80622 100644 --- a/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/service/IAppAgentActivityParticipantService.java +++ b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/service/IAppAgentActivityRelationService.java @@ -13,7 +13,7 @@ import java.util.List; * @author Lingma * @since 2025-12-30 */ -public interface IAppAgentActivityParticipantService { +public interface IAppAgentActivityRelationService { /** * 根据活动ID和代理商ID获取参与记录 diff --git a/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/service/impl/AppAgentActivityParticipantServiceImpl.java b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/service/impl/AppAgentActivityRelationServiceImpl.java similarity index 77% rename from seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/service/impl/AppAgentActivityParticipantServiceImpl.java rename to seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/service/impl/AppAgentActivityRelationServiceImpl.java index d0b379a..3707077 100644 --- a/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/service/impl/AppAgentActivityParticipantServiceImpl.java +++ b/seer-mp/seer-mp-service-app/src/main/java/com/seer/teach/mp/app/service/impl/AppAgentActivityRelationServiceImpl.java @@ -11,7 +11,7 @@ import com.seer.teach.mp.app.controller.req.MpGenerateQrCodeReq; import com.seer.teach.mp.app.controller.resp.AgentActivityParticipantResp; import com.seer.teach.mp.app.controller.resp.MpQrCodeResp; import com.seer.teach.mp.app.service.AppOfficialQrCodeService; -import com.seer.teach.mp.app.service.IAppAgentActivityParticipantService; +import com.seer.teach.mp.app.service.IAppAgentActivityRelationService; import com.seer.teach.mp.app.service.IAppAgentService; import com.seer.teach.mp.entity.MpActivityEntity; import com.seer.teach.mp.entity.MpAgentActivityParticipantEntity; @@ -25,6 +25,7 @@ import org.springframework.stereotype.Service; import java.io.ByteArrayInputStream; import java.io.InputStream; +import java.time.LocalDateTime; import java.util.List; import java.util.Map; import java.util.Objects; @@ -42,9 +43,9 @@ import java.util.stream.Collectors; @Slf4j @Service @RequiredArgsConstructor -public class AppAgentActivityParticipantServiceImpl implements IAppAgentActivityParticipantService { +public class AppAgentActivityRelationServiceImpl implements IAppAgentActivityRelationService { - private final IMpAgentActivityRelationService agentActivityParticipantService; + private final IMpAgentActivityRelationService agentActivityRelationService; private final IAppAgentService appAgentService; @@ -63,14 +64,14 @@ public class AppAgentActivityParticipantServiceImpl implements IAppAgentActivity if(!userAgentIds.contains(agentId) ){ throw new CommonException(ResultCodeEnum.RELATION_NOT_FOUND); } - var participants = agentActivityParticipantService.getListByAgentId(agentId); + var participants = agentActivityRelationService.getListByAgentId(agentId); if (CollectionUtil.isEmpty(participants)) { return List.of(); } Set activityIds = participants.stream().map(MpAgentActivityParticipantEntity::getActivityId).collect(Collectors.toSet()); - List parentInfos = mpActivityService.listByIds(activityIds); + List parentInfos = mpActivityService.getEffectiveActivityListByIds(activityIds); var activityInfoMap = parentInfos.stream().collect(Collectors.toMap(MpActivityEntity::getId, activity -> activity)); @@ -89,10 +90,13 @@ public class AppAgentActivityParticipantServiceImpl implements IAppAgentActivity return ""; } - if(activity.getStatus() != 1){ + // 检查活动是否在有效时间内且处于启用状态 + LocalDateTime now = LocalDateTime.now(); + boolean isWithinTimeRange = !now.isBefore(activity.getStartTime()) && !now.isAfter(activity.getEndTime()); + if(activity.getStatus() != 1 || !isWithinTimeRange){ return ""; } - MpAgentActivityParticipantEntity relation = agentActivityParticipantService.getParticipantsByActivityAndAgent(activityId, agentId); + MpAgentActivityParticipantEntity relation = agentActivityRelationService.getParticipantsByActivityAndAgent(activityId, agentId); AssertUtils.notNull(relation, ResultCodeEnum.INVALID_ACTIVITY); if(StringUtils.isNotBlank(relation.getQrCodeUrl())){ return relation.getQrCodeUrl(); @@ -113,7 +117,7 @@ public class AppAgentActivityParticipantServiceImpl implements IAppAgentActivity relation.setQrCodeUrl(mpQrCodeResp.getQrCodeUrl()); } } - agentActivityParticipantService.updateById(relation); + agentActivityRelationService.updateById(relation); return mpQrCodeResp.getQrCodeUrl(); } @@ -126,6 +130,19 @@ public class AppAgentActivityParticipantServiceImpl implements IAppAgentActivity MpActivityEntity activity = activityInfoMap.get(entity.getActivityId()); if(Objects.nonNull(activity)){ resp.setActivityName(activity.getActivityName()); + resp.setDescription(activity.getDescription()); + resp.setStartTime(activity.getStartTime()); + resp.setEndTime(activity.getEndTime()); + + // 根据当前时间判断活动状态 + LocalDateTime now = LocalDateTime.now(); + if (now.isBefore(activity.getStartTime())) { + resp.setStatus(1); // 未开始 + } else if (now.isAfter(activity.getEndTime())) { + resp.setStatus(3); // 已结束 + } else { + resp.setStatus(1); // 进行中 + } } return resp; } diff --git a/seer-mp/seer-mp-service/src/main/java/com/seer/teach/mp/api/AppMiniProgramApiImpl.java b/seer-mp/seer-mp-service/src/main/java/com/seer/teach/mp/api/AppMiniProgramApiImpl.java index a2eb81c..215a2f5 100644 --- a/seer-mp/seer-mp-service/src/main/java/com/seer/teach/mp/api/AppMiniProgramApiImpl.java +++ b/seer-mp/seer-mp-service/src/main/java/com/seer/teach/mp/api/AppMiniProgramApiImpl.java @@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.RestController; @Slf4j @RequiredArgsConstructor @RestController -public class AppMiniProgramApiImpl implements WechatMiniProgramApi{ +public class AppMiniProgramApiImpl implements MpMiniProgramApi { private final IWechatMiniProgramService wechatMiniProgramService; diff --git a/seer-mp/seer-mp-service/src/main/java/com/seer/teach/mp/api/AppOfficialAccountApiImpl.java b/seer-mp/seer-mp-service/src/main/java/com/seer/teach/mp/api/AppOfficialAccountApiImpl.java index bc15302..cb56d04 100644 --- a/seer-mp/seer-mp-service/src/main/java/com/seer/teach/mp/api/AppOfficialAccountApiImpl.java +++ b/seer-mp/seer-mp-service/src/main/java/com/seer/teach/mp/api/AppOfficialAccountApiImpl.java @@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.RestController; @Slf4j @RestController -public class AppOfficialAccountApiImpl implements WechatOfficialAccountApi{ +public class AppOfficialAccountApiImpl implements MpOfficialAccountApi { @Autowired private MpServiceFactory mpServiceFactory; diff --git a/seer-mp/seer-mp-service/src/main/java/com/seer/teach/mp/service/IMpActivityService.java b/seer-mp/seer-mp-service/src/main/java/com/seer/teach/mp/service/IMpActivityService.java index a08a9ef..4c3ba4e 100644 --- a/seer-mp/seer-mp-service/src/main/java/com/seer/teach/mp/service/IMpActivityService.java +++ b/seer-mp/seer-mp-service/src/main/java/com/seer/teach/mp/service/IMpActivityService.java @@ -3,6 +3,7 @@ package com.seer.teach.mp.service; import com.baomidou.mybatisplus.extension.service.IService; import com.seer.teach.mp.entity.MpActivityEntity; +import java.util.Collection; import java.util.List; /** @@ -32,9 +33,11 @@ public interface IMpActivityService extends IService { */ boolean deleteActivity(Integer id); - /** - * 获取代理商活动名称列表 - * @return 代理商活动名称列表 + /** + * 根据ID查询代理商活动 + * + * @param ids 活动ID + * @return 活动实体 */ - List getActivityName(); + List getEffectiveActivityListByIds(Collection ids); } \ No newline at end of file diff --git a/seer-mp/seer-mp-service/src/main/java/com/seer/teach/mp/service/impl/MpActivityServiceImpl.java b/seer-mp/seer-mp-service/src/main/java/com/seer/teach/mp/service/impl/MpActivityServiceImpl.java index f83b193..7ceb587 100644 --- a/seer-mp/seer-mp-service/src/main/java/com/seer/teach/mp/service/impl/MpActivityServiceImpl.java +++ b/seer-mp/seer-mp-service/src/main/java/com/seer/teach/mp/service/impl/MpActivityServiceImpl.java @@ -1,10 +1,13 @@ package com.seer.teach.mp.service.impl; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.seer.teach.common.constants.CommonConstant; import com.seer.teach.common.enums.ResultCodeEnum; import com.seer.teach.common.utils.AssertUtils; +import com.seer.teach.common.utils.CommonUtils; import com.seer.teach.mp.entity.MpActivityEntity; import com.seer.teach.mp.entity.MpAgentActivityParticipantEntity; import com.seer.teach.mp.mapper.MpAgentActivityMapper; @@ -16,6 +19,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.time.LocalDateTime; +import java.util.Collection; import java.util.List; /** @@ -106,14 +110,16 @@ public class MpActivityServiceImpl extends ServiceImpl getActivityName() { - return this.list().stream() - .map(MpActivityEntity::getActivityName).toList(); + public List getEffectiveActivityListByIds(Collection ids) { + if(CollectionUtil.isEmpty(ids)){ + return List.of(); + } + return super.list(new LambdaQueryWrapper().in(MpActivityEntity::getId, ids).in(MpActivityEntity::getStatus, CommonConstant.ENABLE)); } + @Override public boolean saveOrUpdate(MpActivityEntity entity) { - boolean result = super.saveOrUpdate(entity); - return result; + return super.saveOrUpdate(entity); } } \ No newline at end of file diff --git a/seer-user/seer-user-service-app/src/main/java/com/seer/teach/user/app/auth/service/strategy/MiniProgramLoginStrategy.java b/seer-user/seer-user-service-app/src/main/java/com/seer/teach/user/app/auth/service/strategy/MiniProgramLoginStrategy.java index 66c3893..56216f2 100644 --- a/seer-user/seer-user-service-app/src/main/java/com/seer/teach/user/app/auth/service/strategy/MiniProgramLoginStrategy.java +++ b/seer-user/seer-user-service-app/src/main/java/com/seer/teach/user/app/auth/service/strategy/MiniProgramLoginStrategy.java @@ -8,7 +8,7 @@ import com.seer.teach.common.enums.RoleEnum; import com.seer.teach.common.enums.UserRelationEnum; import com.seer.teach.common.exception.CommonException; import com.seer.teach.common.utils.AssertUtils; -import com.seer.teach.mp.api.WechatMiniProgramApi; +import com.seer.teach.mp.api.MpMiniProgramApi; import com.seer.teach.mp.api.resp.WxMiniProgramSessionDTO; import com.seer.teach.user.app.auth.LoginType; import com.seer.teach.user.app.auth.request.LoginParam; @@ -45,7 +45,7 @@ import java.util.Objects; public class MiniProgramLoginStrategy extends AbstractLoginStrategy implements LoginStrategy { - private final WechatMiniProgramApi wechatMiniProgramApi; + private final MpMiniProgramApi mpMiniProgramApi; private final IUserService userService; @@ -70,7 +70,7 @@ public class MiniProgramLoginStrategy extends AbstractLoginStrategy implements L @Override public LoginUser authenticate(LoginParam request) { - WxMiniProgramSessionDTO wxMiniProgramSessionDTO = wechatMiniProgramApi.code2Session(request.getJsCode()); + WxMiniProgramSessionDTO wxMiniProgramSessionDTO = mpMiniProgramApi.code2Session(request.getJsCode()); AssertUtils.isTrue(wxMiniProgramSessionDTO.isSuccess(), ResultCodeEnum.WX_OAUTH_USED_ERROR); UserAuthEntity userAuth = userAuthService.getOneByOpenIdAndUnionId(wxMiniProgramSessionDTO.getOpenid(), wxMiniProgramSessionDTO.getUnionid()); boolean isExistsChildren = false; diff --git a/seer-user/seer-user-service-app/src/main/java/com/seer/teach/user/app/auth/service/strategy/OfficialAccountLoginStrategy.java b/seer-user/seer-user-service-app/src/main/java/com/seer/teach/user/app/auth/service/strategy/OfficialAccountLoginStrategy.java index 113a22a..05d9ddf 100644 --- a/seer-user/seer-user-service-app/src/main/java/com/seer/teach/user/app/auth/service/strategy/OfficialAccountLoginStrategy.java +++ b/seer-user/seer-user-service-app/src/main/java/com/seer/teach/user/app/auth/service/strategy/OfficialAccountLoginStrategy.java @@ -2,7 +2,7 @@ package com.seer.teach.user.app.auth.service.strategy; import com.seer.teach.common.enums.ResultCodeEnum; import com.seer.teach.common.utils.AssertUtils; -import com.seer.teach.mp.api.WechatOfficialAccountApi; +import com.seer.teach.mp.api.MpOfficialAccountApi; import com.seer.teach.mp.api.resp.WxOAuth2AccessTokenDTO; import com.seer.teach.user.app.auth.LoginType; import com.seer.teach.user.app.auth.request.LoginParam; @@ -26,7 +26,7 @@ import java.util.Objects; public class OfficialAccountLoginStrategy extends AbstractLoginStrategy implements LoginStrategy { @Autowired - private WechatOfficialAccountApi wechatOfficialAccountApi; + private MpOfficialAccountApi mpOfficialAccountApi; @Autowired private IUserService userService; @@ -42,7 +42,7 @@ public class OfficialAccountLoginStrategy extends AbstractLoginStrategy implemen @Override public LoginUser authenticate(LoginParam request) { log.info("微信公众号登录:{}",request); - WxOAuth2AccessTokenDTO wxOAuth2AccessToken = wechatOfficialAccountApi.getUserWxOAuth2AccessToken(request.getAppId(), request.getJsCode()); + WxOAuth2AccessTokenDTO wxOAuth2AccessToken = mpOfficialAccountApi.getUserWxOAuth2AccessToken(request.getAppId(), request.getJsCode()); log.debug("获取用户信息:{}",wxOAuth2AccessToken); AssertUtils.notNull(wxOAuth2AccessToken, ResultCodeEnum.WX_OAUTH_USED_ERROR); String userOpenId = wxOAuth2AccessToken.getOpenId(); diff --git a/seer-user/seer-user-service-app/src/main/java/com/seer/teach/user/app/auth/service/strategy/OfficialOauthWithAccountLoginStrategy.java b/seer-user/seer-user-service-app/src/main/java/com/seer/teach/user/app/auth/service/strategy/OfficialOauthWithAccountLoginStrategy.java index c28c344..2ff7ba5 100644 --- a/seer-user/seer-user-service-app/src/main/java/com/seer/teach/user/app/auth/service/strategy/OfficialOauthWithAccountLoginStrategy.java +++ b/seer-user/seer-user-service-app/src/main/java/com/seer/teach/user/app/auth/service/strategy/OfficialOauthWithAccountLoginStrategy.java @@ -5,7 +5,7 @@ import com.seer.teach.common.enums.ResultCodeEnum; import com.seer.teach.common.exception.CommonException; import com.seer.teach.common.utils.AssertUtils; import com.seer.teach.common.utils.CommonUtils; -import com.seer.teach.mp.api.WechatOfficialAccountApi; +import com.seer.teach.mp.api.MpOfficialAccountApi; import com.seer.teach.mp.api.resp.WxOAuth2AccessTokenDTO; import com.seer.teach.user.app.auth.LoginType; import com.seer.teach.user.app.auth.request.LoginParam; @@ -33,7 +33,7 @@ public class OfficialOauthWithAccountLoginStrategy extends AbstractLoginStrategy private final IUserService userService; @Autowired - private WechatOfficialAccountApi wechatOfficialAccountApi; + private MpOfficialAccountApi mpOfficialAccountApi; @Override public LoginType getType() { @@ -54,7 +54,7 @@ public class OfficialOauthWithAccountLoginStrategy extends AbstractLoginStrategy AssertUtils.notNull(accountUser, ResultCodeEnum.USERNAME_OR_PASSWORD_IS_ERROR); String password = CommonUtils.encryptPassword(request.getPassword()); if (password.equals(accountUser.getPassword())) { - WxOAuth2AccessTokenDTO wxOAuth2AccessToken = wechatOfficialAccountApi.getUserWxOAuth2AccessToken(request.getAppId(), request.getJsCode()); + WxOAuth2AccessTokenDTO wxOAuth2AccessToken = mpOfficialAccountApi.getUserWxOAuth2AccessToken(request.getAppId(), request.getJsCode()); log.debug("获取用户信息:{}",wxOAuth2AccessToken); AssertUtils.notNull(wxOAuth2AccessToken, ResultCodeEnum.WX_OAUTH_USED_ERROR); String userOpenId = wxOAuth2AccessToken.getOpenId(); diff --git a/seer-user/seer-user-service-app/src/main/java/com/seer/teach/user/app/auth/service/strategy/WarehouseAccountLoginStrategy.java b/seer-user/seer-user-service-app/src/main/java/com/seer/teach/user/app/auth/service/strategy/WarehouseAccountLoginStrategy.java index a3765d3..175a289 100644 --- a/seer-user/seer-user-service-app/src/main/java/com/seer/teach/user/app/auth/service/strategy/WarehouseAccountLoginStrategy.java +++ b/seer-user/seer-user-service-app/src/main/java/com/seer/teach/user/app/auth/service/strategy/WarehouseAccountLoginStrategy.java @@ -5,7 +5,7 @@ import com.seer.teach.common.enums.RoleEnum; import com.seer.teach.common.exception.CommonException; import com.seer.teach.common.utils.AssertUtils; import com.seer.teach.common.utils.CommonUtils; -import com.seer.teach.mp.api.WechatOfficialAccountApi; +import com.seer.teach.mp.api.MpOfficialAccountApi; import com.seer.teach.mp.api.resp.WxOAuth2AccessTokenDTO; import com.seer.teach.user.app.auth.LoginType; import com.seer.teach.user.app.auth.request.LoginParam; @@ -38,7 +38,7 @@ public class WarehouseAccountLoginStrategy extends AbstractLoginStrategy impleme private final IUserService userService; - private final WechatOfficialAccountApi wechatOfficialAccountApi; + private final MpOfficialAccountApi mpOfficialAccountApi; private final IUserAuthService userAuthService; @@ -68,7 +68,7 @@ public class WarehouseAccountLoginStrategy extends AbstractLoginStrategy impleme .findAny() .orElseThrow(() -> new CommonException(ResultCodeEnum.USER_NOT_HAVE_WAREHOUSE_ROLE)); - WxOAuth2AccessTokenDTO wxOAuth2AccessToken = wechatOfficialAccountApi.getUserWxOAuth2AccessToken(request.getAppId(),request.getJsCode()); + WxOAuth2AccessTokenDTO wxOAuth2AccessToken = mpOfficialAccountApi.getUserWxOAuth2AccessToken(request.getAppId(),request.getJsCode()); AssertUtils.notNull(wxOAuth2AccessToken, ResultCodeEnum.WX_OAUTH_USED_ERROR); UserAuthEntity userAuthEntity = userAuthService.getOneByOpenId(wxOAuth2AccessToken.getOpenId()); if (Objects.isNull(userAuthEntity)) { diff --git a/seer-user/seer-user-service-app/src/main/java/com/seer/teach/user/app/auth/service/strategy/WechatChildrenAccountLoginStrategy.java b/seer-user/seer-user-service-app/src/main/java/com/seer/teach/user/app/auth/service/strategy/WechatChildrenAccountLoginStrategy.java index 1c99f41..dcdd4c4 100644 --- a/seer-user/seer-user-service-app/src/main/java/com/seer/teach/user/app/auth/service/strategy/WechatChildrenAccountLoginStrategy.java +++ b/seer-user/seer-user-service-app/src/main/java/com/seer/teach/user/app/auth/service/strategy/WechatChildrenAccountLoginStrategy.java @@ -6,7 +6,7 @@ import com.seer.teach.common.exception.CommonException; import com.seer.teach.common.utils.AssertUtils; import com.seer.teach.common.utils.CommonUtils; import com.seer.teach.iot.api.UserDeviceServiceApi; -import com.seer.teach.mp.api.WechatMiniProgramApi; +import com.seer.teach.mp.api.MpMiniProgramApi; import com.seer.teach.mp.api.resp.WxMiniProgramSessionDTO; import com.seer.teach.user.app.auth.LoginType; import com.seer.teach.user.app.auth.request.LoginParam; @@ -35,7 +35,7 @@ public class WechatChildrenAccountLoginStrategy extends AbstractLoginStrategy im private final UserDeviceServiceApi userDeviceServiceApi; - private final WechatMiniProgramApi wechatMiniProgramApi; + private final MpMiniProgramApi mpMiniProgramApi; private final IUserRelationService userRelationService; @@ -54,7 +54,7 @@ public class WechatChildrenAccountLoginStrategy extends AbstractLoginStrategy im AssertUtils.notNull(accountUser, ResultCodeEnum.USERNAME_OR_PASSWORD_IS_ERROR); String password = CommonUtils.encryptPassword(request.getPassword()); if (password.equals(accountUser.getPassword())) { - WxMiniProgramSessionDTO miniProgramSessionDTO = wechatMiniProgramApi.code2Session(request.getJsCode()); + WxMiniProgramSessionDTO miniProgramSessionDTO = mpMiniProgramApi.code2Session(request.getJsCode()); AssertUtils.notNull(miniProgramSessionDTO, ResultCodeEnum.WX_SESSION_CODE_USED_ERROR); // 使用开关控制是否检查设备绑定 if (deviceCheckEnabled) {