xucaiqin 3 viikkoa sitten
vanhempi
commit
8ce9025801

+ 1 - 1
sckw-common/sckw-common-remote/src/main/java/com/sckw/remote/annotation/SckwRemoteApplication.java

@@ -12,6 +12,6 @@ import java.lang.annotation.*;
 @Inherited
 @EnableDubbo
 @EnableFeignClients({"com.sckw.*.api.feign"})
-@ComponentScan(basePackages = {"com.sckw.message.consumer","com.sckw.file.config", "com.sckw.payment.config", "com.sckw.fleet.config", "com.sckw.remote.filter", "com.sckw.*.dao","com.sckw.*.controller", "com.sckw.*.service", "com.sckw.*.repository", "com.sckw.*.dubbo", "com.sckw.*.model", "com.sckw.transport.*", "com.sckw.*.serivce","com.sckw.transport.config","com.sckw.contract.config"})
+@ComponentScan(basePackages = {"com.sckw.message.consumer","com.sckw.order","com.sckw.file.config", "com.sckw.payment.config", "com.sckw.fleet.config", "com.sckw.remote.filter", "com.sckw.*.dao","com.sckw.*.controller", "com.sckw.*.service", "com.sckw.*.repository", "com.sckw.*.dubbo", "com.sckw.*.model", "com.sckw.transport.*", "com.sckw.*.serivce","com.sckw.transport.config","com.sckw.contract.config"})
 public @interface SckwRemoteApplication {
 }

+ 2 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/OrderApplication.java

