luodangjia
2025-01-14 fbb35a6b9ed181fa7e5d7bc1fb0c3318a1d18db1
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
@@ -8,11 +8,13 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.account.api.feignClient.BalanceChangeRecordClient;
import com.ruoyi.account.api.feignClient.UserCouponClient;
import com.ruoyi.account.api.feignClient.UserPointClient;
import com.ruoyi.account.api.model.*;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.utils.uuid.QRCodeGenerator;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.order.enums.OrderStatus;
@@ -22,14 +24,12 @@
import com.ruoyi.order.model.OrderBalancePayment;
import com.ruoyi.order.model.OrderGood;
import com.ruoyi.order.model.RefundPass;
import com.ruoyi.order.service.CommissionService;
import com.ruoyi.order.service.OrderBalancePaymentService;
import com.ruoyi.order.service.OrderService;
import com.ruoyi.order.service.RefundPassService;
import com.ruoyi.order.service.*;
import com.ruoyi.order.util.ExpressDeliveryUtil;
import com.ruoyi.order.util.payment.PaymentUtil;
import com.ruoyi.order.util.payment.model.RefundCallbackResult;
import com.ruoyi.order.util.payment.model.RefundResult;
import com.ruoyi.order.util.vo.MapTrackKD100Vo;
import com.ruoyi.order.util.vo.QueryKD100Vo;
import com.ruoyi.order.vo.*;
import com.ruoyi.other.api.domain.*;
@@ -37,13 +37,16 @@
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.feignClient.SysUserClient;
import com.ruoyi.system.api.model.LoginUser;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
@@ -103,6 +106,15 @@
    @Resource
    private ShopBalanceStatementClient shopBalanceStatementClient;
    
    @Resource
    private RedisTemplate redisTemplate;
    @Resource
    private SystemConfigClient systemConfigClient;
    @Resource
    private UserCouponClient userCouponClient;
    
@@ -147,9 +159,8 @@
        // 收货地址
        String addressJson = order.getAddressJson();
        UserAddress userAddress = new UserAddress();
        if (StringUtils.isNotEmpty(addressJson)){
        if (2 == order.getDistributionMode()){
            userAddress = JSONObject.parseObject(addressJson, UserAddress.class);
        }
        // 优惠券
        String couponJson = order.getCouponJson();
@@ -165,13 +176,7 @@
            orderActivityInfo = JSONObject.parseObject(activityJson, OrderActivityInfo.class);
        }
        OrderDetailVO orderDetailVO = new OrderDetailVO();
        if (CollectionUtil.isNotEmpty(orderGoods)){
            String goodJson = orderGoods.get(0).getGoodJson();
            Goods goods = JSONObject.parseObject(goodJson, Goods.class);
            orderDetailVO.setDistributionMode(goods.getDistributionMode());
        }
        orderDetailVO.setDistributionMode(order.getDistributionMode());
        Technician technician = new Technician();
        if (order.getTechnicianId() != null){
            R<Technician> shopdetail = technicianClient.shopdetail(order.getTechnicianId());
@@ -187,6 +192,7 @@
        orderDetailVO.setAddressId(userAddress.getId());
        orderDetailVO.setRecieveName(userAddress.getRecieveName());
        orderDetailVO.setRecievePhone(userAddress.getRecievePhone());
        userAddress.setRecieveAddress(userAddress.getProvince() + userAddress.getCity() + userAddress.getDistrict() + userAddress.getRecieveAddress());
        orderDetailVO.setRecieveAddress(userAddress.getRecieveAddress());
        orderDetailVO.setOrderNumber(order.getOrderNumber());
        orderDetailVO.setCreateTime(order.getCreateTime());
@@ -204,6 +210,22 @@
        orderDetailVO.setLatitude(shop.getLatitude());
        orderDetailVO.setShopId(shop.getId());
        orderDetailVO.setTechnicianName(technician.getName());
        orderDetailVO.setTechnicianId(technician.getId());
        if(order.getOrderType() == 1){
            List<TechnicianSubscribe> data = technicianSubscribeClient.getTechnicianSubscribeList(order.getId()).getData();
            if(data.size() > 0){
                Long id = data.get(0).getId();
                orderDetailVO.setTechnicianSubscribeId(id.toString());
            }
        }
        // 生成核销码BASE64
        try {
            String base64 = QRCodeGenerator.generateQRCodeBase64(order.getOrderNumber(), 124, 124);
            orderDetailVO.setWriteOffCode(base64);
        } catch (Exception e) {
            e.printStackTrace();
            throw new ServiceException("生成核销码失败");
        }
        return orderDetailVO;
    }
@@ -438,6 +460,7 @@
            BalanceChangeRecord balanceChangeRecord = new BalanceChangeRecord();
            balanceChangeRecord.setOrderId(order.getId());
            balanceChangeRecord.setAppUserId(order.getAppUserId());
            balanceChangeRecord.setVipId(appUser.getVipId());
            balanceChangeRecord.setChangeType(6);
            balanceChangeRecord.setBeforeAmount(balance);
            balanceChangeRecord.setChangeAmount(paymentAmount);
