Browse Source

修复下单端系统派单

master
前端-胡立永 1 week ago
parent
commit
e140f12e13
17 changed files with 415 additions and 58 deletions
  1. +3
    -2
      CatmDogd-Mall-Front-test/src/api/model/AppletUsersTeacher.js
  2. +3
    -0
      CatmDogd-Mall-Front-test/src/views/model/AppletUsersTeacher/index.vue
  3. +13
    -1
      CatmDogd-Mall-Front-test/src/views/model/AppletUsersTeacher/openindex.vue
  4. +11
    -8
      ruoyi-admin/src/main/resources/application-druid-root.yml
  5. +4
    -2
      ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallOrderController.java
  6. +3
    -3
      ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallUserTeacherController.java
  7. +20
    -7
      ruoyi-catdog/src/main/java/com/ruoyi/applet/service/impl/IApiMallOrderServiceImpl.java
  8. +5
    -2
      ruoyi-catdog/src/main/java/com/ruoyi/applet/tencent/TaskConsumer.java
  9. +62
    -7
      ruoyi-catdog/src/main/java/com/ruoyi/model/controller/AppletUsersTeacherController.java
  10. +1
    -0
      ruoyi-catdog/src/main/java/com/ruoyi/model/service/IAApiAppletLoginService.java
  11. +6
    -7
      ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AApiAppletHhrWorkOutServiceImpl.java
  12. +72
    -5
      ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AApiAppletLoginServiceImpl.java
  13. +25
    -1
      ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppletOrderDateFrequencyServiceImpl.java
  14. +3
    -0
      ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppletUsersTeacherServiceImpl.java
  15. +89
    -12
      ruoyi-common/src/main/java/com/ruoyi/common/core/sms/AliyunSmsUtils.java
  16. +87
    -0
      ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java
  17. +8
    -1
      ruoyi-mall/src/main/java/com/cyl/h5/service/H5OrderService.java

+ 3
- 2
CatmDogd-Mall-Front-test/src/api/model/AppletUsersTeacher.js View File

@ -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
})
}


+ 3
- 0
CatmDogd-Mall-Front-test/src/views/model/AppletUsersTeacher/index.vue View File

@ -363,6 +363,9 @@ export default {
form: {},
//
rules: {
userId: [
{ required: true, message: "关联用户不能为空", trigger: "blur" }
]
},
columns: [
{ key: 1, label: "关联用户", visible: true },


+ 13
- 1
CatmDogd-Mall-Front-test/src/views/model/AppletUsersTeacher/openindex.vue View File

@ -29,6 +29,14 @@
<el-input v-model="queryParams.idCard" placeholder="请输入身份证" clearable size="small"
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="答题状态" prop="answerStatus">
<el-select v-model="queryParams.answerStatus" placeholder="请选择答题状态" clearable size="small">
<el-option label="已完成" value="1" />
<el-option label="未完成" value="0" />
</el-select>
</el-form-item>
<!-- <el-form-item label="性别" prop="sex">-->
<!-- <el-select v-model="queryParams.sex" placeholder="请选择性别" clearable size="small">-->
<!-- </el-select>-->
@ -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();


+ 11
- 8
ruoyi-admin/src/main/resources/application-druid-root.yml View File

@ -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

+ 4
- 2
ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallOrderController.java View File

@ -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);


+ 3
- 3
ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallUserTeacherController.java View File

@ -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);


+ 20
- 7
ruoyi-catdog/src/main/java/com/ruoyi/applet/service/impl/IApiMallOrderServiceImpl.java View File

@ -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


+ 5
- 2
ruoyi-catdog/src/main/java/com/ruoyi/applet/tencent/TaskConsumer.java View File

@ -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() + "");
}
}
}


+ 62
- 7
ruoyi-catdog/src/main/java/com/ruoyi/model/controller/AppletUsersTeacherController.java View File

@ -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<AppletUsersTeacher> list = appletUsersTeacherService.selectAppletUsersTeacherList(appletUsersTeacher);
//获取用户信息
List<AppletUsersTeacher> listVo = new ArrayList<>();
for (AppletUsersTeacher teacher : list) {
if (StringUtils.isNotBlank(answerStatus)){
List<Long> 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));
}


