Pu Zhibing
10 小时以前 981aacc8d5de2638a0f5b3eb2585e64cfaf2807d
修改bug
29个文件已修改
456 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteOrderFallbackFactory.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteShopFallbackFactory.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteOrderService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteShopService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/business/MerMemberController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/dto/MerMemberPageDto.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberMapper.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/business/MerOrderController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/concole/OrderController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/order/Order.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/AppUserOrderGetVo.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/AppUserOrderPageVo.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerOrderPageVo.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/mapper/order/UserServiceRecordMapper.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java 213 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/UserServiceRecordServiceImpl.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/UserServiceRecordService.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/UserServiceRecordMapper.xml 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/business/MerShopController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/console/ShopController.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/task/MemberTaskMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopAppointableTimeServiceImpl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/task/MemberTaskServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/task/MemberTaskService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/resources/mapper/task/MemberTaskMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteOrderFallbackFactory.java
@@ -97,6 +97,11 @@
            public R<MgtBulletinBoardVo> boardOrderTotal(BoardMemberTotalDto boardMemberTotalDto) {
                return R.fail(throwable.getMessage());
            }
            @Override
            public R<List<Integer>> countShopServicePerson(Long shopId) {
                return R.fail("获取今日到店用户失败:" + throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteShopFallbackFactory.java
@@ -4,12 +4,11 @@
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.domain.dto.*;
import com.ruoyi.system.api.domain.poji.config.OneClinkSyncing;
import com.ruoyi.system.api.domain.vo.ShopProportionVo;
import com.ruoyi.system.api.domain.poji.shop.Shop;
import com.ruoyi.system.api.domain.vo.*;
import com.ruoyi.system.api.model.QwH5LoginVo;
import com.ruoyi.system.api.model.QwUserDetailDto;
import com.ruoyi.system.api.service.RemoteShopService;
import com.ruoyi.system.api.domain.poji.shop.Shop;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
@@ -179,6 +178,12 @@
            public R updateShopByOneClinkSyncing(OneClinkSyncing oneClinkSyncing) {
                return R.fail("一键同步商户信息失败:"+throwable.getMessage());
            }
            @Override
            public R<List<Integer>> getMemberIngTotal(Long shopId) {
                return R.fail("获取有跟进任务的用户id失败:"+throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteOrderService.java
@@ -11,6 +11,7 @@
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.math.BigDecimal;
import java.util.List;
@@ -126,5 +127,14 @@
     */
    @PostMapping("/order/getGoodsSellStatic")
    R<StaticsShopMgtGoodsVO> getGoodsSellStatic(@RequestBody List<String> orderIdList);
    /**
     * 获取今日到店用户
     * @param shopId
     * @return
     */
    @PostMapping("/order/countShopServicePerson")
    R<List<Integer>> countShopServicePerson(@RequestParam("shopId") Long shopId);
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteShopService.java
@@ -6,7 +6,6 @@
import com.ruoyi.system.api.domain.dto.*;
import com.ruoyi.system.api.domain.poji.config.OneClinkSyncing;
import com.ruoyi.system.api.domain.poji.shop.Shop;
import com.ruoyi.system.api.domain.vo.ShopProportionVo;
import com.ruoyi.system.api.domain.vo.*;
import com.ruoyi.system.api.factory.RemoteShopFallbackFactory;
import com.ruoyi.system.api.model.QwH5LoginVo;
@@ -14,6 +13,7 @@
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
@@ -242,4 +242,14 @@
     */
    @PostMapping("/shop/updateShopByOneClinkSyncing")
    R updateShopByOneClinkSyncing(@RequestBody OneClinkSyncing oneClinkSyncing);
    /**
     * 获取有跟进任务的用户id
     * @param shopId
     * @return
     */
    @PostMapping("/getMemberIngTotal")
    R<List<Integer>> getMemberIngTotal(@RequestParam("shopId") Long shopId);
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/business/MerMemberController.java
@@ -109,8 +109,8 @@
    public R<Long> addMerMember(@RequestBody MerMemberAddDto merMemberAddDto) {
        Long userId = SecurityUtils.getUserId();
        merMemberAddDto.setUserId(userId);
        memberService.addMerMember(merMemberAddDto);
        return R.ok();
        Long aLong = memberService.addMerMember(merMemberAddDto);
        return R.ok(aLong);
    }
    @RequestMapping(value = "/editMerMember", method = RequestMethod.POST)
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/dto/MerMemberPageDto.java
@@ -4,6 +4,8 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * @author jqs34
 * @ClassName MerMemberPageDto
@@ -55,14 +57,22 @@
    @ApiModelProperty(value = "会员性别0男1女")
    private Integer memberGender;
    @ApiModelProperty(value = "会员活跃度")
    private String memberActiveness;
    @ApiModelProperty(value = "活跃度开始时间",hidden = true)
    @ApiModelProperty(value = "活跃度开始时间", hidden = true)
    private String actStartDate;
    @ApiModelProperty(value = "活跃度结束时间",hidden = true)
    @ApiModelProperty(value = "活跃度结束时间", hidden = true)
    private String actEndDate;
    @ApiModelProperty(value = "是否今日到店(0=否,1=是)")
    private Integer isTodayStore;
    @ApiModelProperty(value = "是否有未跟进任务(0=否,1=是)")
    private Integer isTask;
    private List<Integer> userIds;
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java
@@ -432,6 +432,16 @@
                merMemberPageDto.setSurpEndNum(999999999);
            }
        }
        //今日到店用户
        if(1 == merMemberPageDto.getIsTodayStore()){
            List<Integer> data = remoteOrderService.countShopServicePerson(merMemberPageDto.getShopId()).getData();
            merMemberPageDto.setUserIds(data);
        }
        //有未跟进的任务用户
        if(1 == merMemberPageDto.getIsTask()){
            List<Integer> data = remoteShopService.getMemberIngTotal(merMemberPageDto.getShopId()).getData();
            merMemberPageDto.setUserIds(data);
        }
        List<MerMemberPageVo> merMemberPageVoList = memberMapper.pageMerMember(page, merMemberPageDto);
        //处理活跃度返回
        if (merMemberPageVoList != null && !merMemberPageVoList.isEmpty()) {
ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberMapper.xml
@@ -162,10 +162,16 @@
        tm.user_tags userTags,
        tm.goods_type goodsType,
        tmt.last_service_time lastPayTime,
        tm.memberNurse
        tm.member_nurse memberNurse
        FROM t_member tm
        INNER JOIN t_member_total tmt ON tm.member_id = tmt.member_id
        WHERE tm.relation_shop_id = #{param.shopId} AND tm.binding_flag = 1
        <if test="null != param.userIds and param.userIds.size() > 0">
            and tm.user_id in
            <foreach collection="param.userIds" item="userId" open="(" separator="," close=")">
                #{userId}
            </foreach>
        </if>
        <if test="param.memberGender != null">
            AND tm.gender = #{param.memberGender}
        </if>
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/business/MerOrderController.java
@@ -184,6 +184,7 @@
            return R.fail("取消失败");
        }
        order.setOrderStatus(0);
        order.setCancelType(2);
        order.setCancelTime(new Date());
        orderService.updateById(order);
        return R.ok();
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/concole/OrderController.java
@@ -5,6 +5,7 @@
import com.ruoyi.common.core.domain.R;
import com.ruoyi.order.service.order.ConsumerGoodsService;
import com.ruoyi.order.service.order.OrderService;
import com.ruoyi.order.service.order.UserServiceRecordService;
import com.ruoyi.system.api.domain.dto.BirthdayGiftSendDto;
import com.ruoyi.system.api.domain.dto.BoardMemberTotalDto;
import com.ruoyi.system.api.domain.dto.MerBaseDto;
@@ -32,6 +33,9 @@
    @Resource
    private ConsumerGoodsService consumerGoodsService;
    @Resource
    private UserServiceRecordService userServiceRecordService;
    @PostMapping("/getAppOrderTotal")
@@ -114,7 +118,7 @@
     */
    @PostMapping("/autoCancelOrder")
    public R autoCancelOrder(@RequestBody String orderId){
        orderService.autoCancelOrder(orderId);
        orderService.autoCancelOrder(orderId, 1);
        return R.ok();
    }
@@ -193,10 +197,22 @@
     * @param goodsIdList
     * @return
     */
    @PostMapping("/order/getGoodsSellStatic")
    @PostMapping("/getGoodsSellStatic")
    R<StaticsShopMgtGoodsVO> getGoodsSellStatic(@RequestBody List<String> goodsIdList){
        StaticsShopMgtGoodsVO vo = orderService.getGoodsSellStatic(goodsIdList);
        vo.setGoodsNum(goodsIdList.size());
        return R.ok(vo);
    }
    /**
     * 获取今日到店用户
     * @param shopId
     * @return
     */
    @PostMapping("/countShopServicePerson")
    public R<List<Integer>> countShopServicePerson(@RequestParam("shopId") Long shopId){
        List<Integer> list = userServiceRecordService.countShopServicePerson(shopId);
        return R.ok(list);
    }
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/pojo/order/Order.java
@@ -153,6 +153,11 @@
    @TableField("cancel_time")
    private Date cancelTime;
    /**
     * 取消方(1=平台,2=商户,3=用户)
     */
    @TableField("cancel_type")
    private Integer cancelType;
    /**
     * 核销用户id
     */
    @TableField("use_user_id")
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/AppUserOrderGetVo.java
@@ -25,6 +25,9 @@
    @ApiModelProperty(value="订单编号")
    private String orderNo;
    @ApiModelProperty(value="三方订单号")
    private String tripartiteOrderId;
    @ApiModelProperty(value = "订单状态0.已取消1.待支付2.待核销3.已完成")
    private Integer orderStatus;
@@ -100,4 +103,7 @@
    @ApiModelProperty(value="结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date endTime;
    @ApiModelProperty(value="取消方(1=平台,2=商户,3=用户)")
    private Integer cancelType;
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/AppUserOrderPageVo.java
@@ -75,6 +75,9 @@
    @ApiModelProperty(value = "查询关键字", hidden = true)
    @JsonIgnore
    private String keyword;
    @ApiModelProperty(value="取消方(1=平台,2=商户,3=用户)")
    private Integer cancelType;
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerOrderPageVo.java
@@ -35,6 +35,9 @@
    @ApiModelProperty(value="订单编号")
    private String orderNo;
    @ApiModelProperty(value="三方订单号")
    private String tripartiteOrderId;
    @ApiModelProperty(value = "订单状态0.已取消1.待支付2.待核销3.已完成")
    private Integer orderStatus;
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/mapper/order/UserServiceRecordMapper.java
@@ -1,11 +1,11 @@
package com.ruoyi.order.mapper.order;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.order.domain.dto.AppConsumerPageDto;
import com.ruoyi.order.domain.dto.MerServiceRecordPageDto;
import com.ruoyi.order.domain.dto.MgtMemberServiceRecordPageDto;
import com.ruoyi.order.domain.pojo.order.UserServiceRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.order.domain.vo.AppServiceRecordPageVo;
import com.ruoyi.order.domain.vo.MerServiceRecordPageVo;
import com.ruoyi.order.domain.vo.MgtMemberServiceRecordPageVo;
@@ -56,12 +56,12 @@
    MgtMemberServiceTotalVo getMgtMemberServiceTotal(@Param("userId")Long userId);
    /**
     * @description  统计商户到店人数
     * @author  jqs
     * @date    2023/6/25 17:17
     * @param shopId
     * @return  Integer
     * @return Integer
     * @description 统计商户到店人数
     * @author jqs
     * @date 2023/6/25 17:17
     */
    Integer countShopServicePerson(@Param("shopId")Long shopId);
    List<Integer> countShopServicePerson(@Param("shopId") Long shopId);
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java
@@ -1514,6 +1514,7 @@
            delayTime = redisService.getCacheObject(SecurityConstant.AUTO_CANCEL_ORDER_TIME);
        }
        appUserOrderGetVo.setEndTime(DateUtils.addMinutes(order.getCreateTime(), delayTime));
        appUserOrderGetVo.setCancelType(order.getCancelType());
        return appUserOrderGetVo;
    }
@@ -1532,10 +1533,10 @@
            //删除待支付超时取消延时任务
            redisService.deleteObject(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode() + "-" + orderId);
            remoteConfigService.deleteDelayTask(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode()+"-"+orderId);
            this.autoCancelOrder(orderId);
            this.autoCancelOrder(orderId, 3);
        } else if (order.getOrderStatus() == 2) {
            // 2.待核销 -> 订单退款
            this.refundOrder(orderId);
            this.refundOrder(orderId, 3);
        } else {
            throw new ServiceException(AppErrorConstant.CANCEL_ERROR_ORDER);
        }