@@ -4,6 +4,7 @@ import com.sckw.remote.annotation.SckwRemoteApplication;
 import com.sckw.startup.annotation.SckwCloudApplication;
 import io.seata.spring.annotation.datasource.EnableAutoDataSourceProxy;
 import org.springframework.boot.SpringApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 /**
  * @desc: 订单服务
@@ -13,6 +14,7 @@ import org.springframework.boot.SpringApplication;
 @EnableAutoDataSourceProxy
 @SckwRemoteApplication
 @SckwCloudApplication
+@EnableScheduling
 public class OrderApplication {
 
     public static void main(String[] args) {

+ 9 - 4
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java

@@ -683,7 +683,7 @@ public class KwoTradeOrderService {
         if (Objects.isNull(order)) {
             throw new BusinessException("不存在该订单!");
         }
-        Map<String, Map<String, String>> dict = remoteSystemService.queryDictByType(List.of(DictTypeEnum.TRADE_TYPE.getType(), DictTypeEnum.PICKUP_TYPE.getType(), DictTypeEnum.DELIVERY_TYPE.getType(), DictTypeEnum.TORDER_SOURCE.getType(), DictTypeEnum.TORDER_STATUS.getType(), DictTypeEnum.PRODUCT_NAME_TYPE.getType(), DictTypeEnum.UNIT_TYPE.getType(), DictTypeEnum.TAX_RATE.getType(), DictTypeEnum.TORDER_UNIT_TYPE.getType(), DictTypeEnum.TORDER_ADDRESS_TYPE.getType(), DictTypeEnum.ADDRESS_TYPE.getType(), DictTypeEnum.CONSIGNMENT_WAY.getType(), DictTypeEnum.CHARGING_TYPE.getType()));
+        Map<String, Map<String, String>> dict = remoteSystemService.queryDictByType(List.of(DictTypeEnum.TRADE_TYPE.getType(), DictTypeEnum.PICKUP_TYPE.getType(), DictTypeEnum.DELIVERY_TYPE.getType(), DictTypeEnum.TORDER_SOURCE.getType(), DictTypeEnum.TORDER_STATUS.getType(), DictTypeEnum.PRODUCT_NAME_TYPE.getType(), DictTypeEnum.UNIT_TYPE.getType(), DictTypeEnum.TAX_RATE.getType(), DictTypeEnum.TORDER_UNIT_TYPE.getType(), DictTypeEnum.TORDER_ADDRESS_TYPE.getType(), DictTypeEnum.ADDRESS_TYPE.getType(), DictTypeEnum.CONSIGNMENT_WAY.getType(), DictTypeEnum.CHARGING_TYPE.getType(), DictTypeEnum.GOODS_SPEC.getType()));
         Map<String, String> pickupMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
         Map<String, String> deleveryMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
         Map<String, String> sourceMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
@@ -693,6 +693,7 @@ public class KwoTradeOrderService {
         Map<String, String> taxRateMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
         Map<String, String> chargeTypeMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
         Map<String, String> consignmentWayMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+        Map<String, String> goodspec = new HashMap<>(Global.NUMERICAL_SIXTEEN);
         Map<String, String> orderUnitMap, orderAddressMap, addressMap;
         if (CollUtil.isNotEmpty(dict)) {
             pickupMap = dict.get(DictTypeEnum.CONSIGNMENT_WAY.getType());
@@ -707,6 +708,7 @@ public class KwoTradeOrderService {
             addressMap = dict.get(DictTypeEnum.ADDRESS_TYPE.getType());
             chargeTypeMap = dict.get(DictTypeEnum.CHARGING_TYPE.getType());
             consignmentWayMap = dict.get(DictTypeEnum.CONSIGNMENT_WAY.getType());
+            goodspec = dict.get(DictTypeEnum.GOODS_SPEC.getType());
         } else {
             orderUnitMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
             orderAddressMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
@@ -740,6 +742,7 @@ public class KwoTradeOrderService {
                 EntCacheResDto entCache = remoteSystemService.queryEntCacheById(goods.getEntId());
                 GoodsInfoDetailRes goodsDetail = new GoodsInfoDetailRes();
                 goodsDetail.setGoodsTypeLabel(CollUtil.isNotEmpty(prodcutNameMap) ? prodcutNameMap.get(goods.getGoodsType()) : null).setUnitLabel(CollUtil.isNotEmpty(unitMap) ? unitMap.get(goods.getUnit()) : null).setTaxRateLabel(CollUtil.isNotEmpty(taxRateMap) ? taxRateMap.get(goods.getTaxRate()) : null).setGoodsAmount(goods.getAmount()).setGoodsId(goods.getId()).setCode(goods.getCode()).setName(goods.getName()).setGoodsType(goods.getGoodsType()).setTaxRate(goods.getTaxRate()).setSpec(goods.getSpec()).setUnit(goods.getUnit()).setPriceRangeId(orderGoods.getPriceRangeId()).setUnitPrice(orderGoods.getUnitPrice()).setSkuId(orderGoods.getSkuId()).setCollectionUnitId(goods.getEntId()).setGoodsThumb(goods.getThumb()).setPrepaidLimit(goods.getPrepaidLimit()).setAdvancePrice(goods.getAdvancePrice()).setCollectionUnit(Objects.isNull(entCache) ? null : entCache.getFirmName());
+                goodsDetail.setSpec(CollUtil.isNotEmpty(goodspec) ? goodspec.get(goods.getSpec()) : null);
                 detail.setGoodsInfo(goodsDetail);
                 if (Objects.equals(detail.getChargeType(), 1)) {//按装货量
                     detail.setDealMoney(NumberUtil.mul(orderGoods.getUnitPrice(), detail.getLoadAmount()));
@@ -1583,15 +1586,16 @@ public class KwoTradeOrderService {
         Map<Long, UserCacheResDto> userMap = remoteSystemService.queryUserCacheMapByIds(createByIds);
         Map<Long, KwpGoods> goodsMap = goodsInfoService.getGoodsByIds(goodIdList);
         Map<Long, ContractCommonInfoResDto> contractMap = remoteContractService.queryContractBaseInfo(contracIdList);
-        Map<String, Map<String, String>> dict = remoteSystemService.queryDictByType(List.of(DictTypeEnum.TORDER_STATUS.getType(), DictTypeEnum.PRODUCT_NAME_TYPE.getType(), DictTypeEnum.TRADE_TYPE.getType(), DictTypeEnum.SETTLEMENT_WAY.getType(), DictTypeEnum.CONSIGNMENT_WAY.getType(), DictTypeEnum.TORDER_SOURCE.getType()));
+        Map<String, Map<String, String>> dict = remoteSystemService.queryDictByType(List.of(DictTypeEnum.TORDER_STATUS.getType(), DictTypeEnum.PRODUCT_NAME_TYPE.getType(), DictTypeEnum.TRADE_TYPE.getType(), DictTypeEnum.SETTLEMENT_WAY.getType(), DictTypeEnum.CONSIGNMENT_WAY.getType(), DictTypeEnum.TORDER_SOURCE.getType(), DictTypeEnum.GOODS_SPEC.getType()));
         Map<String, SysDictResDto> unitType = remoteSystemService.queryDictMapByType(DictTypeEnum.UNIT_TYPE.getType());
-        Map<String, String> tradeMap, deliveryMap, pickupMap, sourceMap, nameMap;
+        Map<String, String> tradeMap, deliveryMap, pickupMap, sourceMap, nameMap, specMap;
         if (CollUtil.isNotEmpty(dict)) {
             tradeMap = CollUtil.isNotEmpty(dict.get(DictTypeEnum.TRADE_TYPE.getType())) ? dict.get(DictTypeEnum.TRADE_TYPE.getType()) : new HashMap<>(Global.NUMERICAL_SIXTEEN);
             deliveryMap = CollUtil.isNotEmpty(dict.get(DictTypeEnum.SETTLEMENT_WAY.getType())) ? dict.get(DictTypeEnum.SETTLEMENT_WAY.getType()) : new HashMap<>(Global.NUMERICAL_SIXTEEN);
             pickupMap = CollUtil.isNotEmpty(dict.get(DictTypeEnum.CONSIGNMENT_WAY.getType())) ? dict.get(DictTypeEnum.CONSIGNMENT_WAY.getType()) : new HashMap<>(Global.NUMERICAL_SIXTEEN);
             sourceMap = CollUtil.isNotEmpty(dict.get(DictTypeEnum.TORDER_SOURCE.getType())) ? dict.get(DictTypeEnum.TORDER_SOURCE.getType()) : new HashMap<>(Global.NUMERICAL_SIXTEEN);
             nameMap = CollUtil.isNotEmpty(dict.get(DictTypeEnum.PRODUCT_NAME_TYPE.getType())) ? dict.get(DictTypeEnum.PRODUCT_NAME_TYPE.getType()) : new HashMap<>(Global.NUMERICAL_SIXTEEN);
+            specMap = CollUtil.isNotEmpty(dict.get(DictTypeEnum.GOODS_SPEC.getType())) ? dict.get(DictTypeEnum.GOODS_SPEC.getType()) : new HashMap<>(Global.NUMERICAL_SIXTEEN);
 
         } else {
             tradeMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
@@ -1599,6 +1603,7 @@ public class KwoTradeOrderService {
             pickupMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
             sourceMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
             nameMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+            specMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
         }
         list.forEach(e -> {
             //装货地址
@@ -1617,7 +1622,7 @@ public class KwoTradeOrderService {
 
             OrderListResVO vo = BeanUtil.copyProperties(e, OrderListResVO.class);
             vo.setStatusLabel(TradeOrderStatusEnum.getMsg(e.getStatus())).setTradingLabel(tradeMap.get(e.getTrading())).setTrading(tradeMap.get(e.getTrading())).setDeliveryType(deliveryMap.get(e.getDeliveryType())).setPickupTypeLabel(pickupMap.get(e.getPickupType())).setSourceLabel(sourceMap.get(e.getSource())).setSource(sourceMap.get(e.getSource())).setContractName(Objects.isNull(contract) ? null : contract.getContactName()).setContractSigningWay(Objects.isNull(contract) ? null : contract.getSigningWayName()).setGoodsName(Objects.isNull(goods) ? null : goods.getName());
-            vo.setGoodsSpec(Objects.isNull(goods) ? null : goods.getSpec());
+            vo.setGoodsSpec(Objects.isNull(goods) ? "" : CollUtil.isNotEmpty(specMap) ? specMap.get(goods.getSpec()) : null);
             vo.setGoodsTaxRate(Objects.isNull(goods) ? null : goods.getTaxRate());
             vo.setGoodsThumb(Objects.isNull(goods) ? null : goods.getThumb());
             vo.setGoodsType(Objects.isNull(goods) ? null : goods.getGoodsType());

+ 110 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/task/TradeOrderTask.java

@@ -0,0 +1,110 @@
+package com.sckw.order.task;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.NumberUtil;
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.sckw.core.model.constant.Global;
+import com.sckw.core.model.enums.LogisticsOrderV1Enum;
+import com.sckw.order.dao.KwoTradeOrderGoodsMapper;
+import com.sckw.order.dao.KwoTradeOrderMapper;
+import com.sckw.order.dao.KwoTradeOrderUnitMapper;
+import com.sckw.order.enums.TradeOrderStatusEnum;
+import com.sckw.order.model.KwoTradeOrder;
+import com.sckw.order.model.KwoTradeOrderGoods;
+import com.sckw.order.model.KwoTradeOrderUnit;
+import com.sckw.payment.api.feign.WalletApi;
+import com.sckw.payment.api.model.WalletFreeze;
+import com.sckw.transport.api.dubbo.TransportRemoteService;
+import com.sckw.transport.api.model.param.OrderFinishParam;
+import com.sckw.transport.api.model.vo.KwtLogisticsOrderVO;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * @author xucaiqin
+ * @date 2025-12-19 09:05:54
+ */
+@Slf4j
+@Component
+public class TradeOrderTask {
+    @Resource
+    private KwoTradeOrderMapper kwoTradeOrderMapper;
+    @Resource
+    private KwoTradeOrderUnitMapper kwoTradeOrderUnitMapper;
+    @Resource
+    private KwoTradeOrderGoodsMapper kwoTradeOrderGoodsMapper;
+    @Resource
+    private WalletApi walletApi;
+    @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 8000)
+    private TransportRemoteService transportRemoteService;
+    private final ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 2, 1, TimeUnit.MINUTES, new LinkedBlockingQueue<>(20));
+
+    @Scheduled(cron = "0 0/5 * * * ?")
+    public void task() {
+        List<KwoTradeOrder> kwoTradeOrders = kwoTradeOrderMapper.selectList(new LambdaQueryWrapper<KwoTradeOrder>()
+                .eq(KwoTradeOrder::getStatus, TradeOrderStatusEnum.DEAL.getCode())
+                .eq(KwoTradeOrder::getDelFlag, Global.UN_DELETED)
+        );
+        if (CollUtil.isNotEmpty(kwoTradeOrders)) {
+            for (KwoTradeOrder kwoTradeOrder : kwoTradeOrders) {
+                List<KwtLogisticsOrderVO> logisticOrderList = transportRemoteService.getLogisticOrderList(new OrderFinishParam(kwoTradeOrder.getId()));
+                if (logisticOrderList.stream().anyMatch(d -> Objects.equals(d.getStatus(), LogisticsOrderV1Enum.NEARING_COMPLETION.getCode()))) {
+                    return;
+                }
+                threadPoolExecutor.execute(() -> {
+                    try {
+                        List<KwoTradeOrderUnit> orderUnits = kwoTradeOrderUnitMapper.selectList(new LambdaQueryWrapper<KwoTradeOrderUnit>().eq(KwoTradeOrderUnit::getTOrderId, kwoTradeOrder.getId())
+                                .eq(KwoTradeOrderUnit::getDelFlag, 0)
+                        );
+                        if (CollUtil.isEmpty(orderUnits) || orderUnits.size() < 2) {
+                            log.error("订单异常,未找到关联企业。订单id {}", kwoTradeOrder.getId());
+                            return;
+                        }
+                        Map<String, KwoTradeOrderUnit> unitMap = orderUnits.stream().collect(Collectors.toMap(KwoTradeOrderUnit::getUnitType, Function.identity(), (a, b) -> a));
+                        BigDecimal sum;
+                        if (Objects.equals(kwoTradeOrder.getChargeType(), 1)) {
+                            //按装货量
+                            sum = logisticOrderList.stream().map(KwtLogisticsOrderVO::getLoadAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+                        } else {
+                            sum = logisticOrderList.stream().map(KwtLogisticsOrderVO::getUnloadAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+                        }
+                        KwoTradeOrderGoods kwoTradeOrderGoods = kwoTradeOrderGoodsMapper.selectOne(new LambdaQueryWrapper<KwoTradeOrderGoods>()
+                                .eq(KwoTradeOrderGoods::getDelFlag, 0)
+                                .eq(KwoTradeOrderGoods::getTOrderId, kwoTradeOrder.getId())
+                                .last("limit 1")
+                        );
+
+                        //更新贸易订单状态
+                        WalletFreeze walletFreeze = new WalletFreeze();
+                        walletFreeze.setBuyEntId(unitMap.getOrDefault("1", new KwoTradeOrderUnit()).getEntId());
+                        walletFreeze.setSaleEntId(unitMap.getOrDefault("2", new KwoTradeOrderUnit()).getEntId());
+                        walletFreeze.setMoney(NumberUtil.mul(sum, kwoTradeOrderGoods.getUnitPrice()));
+                        walletFreeze.setTTradeOrderId(kwoTradeOrder.getId());
+                        walletFreeze.setOrderNo(kwoTradeOrder.getTOrderNo());
+                        log.info("结算 {}", JSONObject.toJSONString(walletFreeze));
+                        walletApi.dealMoney(walletFreeze);
+                    } catch (Exception ex) {
+                        log.error("更新订单异常{}", ex.getMessage());
+                    }
+                });
+
+            }
+
+        }
+
+    }
+}

+ 6 - 1
sckw-modules/sckw-product/src/main/java/com/sckw/product/service/KwpGoodsService.java

@@ -262,16 +262,20 @@ public class KwpGoodsService {
                 DictTypeEnum.UNIT_TYPE.getType(),
                 DictTypeEnum.TAX_RATE.getType(),
                 DictTypeEnum.GOODS_STATUS.getType(),
-                DictTypeEnum.ADDRESS_TYPE.getType()));
+                DictTypeEnum.ADDRESS_TYPE.getType(),
+                DictTypeEnum.GOODS_SPEC.getType())
+        );
         Map<String, String> productNameMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
         Map<String, String> unitMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
         Map<String, String> goodsStatusMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
         Map<String, String> addressMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+        Map<String, String> goodsMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
         if (CollectionUtils.isNotEmpty(dict)) {
             productNameMap = dict.get(DictTypeEnum.PRODUCT_NAME_TYPE.getType());
             unitMap = dict.get(DictTypeEnum.UNIT_TYPE.getType());
             goodsStatusMap = dict.get(DictTypeEnum.GOODS_STATUS.getType());
             addressMap = dict.get(DictTypeEnum.ADDRESS_TYPE.getType());
+            goodsMap = dict.get(DictTypeEnum.GOODS_SPEC.getType());
         }
         List<SysDictResDto> types = remoteSystemService.queryDictFrontAll(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), detail.getGoodsType());
         if (CollectionUtils.isNotEmpty(types)) {
@@ -280,6 +284,7 @@ public class KwpGoodsService {
         }
         detail.setGoodsTypeLabel(CollectionUtils.isNotEmpty(productNameMap) ? productNameMap.get(detail.getGoodsType()) : null)
                 .setUnitLabel(CollectionUtils.isNotEmpty(unitMap) ? unitMap.get(detail.getUnit()) : null)
+                .setSpec(CollectionUtils.isNotEmpty(goodsMap) ? goodsMap.get(detail.getSpec()) : null)
                 .setStatusLabel(CollectionUtils.isNotEmpty(goodsStatusMap) ? goodsStatusMap.get(String.valueOf(detail.getStatus())) : null);
         //商品图片信息
         if (Objects.nonNull(goods.getThumb())) {