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,