Procházet zdrojové kódy

Merge remote-tracking branch 'origin/dev_20251130' into dev_20251130

sckw-developer před 2 měsíci
rodič
revize
7baeb089db

+ 13 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/entity/KwcContractTradeGoods.java

@@ -1,5 +1,6 @@
 package com.sckw.contract.model.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
@@ -89,5 +90,17 @@ public class KwcContractTradeGoods implements Serializable {
      * 是否删除(0未删除,1删除)
      */
     private Integer delFlag;
+    /**
+     * 开始时间
+     */
+    @TableField("start_time")
+    private Date startTime;
+    /**
+     * 结束时间
+     */
+    @TableField("end_time")
+    private Date endTime;
 
+    @TableField(exist = false)
+    private String contractIdGoodsIdKey;
 }

+ 5 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/SupplyContractTradeReq.java

@@ -188,6 +188,11 @@ public class SupplyContractTradeReq implements Serializable {
         @NotNull(message = "商品不能为空")
         @Schema(description = "商品id")
         private Long goodsId;
+        /**
+         * 商品名称
+         */
+        @Schema(description = "商品名称")
+        private String goodsName;
 
         /**
          * 采购数量

+ 15 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractTradeGoodsRepository.java

@@ -7,6 +7,7 @@ import com.sckw.contract.model.entity.KwcContractTradeGoods;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * @author :chenXiaoFei
@@ -22,4 +23,18 @@ public class KwcContractTradeGoodsRepository extends ServiceImpl<KwcContractTrad
                 .eq(KwcContractTradeGoods::getContractId, pid)
                 .in(KwcContractTradeGoods::getGoodsId, goodsIds));
     }
+
+    public List<KwcContractTradeGoods> queryByContractIds(Set<Long> contractIds) {
+        return list(Wrappers.<KwcContractTradeGoods>lambdaQuery()
+                .eq(KwcContractTradeGoods::getDelFlag,0)
+                .in(KwcContractTradeGoods::getContractId, contractIds));
+    }
+
+    public List<KwcContractTradeGoods> queryByConTractIdsGoodsIds(Set<Long> pids,List<Long> goodsIds) {
+        return list(Wrappers.<KwcContractTradeGoods>lambdaQuery()
+                .eq(KwcContractTradeGoods::getDelFlag,0)
+                .in(KwcContractTradeGoods::getContractId, pids)
+                .in(KwcContractTradeGoods::getGoodsId, goodsIds));
+    }
+
 }

+ 25 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractTradeRepository.java

@@ -0,0 +1,25 @@
+package com.sckw.contract.repository;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.contract.dao.KwcContractTradeMapper;
+import com.sckw.contract.model.entity.KwcContractTrade;
+import jakarta.validation.constraints.NotNull;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 贸易合同接口
+ * @create :2025-11-05 09:27:00
+ */
+@Repository
+public class KwcContractTradeRepository extends ServiceImpl<KwcContractTradeMapper, KwcContractTrade> {
+    public List<KwcContractTrade> queryByPid( Long pid) {
+        return list(Wrappers.<KwcContractTrade>lambdaQuery()
+                .eq(KwcContractTrade::getDelFlag, 0)
+                .eq(KwcContractTrade::getContractPid, pid));
+    }
+}

+ 7 - 3
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/KwcContractTradeGoodsService.java

@@ -37,7 +37,8 @@ public class KwcContractTradeGoodsService {
     private final KwcContractTradeGoodsRepository kwcContractTradeGoodsRepository;
 
 
-    public void saveContractTradeGoods(long contractId, List<TradeGoodsInfoReqVo> goodsInfoList) {
+    public void saveContractTradeGoods(long contractId, List<TradeGoodsInfoReqVo> goodsInfoList,Date startTime,
+                                       Date endTime) {
         //todo 调dubbo接口返回商品详情 填充sku
         //List<Long> goodsIdList = goodsInfoList.stream().map(TradeGoodsInfoReqVo::getGoodsId).toList();
 
@@ -47,7 +48,7 @@ public class KwcContractTradeGoodsService {
             return;
         }
         Set<KwcContractTradeGoods> tradeGoods = goodsInfoList.stream()
-                .map(g -> getKwcContractTradeGoods(contractId, g, userId))
+                .map(g -> getKwcContractTradeGoods(contractId, g, userId, startTime, endTime))
                 .collect(Collectors.toSet());
         if (CollectionUtils.isNotEmpty(tradeGoods)){
             kwcContractTradeGoodsRepository.saveBatch(tradeGoods);
@@ -56,7 +57,8 @@ public class KwcContractTradeGoodsService {
     }
 
     @NotNull
-    private static KwcContractTradeGoods getKwcContractTradeGoods(long contractId, TradeGoodsInfoReqVo g, Long userId) {
+    private static KwcContractTradeGoods getKwcContractTradeGoods(long contractId, TradeGoodsInfoReqVo g, Long userId
+            ,Date startTime, Date endTime) {
         Date date = new Date();
         KwcContractTradeGoods kwcContractTradeGoods = new KwcContractTradeGoods();
         kwcContractTradeGoods.setId(new IdWorker(1L).nextId());
@@ -72,6 +74,8 @@ public class KwcContractTradeGoodsService {
         kwcContractTradeGoods.setUpdateBy(userId);
         kwcContractTradeGoods.setUpdateTime(date);
         kwcContractTradeGoods.setDelFlag(Global.NO);
+        kwcContractTradeGoods.setStartTime(startTime);
+        kwcContractTradeGoods.setEndTime(endTime);
         return kwcContractTradeGoods;
     }
 

+ 84 - 15
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractTradeService.java

@@ -17,6 +17,7 @@ import com.sckw.contract.model.report.TradeListExport;
 import com.sckw.contract.model.vo.req.*;
 import com.sckw.contract.model.vo.res.*;
 import com.sckw.contract.repository.KwcContractTradeGoodsRepository;
+import com.sckw.contract.repository.KwcContractTradeRepository;
 import com.sckw.contract.service.CommonBusinessService;
 import com.sckw.contract.service.KwcContractTradeGoodsService;
 import com.sckw.contract.service.KwcContractTradeTrackService;
@@ -91,6 +92,7 @@ public class KwcContractTradeService {
     private CommonBusinessService commonBusinessService;
 
     private final KwcContractTradeGoodsRepository kwcContractTradeGoodsRepository;
+    private final KwcContractTradeRepository kwcContractTradeRepository;
 
     @DubboReference(version = "1.0.0", group = "design", check = false)
     private RemoteSystemService remoteSystemService;
@@ -257,7 +259,7 @@ public class KwcContractTradeService {
         }
 
         //保存交易合同商品信息
-        kwcContractTradeGoodsService.saveContractTradeGoods(contactId, goodsInfoList);
+        kwcContractTradeGoodsService.saveContractTradeGoods(contactId, goodsInfoList,baseInfo.getStartTime(),baseInfo.getEndTime());
 
         //存单位信息
         kwcContractTradeUnitService.saveContractTradeUnit(contactId, baseInfo);
@@ -720,7 +722,8 @@ public class KwcContractTradeService {
                 throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.UPDATE_FAIL);
             }
         }
-        kwcContractTradeGoodsService.saveContractTradeGoods(kwcContractTrade.getId(), reqVo.getGoodsInfo());
+        kwcContractTradeGoodsService.saveContractTradeGoods(kwcContractTrade.getId(), reqVo.getGoodsInfo(),
+                baseInfo.getStartTime(), baseInfo.getEndTime());
 
         //保存单位信息-先把以前的删除
         List<KwcContractTradeUnit> kwcContractTradeUnits = kwcContractTradeUnitService.queryByContractId(contractId);
@@ -1093,31 +1096,98 @@ public class KwcContractTradeService {
         //校验标的信息是否有重复
         checkParams(req);
         //保存补充合同
-        saveTradeContract(req);
+        long contactId = new IdWorker(1L).nextId();
+        saveTradeContract(req, contactId);
 
         //获取商品id
         List<Long> goodsIds = req.getGoodsInfo()
                 .stream()
                 .map(SupplyContractTradeReq.TradeGoodsInfo::getGoodsId)
                 .collect(Collectors.toList());
+
+
+        //根据父id查询补充合同id
+        List<KwcContractTrade> kwcContractTrades = kwcContractTradeRepository.queryByPid(req.getPid());
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(kwcContractTrades)){
+            throw new BusinessException("没有补充合同");
+        }
+
+        //获取合同id
+        Set<Long> contractIds = kwcContractTrades.stream()
+                .map(KwcContractTrade::getId)
+                .collect(Collectors.toSet());
+        contractIds.add(req.getPid());
+        //查询标的信息
         //根据商品id查询标的信息和主合同
         List<KwcContractTradeGoods> kwcContractTradeGoods =
-                kwcContractTradeGoodsRepository.queryByConTractIdGoodsIds(req.getPid(),goodsIds);
+                kwcContractTradeGoodsRepository.queryByConTractIdsGoodsIds(contractIds,goodsIds);
+        //商品id映射商品信息(排除主合同查看是否存在补充合同的商品信息)
+        Map<Long, KwcContractTradeGoods> goodsIdAndGoodsMap = kwcContractTradeGoods.stream()
+                .filter(x -> !Objects.equals(x.getContractId(), req.getPid()))
+                .collect(Collectors.toMap(KwcContractTradeGoods::getGoodsId, Function.identity(), (x, y) -> x));
+        //过滤主合同查看的标信息 , 合同id商品id组成唯一key映射商品信息
+        Map<String, KwcContractTradeGoods> contractTradeKeyAndGoodsMap =
+                kwcContractTradeGoods.stream().filter(x -> Objects.equals(x.getContractId(), req.getPid()))
+                .peek(x -> x.setContractIdGoodsIdKey(x.getContractId() + "-" + x.getGoodsId()))
+                .collect(Collectors.toMap(KwcContractTradeGoods::getContractIdGoodsIdKey, Function.identity(), (x, y) -> x));
+
         //商品id映射交易商品信息
-        Map<Long, KwcContractTradeGoods> goodsIdAndCtgMap = kwcContractTradeGoods.stream()
-                .collect(Collectors.toMap(KwcContractTradeGoods::getGoodsId, Function.identity(), (a, b) -> a));
-        List<KwcContractTradeGoods> tradeGoodsList = Lists.newArrayList();
-        req.getGoodsInfo().forEach(x->{
-            KwcContractTradeGoods tradeGoods = goodsIdAndCtgMap.getOrDefault(x.getGoodsId(),new KwcContractTradeGoods());
-            // cxdf todo  补充合同的逻辑
-//            if (tradeGoods){
-//
-//            }
+        List<KwcContractTradeGoods> saveOrUpdateTradeGoods = Lists.newArrayList();
+        req.getGoodsInfo().forEach(g -> {
+            KwcContractTradeGoods tradeGoods = goodsIdAndGoodsMap.get(g.getGoodsId());
+            if (Objects.isNull(tradeGoods)){
+                //作为新增对象
+                buildTradeGoods(req, g, contractTradeKeyAndGoodsMap, saveOrUpdateTradeGoods,contactId);
+
+            }else {
+                //如果不为空判断时间是否重叠 存在则报错
+                if (g.getEffectiveStartTime().after(tradeGoods.getStartTime()) && g.getEffectiveStartTime().before(tradeGoods.getEndTime())
+                        || (g.getEffectiveEntTime().after(tradeGoods.getStartTime()) && g.getEffectiveEntTime().before(tradeGoods.getEndTime()))){
+                    throw new BusinessException("商品:"+g.getGoodsName() +"时间重叠,只有先结束之前的补充合同,才能进行创建;");
+                }
+                buildTradeGoods(req, g, contractTradeKeyAndGoodsMap, saveOrUpdateTradeGoods,contactId);
+            }
         });
 
+        kwcContractTradeGoodsRepository.saveOrUpdateBatch(saveOrUpdateTradeGoods);
+    }
+
+    private static void buildTradeGoods(SupplyContractTradeReq req, SupplyContractTradeReq.TradeGoodsInfo g,
+                                        Map<String, KwcContractTradeGoods> contractTradeKeyAndGoodsMap,
+                                        List<KwcContractTradeGoods> saveTradeGoods,long contactId) {
+        Long userId = LoginUserHolder.getUserId();
+        Date date = new Date();
+        KwcContractTradeGoods saveSupplyTradeGoods = new KwcContractTradeGoods();
+        saveSupplyTradeGoods.setContractId(contactId);
+        saveSupplyTradeGoods.setGoodsId(g.getGoodsId());
+        saveSupplyTradeGoods.setSkuId(0L);
+        saveSupplyTradeGoods.setAmount(g.getAmount());
+        saveSupplyTradeGoods.setUnit(g.getUnit());
+        saveSupplyTradeGoods.setPrice(g.getPrice());
+        saveSupplyTradeGoods.setPerformedAmount(new BigDecimal("0"));
+        saveSupplyTradeGoods.setStatus(Global.NO);
+        saveSupplyTradeGoods.setCreateBy(userId);
+        saveSupplyTradeGoods.setCreateTime(date);
+        saveSupplyTradeGoods.setUpdateBy(userId);
+        saveSupplyTradeGoods.setUpdateTime(date);
+        saveSupplyTradeGoods.setDelFlag(Global.NO);
+        saveSupplyTradeGoods.setStartTime(g.getEffectiveStartTime());
+        saveSupplyTradeGoods.setEndTime(g.getEffectiveEntTime());
+        //修改主合同商品数量
+
+        KwcContractTradeGoods tradeGoodsData =
+                contractTradeKeyAndGoodsMap.get(req.getPid() + "-" + g.getGoodsId());
+        if (Objects.nonNull(tradeGoodsData)){
+            KwcContractTradeGoods mainTradeGoods = new KwcContractTradeGoods();
+            mainTradeGoods.setId(tradeGoodsData.getId());
+            mainTradeGoods.setPrice(g.getPrice());
+            mainTradeGoods.setAmount(g.getAmount());
+            saveTradeGoods.add(mainTradeGoods);
+        }
+        saveTradeGoods.add(saveSupplyTradeGoods);
     }
 
-    private void saveTradeContract(SupplyContractTradeReq req) {
+    private void saveTradeContract(SupplyContractTradeReq req,long contactId) {
         SupplyContractTradeReq.TradeBaseInfo baseInfo = req.getBaseInfo();
         List<SupplyContractTradeReq.TradeGoodsInfo> goodsInfo = req.getGoodsInfo();
         Date date = new Date();
@@ -1157,7 +1227,6 @@ public class KwcContractTradeService {
         }
         kwcContractTrade.setAmount(amountTotal);
 
-        long contactId = new IdWorker(1L).nextId();
         kwcContractTrade.setId(contactId);
         kwcContractTrade.setStatus(ContractStatusEnum.SAVE.getCode());
         kwcContractTrade.setSigningUrl(changeFile(req.getContractFile()));

+ 5 - 1
sql/2025/11/30/2025_11_30_cxf_alert.sql

@@ -7,4 +7,8 @@ ALTER TABLE kwc_contract_trade ADD salesman_phone varchar(11)   NOT NULL default
 ALTER TABLE kwp_goods ADD price_unit varchar(10)   NOT NULL default ''  comment '价格单位(元,万元)';
 
 
-ALTER TABLE kws_role ADD ent_id bigint NOT NULL default 0  comment '企业id';
+ALTER TABLE kws_role ADD ent_id bigint NOT NULL default 0  comment '企业id';
+
+ALTER TABLE kwc_contract_trade_goods ADD start_time date NOT NULL default '1000-01-01'  comment '开始日期';
+
+ALTER TABLE kwc_contract_trade_goods ADD end_time date NOT NULL default '1000-01-01'  comment '结束日期';