From d91de223184192ef920736acb59e3384e487acde Mon Sep 17 00:00:00 2001 From: huchuansai Date: Mon, 1 Sep 2025 11:32:30 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E8=A7=A3=E5=86=B3=E8=AE=A2=E5=8D=95=E6=9C=AA=E7=BB=93=E6=9D=9F?= =?UTF-8?q?=E7=9A=84=E9=9C=80=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatis/handler/MyTenantLineHandler.java | 4 + .../admin/modules/order/job/OrderJob.java | 95 ++++++++ .../impl/PlayOrderInfoServiceImpl.java | 223 ++++++++---------- .../entity/PlayClerkUserByWxAddVo.java | 5 +- .../weichat/service/WxCustomMpService.java | 20 +- .../java/com/starry/admin/utils/SmsUtils.java | 9 +- 6 files changed, 215 insertions(+), 141 deletions(-) create mode 100644 play-admin/src/main/java/com/starry/admin/modules/order/job/OrderJob.java diff --git a/play-admin/src/main/java/com/starry/admin/common/mybatis/handler/MyTenantLineHandler.java b/play-admin/src/main/java/com/starry/admin/common/mybatis/handler/MyTenantLineHandler.java index 56fdfc8..132ab72 100644 --- a/play-admin/src/main/java/com/starry/admin/common/mybatis/handler/MyTenantLineHandler.java +++ b/play-admin/src/main/java/com/starry/admin/common/mybatis/handler/MyTenantLineHandler.java @@ -43,6 +43,10 @@ public class MyTenantLineHandler implements TenantLineHandler { */ @Override public boolean ignoreTable(String tableName) { + String threadName = Thread.currentThread().getName(); + if (threadName.contains("schedule")) { + return true; + } String prefix = StringUtils.substringBefore(tableName, "_"); return Arrays.asList(TABLE_FILTER).contains(tableName) || Arrays.asList(TABLE_PRE).contains(prefix); } diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/job/OrderJob.java b/play-admin/src/main/java/com/starry/admin/modules/order/job/OrderJob.java new file mode 100644 index 0000000..308c1c3 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/order/job/OrderJob.java @@ -0,0 +1,95 @@ +package com.starry.admin.modules.order.job; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.starry.admin.common.exception.CustomException; +import com.starry.admin.modules.order.mapper.PlayOrderInfoMapper; +import com.starry.admin.modules.order.module.entity.PlayOrderInfoEntity; +import com.starry.admin.modules.weichat.service.WxCustomMpService; +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.List; +import javax.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + + +@Slf4j +@Component +public class OrderJob { + @Resource + private PlayOrderInfoMapper orderInfoMapper; + @Resource + private WxCustomMpService wxCustomMpService; + + + /** + * 每20秒执行一次的定时任务,修改订单状态为已完成 + */ + @Scheduled(fixedRate = 20000, initialDelay = 20000) + public void orderFinishJob() { + // 查询出所有应该完成的订单 + List serviceDurationList = Arrays.asList("一周", "一个月", "一小时", "15分钟", "一天", "半小时", "30分钟"); + List orderInfoEntityList = orderInfoMapper.selectList(Wrappers.lambdaQuery(PlayOrderInfoEntity.class).isNotNull(PlayOrderInfoEntity::getServiceDuration) + .eq(PlayOrderInfoEntity::getOrderStatus, "2") + .eq(PlayOrderInfoEntity::getOrderType, "2") + .isNotNull(PlayOrderInfoEntity::getOrderStartTime) + .in(PlayOrderInfoEntity::getServiceDuration, serviceDurationList) + .in(PlayOrderInfoEntity::getPlaceType, Arrays.asList("1", "0")) + ); + if (CollectionUtils.isEmpty(orderInfoEntityList)) return; + + orderInfoEntityList.forEach(ca -> { + try { + // 根据serviceDuration换取时间 + Integer serviceDuration = this.getServiceDuration(ca.getServiceDuration()); + if (serviceDuration.equals(0)) return; + + // 判断与开始时间相比较,如果大于服务时长,则修改订单状态为已完成 + if (ca.getOrderStartTime().plusMinutes(serviceDuration).isBefore(LocalDateTime.now())) { + PlayOrderInfoEntity entity2 = new PlayOrderInfoEntity(ca.getId(), "3"); + entity2.setOrderEndTime(LocalDateTime.now()); + this.orderInfoMapper.updateById(entity2); + // 发送消息 + wxCustomMpService.sendOrderFinishMessage(ca); + } + + } catch (Exception e) { + log.error(e.getMessage(), e); + log.error("订单完成失败:{}", ca.getOrderNo()); + } + }); + + } + + private Integer getServiceDuration(String serviceDuration) { + if (StringUtils.isEmpty(serviceDuration)) { + throw new CustomException("服务时长不能为空"); + } + switch (serviceDuration) { + case "一周": + return 7 * 24 * 60; // 一周 = 7天,每天24小时,每小时60分钟 + + case "一个月": + return 30 * 24 * 60; // 按30天计算一个月 + + case "一小时": + return 60; // 一小时 = 60分钟 + + case "15分钟": + return 15; + case "一天": + return 24 * 60; // 一天 = 24小时 + + case "半小时": + return 30; // 半小时 = 30分钟 + + case "30分钟": + return 30; + } + return 0; + } + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/service/impl/PlayOrderInfoServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/order/service/impl/PlayOrderInfoServiceImpl.java index 9328fe5..60d0ad5 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/order/service/impl/PlayOrderInfoServiceImpl.java +++ b/play-admin/src/main/java/com/starry/admin/modules/order/service/impl/PlayOrderInfoServiceImpl.java @@ -61,7 +61,7 @@ import org.springframework.transaction.annotation.Transactional; @Service public class PlayOrderInfoServiceImpl extends ServiceImpl implements - IPlayOrderInfoService { + IPlayOrderInfoService { @Resource private PlayOrderInfoMapper orderInfoMapper; @Resource @@ -100,10 +100,10 @@ public class PlayOrderInfoServiceImpl extends ServiceImpl couponIds, String remark, String clerkSex, String clerkLevelId, String excludeHistory) { + String rewardType, String firstOrder, String commodityId, String commodityType, BigDecimal commodityPrice, + String serviceDuration, String commodityName, String commodityNumber, BigDecimal orderMoney, + BigDecimal finalAmount, BigDecimal discountAmount, String purchaserBy, String acceptBy, String weiChatCode, + List couponIds, String remark, String clerkSex, String clerkLevelId, String excludeHistory) { PlayOrderInfoEntity entity = new PlayOrderInfoEntity(); entity.setId(orderId); entity.setOrderNo(orderNo); @@ -160,11 +160,11 @@ public class PlayOrderInfoServiceImpl extends ServiceImpl croupIds, String placeType, - String firstOrder, BigDecimal finalAmount) { + String firstOrder, BigDecimal finalAmount) { PlayClerkLevelInfoEntity entity = playClerkUserInfoService.queryLevelCommission(clerkId); ClerkEstimatedRevenueVo estimatedRevenueVo = new ClerkEstimatedRevenueVo(); switch (placeType) { - case "0" : { + case "0": { if ("1".equals(firstOrder)) { estimatedRevenueVo.setRevenueRatio(entity.getFirstRegularRatio()); estimatedRevenueVo @@ -183,7 +183,7 @@ public class PlayOrderInfoServiceImpl extends ServiceImpl listByTime(String clerkId, String startTime, String endTime, - List orderStatus) { + List orderStatus) { MPJLambdaWrapper lambdaQueryWrapper = new MPJLambdaWrapper<>(); if (StrUtil.isNotEmpty(clerkId)) { lambdaQueryWrapper.eq(PlayOrderInfoEntity::getAcceptBy, clerkId); @@ -430,7 +422,7 @@ public class PlayOrderInfoServiceImpl extends ServiceImpl(vo.getPageNum(), vo.getPageSize()), PlayRewardInfoReturnVo.class, lambdaQueryWrapper); @@ -497,8 +489,7 @@ public class PlayOrderInfoServiceImpl extends ServiceImpl - */ - public MPJLambdaWrapper getCommonOrderQueryVo(PlayOrderInfoEntity entity) { - MPJLambdaWrapper lambdaQueryWrapper = new MPJLambdaWrapper<>(); - // 查询主表全部字段 - lambdaQueryWrapper.selectAll(PlayOrderInfoEntity.class); - // 查询顾客表 - lambdaQueryWrapper.selectAs(PlayCustomUserInfoEntity::getId, "customId") - .selectAs(PlayCustomUserInfoEntity::getAvatar, "customAvatar") - .selectAs(PlayCustomUserInfoEntity::getNickname, "customNickname"); - // 查询陪聊表 - lambdaQueryWrapper.selectAs(PlayClerkUserInfoEntity::getId, "clerkId") - .selectAs(PlayClerkUserInfoEntity::getAvatar, "clerkAvatar") - .selectAs(PlayClerkUserInfoEntity::getNickname, "clerkNickname"); - // 子表-店员服务项目表 - lambdaQueryWrapper.leftJoin(PlayCustomUserInfoEntity.class, PlayCustomUserInfoEntity::getId, - PlayOrderInfoEntity::getPurchaserBy); - // 子表-店员表 - lambdaQueryWrapper.leftJoin(PlayClerkUserInfoEntity.class, PlayClerkUserInfoEntity::getId, - PlayOrderInfoEntity::getAcceptBy); - if (StringUtils.isNotBlank(entity.getId())) { - lambdaQueryWrapper.eq(PlayOrderInfoEntity::getId, entity.getId()); - } - if (StringUtils.isNotBlank(entity.getPurchaserBy())) { - lambdaQueryWrapper.eq(PlayOrderInfoEntity::getPurchaserBy, entity.getPurchaserBy()); - } - if (StringUtils.isNotBlank(entity.getAcceptBy())) { - lambdaQueryWrapper.eq(PlayOrderInfoEntity::getAcceptBy, entity.getAcceptBy()); - } - if (StringUtils.isNotBlank(entity.getOrderStatus())) { - lambdaQueryWrapper.eq(PlayOrderInfoEntity::getOrderStatus, entity.getOrderStatus()); - } - if (StringUtils.isNotBlank(entity.getPlaceType())) { - lambdaQueryWrapper.eq(PlayOrderInfoEntity::getPlaceType, entity.getPlaceType()); - } - if (StringUtils.isNotBlank(entity.getOrderType())) { - lambdaQueryWrapper.eq(PlayOrderInfoEntity::getOrderType, entity.getOrderType()); - } - lambdaQueryWrapper.orderByDesc(PlayOrderInfoEntity::getCreatedTime); - return lambdaQueryWrapper; - - } - /** * 修改订单状态为接单 只有管理员或者店员本人才能操作 * - * @param operatorByType - * 操作人类型(0:顾客;1:店员;2:管理员) - * @param operatorBy - * 操作人ID - * @param acceptBy - * 接单人ID - * @param orderId - * 订单Id + * @param operatorByType 操作人类型(0:顾客;1:店员;2:管理员) + * @param operatorBy 操作人ID + * @param acceptBy 接单人ID + * @param orderId 订单Id **/ @Override public void updateStateTo1(String operatorByType, String operatorBy, String acceptBy, String orderId) { @@ -776,17 +716,60 @@ public class PlayOrderInfoServiceImpl extends ServiceImpl + */ + public MPJLambdaWrapper getCommonOrderQueryVo(PlayOrderInfoEntity entity) { + MPJLambdaWrapper lambdaQueryWrapper = new MPJLambdaWrapper<>(); + // 查询主表全部字段 + lambdaQueryWrapper.selectAll(PlayOrderInfoEntity.class); + // 查询顾客表 + lambdaQueryWrapper.selectAs(PlayCustomUserInfoEntity::getId, "customId") + .selectAs(PlayCustomUserInfoEntity::getAvatar, "customAvatar") + .selectAs(PlayCustomUserInfoEntity::getNickname, "customNickname"); + // 查询陪聊表 + lambdaQueryWrapper.selectAs(PlayClerkUserInfoEntity::getId, "clerkId") + .selectAs(PlayClerkUserInfoEntity::getAvatar, "clerkAvatar") + .selectAs(PlayClerkUserInfoEntity::getNickname, "clerkNickname"); + // 子表-店员服务项目表 + lambdaQueryWrapper.leftJoin(PlayCustomUserInfoEntity.class, PlayCustomUserInfoEntity::getId, + PlayOrderInfoEntity::getPurchaserBy); + // 子表-店员表 + lambdaQueryWrapper.leftJoin(PlayClerkUserInfoEntity.class, PlayClerkUserInfoEntity::getId, + PlayOrderInfoEntity::getAcceptBy); + if (StringUtils.isNotBlank(entity.getId())) { + lambdaQueryWrapper.eq(PlayOrderInfoEntity::getId, entity.getId()); + } + if (StringUtils.isNotBlank(entity.getPurchaserBy())) { + lambdaQueryWrapper.eq(PlayOrderInfoEntity::getPurchaserBy, entity.getPurchaserBy()); + } + if (StringUtils.isNotBlank(entity.getAcceptBy())) { + lambdaQueryWrapper.eq(PlayOrderInfoEntity::getAcceptBy, entity.getAcceptBy()); + } + if (StringUtils.isNotBlank(entity.getOrderStatus())) { + lambdaQueryWrapper.eq(PlayOrderInfoEntity::getOrderStatus, entity.getOrderStatus()); + } + if (StringUtils.isNotBlank(entity.getPlaceType())) { + lambdaQueryWrapper.eq(PlayOrderInfoEntity::getPlaceType, entity.getPlaceType()); + } + if (StringUtils.isNotBlank(entity.getOrderType())) { + lambdaQueryWrapper.eq(PlayOrderInfoEntity::getOrderType, entity.getOrderType()); + } + lambdaQueryWrapper.like(StringUtils.isNotEmpty(entity.getOrderNo()), PlayOrderInfoEntity::getOrderNo, entity.getOrderNo()); + lambdaQueryWrapper.orderByDesc(PlayOrderInfoEntity::getCreatedTime); + return lambdaQueryWrapper; + + } + /** * 修改订单状态为开始订单或者完成订单 只有管理员或者店员本人才能操作 * - * @param operatorByType - * 操作人类型(0:顾客;1:店员;2:管理员) - * @param operatorBy - * 操作人ID - * @param orderState - * 订单状态 - * @param orderId - * 订单Id + * @param operatorByType 操作人类型(0:顾客;1:店员;2:管理员) + * @param operatorBy 操作人ID + * @param orderState 订单状态 + * @param orderId 订单Id **/ @Override public void updateStateTo23(String operatorByType, String operatorBy, String orderState, String orderId) { @@ -808,7 +791,7 @@ public class PlayOrderInfoServiceImpl extends ServiceImpl images) { + List images) { PlayOrderInfoEntity orderInfo = this.selectOrderInfoById(orderId); if ("0".equals(operatorByType) && !operatorBy.equals(orderInfo.getPurchaserBy())) { throw new CustomException("只能操作本人订单"); @@ -890,8 +870,7 @@ public class PlayOrderInfoServiceImpl extends ServiceImpl data = new ArrayList<>(); data.add(new WxMpTemplateData("time4", DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"))); data.add(new WxMpTemplateData("amount2", order.getOrderMoney().toString())); @@ -141,7 +141,7 @@ public class WxCustomMpService { SysTenantEntity tenant = tenantService.selectSysTenantByTenantId(tenantId); WxMpTemplateMessage templateMessage = getWxMpTemplateMessage(tenant.getXindingdanshoulitongzhiTemplateId(), - openId, "http://" + tenant.getTenantKey() + ".julyharbor.com/clerk/#/orderDetail/"); + openId, "https://" + tenant.getTenantKey() + ".julyharbor.com/clerk/#/orderDetail/"); List data = new ArrayList<>(); data.add(new WxMpTemplateData("time6", DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"))); data.add(new WxMpTemplateData("character_string9", orderNo)); @@ -171,7 +171,7 @@ public class WxCustomMpService { WxMpTemplateMessage templateMessage = getWxMpTemplateMessage(tenant.getJiedanchenggongtongzhiTemplateId(), clerkUserInfo.getOpenid(), - "http://" + tenant.getTenantKey() + ".julyharbor.com/clerk/#/orderDetail/" + orderInfo.getId()); + "https://" + tenant.getTenantKey() + ".julyharbor.com/clerk/#/orderDetail/" + orderInfo.getId()); List data = new ArrayList<>(); data.add(new WxMpTemplateData("character_string1", orderInfo.getOrderNo())); data.add(new WxMpTemplateData("time2", DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"))); @@ -184,7 +184,7 @@ public class WxCustomMpService { templateMessage.setToUser(customUserInfo.getOpenid()); templateMessage - .setUrl("http://" + tenant.getTenantKey() + ".julyharbor.com/user/#/orderDetail/" + orderInfo.getId()); + .setUrl("https://" + tenant.getTenantKey() + ".julyharbor.com/user/#/orderDetail/" + orderInfo.getId()); try { proxyWxMpService().getTemplateMsgService().sendTemplateMsg(templateMessage); } catch (WxErrorException e) { @@ -200,7 +200,7 @@ public class WxCustomMpService { SysTenantEntity tenant = tenantService.selectSysTenantByTenantId(userInfo.getTenantId()); String template_id = tenant.getRzsqshtxTemplateId(); String tenantKey = tenant.getTenantKey(); - String url = "http://" + tenantKey + ".julyharbor.com/clerk/"; + String url = "https://" + tenantKey + ".julyharbor.com/clerk/"; WxMpTemplateMessage templateMessage = new WxMpTemplateMessage(); templateMessage.setTemplateId(template_id); @@ -225,7 +225,7 @@ public class WxCustomMpService { SysTenantEntity tenant = tenantService.selectSysTenantByTenantId(tenantId); String template_id = tenant.getRzsqAdminTemplateId(); String tenantKey = tenant.getTenantKey(); - String url = "http://" + tenantKey + ".julyharbor.com/clerk/#/admin/clerk-apply-list"; + String url = "https://" + tenantKey + ".julyharbor.com/clerk/#/admin/clerk-apply-list"; List adminInfoEntityList = playPersonnelAdminInfoService.list(Wrappers .lambdaQuery(PlayPersonnelAdminInfoEntity.class).select(PlayPersonnelAdminInfoEntity::getSysUserId)); for (PlayPersonnelAdminInfoEntity adminInfoEntity : adminInfoEntityList) { @@ -289,7 +289,7 @@ public class WxCustomMpService { } WxMpTemplateMessage templateMessage = getWxMpTemplateMessage(tenant.getDingdantousuchuliTemplateId(), clerkUserInfo.getOpenid(), - "http://" + tenant.getTenantKey() + ".julyharbor.com/clerk/#/admin/order/complain-list"); + "https://" + tenant.getTenantKey() + ".julyharbor.com/clerk/#/admin/order/complain-list"); List data = new ArrayList<>(); data.add(new WxMpTemplateData("character_string", orderInfo.getOrderNo())); data.add(new WxMpTemplateData("time2", DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"))); @@ -309,7 +309,7 @@ public class WxCustomMpService { PlayCustomUserInfoEntity customUserInfo = customUserInfoService.selectById(order.getPurchaserBy()); WxMpTemplateMessage templateMessage = getWxMpTemplateMessage(tenant.getDingdanwanchengtongzhiTemplateId(), customUserInfo.getOpenid(), - "http://" + tenant.getTenantKey() + ".julyharbor.com/user/#/orderDetail/" + order.getId()); + "https://" + tenant.getTenantKey() + ".julyharbor.com/user/#/orderDetail/" + order.getId()); List data = new ArrayList<>(); data.add(new WxMpTemplateData("time18", DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"))); data.add(new WxMpTemplateData("character_string8", order.getOrderNo())); @@ -331,7 +331,7 @@ public class WxCustomMpService { WxMpTemplateMessage templateMessage = getWxMpTemplateMessage(tenant.getQuxiaodingdantongzhiTemplateId(), customUserInfo.getOpenid(), - "http://" + tenant.getTenantKey() + ".julyharbor.com/user/#/orderDetail/" + orderInfo.getId()); + "https://" + tenant.getTenantKey() + ".julyharbor.com/user/#/orderDetail/" + orderInfo.getId()); List data = new ArrayList<>(); data.add(new WxMpTemplateData("character_string2", orderInfo.getOrderNo())); data.add(new WxMpTemplateData("thing5", StringUtils.isEmpty(refundReason) ? "已取消" : refundReason)); @@ -348,7 +348,7 @@ public class WxCustomMpService { templateMessage.setToUser(clerkUserInfo.getOpenid()); templateMessage.setUrl( - "http://" + tenant.getTenantKey() + ".julyharbor.com/clerk/#/orderDetail/" + orderInfo.getId()); + "https://" + tenant.getTenantKey() + ".julyharbor.com/clerk/#/orderDetail/" + orderInfo.getId()); try { proxyWxMpService().getTemplateMsgService().sendTemplateMsg(templateMessage); } catch (WxErrorException e) { diff --git a/play-admin/src/main/java/com/starry/admin/utils/SmsUtils.java b/play-admin/src/main/java/com/starry/admin/utils/SmsUtils.java index 1081659..dff3b78 100644 --- a/play-admin/src/main/java/com/starry/admin/utils/SmsUtils.java +++ b/play-admin/src/main/java/com/starry/admin/utils/SmsUtils.java @@ -4,17 +4,16 @@ import cn.hutool.core.util.RandomUtil; import com.alibaba.fastjson2.JSONObject; import com.starry.common.redis.RedisCache; import com.starry.common.utils.StringUtils; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.util.EntityUtils; import org.springframework.stereotype.Service; -import javax.annotation.Resource; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - /** * @Author: huchuansai * @Date: 2024/7/29 5:41 PM