+ 1
- 0
ruoyi-catdog/src/main/java/com/ruoyi/model/service/IAApiAppletLoginService.java View File

@ -20,4 +20,5 @@ public interface IAApiAppletLoginService {
//伴宠师-获取用户基本能信息
AjaxResult getAppletUserInfo(Long appUserId);
Object getInvitationUrl(String code);
}

+ 6
- 7
ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AApiAppletHhrWorkOutServiceImpl.java View File

@ -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<AppletConfig> appletConfigs = appletConfigService.selectAppletConfigList(null);


+ 72
- 5
ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AApiAppletLoginServiceImpl.java View File

@ -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());


+ 25
- 1
ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppletOrderDateFrequencyServiceImpl.java View File

@ -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<AppletOrder
private MemberMapper memberMapper;
@Autowired
private IAppletConfigService appletConfigService;
@Autowired
private H5MemberService h5MemberService;
/**
* 查询日订单
@ -394,13 +399,32 @@ public class AppletOrderDateFrequencyServiceImpl extends ServiceImpl<AppletOrder
//订单完成
if(count == 0){
appletOrderItem.setOrderStatus(2);
appletOrderItemMapper.updateAppletOrderItem(appletOrderItem);
//根据订单中的用户id查询用户信息
AppUsers user = appUsersService.selectAppUsersByUserId(appletOrderItem.getUserId());
//增加伴宠师流水
if(omsOrder != null){
//发送给伴宠师
AliyunSmsUtils.sendBcshOrderCompleteSMS(user.getUserTelephone(), omsOrder.getId() + "",
appletOrderItem.getOrderGivePrice().toString());
//发送给消费者
Member member = memberMapper.selectById(omsOrder.getMemberId());
if (member != null){
MemberV2VO infoV2 = h5MemberService.getMemberInfoV2(member);
AliyunSmsUtils.sendPoOrderCompleteSMS(omsOrder.getReceiverPhone(),
infoV2.getCurrentYearOrderAmount().toString(),
infoV2.getLevel(),
"");
}
}
//增加伴宠师流水
// 记录日志
AppletAmountLog moneyLog = new AppletAmountLog();
moneyLog.setUserId(user.getUserId());


+ 3
- 0
ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppletUsersTeacherServiceImpl.java View File

@ -57,6 +57,9 @@ public class AppletUsersTeacherServiceImpl extends ServiceImpl<AppletUsersTeache
List<AppletAnswer> appletAnswers = appletAnswerMapper.selectAppletAnswerList(appletAnswer);
appletQuestion.setAnswerList(appletAnswers);
if (appletUsersTeacher.getUserId() == null){
continue;
}
if(appletQuestion.getTypeAnswer() == 0){
AppletAnswerBase appletAnswerBase = new AppletAnswerBase();
appletAnswerBase.setQuestionId(appletQuestion.getId());


+ 89
- 12
ruoyi-common/src/main/java/com/ruoyi/common/core/sms/AliyunSmsUtils.java View File

@ -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<String, String> 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<String, String> param = new HashMap<>();
param.put("address", address);
param.put("petName", petName);
try {
log.info("【短信发送】开始发送短信伴宠师:伴宠师-订单服务开始通知");
Map<String, String> 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<String, String> param = new HashMap<>();
param.put("orderId", orderId);
param.put("amount", amount);
return send(phones, bcshOrderComplete, param);
try {
log.info("【短信发送】开始发送短信伴宠师:伴宠师订单完成通知");
Map<String, String> 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<String, String> 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<String, String> 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<String, String> 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<String, String> 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;
}
}

+ 87
- 0
ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java View File

@ -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<WechatMemberCoupon> list = h5MemberCouponService.selectMemberCouponList(h5MemberCouponRequest);
if(CollectionUtils.isEmpty(list)){
memberV2VO.setCoupon(BigDecimal.ZERO);
}else{
memberV2VO.setCoupon(new BigDecimal(list.size()));
}
//自然年累计消费金额等级升级规则放参数表
//根据memberId查询所有有效订单
List<Order> 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<Order> 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<String,String> 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)){


+ 8
- 1
ruoyi-mall/src/main/java/com/cyl/h5/service/H5OrderService.java View File

@ -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,


Loading…
Cancel
Save