diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index 6bdd852..4333424 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -17,6 +17,12 @@ + + com.github.binarywang + weixin-java-mp + 4.1.0 + + com.github.wechatpay-apiv3 wechatpay-apache-httpclient diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/WxMsgApi.java b/ruoyi-admin/src/main/java/com/ruoyi/api/WxMsgApi.java index 01ae65c..658ef11 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/WxMsgApi.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/WxMsgApi.java @@ -55,4 +55,8 @@ public class WxMsgApi { } + + + + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseCityController.java b/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseCityController.java index a6270b2..50ee81c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseCityController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseCityController.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.base.domain.BaseCity; import com.ruoyi.base.service.IBaseCityService; import com.ruoyi.base.vo.BaseCityVO; +import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; @@ -48,6 +49,7 @@ public class BaseCityController extends BaseController { * @date 15:11 2025/4/2 **/ @GetMapping("/treeCity") + @Anonymous public AjaxResult treeCity() { List list = baseCityService.treeCity(); return success(list); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiNoticeController.java b/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiNoticeController.java index 98fac60..dabe2cf 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiNoticeController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiNoticeController.java @@ -133,14 +133,9 @@ public class BusiNoticeController extends BaseController @Log(title = "通告", businessType = BusinessType.INSERT) @PostMapping("saveOrUpdate") - public AjaxResult saveOrUpdate(@RequestBody BusiNotice busiNotice) - { + public AjaxResult saveOrUpdate(@RequestBody BusiNotice busiNotice) throws Exception { JSONObject res = new JSONObject(); - try{ - res.put("noticeId", busiNoticeService.saveOrUpdateVo(busiNotice)); - } catch (Exception e){ - return error(e.getMessage()); - } + res.put("noticeId", busiNoticeService.saveOrUpdateVo(busiNotice)); return success(res); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiSubscribeController.java b/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiSubscribeController.java index c39ffd9..345e645 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiSubscribeController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiSubscribeController.java @@ -1,5 +1,6 @@ package com.ruoyi.busi.controller; +import cn.hutool.core.util.ArrayUtil; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.busi.domain.BusiSubscribe; @@ -14,6 +15,8 @@ import com.ruoyi.common.utils.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.Arrays; + /** * 订阅Controller * @@ -60,6 +63,16 @@ public class BusiSubscribeController extends BaseController { SubscribeDataObj subscribeDataObj = JSONObject.parseObject(busiSubscribe.getJsonObj(), SubscribeDataObj.class); busiSubscribe.setNewNotice(subscribeDataObj.getNewNotice()?"1":"0"); busiSubscribe.setForkNotice(subscribeDataObj.getForkNotice()?"1":"0"); + busiSubscribe.setBloggerTypeCode(String.join(",", subscribeDataObj.getBloggerTypeCode())); + busiSubscribe.setPlatformCode(String.join(",", subscribeDataObj.getPlatformCode())); + busiSubscribe.setSettleTypeCode(subscribeDataObj.getSettleTypeCode()); + busiSubscribe.setKeywordsList(String.join(",", subscribeDataObj.getKeywordsList())); + busiSubscribe.setFansLimit(subscribeDataObj.getFansLimit()?"1":"0"); + busiSubscribe.setFeeLimit(subscribeDataObj.getFeeLimit()?"1":"0"); + busiSubscribe.setFansUp(subscribeDataObj.getFansUp()); + busiSubscribe.setFansDown(subscribeDataObj.getFansDown()); + busiSubscribe.setFeeUp(subscribeDataObj.getFeeUp()); + busiSubscribe.setFeeDown(subscribeDataObj.getFeeDown()); busiSubscribeService.saveOrUpdate(busiSubscribe); return success(); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiSubscribe.java b/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiSubscribe.java index 051b78d..aa94e70 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiSubscribe.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiSubscribe.java @@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import com.ruoyi.common.core.domain.DlBaseEntity; +import java.util.List; + /** * 【请填写功能名称】对象 dl_busi_subscribe * @@ -37,4 +39,25 @@ public class BusiSubscribe extends DlBaseEntity //订阅通告主新通告0否 1是 private String forkNotice; + //领域 博主类型 + private String bloggerTypeCode; + //平台 + private String platformCode; + //结算方式类型 + private String settleTypeCode; + //关键词 + private String keywordsList; + //粉丝数量是否限制 + private String fansLimit; + //粉丝数量上限 + private Integer fansUp; + //粉丝数量下限 + private Integer fansDown; + //费用是否限制 + private String feeLimit; + //费用上限 + private Double feeDown; + //费用下限 + private Double feeUp; + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiSubscribeMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiSubscribeMapper.java index 4029cb1..b894aed 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiSubscribeMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiSubscribeMapper.java @@ -1,9 +1,13 @@ package com.ruoyi.busi.mapper; import java.util.List; + +import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.busi.domain.BusiSubscribe; +import com.ruoyi.busi.vo.SubScribeQuery; +import com.ruoyi.busi.vo.SubscribeDataObj; import org.apache.ibatis.annotations.Param; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @@ -17,4 +21,5 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface BusiSubscribeMapper extends BaseMapper { + List getOkUser(SubScribeQuery subscribeDataObj); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiSubscribeService.java b/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiSubscribeService.java index 9ac3496..b994add 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiSubscribeService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiSubscribeService.java @@ -1,10 +1,14 @@ package com.ruoyi.busi.service; import java.util.List; + +import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.busi.domain.BusiSubscribe; +import com.ruoyi.busi.vo.SubScribeQuery; +import com.ruoyi.busi.vo.SubscribeDataObj; /** * 订阅Service接口 @@ -14,4 +18,6 @@ import com.ruoyi.busi.domain.BusiSubscribe; */ public interface IBusiSubscribeService extends IService { + + List getOkUser(SubScribeQuery subscribeDataObj); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiNoticeServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiNoticeServiceImpl.java index 1f2e909..f9910b6 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiNoticeServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiNoticeServiceImpl.java @@ -1,10 +1,14 @@ package com.ruoyi.busi.service.impl; +import java.math.BigDecimal; import java.util.*; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.base.domain.BaseCategory; @@ -18,7 +22,9 @@ import com.ruoyi.busi.service.IBusiNoticeFormService; import com.ruoyi.busi.service.IBusiSubscribeService; import com.ruoyi.busi.service.IBusiUserLoveService; import com.ruoyi.busi.vo.BusiNoticeVo; +import com.ruoyi.busi.vo.SubScribeQuery; import com.ruoyi.busi.vo.SubscribeDataObj; +import com.ruoyi.common.config.WxAppConfig; import com.ruoyi.common.core.domain.DlBaseEntity; import java.util.stream.Collectors; @@ -36,11 +42,13 @@ import com.ruoyi.member.domain.MemberApply; import com.ruoyi.member.domain.MemberPoints; import com.ruoyi.member.domain.MemberUser; import com.ruoyi.member.service.*; +import com.ruoyi.payConfig.WechatPayConfig; import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.service.ISysDictDataService; import com.ruoyi.system.service.ISysDictTypeService; import com.ruoyi.system.service.ISysUserService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.busi.mapper.BusiNoticeMapper; @@ -87,8 +95,14 @@ public class BusiNoticeServiceImpl extends ServiceImpl queryListPage(BusiNoticeQuery query, Page page) { @@ -123,6 +137,7 @@ public class BusiNoticeServiceImpl extends ServiceImpl=0.7&&v2>=0.7){ //title 和 detail 相似度大于70% 待审核 data.setApprovalStatus("0"); + data.setApprovalTime(null); data.setSimilarityIds(Optional.ofNullable(data.getSimilarityIds()).orElse("")+busiNotice.getId()+","); } } @@ -130,6 +145,8 @@ public class BusiNoticeServiceImpl extends ServiceImpl content) { + /**小程序appid*/ + String APPLET_APPID=wxAppConfig.getAppId(); + /**公众号秘钥*/ + String OFFICIAL_ACCOUNT_SECRET=wechatPayConfig.getWxAppSecret(); + /**公众号appid*/ + String OFFICIAL_ACCOUNT_APPID=wechatPayConfig.getAppId(); + /**公众号模板id*/ + String OFFICIAL_ACCOUNT_TEMPLATE_ID="h646Xn1xNc70npuUI7C3bvrL0DxZQgf7wM0qKRqep5c"; + //获取需要推送的用户openid + String openid= content.get("openid"); + //获取用户token + String token = getAccessToken(OFFICIAL_ACCOUNT_APPID,OFFICIAL_ACCOUNT_SECRET); + + String resultStatus = "0";//0:失败,1:成功 + try { + //小程序统一消息推送 + String path = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + token; + //封装参数 + JSONObject jsonData = new JSONObject(); + //小程序用户的openid + jsonData.put("touser", openid); + //公众号模板ID + jsonData.put("template_id", OFFICIAL_ACCOUNT_TEMPLATE_ID); + + //公众号模板消息所要跳转的小程序,小程序的必须与公众号具有绑定关系 + JSONObject miniprogram = new JSONObject(); + //小程序APPID + miniprogram.put("appid",APPLET_APPID); + //跳转到小程序的页面路径 + miniprogram.put("pagepath","pages/notice/detail?id="+content.get("noticeId")); + jsonData.put("miniprogram", miniprogram); + //公众号消息数据封装 + JSONObject data = new JSONObject(); + //此处的参数key,需要对照模板中的key来设置 + data.put("thing15", getValue(content.get("noticeTitle"))); + data.put("thing2", getValue(content.get("platformName")));//联系方式 + data.put("thing19", getValue(content.get("tgzName")));//时间 + data.put("time78", getValue(content.get("startTime"))); + data.put("time38", getValue(content.get("endTime"))); + jsonData.put("data", data); + System.out.println("请求参数:"+jsonData); + String s = HttpUtil.post(path, jsonData.toJSONString()); + System.out.println("返回结果:"+s); + resultStatus="1"; + } catch (Exception e) { + log.error("微信公众号发送消息失败!"+e.getMessage()); + resultStatus="0"; + } + return resultStatus; + } + + + + /** + * 获取data + * @param value + * @return + */ + private JSONObject getValue(String value) { + // TODO Auto-generated method stub + JSONObject json = new JSONObject(); + json.put("value", value); + return json; + } + + + public void sendNoticeMsg(BusiNotice notice){ + //开始线程 + ThreadUtil.execute(()->{ + if(null!=notice){ + //推送分两个1:符合订阅设置的 2:符合关注的 + SubScribeQuery subScribeQuery =new SubScribeQuery(); + subScribeQuery.setBloggerTypeCode(StringUtils.isNotEmpty(notice.getBloggerTypes())?notice.getBloggerTypes().split(","):new String[]{}); + subScribeQuery.setPlatformCode(notice.getPlatformCode()); + //结算方式 + subScribeQuery.setSettleTypeCode(notice.getIsPlatformFree().toString()); + subScribeQuery.setFansDown(notice.getFansDown()); + subScribeQuery.setFansUp(notice.getFansUp()==null?999999999:notice.getFansUp()); + subScribeQuery.setFeeDown(notice.getFeeDown()); + subScribeQuery.setFeeUp(notice.getFeeUp()==null?new BigDecimal(999999999):notice.getFeeUp()); + subScribeQuery.setLoveUserId(notice.getUserId().toString()); + List okUser = subscribeService.getOkUser(subScribeQuery); + //过滤重复wxOpenId + List wxOpenIdList = new ArrayList<>(); + for (JSONObject jsonObject : okUser) { + //判断关键词是否满足 + boolean flag = true; + if (jsonObject.getString("allOk").equals("0")&&jsonObject.containsKey("keywordsList")&& StringUtils.isNotEmpty(jsonObject.getString("keywordsList"))){ + String[] split = jsonObject.getString("keywordsList").split(","); + flag = false; + for (String s : split) { + //判断关键词是否满足 + if (notice.getTitle().contains(s)) { + //满足关键词 + flag = true; + + break; + } + + } + } + if (flag){ + if (!wxOpenIdList.contains(jsonObject.getString("wxOpenId"))){ + wxOpenIdList.add(jsonObject.getString("wxOpenId")); + //推送消息 + Map content =new HashMap<>(); + content.put("openid",jsonObject.getString("wxOpenId")); + String noticeTitle = notice.getTitle(); + if (noticeTitle.length() > 20) { + noticeTitle = noticeTitle.substring(0, 19); + } + content.put("noticeTitle", noticeTitle); + content.put("platformName",baseCategoryService.selectByCode(notice.getPlatformCode()).get(0).getTitle()); + SysUser sysUser = userService.selectUserById(notice.getUserId()); + content.put("tgzName",sysUser.getNickName()); + content.put("startTime",DateUtil.format(notice.getApprovalTime(),"yyyy年MM月dd日 HH:mm")); + content.put("endTime",DateUtil.format(notice.getEndDate(),"yyyy年MM月dd日 HH:mm")); + push(content); + } + } + } + + + } + + }); + + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiSubscribeServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiSubscribeServiceImpl.java index c73ad30..627e280 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiSubscribeServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiSubscribeServiceImpl.java @@ -1,6 +1,10 @@ package com.ruoyi.busi.service.impl; import java.util.List; + +import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.busi.vo.SubScribeQuery; +import com.ruoyi.busi.vo.SubscribeDataObj; import com.ruoyi.common.utils.DateUtils; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -24,4 +28,8 @@ public class BusiSubscribeServiceImpl extends ServiceImpl getOkUser(SubScribeQuery subscribeDataObj) { + return busiSubscribeMapper.getOkUser(subscribeDataObj); + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/busi/utils/NoticeUtils.java b/ruoyi-admin/src/main/java/com/ruoyi/busi/utils/NoticeUtils.java index e8117da..ef2bdb0 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/busi/utils/NoticeUtils.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/busi/utils/NoticeUtils.java @@ -47,4 +47,6 @@ public class NoticeUtils { }); return String.join(" ",rtnList); } + + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/SubScribeQuery.java b/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/SubScribeQuery.java new file mode 100644 index 0000000..4b9cf3c --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/SubScribeQuery.java @@ -0,0 +1,30 @@ +package com.ruoyi.busi.vo; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@Data +public class SubScribeQuery { + //领域 博主类型 + private String[] bloggerTypeCode; + //平台 + private String platformCode; + //结算方式类型 + private String settleTypeCode; + //标题 + private String title; + private String content; + + //粉丝数量上限 + private Long fansUp; + //粉丝数量下限 + private Long fansDown; + + //费用上限 + private BigDecimal feeDown; + //费用下限 + private BigDecimal feeUp; + private String loveUserId; +} diff --git a/ruoyi-admin/src/main/resources/mapper/busi/BusiSubscribeMapper.xml b/ruoyi-admin/src/main/resources/mapper/busi/BusiSubscribeMapper.xml index e5d2c2c..9d64d09 100644 --- a/ruoyi-admin/src/main/resources/mapper/busi/BusiSubscribeMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/busi/BusiSubscribeMapper.xml @@ -17,5 +17,48 @@ select id, json_obj, create_time, update_time, creator, updater, del_flag from dl_busi_subscribe + + + + diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java index 7840141..c89535b 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java @@ -39,9 +39,12 @@ public class ThreadPoolConfig executor.setKeepAliveSeconds(keepAliveSeconds); // 线程池对拒绝任务(无线程可用)的处理策略 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + executor.initialize(); // 初始化 return executor; } + + /** * 执行周期性或定时任务 */