diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/app/TbCallServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/app/TbCallServiceImpl.java index ec1470a3..69bb7cb9 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/app/TbCallServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/app/TbCallServiceImpl.java @@ -19,6 +19,7 @@ import cn.ysk.cashier.pojo.shop.TbShopUser; import cn.ysk.cashier.repository.shop.TbShopInfoRepository; import cn.ysk.cashier.service.app.TbCallService; import cn.ysk.cashier.utils.Utils; +import cn.ysk.cashier.utils.WxMiniUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -41,6 +42,7 @@ public class TbCallServiceImpl implements TbCallService { private final TbShopInfoRepository shopInfoRepository; private final StringRedisTemplate redisTemplate; private final TbCallQueueMapper tbCallQueueMapper; + private final WxMiniUtils wxMiniUtils; @Override public Object add(CallTableDTO addCallTableDTO) { @@ -201,9 +203,50 @@ public class TbCallServiceImpl implements TbCallService { // 发送模板消息通知用户 + TbShopInfo shopInfo = shopInfoRepository.findById(callQueue.getShopId()).orElse(null); + if (shopInfo == null) { + throw new BadRequestException("店铺信息不存在"); + } + + List current = callQueueService.lambdaQuery() + .eq(TbCallQueue::getCallTableId, callQueue.getCallTableId()) + .and(r -> { + r.eq(TbCallQueue::getState, 1) + .or() + .eq(TbCallQueue::getState, 0); + }) + .orderByAsc(TbCallQueue::getCreateTime) + .page(new Page<>(1, 1)).getRecords(); + + if (StrUtil.isBlank(callQueue.getOpenId())) { + throw new BadRequestException("此用户未订阅微信小程序消息"); + } + + wxMiniUtils.sendNearCallMsg(shopInfo.getShopName(), getStrByState(Integer.valueOf(callQueue.getState())), + callQueue.getCallNum(), current.isEmpty() ? "" : current.get(0).getCallNum(), "排号信息", callQueue.getOpenId()); + return callQueueService.updateById(callQueue); } + private String getStrByState(Integer state) { + String msg = ""; + switch (state) { + case -1: + msg = "已取消"; + break; + case 0: + msg = "排队中"; + break; + case 1: + msg = "已到号"; + break; + case 3: + msg = "已过号"; + } + + return msg; + } + @Override public Object updateInfo(UpdateCallQueueDTO updateCallQueueDTO) { TbCallQueue callQueue = callQueueService.lambdaQuery() diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/utils/WxAccountUtil.java b/eladmin-system/src/main/java/cn/ysk/cashier/utils/WxAccountUtil.java index f870f5a1..4d5cd717 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/utils/WxAccountUtil.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/utils/WxAccountUtil.java @@ -156,4 +156,7 @@ public class WxAccountUtil { } } + + + } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/utils/WxMiniUtils.java b/eladmin-system/src/main/java/cn/ysk/cashier/utils/WxMiniUtils.java index f01cae4c..1b7b8421 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/utils/WxMiniUtils.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/utils/WxMiniUtils.java @@ -2,8 +2,10 @@ package cn.ysk.cashier.utils; import cn.hutool.core.util.ObjectUtil; import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -12,92 +14,100 @@ import java.util.LinkedHashMap; import java.util.Map; @Component +@Slf4j public class WxMiniUtils { -// @Value("${wx.msg.appId}") -// private String appId; -// -// @Value("${wx.msg.secrete}") -// private String secrete; -// -// @Value("${wx.msg.warnMsgTmpId}") -// private String msgTmpId; -// -// static LinkedHashMap linkedHashMap=new LinkedHashMap<>(); -// -// static { -// -// linkedHashMap.put("40001","获取 access_token 时 AppSecret 错误,或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的公众号调用接口"); -// linkedHashMap.put("40003","不合法的 OpenID ,请开发者确认 OpenID (该用户)是否已关注公众号,或是否是其他公众号的 OpenID"); -// linkedHashMap.put("40014","不合法的 access_token ,请开发者认真比对 access_token 的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口"); -// linkedHashMap.put("40037","不合法的 template_id"); -// linkedHashMap.put("43101","用户未订阅消息"); -// linkedHashMap.put("43107","订阅消息能力封禁"); -// linkedHashMap.put("43108","并发下发消息给同一个粉丝"); -// linkedHashMap.put("45168","命中敏感词"); -// linkedHashMap.put("47003","参数错误"); -// -// } -// -// public JSONObject getAccessToken(){ -// String requestUrl = "https://api.weixin.qq.com/cgi-bin/token"; -// Map requestUrlParam = new HashMap<>(); -// //小程序appId -// requestUrlParam.put("appid", appId); -// //小程序secret -// requestUrlParam.put("secret", secrete); -// //默认参数 -// requestUrlParam.put("grant_type", "client_credential"); -// JSONObject jsonObject = JSON.parseObject(HttpClientUtil.doGet(requestUrl,requestUrlParam)); -// return jsonObject; -// } -// -// public static void main(String[] args) { -// String id ="kSxJL9TR4s_UmOmNLE"; -//// sendStockWarnMsg("123", "1231", "1231", "23321", id); -// } -// -// public JSONObject sendStockWarnMsg(String shopName, String productName, String stock, String note, String toUserOpenId) { -// Map data = new HashMap() {{ -// put("thing1", new HashMap(){{ -// put("value", shopName); -// }}); -// put("thing6", new HashMap(){{ -// put("value", productName); -// }}); -// put("number7", new HashMap(){{ -// put("value", stock); -// }}); -// put("thing5", new HashMap(){{ -// put("value", note); -// }}); -// }}; -// log.info("开始发送库存预警消息, 接收用户openId: {}, 消息数据: {}", toUserOpenId, data); -// return sendTempMsg(msgTmpId, toUserOpenId, data); -// } -// -// -// public JSONObject sendTempMsg(String tempId, String toUserOpenId, Map data) { -// log.info("开始发送微信模板消息, 接收用户openId: {}, 消息数据: {}", toUserOpenId, data); -// JSONObject object= getAccessToken(); -// String accessToken=object.get("access_token")+""; -// -// JSONObject object1=new JSONObject(); -// -// object1.put("template_id", tempId); -// object1.put("touser", toUserOpenId); -// object1.put("data",data); -// -// object1.put("miniprogram_state","trial"); -// object1.put("lang","zh_CN"); -// -// String response= HttpRequest.post("https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=".concat(accessToken)).body(object1.toString()).execute().body(); -// log.info("微信模板消息发送成功,相应内容:{}",response); -// JSONObject resObj=JSONObject.parseObject(response); -// if(ObjectUtil.isNotEmpty(resObj)&&ObjectUtil.isNotNull(resObj)&&"0".equals(resObj.get("errcode")+"")){ -// return resObj; -// } -// -// throw new RuntimeException(linkedHashMap.getOrDefault(resObj.get("errcode") + "", "未知错误")); -// } + @Value("${wx.mini.user.appId}") + private String appId; + + @Value("${wx.mini.user.secrete}") + private String secrete; + + @Value("${wx.mini.user.msgId.currentCall}") + private String currentCallTempId; + + + static LinkedHashMap linkedHashMap=new LinkedHashMap<>(); + + static { + + linkedHashMap.put("40001","获取 access_token 时 AppSecret 错误,或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的公众号调用接口"); + linkedHashMap.put("40003","不合法的 OpenID ,请开发者确认 OpenID (该用户)是否已关注公众号,或是否是其他公众号的 OpenID"); + linkedHashMap.put("40014","不合法的 access_token ,请开发者认真比对 access_token 的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口"); + linkedHashMap.put("40037","不合法的 template_id"); + linkedHashMap.put("43101","用户未订阅消息"); + linkedHashMap.put("43107","订阅消息能力封禁"); + linkedHashMap.put("43108","并发下发消息给同一个粉丝"); + linkedHashMap.put("45168","命中敏感词"); + linkedHashMap.put("47003","参数错误"); + + } + + public JSONObject getAccessToken(){ + String requestUrl = "https://api.weixin.qq.com/cgi-bin/token"; + Map requestUrlParam = new HashMap<>(); + //小程序appId + requestUrlParam.put("appid", appId); + //小程序secret + requestUrlParam.put("secret", secrete); + //默认参数 + requestUrlParam.put("grant_type", "client_credential"); + return JSON.parseObject(HttpUtil.get(requestUrl,requestUrlParam)); + } + + public static void main(String[] args) { + String id ="kSxJL9TR4s_UmOmNLE"; +// sendStockWarnMsg("123", "1231", "1231", "23321", id); + } + + + public JSONObject sendTempMsg(String tempId, String toUserOpenId, Map data) { + log.info("开始发送微信模板消息, 接收用户openId: {}, 消息数据: {}", toUserOpenId, data); + JSONObject object= getAccessToken(); + String accessToken=object.get("access_token")+""; + + JSONObject object1=new JSONObject(); + + object1.put("template_id", tempId); + object1.put("touser", toUserOpenId); + object1.put("data",data); + + object1.put("miniprogram_state","trial"); + object1.put("lang","zh_CN"); + + String response= HttpRequest.post("https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=".concat(accessToken)).body(object1.toString()).execute().body(); + log.info("微信模板消息发送成功,相应内容:{}",response); + JSONObject resObj=JSONObject.parseObject(response); + if(ObjectUtil.isNotEmpty(resObj)&&ObjectUtil.isNotNull(resObj)&&"0".equals(resObj.get("errcode")+"")){ + return resObj; + } + + throw new RuntimeException(linkedHashMap.getOrDefault(resObj.get("errcode") + "", "未知错误")); + } + + public void sendNearCallMsg(String shopName, String state, String callNum, String currentNum, String note, String openId) { + Map data = new HashMap() {{ + put("thing1", new HashMap() {{ + put("value", shopName); + }}); + put("phrase2", new HashMap() {{ + put("value", state); + }}); + put("character_string3", new HashMap() {{ + put("value", callNum); + }}); + put("character_string4", new HashMap() {{ + put("value", currentNum); + }}); + put("thing5", new HashMap() {{ + put("value", note); + }}); + }}; + log.info("开始发送排号到号消息, 接收用户openId: {}, 消息数据: {}", openId, data); + try { + sendTempMsg(currentCallTempId, openId, data); + } catch (Exception e) { + log.error("发送失败, openId:{}, msg: {}", openId, e.getMessage()); + } + } }