package com.cyksj.service.mange.impl; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.cyksj.common.task.GlobalThreadPoolTaskExecutor; import com.cyksj.common.util.Jsons; import com.cyksj.mapper.GoodsDonSkuMapper; import com.cyksj.mapper.OrderDonMapper; import com.cyksj.mapper.OrderDonTransportMapper; import com.cyksj.mapper.OrderDonWaybillMapper; import com.cyksj.mapper.stock.GoodsSkuStockRelateMapper; import com.cyksj.model.entity.*; import com.cyksj.model.excel.ExcelOrderDonInfo; import com.cyksj.model.manage.request.ReqSetLogisticsPost; import com.cyksj.service.mange.CmsOrderDonService; import com.cyksj.service.mange.stock.GoodsDonStockService; import com.cyksj.service.order.UserRealOrderBenefitsService; import com.cyksj.service.template.TemplateCommonService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Optional; /** * @author chan * @date 2021/10/25 下午10:14 */ @Service @Slf4j @RequiredArgsConstructor public class CmsOrderDonServiceImpl extends ServiceImpl implements CmsOrderDonService { private final OrderDonTransportMapper transportMapper; private final OrderDonWaybillMapper orderDonWaybillMapper; private final GoodsSkuStockRelateMapper skuStockRelateMapper; private final GoodsDonStockService goodsDonStockService; private final TemplateCommonService templateCommonService; private final GoodsDonSkuMapper goodsDonSkuMapper; private final UserRealOrderBenefitsService userRealOrderBenefitsService; private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance(); @Override public List exportOrderInfo(Long promotionId, String start, String end) { return this.getBaseMapper().exportOrderInfo(promotionId,start,end); } @Override public OrderDonTransport getTransport(Long orderId) { return transportMapper.selectOne(Wrappers.lambdaQuery(OrderDonTransport.class).eq(OrderDonTransport::getOrderId, orderId)); } @Transactional(rollbackFor = Throwable.class) @Override public OrderDonWaybill setWaybill(ReqSetLogisticsPost reqSetLogisticsPost) { OrderDonWaybill orderDonWaybill = Optional.ofNullable(orderDonWaybillMapper.selectOne(Wrappers.lambdaQuery(OrderDonWaybill.class).eq(OrderDonWaybill::getOrderId, reqSetLogisticsPost.getOrderId()))).orElse(new OrderDonWaybill()); orderDonWaybill.setCodeCn(reqSetLogisticsPost.getCodeCn()); orderDonWaybill.setTrackingNumber(reqSetLogisticsPost.getTrackingNumber()); orderDonWaybill.setOrderId(reqSetLogisticsPost.getOrderId()); orderDonWaybill.setRemark(reqSetLogisticsPost.getRemark()); OrderDon orderDon = getById(orderDonWaybill.getOrderId()); if(orderDonWaybill.getId() == null){ try { orderDonWaybillMapper.insert(orderDonWaybill); } catch (DuplicateKeyException e) { return orderDonWaybill; } orderDon.setStatus(OrderDon.Status.transport); updateById(orderDon); //发放实物购买权益 Boolean isReceivedAll = true; GoodsDonSku sku = goodsDonSkuMapper.selectById(orderDon.getSkuId()); if (sku != null) { if (sku.getIsBenefits()) { if (StrUtil.isNotEmpty(sku.getBenefitsList())) { try { List goodsDonSkus = Jsons.parseList(sku.getBenefitsList(), GoodsDonSku.class); //自购实物 获取权益 isReceivedAll = userRealOrderBenefitsService.getPayRealGoodsBenefits(orderDon.getUserId(), orderDon.getId(), goodsDonSkus); } catch (Exception e) { } } } } final Boolean flag = isReceivedAll; //库存扣减逻辑 List relateList = skuStockRelateMapper.selectList(Wrappers.lambdaQuery(GoodsSkuStockRelate.class).eq(GoodsSkuStockRelate::getSkuId,orderDon.getSkuId())); if(!relateList.isEmpty()){ relateList.forEach((relate)->{ goodsDonStockService.upStockRelate(relate.getStockId(),orderDon.getId(),"transport"); }); } //发送微信模板消息 TASK_POOL.execute(()->{ try { log.info("发送发货通知至{}用户", orderDon.getUserId()); templateCommonService.sendTransportMsgNotify(orderDon, reqSetLogisticsPost, flag); } catch (Exception e) { log.error("发送发货通知至{}用户失败:{}", orderDon.getUserId(), e); } }); }else { if (orderDon.getStatus() == OrderDon.Status.hasPayment) { orderDon.setStatus(OrderDon.Status.transport); updateById(orderDon); } orderDonWaybillMapper.updateById(orderDonWaybill); } return orderDonWaybill; } }