From e140f12e1386948d819abead924b04121b2f437d Mon Sep 17 00:00:00 2001 From: huliyong <2783385703@qq.com> Date: Mon, 1 Sep 2025 17:07:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=8B=E5=8D=95=E7=AB=AF?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=B4=BE=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/api/model/AppletUsersTeacher.js | 5 +- .../src/views/model/AppletUsersTeacher/index.vue | 3 + .../views/model/AppletUsersTeacher/openindex.vue | 14 ++- .../src/main/resources/application-druid-root.yml | 19 ++-- .../applet/contoller/ApiMallOrderController.java | 6 +- .../contoller/ApiMallUserTeacherController.java | 6 +- .../service/impl/IApiMallOrderServiceImpl.java | 27 ++++-- .../com/ruoyi/applet/tencent/TaskConsumer.java | 7 +- .../controller/AppletUsersTeacherController.java | 69 ++++++++++++-- .../model/service/IAApiAppletLoginService.java | 1 + .../impl/AApiAppletHhrWorkOutServiceImpl.java | 13 ++- .../service/impl/AApiAppletLoginServiceImpl.java | 77 +++++++++++++++- .../impl/AppletOrderDateFrequencyServiceImpl.java | 26 +++++- .../impl/AppletUsersTeacherServiceImpl.java | 3 + .../com/ruoyi/common/core/sms/AliyunSmsUtils.java | 101 ++++++++++++++++++--- .../java/com/cyl/h5/service/H5MemberService.java | 87 ++++++++++++++++++ .../java/com/cyl/h5/service/H5OrderService.java | 9 +- 17 files changed, 415 insertions(+), 58 deletions(-) diff --git a/CatmDogd-Mall-Front-test/src/api/model/AppletUsersTeacher.js b/CatmDogd-Mall-Front-test/src/api/model/AppletUsersTeacher.js index 4e76c86..401ea77 100644 --- a/CatmDogd-Mall-Front-test/src/api/model/AppletUsersTeacher.js +++ b/CatmDogd-Mall-Front-test/src/api/model/AppletUsersTeacher.js @@ -27,11 +27,12 @@ export function addAppletUsersTeacher(data) { } // 修改伴宠师认证 -export function updateAppletUsersTeacher(data) { +export function updateAppletUsersTeacher(data, params) { return request({ url: '/model/AppletUsersTeacher', method: 'put', - data: data + data: data, + params }) } diff --git a/CatmDogd-Mall-Front-test/src/views/model/AppletUsersTeacher/index.vue b/CatmDogd-Mall-Front-test/src/views/model/AppletUsersTeacher/index.vue index c85a4b3..ad7073e 100644 --- a/CatmDogd-Mall-Front-test/src/views/model/AppletUsersTeacher/index.vue +++ b/CatmDogd-Mall-Front-test/src/views/model/AppletUsersTeacher/index.vue @@ -363,6 +363,9 @@ export default { form: {}, // 表单校验 rules: { + userId: [ + { required: true, message: "关联用户不能为空", trigger: "blur" } + ] }, columns: [ { key: 1, label: "关联用户", visible: true }, diff --git a/CatmDogd-Mall-Front-test/src/views/model/AppletUsersTeacher/openindex.vue b/CatmDogd-Mall-Front-test/src/views/model/AppletUsersTeacher/openindex.vue index f534820..33e63d1 100644 --- a/CatmDogd-Mall-Front-test/src/views/model/AppletUsersTeacher/openindex.vue +++ b/CatmDogd-Mall-Front-test/src/views/model/AppletUsersTeacher/openindex.vue @@ -29,6 +29,14 @@ + + + + + + + + @@ -333,6 +341,8 @@ export default { images: null, + answerStatus: null, + }, // 表单参数 form: {}, @@ -442,7 +452,9 @@ export default { this.$refs["form"].validate(valid => { if (valid) { if (this.form.id != null) { - updateAppletUsersTeacher(this.form).then(response => { + updateAppletUsersTeacher(this.form, { + action : 'check' + }).then(response => { this.$modal.msgSuccess("修改成功"); this.open = false; this.getList(); diff --git a/ruoyi-admin/src/main/resources/application-druid-root.yml b/ruoyi-admin/src/main/resources/application-druid-root.yml index 9620f57..6695d11 100644 --- a/ruoyi-admin/src/main/resources/application-druid-root.yml +++ b/ruoyi-admin/src/main/resources/application-druid-root.yml @@ -57,8 +57,8 @@ wechat: secret: 你的微信服务号密钥 merchantId: 1665639691 # privateKeyPath: /data/software/app/key/apiclient_key.pem -# privateKeyPath: E:\\file\\2025\\1\pet-admin\\ruoyi-admin\\src\\main\\resources\\apiclient_key.pem - privateKeyPath: E:\\file\\2025\\project\\1\pet-admin\\ruoyi-admin\\src\\main\\resources\\apiclient_key.pem + privateKeyPath: E:\\file\\2025\\1\pet-admin\\ruoyi-admin\\src\\main\\resources\\apiclient_key.pem +# privateKeyPath: E:\\file\\2025\\project\\1\pet-admin\\ruoyi-admin\\src\\main\\resources\\apiclient_key.pem # privateKeyPath: /root/pem/apiclient_key.pem # privateKeyPath: F:\\java_work\\team_work_java\\pet-admin-25-01-25\\pet-admin\\ruoyi-admin\\src\\main\\resources\\apiclient_key.pem #privateKeyPath: /Users/daixiande/Work/杂七杂八/1665639691_20240111_cert/apiclient_key.pem @@ -67,10 +67,10 @@ wechat: apiV2key: 19961022196901121965060120230731 # notifyUrl: https://api.catmdogd.com/prod-api/no-auth/wechat/notify # notifyUrlForBCHSH: https://api.catmdogd.com/prod-api/no-auth/wechat/notifyForBCHSH -# notifyUrl: https://pet-admin.hhlm1688.com/api/no-auth/wechat/notify -# notifyUrlForBCHSH: https://pet-admin.hhlm1688.com/api/no-auth/wechat/notifyForBCHSH - notifyUrl: http://h5.xzaiyp.top/no-auth/wechat/notify - notifyUrlForBCHSH: http://h5.xzaiyp.top/no-auth/wechat/notifyForBCHSH + notifyUrl: https://pet-admin.hhlm1688.com/api/no-auth/wechat/notify + notifyUrlForBCHSH: https://pet-admin.hhlm1688.com/api/no-auth/wechat/notifyForBCHSH +# notifyUrl: http://h5.xzaiyp.top/no-auth/wechat/notify +# notifyUrlForBCHSH: http://h5.xzaiyp.top/no-auth/wechat/notifyForBCHSH miniProgramAppId: wxd1a6ba7b5e17a5b6 miniProgramSecret: 06e946a2c9010f8eb9e306018a779a7f staffAppId: wx01f0f43759922fda @@ -134,8 +134,8 @@ wechat-admin: staffAppId: wx01f0f43759922fda staffSecret: b0a5617e6e4c387262a32af2b355c8b6 # publicKeyPath: /root/pem/pub_key.pem -# publicKeyPath: E:\\file\\2025\\1\pet-admin\\ruoyi-admin\\src\\main\\resources\\pub_key.pem - publicKeyPath: E:\\file\\2025\\project\\1\pet-admin\\ruoyi-admin\\src\\main\\resources\\pub_key.pem + publicKeyPath: E:\\file\\2025\\1\pet-admin\\ruoyi-admin\\src\\main\\resources\\pub_key.pem +# publicKeyPath: E:\\file\\2025\\project\\1\pet-admin\\ruoyi-admin\\src\\main\\resources\\pub_key.pem # publicKeyPath: /data/software/app/key/pub_key.pem publicKeyId: PUB_KEY_ID_0116656396912025062400291558001601 pay: @@ -165,3 +165,6 @@ wechat-admin: tencent: secretId: AKIDBNbfV9brwnRt89wVqDcGoHagYDmBZnna secretKey: cz96D9rPluvjKitrc9VfWSEqHWbUAh2D + + +payMangeDev: false \ No newline at end of file diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallOrderController.java b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallOrderController.java index 322e5bf..e39e65b 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallOrderController.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallOrderController.java @@ -207,7 +207,7 @@ public class ApiMallOrderController extends BaseController { if(appletOrder != null){ AppUsers appUsers = appUsersService.selectAppUsersByUserId(appletOrder.getUserId()); if (appUsers != null){ - AliyunSmsUtils.sendOrderUpdate(appUsers.getUserTelephone(), "取消订单", order.getId() + ""); + AliyunSmsUtils.sendOrderUpdate(appUsers.getUserTelephone(), AliyunSmsUtils.CANCEL, order.getId() + ""); } } AppletConfig appletConfig = appletConfigService.getByCode("admin_phone_list"); @@ -215,10 +215,12 @@ public class ApiMallOrderController extends BaseController { String adminPhoneList = appletConfig.getParamValueText(); if(StringUtils.isNotEmpty(adminPhoneList)){ for (String phone : adminPhoneList.split(",")) { - AliyunSmsUtils.sendOrderUpdate(phone, "取消订单", order.getId() + ""); + AliyunSmsUtils.sendOrderUpdate(phone, AliyunSmsUtils.CANCEL, order.getId() + ""); } } + AliyunSmsUtils.sendNotifyOrderCancel(order.getReceiverPhone()); + return AjaxResult.success(cancelResult); } catch (Exception e) { log.error("订单取消或退款申请失败", e); diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallUserTeacherController.java b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallUserTeacherController.java index 0da79ed..029a724 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallUserTeacherController.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallUserTeacherController.java @@ -354,17 +354,17 @@ public class ApiMallUserTeacherController extends BaseController { public AjaxResult bindCode(String code, String openId) { if (StringUtils.isEmpty(openId)){ - throw new ServiceException("openId不能为空"); + return AjaxResult.success(); } Member member = memberWechatService.isRegister(openId); if (member == null){ - throw new ServiceException("用户不存在"); + return AjaxResult.success(); } //判断当前用户有没有绑定 if (StringUtils.isNotEmpty(member.getInviteCode())){ - throw new ServiceException("已经绑定过了"); + return AjaxResult.success(); } AppUsers users = appUsersService.bindCode(code); diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/applet/service/impl/IApiMallOrderServiceImpl.java b/ruoyi-catdog/src/main/java/com/ruoyi/applet/service/impl/IApiMallOrderServiceImpl.java index 7e7c3e4..17db4ab 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/applet/service/impl/IApiMallOrderServiceImpl.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/applet/service/impl/IApiMallOrderServiceImpl.java @@ -58,6 +58,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; @@ -79,6 +80,9 @@ import java.util.stream.Stream; @Service public class IApiMallOrderServiceImpl implements IApiMallOrderService { + @Value("${payMangeDev}") + private boolean payMangeDev; + @Autowired private MemberAddressMapper memberAddressMapper; @@ -421,11 +425,14 @@ public class IApiMallOrderServiceImpl implements IApiMallOrderService { // 设置退款金额 WechatRefundUtil.AmountReq amountReq = new WechatRefundUtil.AmountReq(); -// amountReq.refund = order.getPayAmount().multiply(new BigDecimal(100)).longValue(); // 退款金额(分) -// amountReq.total = order.getPayAmount().multiply(new BigDecimal(100)).longValue(); // 原订单金额(分) - amountReq.refund = 1L; // 退款金额(分) - amountReq.total = 1L; // 原订单金额(分) + amountReq.refund = order.getPayAmount().multiply(new BigDecimal(100)).longValue(); // 退款金额(分) + amountReq.total = order.getPayAmount().multiply(new BigDecimal(100)).longValue(); // 原订单金额(分) + + if (payMangeDev){ + amountReq.refund = 1L; // 退款金额(分) + amountReq.total = 1L; // 原订单金额(分) + } amountReq.currency = "CNY"; // 货币类型 refundRequest.amount = amountReq; @@ -545,6 +552,14 @@ public class IApiMallOrderServiceImpl implements IApiMallOrderService { // } //请开启微信支付 wechat.enabled=true //调用wx的jsapi拿prepayId,返回签名等信息 + + Integer price = Integer.valueOf(orderList.stream().map(Order::getPayAmount). + reduce(BigDecimal.ZERO, BigDecimal::add).multiply(new BigDecimal(100)).stripTrailingZeros().toPlainString()); + + if (payMangeDev){ + price = 1; + } + String openId = memberWechat.getOpenid(); String appId = WechatPayData.appId; if (2 == req.getWechatType()) { @@ -554,9 +569,7 @@ public class IApiMallOrderServiceImpl implements IApiMallOrderService { String prepayId = wechatPayService.jsapiPay( String.valueOf(req.getPayId()), orderDesc, -// Integer.valueOf(orderList.stream().map(Order::getPayAmount). -// reduce(BigDecimal.ZERO, BigDecimal::add).multiply(new BigDecimal(100)).stripTrailingZeros().toPlainString()), - 1, + price, openId, req.getMemberId(), appId diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/applet/tencent/TaskConsumer.java b/ruoyi-catdog/src/main/java/com/ruoyi/applet/tencent/TaskConsumer.java index d7234f4..c06b736 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/applet/tencent/TaskConsumer.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/applet/tencent/TaskConsumer.java @@ -308,6 +308,9 @@ public class TaskConsumer implements QueueConsumer { log.info("修改订单startOrder(H5OrderVO {}, Order {})", h5OrderVO, omsOrder); //按照原订单进行接单 H5OrderVO oldOrder = h5OrderService.orderDetail(h5OrderVO.getOldOrderId()); + + AliyunSmsUtils.sendNotifyOrderUpdate(oldOrder.getReceiverPhone()); + if(oldOrder != null && oldOrder.getAcceptAppUserId() != null && oldOrder.getAcceptAppUserId() != 0){ @@ -377,14 +380,14 @@ public class TaskConsumer implements QueueConsumer { oldOrder.getAcceptAppUserId()); //TODO 短信通知 系统和接单的伴宠师 通知内容需要修改一下 - AliyunSmsUtils.sendOrderUpdate(appUsers.getUserTelephone(), "修改订单", omsOrder.getId() + ""); + AliyunSmsUtils.sendOrderUpdate(appUsers.getUserTelephone(), AliyunSmsUtils.UPDATE, omsOrder.getId() + ""); AppletConfig appletConfig = appletConfigService.getByCode("admin_phone_list"); String adminPhoneList = appletConfig.getParamValueText(); if(StringUtils.isNotEmpty(adminPhoneList)){ for (String phone : adminPhoneList.split(",")) { - AliyunSmsUtils.sendOrderUpdate(phone, "修改订单", omsOrder.getId() + ""); + AliyunSmsUtils.sendOrderUpdate(phone, AliyunSmsUtils.UPDATE, omsOrder.getId() + ""); } } } diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/model/controller/AppletUsersTeacherController.java b/ruoyi-catdog/src/main/java/com/ruoyi/model/controller/AppletUsersTeacherController.java index a081a3b..c9848e5 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/model/controller/AppletUsersTeacherController.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/model/controller/AppletUsersTeacherController.java @@ -1,11 +1,17 @@ package com.ruoyi.model.controller; import java.io.IOException; +import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; -import com.ruoyi.model.domain.AppUsers; -import com.ruoyi.model.service.IAppUsersService; +import com.ruoyi.common.core.sms.AliyunSmsUtils; +import com.ruoyi.common.utils.SmsUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.model.domain.*; +import com.ruoyi.model.mapper.AppletAnswerTrainMapper; +import com.ruoyi.model.service.*; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -20,8 +26,6 @@ import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.model.domain.AppletUsersTeacher; -import com.ruoyi.model.service.IAppletUsersTeacherService; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.page.TableDataInfo; @@ -39,24 +43,64 @@ public class AppletUsersTeacherController extends BaseController private IAppletUsersTeacherService appletUsersTeacherService; @Autowired private IAppUsersService appUsersService; + + //用户培训考核答案 + @Autowired + private IAppletAnswerTrainService appletAnswerTrainService; + + //用户培训考核答案 + @Autowired + private IAppletAnswerBaseService appletAnswerBaseService; + //题目信息 + @Autowired + private IAppletQuestionService appletQuestionService; /** * 查询伴宠师认证列表 */ @PreAuthorize("@ss.hasPermi('model:AppletUsersTeacher:list')") @GetMapping("/list") - public TableDataInfo list(AppletUsersTeacher appletUsersTeacher) + public TableDataInfo list(AppletUsersTeacher appletUsersTeacher, String answerStatus) { startPage(); List list = appletUsersTeacherService.selectAppletUsersTeacherList(appletUsersTeacher); //获取用户信息 + List listVo = new ArrayList<>(); for (AppletUsersTeacher teacher : list) { + + if (StringUtils.isNotBlank(answerStatus)){ + List ids = appletQuestionService.lambdaQuery() + .eq(AppletQuestion::getType, "培训") + .select(AppletQuestion::getId) + .list() + .stream().map(AppletQuestion::getId) + .collect(Collectors.toList()); + + Integer count = appletAnswerBaseService.lambdaQuery() + .in(AppletAnswerBase::getQuestionId, ids) + .eq(AppletAnswerBase::getUserId, teacher.getUserId()) + .count(); + + Integer count1 = appletAnswerTrainService.lambdaQuery() + .in(AppletAnswerTrain::getQuestionId, ids) + .eq(AppletAnswerTrain::getUserId, teacher.getUserId()) + .count(); + + int i = count + count1; + if (i > 0 && "1".equals(answerStatus) || + i == 0 && "0".equals(answerStatus)){ + listVo.add(teacher); + } + } else { + listVo.add(teacher); + } + AppUsers appUsers = appUsersService.selectAppUsersByUserId(teacher.getUserId()); if(appUsers != null){ teacher.setUserName(appUsers.getUserName()); } } - return getDataTable(list); + return getDataTable(listVo); } /** @@ -98,7 +142,7 @@ public class AppletUsersTeacherController extends BaseController @PreAuthorize("@ss.hasPermi('model:AppletUsersTeacher:edit')") @Log(title = "伴宠师认证", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@RequestBody AppletUsersTeacher appletUsersTeacher) + public AjaxResult edit(@RequestBody AppletUsersTeacher appletUsersTeacher, String action) { // //如果审核状态为通过status = 1 // if(appletUsersTeacher.getStatus() == 1){ @@ -112,6 +156,17 @@ public class AppletUsersTeacherController extends BaseController // appUsers.setUserBcsRole(1); // appUsersService.updateAppUsers(appUsers); // } +// return AjaxResult.success(); + + if ("check".equals(action) && appletUsersTeacher.getPhone() != null){ + if (appletUsersTeacher.getStatus() == 1){//通过 + AliyunSmsUtils.sendBcshJoinSuccessSMS(appletUsersTeacher.getPhone()); + } + if (appletUsersTeacher.getStatus() == 2){//驳回 + AliyunSmsUtils.sendBcshJoinFailSMS(appletUsersTeacher.getPhone()); + } + } + return toAjax(appletUsersTeacherService.updateAppletUsersTeacher(appletUsersTeacher)); } diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/model/service/IAApiAppletLoginService.java b/ruoyi-catdog/src/main/java/com/ruoyi/model/service/IAApiAppletLoginService.java index 587b6a7..6c32bbe 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/model/service/IAApiAppletLoginService.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/model/service/IAApiAppletLoginService.java @@ -20,4 +20,5 @@ public interface IAApiAppletLoginService { //伴宠师-获取用户基本能信息 AjaxResult getAppletUserInfo(Long appUserId); + Object getInvitationUrl(String code); } diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AApiAppletHhrWorkOutServiceImpl.java b/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AApiAppletHhrWorkOutServiceImpl.java index 82623b0..30115f3 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AApiAppletHhrWorkOutServiceImpl.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AApiAppletHhrWorkOutServiceImpl.java @@ -15,12 +15,10 @@ import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.model.domain.AppUsers; import com.ruoyi.model.domain.AppletAmountLog; import com.ruoyi.model.domain.AppletConfig; -import com.ruoyi.model.service.IAApiAppletHhrWorkOutService; -import com.ruoyi.model.service.IAppUsersService; -import com.ruoyi.model.service.IAppletAmountLogService; -import com.ruoyi.model.service.IAppletConfigService; +import com.ruoyi.model.service.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; @@ -58,6 +56,9 @@ public class AApiAppletHhrWorkOutServiceImpl implements IAApiAppletHhrWorkOutSer @Resource private IAppletAmountLogService appletAmountLogService; + //伴宠师-登录相关问题 + @Autowired + private IAApiAppletLoginService apiAppletLoginService; //合伙人工作台 - 绑定用户基础信息 @Override @@ -126,8 +127,6 @@ public class AApiAppletHhrWorkOutServiceImpl implements IAApiAppletHhrWorkOutSer - map.put("upgrade_register_num","5"); //距离下一个等级需要注册多少人 - map.put("upgrade_order_num","20"); //距离下一个等级需要下单人数 map.put("upgrade_image","https://image.hhlm1688.com/img/work/log/indexInfo/11.png"); //背景图 map.put("upgrade_details","合伙人权益说明:富文本"); //合伙人权益说明:富文本 @@ -364,7 +363,7 @@ public class AApiAppletHhrWorkOutServiceImpl implements IAApiAppletHhrWorkOutSer map.put("code",appUsers.getInvitationCode());//邀请码 - + map.put("invitation_url", apiAppletLoginService.getInvitationUrl(appUsersService.getUserCode(appUserId))); //邀请码 List appletConfigs = appletConfigService.selectAppletConfigList(null); diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AApiAppletLoginServiceImpl.java b/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AApiAppletLoginServiceImpl.java index 918c43c..d09ebc2 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AApiAppletLoginServiceImpl.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AApiAppletLoginServiceImpl.java @@ -42,8 +42,15 @@ public class AApiAppletLoginServiceImpl implements IAApiAppletLoginService { private String appId; @Value("${wechat-admin.secret}") private String secret; + + + @Value("${wechat.miniProgramAppId}") + private String wechatAppId; + @Value("${wechat.miniProgramSecret}") + private String wechatSecret; private static final String TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"; private static final String API_URL = "https://api.weixin.qq.com/wxa/business/getuserphonenumber"; + private static final String SCHEME_URL = "https://api.weixin.qq.com/wxa/generatescheme?access_token=%s"; @Resource private WechatHttpConf wechatHttpConf; @Resource @@ -52,9 +59,6 @@ public class AApiAppletLoginServiceImpl implements IAApiAppletLoginService { private TokenService tokenService; - - - //伴宠师-微信授权登录 @Transactional(rollbackFor = {Exception.class}) @Override @@ -150,10 +154,71 @@ public class AApiAppletLoginServiceImpl implements IAApiAppletLoginService { return AjaxResult.success("用户信息",appUsers); } + @Override + public String getInvitationUrl(String code) { + try { + String accessToken = getAccessToken(wechatAppId, wechatSecret); + String scheme = generateScheme(accessToken, code); + return scheme; + } catch (Exception e) { + log.error("获取邀请链接失败: {}", e.getMessage(), e); + return "https://wxaurl.cn/"; + } + } + + /** + * 生成小程序scheme码 + * @param accessToken 访问令牌 + * @param code 用户邀请码 + * @return scheme码 + * @throws Exception + */ + private String generateScheme(String accessToken, String code) throws Exception { + String requestUrl = String.format(SCHEME_URL, accessToken); + URL url = new URL(requestUrl); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("POST"); + conn.setRequestProperty("Content-Type", "application/json; utf-8"); + conn.setRequestProperty("Accept", "application/json"); + conn.setDoOutput(true); + + // 构建请求参数 + JSONObject requestBody = new JSONObject(); + JSONObject jumpWxa = new JSONObject(); +// jumpWxa.put("path", "/pages/workbenchManage/index"); // 小程序页面路径 + jumpWxa.put("path", "/pages/index"); // 小程序页面路径 + jumpWxa.put("query", "inviteCode=" + code); // 邀请用户参数 + jumpWxa.put("env_version", "release"); // 正式版 + requestBody.put("jump_wxa", jumpWxa); + requestBody.put("expire_type", 0); // 失效时间类型:0-失效时间 + requestBody.put("expire_time", System.currentTimeMillis() / 1000 + 30 * 24 * 60 * 60); // 30天后失效 + + // 发送请求 + try (DataOutputStream os = new DataOutputStream(conn.getOutputStream())) { + byte[] input = requestBody.toString().getBytes(StandardCharsets.UTF_8); + os.write(input, 0, input.length); + } + // 读取响应 + try (BufferedReader br = new BufferedReader( + new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) { + StringBuilder response = new StringBuilder(); + String responseLine; + while ((responseLine = br.readLine()) != null) { + response.append(responseLine.trim()); + } + JSONObject jsonResponse = JSONObject.parseObject(response.toString()); + if (jsonResponse.getInteger("errcode") == 0) { + return jsonResponse.getString("openlink"); + } else { + log.error("生成scheme码失败: {}", jsonResponse.getString("errmsg")); + throw new Exception("生成scheme码失败: " + jsonResponse.getString("errmsg")); + } + } + } - public String getAccessToken() throws Exception { + public String getAccessToken(String appId, String secret) throws Exception { String requestUrl = String.format(TOKEN_URL, appId, secret); URL url = new URL(requestUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); @@ -172,7 +237,9 @@ public class AApiAppletLoginServiceImpl implements IAApiAppletLoginService { } } - + public String getAccessToken() throws Exception { + return getAccessToken(appId, secret); + } public String getPhoneNumber(String code) throws Exception { URL url = new URL(API_URL + "?access_token=" + this.getAccessToken()); diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppletOrderDateFrequencyServiceImpl.java b/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppletOrderDateFrequencyServiceImpl.java index bbf1cdc..e4d662a 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppletOrderDateFrequencyServiceImpl.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppletOrderDateFrequencyServiceImpl.java @@ -25,9 +25,11 @@ import com.cyl.manager.ums.domain.Member; import com.cyl.manager.ums.domain.Pet; import com.cyl.manager.ums.mapper.MemberMapper; import com.cyl.manager.ums.mapper.PetMapper; +import com.cyl.manager.ums.pojo.vo.MemberV2VO; import com.cyl.manager.ums.service.MemberService; import com.cyl.manager.ums.service.PetService; import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.sms.AliyunSmsUtils; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.model.domain.*; @@ -83,6 +85,9 @@ public class AppletOrderDateFrequencyServiceImpl extends ServiceImpl appletAnswers = appletAnswerMapper.selectAppletAnswerList(appletAnswer); appletQuestion.setAnswerList(appletAnswers); + if (appletUsersTeacher.getUserId() == null){ + continue; + } if(appletQuestion.getTypeAnswer() == 0){ AppletAnswerBase appletAnswerBase = new AppletAnswerBase(); appletAnswerBase.setQuestionId(appletQuestion.getId()); diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/sms/AliyunSmsUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/sms/AliyunSmsUtils.java index 8cf16b1..d88f590 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/sms/AliyunSmsUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/sms/AliyunSmsUtils.java @@ -26,6 +26,9 @@ import java.util.Map; @Slf4j public class AliyunSmsUtils { + public static String UPDATE = "update";//修改订单 + public static String CANCEL = "cancel";//取消订单 + private static Client client; @Autowired @@ -48,6 +51,18 @@ public class AliyunSmsUtils { // 【猫妈狗爸】订单编号:【订单编号字段】长时间无人接单,请处理! private static String longTimeNoOrderAccepted = "SMS_488875138"; + // 【猫妈狗爸】取消订单通知消费者 + private static String NotifyOrderCancel = "SMS_493700126"; + + // 【猫妈狗爸】取消订单通知伴宠师 + private static String NotifyOrderCancelTechnician = "SMS_493815144"; + + // 【猫妈狗爸】修改订单通知伴宠师 + private static String NotifyOrderUpdateTechnician = "SMS_493705144"; + + // 【猫妈狗爸】修改订单通知消费者 + private static String NotifyOrderUpdate = "SMS_493915117"; + @SneakyThrows(Exception.class) public AliyunSmsUtils(SmsProperties smsProperties) { if (client == null) { @@ -151,7 +166,7 @@ public class AliyunSmsUtils { } public static SmsResult sendBcshOrderBeginNextDaySMS(String phones, String address, String petName) { - log.info("【短信发送】开始发送短信消费者:伴宠师订单服务开始通知"); + log.info("【短信发送】开始发送短信伴宠师:伴宠师订单服务开始通知"); Map param = new HashMap<>(); param.put("address", address); param.put("petName", petName); @@ -160,21 +175,30 @@ public class AliyunSmsUtils { } public static SmsResult sendBcshOrderBeginTodaySMS(String phones, String address, String petName) { - log.info("【短信发送】开始发送短信消费者:伴宠师-订单服务开始通知"); - Map param = new HashMap<>(); - param.put("address", address); - param.put("petName", petName); + try { + log.info("【短信发送】开始发送短信伴宠师:伴宠师-订单服务开始通知"); + Map param = new HashMap<>(); + param.put("address", address); + param.put("petName", petName); - return send(phones, bcshOrderBeginToday, param); + return send(phones, bcshOrderBeginToday, param); + }catch (Exception e){ + log.error("短信发生失败:", e); + } + return null; } public static SmsResult sendBcshOrderCompleteSMS(String phones, String orderId, String amount) { - log.info("【短信发送】开始发送短信消费者:伴宠师订单完成通知"); - Map param = new HashMap<>(); - param.put("orderId", orderId); - param.put("amount", amount); - - return send(phones, bcshOrderComplete, param); + try { + log.info("【短信发送】开始发送短信伴宠师:伴宠师订单完成通知"); + Map param = new HashMap<>(); + param.put("orderId", orderId); + param.put("amount", amount); + return send(phones, bcshOrderComplete, param); + }catch (Exception e){ + log.error("短信发生失败:", e); + } + return null; } public static SmsResult sendLongTimeNoOrderAccepted(String phones, String orderId) { @@ -189,6 +213,52 @@ public class AliyunSmsUtils { return null; } + public static SmsResult sendNotifyOrderUpdateTechnician(String phones, String orderId) { + try { + log.info("【短信发送】修改订单通知伴宠师"); + Map param = new HashMap<>(); + param.put("orderId", orderId); + return send(phones, NotifyOrderUpdateTechnician, param); + }catch (Exception e){ + log.error("短信发生失败:", e); + } + return null; + } + + public static SmsResult sendNotifyOrderUpdate(String phones) { + try { + log.info("【短信发送】修改订单通知消费者"); + Map param = new HashMap<>(); + return send(phones, NotifyOrderUpdate, param); + }catch (Exception e){ + log.error("短信发生失败:", e); + } + return null; + } + + public static SmsResult sendNotifyOrderCancel(String phones) { + try { + log.info("【短信发送】取消订单通知消费者"); + Map param = new HashMap<>(); + return send(phones, NotifyOrderCancel, param); + }catch (Exception e){ + log.error("短信发生失败:", e); + } + return null; + } + + public static SmsResult sendNotifyOrderCancelTechnician(String phones, String orderId) { + try { + log.info("【短信发送】取消订单通知消费者"); + Map param = new HashMap<>(); + param.put("orderId", orderId); + return send(phones, NotifyOrderCancelTechnician, param); + }catch (Exception e){ + log.error("短信发生失败:", e); + } + return null; + } + public static SmsResult sendOrderUpdate(String phones, String type, String orderId) { // try { // log.info("【短信发送】通知管理员长时间无人接单,请处理!"); @@ -199,6 +269,13 @@ public class AliyunSmsUtils { // }catch (Exception e){ // log.error("短信发生失败:", e); // } + + if (CANCEL.equals(type)){ + sendNotifyOrderCancelTechnician(phones, orderId); + }else if (UPDATE.equals(type)){ + sendNotifyOrderUpdateTechnician(phones, orderId); + } + return null; } } diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java index 01d8391..2c1ccca 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java @@ -452,6 +452,93 @@ public class H5MemberService { return null; } + public MemberV2VO getMemberInfoV2(Member member) { + if(ObjectUtil.isNull(member)){ + return null; + } + MemberV2VO memberV2VO = new MemberV2VO(); + MemberWechat memberWechat = memberWechatService.selectByMemberId(member.getId()); + BeanUtils.copyProperties(member, memberV2VO); + memberV2VO.setPhone(AesCryptoUtils.decrypt(aesKey, member.getPhoneEncrypted())); + memberV2VO.setOpenId(memberWechat.getRoutineOpenid()); + memberV2VO.setLevel(MemberLevel.getName(member.getLevel())); + memberV2VO.setLevelKey(member.getLevel()); + /** + * 1、个人信息(等级、名字、头像) + * 2、自然年累计消费金额、等级升级规则(放参数表) + * 3、获取积分,集点,卡券数量 + * 4、获取当前订单详情(最新订单) + */ + + //获取卡券数量 通过手机号获取卡券数量 + H5MemberCouponRequest h5MemberCouponRequest = new H5MemberCouponRequest(); + h5MemberCouponRequest.setPhone(memberV2VO.getPhone()); + h5MemberCouponRequest.setOpenId(memberV2VO.getOpenId()); + List list = h5MemberCouponService.selectMemberCouponList(h5MemberCouponRequest); + if(CollectionUtils.isEmpty(list)){ + memberV2VO.setCoupon(BigDecimal.ZERO); + }else{ + memberV2VO.setCoupon(new BigDecimal(list.size())); + } + + //自然年累计消费金额、等级升级规则(放参数表) + //根据memberId查询所有有效订单 + List orderList = h5OrderService.getAllOrderByMemberId(memberV2VO.getId()); + BigDecimal currentYearOrderAmount = BigDecimal.ZERO; + if(!CollectionUtils.isEmpty(orderList)){ + // 获取当前年份 + int currentYear = Year.now().getValue(); + // 过滤出 paymentTime 在今年的订单,并统计 payAmount 之和 + currentYearOrderAmount = orderList.stream() + .filter(order -> order.getPaymentTime() != null && + order.getPaymentTime().getYear() == currentYear) + .map(Order::getPayAmount) // 获取支付金额 + .filter(amount -> amount != null) // 过滤掉 null 值 + .reduce(BigDecimal.ZERO, BigDecimal::add); // 统计金额之和 + } + memberV2VO.setCurrentYearOrderAmount(currentYearOrderAmount); + memberV2VO.setOrderNumber(orderList.size()); + + // 获取当前订单详情(最新订单) + Optional latestOrder = orderList.stream() + .filter(order -> order.getPaymentTime() != null) // 确保 paymentTime 不为 null + .max(Comparator.comparing(Order::getPaymentTime)); // 按 paymentTime 排序并找出最大值 + Order order = null; + // 检查是否找到订单并打印信息 + if (latestOrder.isPresent()) { + order = latestOrder.get(); + } + if(!ObjectUtil.isEmpty(order)){ + H5OrderVO h5OrderVO = h5OrderService.orderDetail(order.getId()); + memberV2VO.setH5OrderVO(h5OrderVO); + } + computeConsumptionAndPromotion(currentYearOrderAmount,memberV2VO); + + //获取进度条数据 + String rule = sysConfigService.selectConfigByKey("member.level.rule"); + // 将 JSON 字符串转换为 List + if(CollectionUtils.isEmpty(levelAmountList)){ + convertJsonToList(rule); + } + Map result = getProgressData(currentYearOrderAmount); + memberV2VO.setProcess(result.get("progressPercentage")); + memberV2VO.setNextLevel(result.get("nextLevel")); + memberV2VO.setAmountNeeded(result.get("amountNeeded")); + + + // 获取当前日期 + LocalDate today = LocalDate.now(); + // 获取当前年的第一天 + LocalDate firstDayOfCurrentYear = today.withDayOfYear(1); + // 获取下一年的第一天 + LocalDate firstDayOfNextYear = firstDayOfCurrentYear.plusYears(1); + // 定义日期格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日"); + String formattedNextYear = firstDayOfNextYear.format(formatter); + memberV2VO.setPromotionDate(formattedNextYear); + return memberV2VO; + } + public MemberV2VO getMemberInfoV2(){ Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO); if(ObjectUtil.isNull(member)){ diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5OrderService.java b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5OrderService.java index 75793d6..f0f451a 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5OrderService.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5OrderService.java @@ -60,6 +60,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; @@ -83,6 +84,9 @@ import java.util.stream.Stream; @Slf4j public class H5OrderService { + @Value("${payMangeDev}") + private boolean payMangeDev; + @Autowired private MemberAddressMapper memberAddressMapper; @@ -1105,7 +1109,10 @@ public class H5OrderService { //TODO String payAmount = order.getPayAmount().multiply(new BigDecimal(100)).stripTrailingZeros().toPlainString(); - payAmount = "1";//支付一分钱 + if (payMangeDev){ + payAmount = "1";//支付一分钱 + } + String prepayId = wechatPayService.jsapiPay( String.valueOf(order.getPayId()), orderDesc,