@@ -484,7 +507,12 @@
            userPoint.setObjectId(order.getId());
            userPointClient.saveUserPoint(userPoint);
            appUserClient.editAppUserById(appUser);
            //回退优惠券状态
            if(null != order.getUserCouponId()){
                UserCoupon userCoupon = userCouponClient.getUserCoupon(order.getUserCouponId()).getData();
                userCoupon.setUseTime(null);
                userCouponClient.editReturnUse(userCoupon);
            }
        }
        if(3 == payMethod){
            //开始运费退款,积分支付,运费是单独进行支付的,所以需要单独退款
@@ -513,6 +541,7 @@
                    BalanceChangeRecord balanceChangeRecord = new BalanceChangeRecord();
                    balanceChangeRecord.setOrderId(order.getId());
                    balanceChangeRecord.setAppUserId(order.getAppUserId());
                    balanceChangeRecord.setVipId(appUser.getVipId());
                    balanceChangeRecord.setChangeType(6);
                    balanceChangeRecord.setBeforeAmount(balance);
                    balanceChangeRecord.setChangeAmount(expressAmount);
@@ -609,6 +638,13 @@
        userPoint.setObjectId(order.getId());
        userPointClient.saveUserPoint(userPoint);
        appUserClient.editAppUserById(appUser);
        //回退优惠券状态
        if(null != order.getUserCouponId()){
            UserCoupon userCoupon = userCouponClient.getUserCoupon(order.getUserCouponId()).getData();
            userCoupon.setUseTime(null);
            userCouponClient.editReturnUse(userCoupon);
        }
        return R.ok();
    }
@@ -655,9 +691,6 @@
        userPoint.setAppUserId(order.getAppUserId());
        userPoint.setObjectId(order.getId());
        userPointClient.saveUserPoint(userPoint);
        order.setRefundStatus(2);
        order.setRefundTime(LocalDateTime.now());
        return R.ok();
    }
@@ -722,7 +755,7 @@
            orderInfo.setUserName(appUser.getName());
            orderInfo.setPhone(appUser.getPhone());
        }
        orderInfo.setOrderType(order.getOrderType() == 1 ? "服务" : (StringUtils.isNotEmpty(order.getExpressJson()) ? "单品-快递配送" : "单品-自提"));
        orderInfo.setOrderType(order.getOrderType() == 1 ? "服务" : (StringUtils.isNotEmpty(order.getAddressJson()) ? "单品-快递配送" : "单品-上门自提"));
        Shop shop = shopClient.getShopById(order.getShopId()).getData();
        if(null != shop){
            orderInfo.setShopName(shop.getName());
@@ -737,17 +770,13 @@
        orderInfo.setExpressAmount(order.getExpressAmount());
        orderInfo.setPaymentAmount(order.getPaymentAmount());
        orderInfo.setGetPoint(order.getGetPoint());
        if(StringUtils.isNotEmpty(order.getAddressJson())){
        if(2 == order.getDistributionMode()){
            UserAddress userAddress = JSON.parseObject(order.getAddressJson(), UserAddress.class);
            orderInfo.setRecipient(userAddress.getRecieveName() + "-" + userAddress.getRecievePhone());
            userAddress.setRecieveAddress(userAddress.getProvince() + userAddress.getCity() + userAddress.getDistrict() + userAddress.getRecieveAddress());
            orderInfo.setAddress(userAddress.getRecieveAddress());
        }
        if(StringUtils.isNotEmpty(order.getExpressJson())){
            JSONObject jsonObject = JSON.parseObject(order.getExpressJson());
            String com = jsonObject.getString("com");
            String num = jsonObject.getString("num");
            QueryKD100Vo queryKD100Vo = ExpressDeliveryUtil.kd100QueryTrack(com, num);
            orderInfo.setExpress(queryKD100Vo);
            MapTrackKD100Vo mapTrackKD100Vo = JSON.parseObject(order.getExpressResult(), MapTrackKD100Vo.class);
            orderInfo.setExpress(mapTrackKD100Vo);
        }
        List<OrderGood> orderGoods = orderGoodMapper.selectList(new LambdaQueryWrapper<OrderGood>().eq(OrderGood::getOrderId, orderId).eq(OrderGood::getDelFlag, 0));
        int sum = orderGoods.stream().mapToInt(OrderGood::getNum).sum();
@@ -811,4 +840,41 @@
    public Integer getShopSaleNum(Integer shopId, Integer type) {
        return this.baseMapper.getShopSaleNum(shopId, type);
    }
    /**
     * 定时查询快递信息
     */
    @Override
    public void taskExpress() {
        Set<Long> order_express = redisTemplate.opsForZSet().rangeByScore("order_express", 0, LocalDateTime.now().toEpochSecond(ZoneOffset.UTC));
        if(order_express.size() > 0){
            for (Long id : order_express) {
                Order order = this.getById(id);
                if(order.getOrderStatus() != 2){
                    redisTemplate.opsForZSet().remove("order_express", id);
                    continue;
                }
                String expressJson = order.getExpressJson();
                if(StringUtils.isEmpty(expressJson)){
                    redisTemplate.opsForZSet().remove("order_express", id);
                    continue;
                }
                //{"com":"jd","num":"JDV016336234367"}
                JSONObject jsonObject = JSON.parseObject(expressJson);
                String com = jsonObject.getString("com");
                String num = jsonObject.getString("num");
                UserAddress userAddress = JSON.parseObject(order.getAddressJson(), UserAddress.class);
                MapTrackKD100Vo mapTrackKD100Vo = ExpressDeliveryUtil.kd100MapTrack(com, num, order.getDeliverProvince() + order.getDeliverCity(),
                        userAddress.getProvince() + userAddress.getCity());
                order.setExpressResult(JSON.toJSONString(mapTrackKD100Vo));
                this.updateById(order);
                //延长时间x小时
                SystemConfig systemConfig = systemConfigClient.getSystemConfig(3).getData();
                JSONObject jsonObject1 = JSON.parseObject(systemConfig.getContent());
                Integer waitTime = jsonObject1.getInteger("waitTime");
                redisTemplate.opsForZSet().add("order_express", order.getId(), LocalDateTime.now().plusHours(waitTime).toEpochSecond(ZoneOffset.UTC));
            }
        }
    }
}