From bf93bb740d46eb408c124d91c265b032c2a71922 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Mon, 6 Jul 2026 18:00:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=88=91=E7=9A=84=E9=A3=9F=E5=A0=82?= =?UTF-8?q?=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pjcloud/thirdparty/dto/jg/JgPusDto.java | 16 ++++ .../pjcloud-thirdparty-biz/pom.xml | 6 ++ .../bsd/pjcloud/thirdparty/ThirdPartyApp.java | 2 + .../pjcloud/thirdparty/config/JgConfig.java | 41 +++++++++++ .../config/initconfig/JgConfiguration.java | 34 +++++++++ .../thirdparty/job/ThirdAppJgPushJob.java | 50 +++++++++++++ .../service/ThirdJgPushService.java | 12 +++ .../impl/jg/ThirdThirdJgPushServiceImpl.java | 73 +++++++++++++++++++ .../src/main/resources/application.yml | 9 ++- .../api/dto/mch/WalletMchDeptViewDto.java | 4 + .../controller/mch/MchManageController.java | 19 ++--- .../mapper/mch/view/MchDeptViewMapper.java | 1 + .../wallet/service/MchManageService.java | 5 ++ .../impl/mch/MchManageServiceImpl.java | 27 +++++++ .../mapper/mch/view/MchDeptViewMapper.xml | 22 ++++++ 15 files changed, 307 insertions(+), 14 deletions(-) create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/jg/JgPusDto.java create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/JgConfig.java create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/initconfig/JgConfiguration.java create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/job/ThirdAppJgPushJob.java create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdJgPushService.java create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/jg/ThirdThirdJgPushServiceImpl.java diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/jg/JgPusDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/jg/JgPusDto.java new file mode 100644 index 00000000..0486432a --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/jg/JgPusDto.java @@ -0,0 +1,16 @@ +package com.bsd.pjcloud.thirdparty.dto.jg; + +import lombok.Data; + +import java.util.List; + +@Data +public class JgPusDto { + + private String title; + + private String subtitle; + + private List userIds; + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml index e277d21a..ff550308 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml @@ -17,6 +17,12 @@ com.bsd pjcloud-common-encrypt-api + + + io.github.jpush + jiguang-sdk + 5.3.1 + com.alipay.sdk diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/ThirdPartyApp.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/ThirdPartyApp.java index 4c92e039..b245c00f 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/ThirdPartyApp.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/ThirdPartyApp.java @@ -6,6 +6,7 @@ import com.bsd.pjcloud.common.swagger.annotation.EnableOpenApi; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.scheduling.annotation.EnableScheduling; /** * @author archetype auto @@ -16,6 +17,7 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnablePjcloudFeignClients @EnableDiscoveryClient @EnablePjcloudResourceServer +@EnableScheduling @SpringBootApplication public class ThirdPartyApp { public static void main(String[] args) { diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/JgConfig.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/JgConfig.java new file mode 100644 index 00000000..1d1af148 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/JgConfig.java @@ -0,0 +1,41 @@ +package com.bsd.pjcloud.thirdparty.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties(prefix = "jg") +@Data +public class JgConfig { + + + private JgPush jgPush; + + + @Data + public static class JgPush { + + /** + * 极光推送key + */ + private String appKey; + + /** + * 极光推送secret + */ + private String masterSecret; + + /** + * 通知默认大图标 + */ + private String largeIcon; + + /** + * 通知默认小图标 + */ + private String smallIconUri; + + } + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/initconfig/JgConfiguration.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/initconfig/JgConfiguration.java new file mode 100644 index 00000000..527f0d26 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/initconfig/JgConfiguration.java @@ -0,0 +1,34 @@ +package com.bsd.pjcloud.thirdparty.config.initconfig; + +import cn.jiguang.sdk.api.PushApi; +import com.bsd.pjcloud.thirdparty.config.AppPlusPayConfig; +import com.bsd.pjcloud.thirdparty.config.JgConfig; +import com.github.binarywang.wxpay.config.WxPayConfig; +import com.github.binarywang.wxpay.service.WxPayService; +import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; +import feign.Logger; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Slf4j +@Configuration +public class JgConfiguration { + + private final JgConfig jgConfig; + + public JgConfiguration(JgConfig jgConfig) { + this.jgConfig = jgConfig; + } + + @Bean + public PushApi initJgPush() { + JgConfig.JgPush jgPush = this.jgConfig.getJgPush(); + return new PushApi.Builder() + .setLoggerLevel(Logger.Level.FULL) + .setAppKey(jgPush.getAppKey()) + .setMasterSecret(jgPush.getMasterSecret()) + .build(); + } + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/job/ThirdAppJgPushJob.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/job/ThirdAppJgPushJob.java new file mode 100644 index 00000000..1798a814 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/job/ThirdAppJgPushJob.java @@ -0,0 +1,50 @@ +package com.bsd.pjcloud.thirdparty.job; + +import com.bsd.pjcloud.admin.api.feign.RemoteUserService; +import com.bsd.pjcloud.thirdparty.dto.jg.JgPusDto; +import com.bsd.pjcloud.thirdparty.service.ThirdJgPushService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +@Slf4j +@RequiredArgsConstructor +public class ThirdAppJgPushJob { + + private final ThirdJgPushService thirdJgPushService; + + private final RemoteUserService remoteUserService; + + private final List testUserIdList = List.of(2029755089492066305L, 2034824566572941314L); + + // 早饭提醒(每天早上6点7点) + @Scheduled(cron = "0 0 6,7 * * ?") + public void breakfastReminder() { + pushToAllUsers("早餐提醒", "早餐时间就要到了,请尽快预约哦!!"); + } + + // 午饭提醒(每天中午10点11点) + @Scheduled(cron = "0 0 10,11 * * ?") + public void lunchReminder() { + pushToAllUsers("午餐提醒", "午餐间就要到了,请尽快预约哦!!"); + } + + // 晚餐提醒(每天下午5点6点) + @Scheduled(cron = "0 0 17,18 * * ?") + public void dinnerReminder() { + pushToAllUsers("晚餐提醒", "晚餐时间就要到了,请尽快预约哦!!"); + } + + private void pushToAllUsers(String title, String subtitle) { + JgPusDto jgPusDto = new JgPusDto(); + jgPusDto.setTitle(title); + jgPusDto.setSubtitle(subtitle); + jgPusDto.setUserIds(testUserIdList); + thirdJgPushService.push(jgPusDto); + } + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdJgPushService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdJgPushService.java new file mode 100644 index 00000000..adaa704c --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdJgPushService.java @@ -0,0 +1,12 @@ +package com.bsd.pjcloud.thirdparty.service; + +import com.bsd.pjcloud.thirdparty.dto.jg.JgPusDto; + +/** + * 极光推送 + */ +public interface ThirdJgPushService { + + void push(JgPusDto jgPusDto); + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/jg/ThirdThirdJgPushServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/jg/ThirdThirdJgPushServiceImpl.java new file mode 100644 index 00000000..5e98d4c2 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/jg/ThirdThirdJgPushServiceImpl.java @@ -0,0 +1,73 @@ +package com.bsd.pjcloud.thirdparty.service.impl.jg; + +import cn.jiguang.sdk.api.PushApi; +import cn.jiguang.sdk.bean.push.PushSendParam; +import cn.jiguang.sdk.bean.push.PushSendResult; +import cn.jiguang.sdk.bean.push.audience.Audience; +import cn.jiguang.sdk.bean.push.message.notification.NotificationMessage; +import cn.jiguang.sdk.constants.ApiConstants; +import com.bsd.pjcloud.thirdparty.config.JgConfig; +import com.bsd.pjcloud.thirdparty.dto.jg.JgPusDto; +import com.bsd.pjcloud.thirdparty.service.ThirdJgPushService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.HashMap; +import java.util.Map; + +/** + * 极光推送 + */ +@Service +@Validated +@Slf4j +@RequiredArgsConstructor +public class ThirdThirdJgPushServiceImpl implements ThirdJgPushService { + + private final String TAG = "极光推送"; + + private final PushApi pushApi; + + private final JgConfig jgConfig; + + @Override + public void push(JgPusDto jgPusDto) { + PushSendParam param = new PushSendParam(); + JgConfig.JgPush jgPush = jgConfig.getJgPush(); + + // start 通知内容 android start + NotificationMessage.Android android = new NotificationMessage.Android(); + android.setAlert(jgPusDto.getTitle()); + android.setTitle(jgPusDto.getSubtitle()); + android.setLargeIcon(jgPush.getLargeIcon()); + android.setSmallIcon(jgPush.getSmallIconUri()); + // end 通知内容 android end + + // start 通知内容 ios start + NotificationMessage.IOS iOS = new NotificationMessage.IOS(); + Map iOSAlert = new HashMap<>(); + iOSAlert.put("title", jgPusDto.getTitle()); + iOSAlert.put("subtitle", jgPusDto.getSubtitle()); + // 通知级别 + iOSAlert.put("interruption-level", "active"); + iOS.setAlert(iOSAlert); + // end 通知内容 ios end + + NotificationMessage notificationMessage = new NotificationMessage(); + notificationMessage.setAlert(jgPusDto.getTitle()); + notificationMessage.setAndroid(android); + notificationMessage.setIos(iOS); + + Audience audience = new Audience(); + audience.setAliasList(jgPusDto.getUserIds().stream().map(String::valueOf).toList()); + + param.setNotification(notificationMessage); + param.setAudience(audience); + param.setPlatform(ApiConstants.Platform.ALL); + PushSendResult result = pushApi.send(param); + log.info("|{}|极光推送返回,result:|{}|", TAG, result); + } + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml index bebc5b8a..5b64ea08 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml @@ -212,4 +212,11 @@ aliyun: accessKeySecret: p4RIWlleFMH60cjuoeKl7YIBLS18v8 signName: 浙江资安信信息科技 template-codes: - verification: SMS_500945185 \ No newline at end of file + verification: SMS_500945185 + +jg: + jg-push: + app-key: 3877351c5811a35093f04476 + master-secret: 2a253b41ac1eaa96558c56ef + large-icon: https://public-com.zianxin.com/logo/60x60.png + small-icon-uri: https://public-com.zianxin.com/logo/320x320.png \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/mch/WalletMchDeptViewDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/mch/WalletMchDeptViewDto.java index 1f79560d..fb240fc9 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/mch/WalletMchDeptViewDto.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/mch/WalletMchDeptViewDto.java @@ -10,4 +10,8 @@ public class WalletMchDeptViewDto extends WalletMchDeptViewEntity { private List mchIdList; + private List deptIdList; + + private List mchTypeList; + } diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchManageController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchManageController.java index 1b077d02..bdd0d0a1 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchManageController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchManageController.java @@ -183,19 +183,12 @@ public class MchManageController { public R> appPageJoin(@ParameterObject Page page, @ParameterObject MchManageDto dto) { PjcloudUser user = SecurityUtils.getUser(); dto.setVisibleMobile(YesNoEnum.YES.getCode()); - if (ObjectUtil.isNotEmpty(user) && ObjectUtil.isNotEmpty(user.getDeptId())) { - UserInfo userInfo = remoteUserService.getInnerByUserId(user.getId()).getData(); - MchManageVo targetMch = mchManageService.getViewsCanteenMchByDeptId(userInfo.getSysUser().getDeptId()); - if (ObjectUtil.isNotEmpty(targetMch)) { - dto.setIds(List.of(targetMch.getId())); - } else { - List deptIdList = remoteDeptService.getDescendantList(userInfo.getSysUser().getDeptId()).getData(); - if (ObjectUtil.isNotEmpty(deptIdList)) { - dto.setDeptIds(deptIdList.stream().map(SysDept::getDeptId).toList()); - } - } - } else { - R.ok(new Page<>()); + List selfMchIdList = mchManageService.getSelfCanteenMchIdList(user.getId(), List.of(MerchantTypeEnum.CANTEEN)); + if (ObjectUtil.isNotEmpty(selfMchIdList)) { + List ids = dto.getIds(); + if (ObjectUtil.isEmpty(ids)) ids = new ArrayList<>(); + ids.addAll(selfMchIdList); + dto.setIds(ids); } return R.ok(mchManageService.pageJoin(page, dto)); } diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/view/MchDeptViewMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/view/MchDeptViewMapper.java index e93df381..a6a6ad4c 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/view/MchDeptViewMapper.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/view/MchDeptViewMapper.java @@ -16,4 +16,5 @@ public interface MchDeptViewMapper { WalletMchDeptViewVo selectByDeptId(@Param("deptId") Long deptId, @Param("mchTypeList") List mchTypeList); + List selectMchIdList(@Param("dto") WalletMchDeptViewDto dto); } diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchManageService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchManageService.java index 98ed67db..3abafb02 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchManageService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchManageService.java @@ -62,6 +62,11 @@ public interface MchManageService extends IService { */ String lbLogin(PjcloudUser user); + /** + * 获取用户的食堂商户列表 + */ + List getSelfCanteenMchIdList(Long userId,List mchTypeList); + /** * 判断用户是否能查看到所有食堂 */ diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchManageServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchManageServiceImpl.java index d4b36c62..ec4c1438 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchManageServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchManageServiceImpl.java @@ -33,6 +33,7 @@ import com.bsd.pjcloud.wallet.api.constant.mch.WalletMchSupType; import com.bsd.pjcloud.wallet.api.dto.MchManageDto; import com.bsd.pjcloud.wallet.api.dto.WalletTypeDto; import com.bsd.pjcloud.wallet.api.dto.mch.MchPaySettingDto; +import com.bsd.pjcloud.wallet.api.dto.mch.WalletMchDeptViewDto; import com.bsd.pjcloud.wallet.api.entity.mch.MchManageEntity; import com.bsd.pjcloud.wallet.api.entity.WalletTypeEntity; import com.bsd.pjcloud.wallet.api.utils.WalletDataUtil; @@ -469,6 +470,32 @@ public class MchManageServiceImpl extends ServiceImpl getSelfCanteenMchIdList(Long userId, List mchTypeList) { + List mchIds = new ArrayList<>(); + List deptIdList = new ArrayList<>(); + UserInfo userInfo = remoteUserService.getInnerByUserId(userId).getData(); + if (ObjectUtil.isEmpty(userInfo)) { + return mchIds; + } + deptIdList.add(userInfo.getSysUser().getDeptId()); + // 查询下级部门 + List descendantList = remoteDeptService.getDescendantList(userInfo.getSysUser().getDeptId()).getData(); + if (ObjectUtil.isNotEmpty(descendantList)) { + List descendantIds = descendantList.stream().map(SysDept::getDeptId).toList(); + if (ObjectUtil.isNotEmpty(descendantIds)) deptIdList.addAll(descendantIds); + } + + WalletMchDeptViewDto dto = new WalletMchDeptViewDto(); + dto.setDeptIdList(deptIdList); + dto.setMchTypeList(mchTypeList.stream().map(MerchantTypeEnum::getType).toList()); + List selfMchIdList = mchDeptViewMapper.selectMchIdList(dto); + if (ObjectUtil.isEmpty(selfMchIdList)) { + return mchIds; + } + return selfMchIdList; + } + /** * 判断用户是否能查看到所有食堂 */ diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/view/MchDeptViewMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/view/MchDeptViewMapper.xml index ebdf4118..39f73f49 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/view/MchDeptViewMapper.xml +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/view/MchDeptViewMapper.xml @@ -27,6 +27,18 @@ #{v} + + and a.deptId IN + + #{v} + + + + and a.mchType IN + + #{v} + + and a.mchName like concat('%',#{dto.mchName},'%') @@ -69,4 +81,14 @@ order by a.level asc limit 1 + +