@@ -1690,12 +1691,12 @@
        shopId = merHomeShopTotalVo.getShopId();
        
        //获取今日到店
        Integer todayShop = userServiceRecordService.countShopServicePerson(shopId);
        List<Integer> todayShop = userServiceRecordService.countShopServicePerson(shopId);
        //获取待处理订单和营业额
        merHomeShopTotalVo = orderMapper.getMerHomeShopTotalVo(shopId);
        //获取服务统计
        MerHomeShopTotalVo serviceTotalVo = orderMapper.getMerHomeShopServiceTotalVo(shopId);
        merHomeShopTotalVo.setTodayShop(todayShop);
        merHomeShopTotalVo.setTodayShop(todayShop.size());
        merHomeShopTotalVo.setCycleSurp(serviceTotalVo.getCycleSurp());
        merHomeShopTotalVo.setExplorationSurp(serviceTotalVo.getExplorationSurp());
        return merHomeShopTotalVo;
@@ -3255,7 +3256,7 @@
            Long userId;
            Member member;
            Integer orderFrom;
            String orderFromDesc;
            String orderFromDesc = "";
            BigDecimal zeroBig = new BigDecimal("0.00");
            StringJoiner userIdSj = new StringJoiner(",");
            // 遍历订单列表
@@ -3269,8 +3270,16 @@
                        orderFromDesc = "商城订单";
                    } else if (orderFrom == 2) {
                        orderFromDesc = "平台秒杀活动(" + merOrderPageVo.getActivityName() + ")";
                    } else {
                    } else if(orderFrom == 3) {
                        orderFromDesc = "线下创建";
                    }else if(orderFrom == 4) {
                        orderFromDesc = "抽奖";
                    }else if(orderFrom == 5) {
                        orderFromDesc = "美团";
                    }else if(orderFrom == 6) {
                        orderFromDesc = "抖音";
                    }else if(orderFrom == 7) {
                        orderFromDesc = "快手";
                    }
                } else {
                    orderFromDesc = "商城订单";
@@ -5575,11 +5584,12 @@
    @Override
    @Transactional
//    @GlobalTransactional(rollbackFor = Exception.class) todo 放开分布式事务注解
    public void autoCancelOrder(String orderId) {
    public void autoCancelOrder(String orderId, Integer cancelType) {
        //更新订单信息
        Order order = this.getById(orderId);
        order.setOrderStatus(0);
        order.setCancelTime(new Date());
        order.setCancelType(cancelType);
        this.saveOrUpdate(order);
        //活动订单回退库存
        if (order.getOrderFrom() == 2) {
@@ -5791,11 +5801,12 @@
    @Override
    @Transactional
//    @GlobalTransactional(rollbackFor = Exception.class) todo 放开分布式事务注解
    public void refundOrder(String orderId) {
    public void refundOrder(String orderId, Integer cancelType) {
        // 更新订单信息
        Order order = this.getById(orderId);
        order.setOrderStatus(0);
        order.setCancelTime(new Date());
        order.setCancelType(cancelType);
        this.saveOrUpdate(order);
        OrderRefund orderRefund = new OrderRefund();
        String refundId = IdUtils.simpleUUID();
@@ -6534,64 +6545,39 @@
        }
    }
//    @GlobalTransactional(rollbackFor = Exception.class) todo 放开分布式事务注解
    private void autoTimeCancelOrder(Order order) {
        String orderId = order.getOrderId();
        order.setOrderStatus(0);
        order.setCancelTime(new Date());
        this.saveOrUpdate(order);
        //活动订单回退库存
        if (order.getOrderFrom() == 2) {
            List<OrderGoods> orderGoodsList = orderGoodsService.listByOrderId(orderId);
            if (orderGoodsList != null && !orderGoodsList.isEmpty()) {
                for (OrderGoods orderGoods : orderGoodsList) {
                    //redis库存控制极简版
                    String goodsLock = "goods_lock_" + order.getActivityId() + "_" + orderGoods.getGoodsId();
                    RLock redissonLock = redissonClient.getLock(goodsLock);
                    try {
                        redissonLock.lock(30, TimeUnit.SECONDS);
                        Integer surpNum = redisService.getCacheObject(SecurityConstant.ACTIVITY_GOODS + "-" + order.getActivityId() + "-" + orderGoods.getGoodsId());
                        if(null == surpNum){
                            surpNum = 0;
                        }
                        redisService.setCacheObject(SecurityConstant.ACTIVITY_GOODS + "-" + order.getActivityId() + "-" + orderGoods.getGoodsId(), surpNum + orderGoods.getBuyNum());
                    } finally {
                        redissonLock.unlock();
                    }
                    //改变活动库存
                    AGStockChangeDto agStockChangeDto = new AGStockChangeDto();
                    agStockChangeDto.setActivityId(order.getActivityId());
                    agStockChangeDto.setGoodsId(orderGoods.getGoodsId());
                    agStockChangeDto.setChangeType(1);
                    agStockChangeDto.setChangeNum(orderGoods.getBuyNum());
                    agStockChangeDto.setShopId(order.getShopId());
                    agStockChangeDto.setUserId(order.getUserId());
                    remoteActivityService.changeActivityStock(agStockChangeDto);
                    //删除活动记录
                    ActivityRecord activityRecord = new ActivityRecord();
                    activityRecord.setActivityId(order.getActivityId());
                    activityRecord.setGoodsId(orderGoods.getGoodsId());
                    activityRecord.setUserId(order.getUserId());
                    activityRecord.setOrderTime(order.getCreateTime());
                    remoteActivityService.delActivityRecord(activityRecord);
                }
            }
        } else {
            if (order.getCouponMoney().compareTo(BigDecimal.ZERO) > 0) {
                //回退优惠券
                List<OrderGoods> orderGoodsList = orderGoodsService.listByOrderId(orderId);
                if (orderGoodsList != null && !orderGoodsList.isEmpty()) {
                    StringJoiner memberCouponSJ = new StringJoiner(",");
                    for (OrderGoods orderGoods : orderGoodsList) {
                        memberCouponSJ.add(orderGoods.getCouponId());
                    }
                    if (memberCouponSJ != null) {
                        remoteCouponService.backMemberCoupon(memberCouponSJ.toString());
                    }
                }
            }
    /**
     * 后台取消订单
     * 订单状态变为已取消 不退款
     * @param dto
     */
    @Override
    public R cancelOrderBySys(CancelOrderDTO dto) {
        Order order = this.getById(dto.getOrderId());
        // 订单状态-1.删除 0.已取消 1.待支付 2.待核销 3.已完成
        if(null == order || order.getDelFlag() == -1){
            return R.fail("订单不存在");
        }
        if (order.getOrderStatus() == 0) {
            return R.fail(AppErrorConstant.CANCEL_CANCEL_ORDER);
        } else if (order.getOrderStatus() == 1) {
            //删除待支付超时取消延时任务
            redisService.deleteObject(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode() + "-" + order.getOrderId());
            remoteConfigService.deleteDelayTask(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode()+"-"+order.getOrderId());
            order.setOrderStatus(0);
            order.setCancelTime(new Date());
            order.setCancelType(1);
            this.saveOrUpdate(order);
        } else if (order.getOrderStatus() == 2) {
            // 2.待核销
            order.setOrderStatus(0);
            order.setCancelTime(new Date());
            order.setCancelType(1);
            this.saveOrUpdate(order);
        } else {
            return R.fail(AppErrorConstant.CANCEL_ERROR_ORDER);
        }
        return R.ok();
    }
    /**
@@ -6732,38 +6718,6 @@
        }
        return new ArrayList<>();
    }
    /**
     * 后台取消订单
     * 订单状态变为已取消 不退款
     * @param dto
     */
    @Override
    public R cancelOrderBySys(CancelOrderDTO dto) {
        Order order = this.getById(dto.getOrderId());
        // 订单状态-1.删除 0.已取消 1.待支付 2.待核销 3.已完成
        if(null == order || order.getDelFlag() == -1){
            return R.fail("订单不存在");
        }
        if (order.getOrderStatus() == 0) {
            return R.fail(AppErrorConstant.CANCEL_CANCEL_ORDER);
        } else if (order.getOrderStatus() == 1) {
            //删除待支付超时取消延时任务
            redisService.deleteObject(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode() + "-" + order.getOrderId());
            remoteConfigService.deleteDelayTask(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode()+"-"+order.getOrderId());
            order.setOrderStatus(0);
            order.setCancelTime(new Date());
            this.saveOrUpdate(order);
        } else if (order.getOrderStatus() == 2) {
            // 2.待核销
            order.setOrderStatus(0);
            order.setCancelTime(new Date());
            this.saveOrUpdate(order);
        } else {
            return R.fail(AppErrorConstant.CANCEL_ERROR_ORDER);
        }
        return R.ok();
    }
    @Override
    public R refundOrderBySys(CancelOrderDTO dto) {
@@ -6778,10 +6732,10 @@
            //删除待支付超时取消延时任务
            redisService.deleteObject(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode() + "-" + order.getOrderId());
            remoteConfigService.deleteDelayTask(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode()+"-"+ order.getOrderId());
            this.autoCancelOrder( order.getOrderId());
            this.autoCancelOrder( order.getOrderId(), 1);
        } else if (order.getOrderStatus() == 2) {
            // 2.待核销 -> 订单退款
            this.refundOrder( order.getOrderId());
            this.refundOrder( order.getOrderId(), 1);
        } else {
            return R.fail("已核销订单不能退款");
        }
@@ -6789,6 +6743,67 @@
    }
//    @GlobalTransactional(rollbackFor = Exception.class) todo 放开分布式事务注解
    private void autoTimeCancelOrder(Order order) {
        String orderId = order.getOrderId();
        order.setOrderStatus(0);
        order.setCancelTime(new Date());
        order.setCancelType(1);
        this.saveOrUpdate(order);
        //活动订单回退库存
        if (order.getOrderFrom() == 2) {
            List<OrderGoods> orderGoodsList = orderGoodsService.listByOrderId(orderId);
            if (orderGoodsList != null && !orderGoodsList.isEmpty()) {
                for (OrderGoods orderGoods : orderGoodsList) {
                    //redis库存控制极简版
                    String goodsLock = "goods_lock_" + order.getActivityId() + "_" + orderGoods.getGoodsId();
                    RLock redissonLock = redissonClient.getLock(goodsLock);
                    try {
                        redissonLock.lock(30, TimeUnit.SECONDS);
                        Integer surpNum = redisService.getCacheObject(SecurityConstant.ACTIVITY_GOODS + "-" + order.getActivityId() + "-" + orderGoods.getGoodsId());
                        if(null == surpNum){
                            surpNum = 0;
                        }
                        redisService.setCacheObject(SecurityConstant.ACTIVITY_GOODS + "-" + order.getActivityId() + "-" + orderGoods.getGoodsId(), surpNum + orderGoods.getBuyNum());
                    } finally {
                        redissonLock.unlock();
                    }
                    //改变活动库存
                    AGStockChangeDto agStockChangeDto = new AGStockChangeDto();
                    agStockChangeDto.setActivityId(order.getActivityId());
                    agStockChangeDto.setGoodsId(orderGoods.getGoodsId());
                    agStockChangeDto.setChangeType(1);
                    agStockChangeDto.setChangeNum(orderGoods.getBuyNum());
                    agStockChangeDto.setShopId(order.getShopId());
                    agStockChangeDto.setUserId(order.getUserId());
                    remoteActivityService.changeActivityStock(agStockChangeDto);
                    //删除活动记录
                    ActivityRecord activityRecord = new ActivityRecord();
                    activityRecord.setActivityId(order.getActivityId());
                    activityRecord.setGoodsId(orderGoods.getGoodsId());
                    activityRecord.setUserId(order.getUserId());
                    activityRecord.setOrderTime(order.getCreateTime());
                    remoteActivityService.delActivityRecord(activityRecord);
                }
            }
        } else {
            if (order.getCouponMoney().compareTo(BigDecimal.ZERO) > 0) {
                //回退优惠券
                List<OrderGoods> orderGoodsList = orderGoodsService.listByOrderId(orderId);
                if (orderGoodsList != null && !orderGoodsList.isEmpty()) {
                    StringJoiner memberCouponSJ = new StringJoiner(",");
                    for (OrderGoods orderGoods : orderGoodsList) {
                        memberCouponSJ.add(orderGoods.getCouponId());
                    }
                    if (memberCouponSJ != null) {
                        remoteCouponService.backMemberCoupon(memberCouponSJ.toString());
                    }
                }
            }
        }
    }
    @Override
    public List<MgtThirdOrderPageVo> pageMgtThirdOrder(Page<MgtThirdOrderPageVo> page, MgtThirdOrderPageDto dto) {
        //如果区域代码不为null获取对应的商户id
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/UserServiceRecordServiceImpl.java
@@ -106,14 +106,14 @@
    }
    /**
     * @description  统计商户到店人数
     * @author  jqs
     * @date    2023/6/25 17:17
     * @param shopId
     * @return  Integer
     * @return Integer
     * @description 统计商户到店人数
     * @author jqs
     * @date 2023/6/25 17:17
     */
    @Override
    public Integer countShopServicePerson(Long shopId){
    public List<Integer> countShopServicePerson(Long shopId) {
        return userServiceRecordMapper.countShopServicePerson(shopId);
    }
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java
@@ -443,7 +443,7 @@
     * @param orderId
     * @return  void
     */
    void autoCancelOrder(String orderId);
    void autoCancelOrder(String orderId, Integer cancelType);
    /**
     * @description  订单支付回调
@@ -458,7 +458,7 @@
     * 取消订单
     * @param orderId
     */
    void refundOrder(String orderId);
    void refundOrder(String orderId, Integer cancelType);
    /**
     * @description  员工端活动订单统计
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/UserServiceRecordService.java
@@ -1,11 +1,11 @@
package com.ruoyi.order.service.order;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.order.domain.dto.AppConsumerPageDto;
import com.ruoyi.order.domain.dto.MerServiceRecordPageDto;
import com.ruoyi.order.domain.dto.MgtMemberServiceRecordPageDto;
import com.ruoyi.order.domain.pojo.order.UserServiceRecord;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.order.domain.vo.AppServiceRecordPageVo;
import com.ruoyi.order.domain.vo.MerServiceRecordPageVo;
import com.ruoyi.order.domain.vo.MgtMemberServiceRecordPageVo;
@@ -55,11 +55,11 @@
    MgtMemberServiceTotalVo getMgtMemberServiceTotal(Long userId);
    /**
     * @description  统计商户到店人数
     * @author  jqs
     * @date    2023/6/25 17:17
     * @param shopId
     * @return  Integer
     * @return Integer
     * @description 统计商户到店人数
     * @author jqs
     * @date 2023/6/25 17:17
     */
    Integer countShopServicePerson(Long shopId);
    List<Integer> countShopServicePerson(Long shopId);
}
ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml
@@ -36,6 +36,7 @@
        <result column="shopId" property="shopId" />
        <result column="orderFrom" property="orderFrom" />
        <result column="createTime" property="createTime" />
        <result column="cancelType" property="cancelType" />
        <collection property="appUserOrderGoodsPageVoList"
                    ofType="com.ruoyi.order.domain.vo.AppUserOrderGoodsPageVo"
                    select="listOrderGoodsByOrderId"
@@ -87,6 +88,7 @@
        <result column="orderRemark" property="orderRemark" />
        <result column="orderFrom" property="orderFrom" />
        <result column="createTime" property="createTime" />
        <result column="tripartiteOrderId" property="tripartiteOrderId" />
        <collection property="merOrderGoodsVoList"
                    ofType="com.ruoyi.order.domain.vo.MerOrderGoodsPageVo"
                    select="listSimpleOrderGoodsByOrderId"
@@ -296,7 +298,8 @@
        toc.receivable_money receivableMoney,
        toc.goods_num goodsNum,
        toc.shop_id shopId,
        toc.create_time createTime
        toc.create_time createTime,
        toc.cancel_type cancelType,
        FROM t_order toc
        WHERE toc.del_flag = 0
        <if test="param.userId != null">
@@ -380,7 +383,8 @@
        toc.order_from orderFrom,
        CASE toc.order_from WHEN 1 THEN '商城订单' WHEN 2 THEN CONCAT('平台秒杀活动(',toc.activity_name,')') WHEN 3 THEN
        '线下创建' END orderFromDesc,
        toc.activity_name activityName
        toc.activity_name activityName,
        toc.tripartite_order_id tripartiteOrderId
        FROM t_order toc
        WHERE toc.del_flag = 0 AND toc.shop_id = #{param.shopId}
        <if test="param.memberUserId != null and param.memberUserId != ''">
ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/UserServiceRecordMapper.xml
@@ -120,20 +120,22 @@
        </if>
        ORDER BY tusr.create_time DESC
    </select>
    <select id="getMgtMemberServiceTotal" resultType="com.ruoyi.order.domain.vo.MgtMemberServiceTotalVo">
        SELECT
        COUNT(consumer_goods_id) cycleTotal,
        IFNULL(SUM(service_num),0) cycleCount,
        IFNULL(SUM(service_num-used_num),0) surpCycleCount
        SELECT COUNT(consumer_goods_id)               cycleTotal,
               IFNULL(SUM(service_num), 0)            cycleCount,
               IFNULL(SUM(service_num - used_num), 0) surpCycleCount
        FROM t_consumer_goods
        WHERE del_flag = 0 AND goods_type = 1 AND cycle_num_flag = 1 AND user_id = #{userId}
        WHERE del_flag = 0
          AND goods_type = 1
          AND cycle_num_flag = 1
          AND user_id = #{userId}
    </select>
    <select id="countShopServicePerson" resultType="java.lang.Integer">
        SELECT COUNT(DISTINCT user_id)
    <select id="countShopServicePerson" resultType="list">
        SELECT DISTINCT user_id
        FROM t_user_service_record
        WHERE shop_id = #{shopId} AND DATE(create_time) = CURDATE()
        WHERE shop_id = #{shopId} AND DATE (create_time) = CURDATE()
    </select>
</mapper>
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/business/MerShopController.java
@@ -28,7 +28,10 @@
import javax.annotation.Resource;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
@@ -231,6 +234,15 @@
    }
    
    
    @RequestMapping(value = "/delShopNonAppointableTime/{id}", method = RequestMethod.POST)
    @ApiOperation(value = "门店删除不可预约时间段【2.0】")
    public R delShopNonAppointableTime(@PathVariable("id") String id) {
        shopNonAppointableTimeService.removeById(id);
        return R.ok();
    }
    @RequestMapping(value = "/switchAppointment/{shopId}/{subscribe}", method = RequestMethod.POST)
    @ApiOperation(value = "开关门店预约配置【2.0】")
    @ApiImplicitParams({
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/console/ShopController.java
@@ -24,10 +24,7 @@
import com.ruoyi.system.api.model.QwUserDetailDto;
import com.ruoyi.system.api.service.RemoteUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@@ -484,4 +481,16 @@
    List<Shop> getShopListByShopName(@RequestBody String content){
        return  shopService.getBaseMapper().selectList(new LambdaQueryWrapper<Shop>().like(Shop::getShopName, content));
    }
    /**
     * 获取有跟进任务的用户id
     * @param shopId
     * @return
     */
    @PostMapping("/getMemberIngTotal")
    public R<List<Integer>> getMemberIngTotal(@RequestParam("shopId") Long shopId){
        List<Integer> list = memberTaskService.getMemberIngTotal(shopId);
        return R.ok(list);
    }
}
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/task/MemberTaskMapper.java
@@ -36,7 +36,7 @@
     * @param shopId
     * @return  Integer
     */
    Integer getMemberIngTotal(@Param("shopId")Long shopId);
    List<Integer> getMemberIngTotal(@Param("shopId")Long shopId);
    /**
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopAppointableTimeServiceImpl.java
@@ -62,7 +62,11 @@
            Member member = remoteMemberService.getMember(shopAppointableTime.getUserId()).getData();
            shopAppointableTimeListVo.setUserName(member.getRealName());
            shopAppointableTimeListVo.setMobile(member.getMobile());
            shopAppointableTimeListVo.setSex(member.getGender() == 1 ? "女" : member.getGender() == 0 ? "男" : "未知");
            if (null == member.getGender()) {
                shopAppointableTimeListVo.setSex("未知");
            } else {
                shopAppointableTimeListVo.setSex(member.getGender() == 1 ? "女" : member.getGender() == 0 ? "男" : "未知");
            }
            list.add(shopAppointableTimeListVo);
        });
        return list;
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java
@@ -966,8 +966,8 @@
        merHomeShopTotalVo.setShopType(shop.getShopType());
        merHomeShopTotalVo.setTodayShop(orderVo.getTodayShop());
        merHomeShopTotalVo.setUnHandleOrder(orderVo.getUnHandleOrder());
        Integer taskCount = memberTaskService.getMemberIngTotal(shopId);
        merHomeShopTotalVo.setTask(taskCount);
        List<Integer> taskCount = memberTaskService.getMemberIngTotal(shopId);
        merHomeShopTotalVo.setTask(taskCount.size());
        merHomeShopTotalVo.setShopTurnover(orderVo.getShopTurnover());
        merHomeShopTotalVo.setCycleSurp(orderVo.getCycleSurp());
        merHomeShopTotalVo.setExplorationSurp(orderVo.getExplorationSurp());
@@ -1580,11 +1580,11 @@
        // 通过远程订单服务获取商店总览信息
        MerHomeShopTotalVo orderVo = remoteOrderService.getMerHomeTotal(merHomeShopTotalVo).getData();
        // 获取商店任务计数
        Integer taskCount = memberTaskService.getMemberIngTotal(shopId);
        List<Integer> taskCount = memberTaskService.getMemberIngTotal(shopId);
        // 设置员工商店信息对象的属性
        staffShopInfoGetVo.setTodayReservation(0);
        staffShopInfoGetVo.setUnHandleOrder(orderVo.getUnHandleOrder());
        staffShopInfoGetVo.setShopTask(taskCount);
        staffShopInfoGetVo.setShopTask(taskCount.size());
        staffShopInfoGetVo.setShopTurnover(orderVo.getShopTurnover());
        staffShopInfoGetVo.setCycleSurp(orderVo.getCycleSurp());
        staffShopInfoGetVo.setExplorationSurp(orderVo.getExplorationSurp());
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/task/MemberTaskServiceImpl.java
@@ -1,6 +1,7 @@
package com.ruoyi.shop.service.impl.task;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.utils.uuid.IdUtils;
@@ -12,7 +13,6 @@
import com.ruoyi.shop.mapper.task.MemberTaskMapper;
import com.ruoyi.shop.service.task.MemberTaskRecordService;
import com.ruoyi.shop.service.task.MemberTaskService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.shop.service.task.TaskFileService;
import com.ruoyi.system.api.domain.dto.MemberTotalChangeDto;
import com.ruoyi.system.api.domain.vo.MemberTaskSimpleVo;
@@ -237,7 +237,7 @@
     * @return  Integer
     */
    @Override
    public Integer getMemberIngTotal(Long shopId) {
    public List<Integer> getMemberIngTotal(Long shopId) {
        return memberTaskMapper.getMemberIngTotal(shopId);
    }
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/task/MemberTaskService.java
@@ -51,7 +51,7 @@
     * @param shopId
     * @return  Integer
     */
    Integer getMemberIngTotal(Long shopId);
    List<Integer> getMemberIngTotal(Long shopId);
    /**
     * @description  获取最近任务
ruoyi-modules/ruoyi-shop/src/main/resources/mapper/task/MemberTaskMapper.xml
@@ -92,8 +92,8 @@
    </select>
    <select id="getMemberIngTotal" resultType="java.lang.Integer">
        SELECT COUNT(task_id)
    <select id="getMemberIngTotal" resultType="list">
        SELECT user_id
        FROM t_member_task
        WHERE del_flag = 0 AND task_status = 1 AND shop_id = #{shopId} AND task_date = CURRENT_DATE()
    </select>