Procházet zdrojové kódy

提交630贸易合同相关逻辑

chenxiaofei před 2 týdny
rodič
revize
430ca9579b

+ 6 - 1
sckw-modules/sckw-contract/pom.xml

@@ -88,6 +88,11 @@
             <groupId>org.springframework</groupId>
             <artifactId>spring-test</artifactId>
         </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
         <dependency>
             <groupId>com.sckw</groupId>
             <artifactId>sckw-common-log</artifactId>
@@ -150,4 +155,4 @@
             </plugin>
         </plugins>
     </build>
-</project>
+</project>

+ 5 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/dto/res/QueryListResDto.java

@@ -178,4 +178,9 @@ public class QueryListResDto {
      */
     private Integer unloadWay;
 
+    /**
+     * 是否代理属性:0-否,1-是
+     */
+    private Integer agentFlag;
+
 }

+ 7 - 1
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/entity/KwcContractTrade.java

@@ -173,4 +173,10 @@ public class KwcContractTrade implements Serializable {
     @TableField("dispatch_way")
     private Integer dispatchWay;
 
-}
+    /**
+     * 是否代理属性:0-否,1-是
+     */
+    @TableField("agent_flag")
+    private Integer agentFlag;
+
+}

+ 6 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/QueryListReqVo.java

@@ -123,5 +123,11 @@ public class QueryListReqVo extends PageReq implements Serializable {
     @Schema(description = "派车方式(1-手动派车、2-自动派车)")
     private Integer dispatchWay;
 
+    /**
+     * 是否代理属性:0-否,1-是
+     */
+    @Schema(description = "是否代理属性:0-否,1-是")
+    private Integer agentFlag;
+
 
 }

+ 6 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/QueryTradeReq.java

@@ -55,4 +55,10 @@ public class QueryTradeReq extends PageReq implements Serializable {
      */
     @Schema(description = "派车方式")
     private Integer dispatchWay;
+
+    /**
+     * 是否代理属性:0-否,1-是
+     */
+    @Schema(description = "是否代理属性:0-否,1-是")
+    private Integer agentFlag;
 }

+ 13 - 1
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/res/QueryListResVo.java

@@ -238,7 +238,19 @@ public class QueryListResVo implements Serializable {
     @Schema(description = "派车方式秒速")
     private String dispatchWayDesc;
 
+    /**
+     * 是否代理属性:0-否,1-是
+     */
+    @Schema(description = "是否代理属性:0-否,1-是")
+    private Integer agentFlag;
+
+    /**
+     * 是否代理属性描述
+     */
+    @Schema(description = "是否代理属性描述")
+    private String agentFlagDesc;
+
 
 
 
-}
+}

+ 3 - 1
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractTradeRepository.java

@@ -63,7 +63,8 @@ public class KwcContractTradeRepository extends ServiceImpl<KwcContractTradeMapp
 
     public List<KwcContractTrade> queryTradeListByPageList(String contractCode,
                                                          String contractName, String supplementCode,
-                                                            Set<Long> contractIds, Integer status, Integer dispatchWay, int pageNum, int pageSize) {
+                                                            Set<Long> contractIds, Integer status, Integer dispatchWay,
+                                                            Integer agentFlag, int pageNum, int pageSize) {
         return list( Wrappers.<KwcContractTrade>lambdaQuery()
                 .eq(KwcContractTrade::getDelFlag, 0)
                 .like(StringUtils.isNotBlank(contractCode),KwcContractTrade::getContractNo, contractCode)
@@ -72,6 +73,7 @@ public class KwcContractTradeRepository extends ServiceImpl<KwcContractTradeMapp
                 .like(StringUtils.isNotBlank(supplementCode),KwcContractTrade::getContractPid, supplementCode)
                 .in(CollectionUtils.isNotEmpty(contractIds),KwcContractTrade::getId, contractIds)
                 .eq(Objects.nonNull(dispatchWay),KwcContractTrade::getDispatchWay, dispatchWay)
+                .eq(Objects.nonNull(agentFlag),KwcContractTrade::getAgentFlag, agentFlag)
                 .orderByDesc(KwcContractTrade::getUpdateTime)
                 .orderByDesc(KwcContractTrade::getId));
 

+ 91 - 3
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractTradeService.java

@@ -92,6 +92,11 @@ import java.util.stream.Collectors;
 @RequiredArgsConstructor
 public class KwcContractTradeService {
 
+    /**
+     * 供应单位代理属性类型
+     */
+    static final int SUPPLY_AGENT_ENT_TYPE = 4;
+
 
     @Autowired
     private KwcContractTradeMapper kwcContractTradeMapper;
@@ -199,6 +204,7 @@ public class KwcContractTradeService {
         queryTradeReq.setSupplyEntId(reqVo.getSupplyEntId());
         queryTradeReq.setDispatchWay(reqVo.getDispatchWay());
         queryTradeReq.setStatus(reqVo.getStatus());
+        queryTradeReq.setAgentFlag(reqVo.getAgentFlag());
         queryTradeReq.setPageNum(reqVo.getPageNum());
         queryTradeReq.setPageSize(reqVo.getPageSize());
 
@@ -232,6 +238,7 @@ public class KwcContractTradeService {
         for (QueryListResDto queryListResDto : queryListResDtos) {
             QueryListResVo queryListResVo = new QueryListResVo();
             BeanUtils.copyProperties(queryListResDto, queryListResVo);
+            queryListResVo.setAgentFlagDesc(Objects.equals(queryListResDto.getAgentFlag(), Global.YES) ? "是" : "否");
 
 
             if (Objects.nonNull(queryListResDto.getUnitType())) {
@@ -313,6 +320,7 @@ public class KwcContractTradeService {
         KwcContractTrade kwcContractTrade = getKwcContractTrade(baseInfo, reqVo.getGoodsInfo(), reqVo.getRemark(), reqVo.getPid());
         long contactId = new IdWorker(1L).nextId();
         kwcContractTrade.setId(contactId);
+        kwcContractTrade.setAgentFlag(querySupplyAgentFlag(baseInfo.getProvideEntId()));
         EntCacheResDto entCacheResDto = remoteSystemService.queryEntTreeById(LoginUserHolder.getEntId());
         if (Objects.nonNull(entCacheResDto) && StringUtils.isNotBlank(entCacheResDto.getEntTypes())) {
             if (org.apache.commons.lang3.StringUtils.equals(entCacheResDto.getEntTypes(), String.valueOf(EntTypeEnum.SUPPLIER.getCode()))) {
@@ -489,6 +497,82 @@ public class KwcContractTradeService {
         return kwcContractTrade;
     }
 
+    /**
+     * 根据供应单位企业属性计算贸易合同代理标记。
+     *
+     * @param supplyEntId 供应单位ID
+     * @return 0-否,1-是
+     */
+    /**
+     * 查询供应单位是否具备代理属性。
+     * <p>
+     * 通过远程服务获取企业属性信息,判断该企业是否被标记为“供应单位代理”。
+     * 如果具备代理属性,返回 Global.YES (1),否则返回 Global.NO (0)。
+     * </p>
+     *
+     * @param supplyEntId 供应单位ID
+     * @return 代理标识:1-是代理,0-非代理
+     * @throws BusinessException 当供应单位ID为空或查询远程服务异常时抛出
+     */
+    private Integer querySupplyAgentFlag(Long supplyEntId) {
+        // 参数校验:供应单位ID不能为空
+        if (Objects.isNull(supplyEntId)) {
+            log.warn("查询供应单位代理属性失败,原因:供应单位ID为空");
+            throw new BusinessException("供应单位不能为空");
+        }
+
+        try {
+            log.debug("开始查询供应单位代理属性,supplyEntId: {}", supplyEntId);
+            
+            // 调用远程系统服务查询企业属性类型列表
+            List<EntTypeResDto> entTypeList = remoteSystemService.queryEntTypeByIds(Collections.singleton(supplyEntId));
+            
+            // 判断是否包含代理属性类型
+            boolean isAgent = hasSupplyAgentAttribute(entTypeList, supplyEntId);
+            Integer result = isAgent ? Global.YES : Global.NO;
+            
+            log.debug("供应单位代理属性查询完成,supplyEntId: {}, 结果: {}", supplyEntId, result);
+            return result;
+            
+        } catch (BusinessException e) {
+            // 业务异常直接抛出,避免重复包装
+            throw e;
+        } catch (Exception e) {
+            // 捕获其他异常(如网络超时、远程服务错误等),记录详细日志并抛出通用业务异常
+            log.error("查询供应单位代理属性发生系统异常,supplyEntId: {}", supplyEntId, e);
+            throw new BusinessException("查询供应单位代理属性失败");
+        }
+    }
+
+    /**
+     * 判断指定供应单位是否具备代理属性。
+     * <p>
+     * 遍历企业属性列表,检查是否存在与给定 supplyEntId 匹配且类型为 {@link #SUPPLY_AGENT_ENT_TYPE} 的记录。
+     * </p>
+     *
+     * @param entTypeList 企业属性集合,由远程服务返回
+     * @param supplyEntId 待检查的供应单位ID
+     * @return true-具备代理属性,false-不具备代理属性或参数无效
+     */
+    static boolean hasSupplyAgentAttribute(List<EntTypeResDto> entTypeList, Long supplyEntId) {
+        // 前置条件检查:ID不为空且列表非空
+        if (Objects.isNull(supplyEntId) || CollectionUtils.isEmpty(entTypeList)) {
+            return false;
+        }
+
+        // 流式处理:过滤空对象 -> 匹配企业ID -> 检查是否为代理类型
+        boolean isMatch = entTypeList.stream()
+                .filter(Objects::nonNull) // 过滤列表中的null元素
+                .filter(item -> Objects.equals(item.getEntId(), supplyEntId)) // 匹配指定的企业ID
+                .anyMatch(item -> Objects.equals(item.getType(), SUPPLY_AGENT_ENT_TYPE)); // 检查类型是否为代理类型(4)
+
+        if (isMatch) {
+            log.debug("检测到供应单位具备代理属性,supplyEntId: {}", supplyEntId);
+        }
+        
+        return isMatch;
+    }
+
     /**
      * @param reqVo 补充入参
      * @desc: 补充合同
@@ -812,6 +896,7 @@ public class KwcContractTradeService {
         kwcContractTrade.setSalesmanId(baseInfo.getSalesmanId());
         kwcContractTrade.setSalesmanPhone(baseInfo.getSalesmanPhone());
         kwcContractTrade.setDispatchWay(baseInfo.getDispatchWay());
+        kwcContractTrade.setAgentFlag(querySupplyAgentFlag(baseInfo.getProvideEntId()));
         List<TradeGoodsInfoReqVo> goodsInfo = reqVo.getGoodsInfo();
         BigDecimal amountTotal = new BigDecimal(Global.NUMERICAL_ZERO);
         if (CollectionUtils.isNotEmpty(goodsInfo)) {
@@ -1351,6 +1436,7 @@ public class KwcContractTradeService {
         kwcContractTrade.setSalesmanId(baseInfo.getSalesmanId());
         kwcContractTrade.setSalesmanPhone(baseInfo.getSalesmanPhone());
         kwcContractTrade.setDispatchWay(baseInfo.getDispatchWay());
+        kwcContractTrade.setAgentFlag(querySupplyAgentFlag(baseInfo.getProvideEntId()));
 
 
         BigDecimal amountTotal = new BigDecimal(Global.NUMERICAL_ZERO);
@@ -1674,7 +1760,7 @@ public class KwcContractTradeService {
                 req.getContractCode(),
                 req.getContractName(),
                 req.getSupplementCode(),
-                contractIds, req.getStatus(), req.getDispatchWay(), req.getPageNum(), req.getPageSize());
+                contractIds, req.getStatus(), req.getDispatchWay(), req.getAgentFlag(), req.getPageNum(), req.getPageSize());
         // List<KwcContractTrade> records = page.getRecords();
         if (org.apache.commons.collections4.CollectionUtils.isEmpty(records)) {
             return Collections.emptyList();
@@ -1842,7 +1928,7 @@ public class KwcContractTradeService {
                 req.getContractCode(),
                 req.getContractName(),
                 req.getSupplementCode(),
-                contractIds, req.getStatus(), req.getDispatchWay(), 0, 0);
+                contractIds, req.getStatus(), req.getDispatchWay(), req.getAgentFlag(), 0, 0);
         if (org.apache.commons.collections4.CollectionUtils.isEmpty(records)) {
             return 0L;
         }
@@ -1965,6 +2051,8 @@ public class KwcContractTradeService {
         queryListResVo.setStatusName(ContractStatusEnum.getNameByCode(t.getStatus()));
         queryListResVo.setDispatchWay(t.getDispatchWay());
         queryListResVo.setDispatchWayDesc(DispatchWayEnums.getDesc(t.getDispatchWay()));
+        queryListResVo.setAgentFlag(t.getAgentFlag());
+        queryListResVo.setAgentFlagDesc(Objects.equals(t.getAgentFlag(), Global.YES) ? "是" : "否");
 
         KwcContractTradeUnit purchaseEnt = finalContractUnitTypeKeyAndUnitMap.getOrDefault(t.getId() + "-" + CooperateTypeEnum.PURCHASER.getCode(),
                 new KwcContractTradeUnit());
@@ -2332,7 +2420,7 @@ public class KwcContractTradeService {
                 req.getContractCode(),
                 req.getContractName(),
                 req.getSupplementCode(),
-                contractIds, req.getStatus(), req.getDispatchWay(), 0, 0);
+                contractIds, req.getStatus(), req.getDispatchWay(), req.getAgentFlag(), 0, 0);
 
         // List<KwcContractTrade> kwcContractTrades = kwcContractTradeRepository.queryTradeListByPageList(LoginUserHolder.getEntId());
 

+ 15 - 3
sckw-modules/sckw-contract/src/main/resources/mapper/KwcContractTradeMapper.xml

@@ -27,7 +27,8 @@
                a.performed_amount performedAmount,
                f.name             contractPname,
                a.unload_way       unloadWay,
-               a.signing_way      signingWay
+               a.signing_way      signingWay,
+               a.agent_flag       agentFlag
         from kwc_contract_trade a
             left join kwc_contract_trade_unit b
         on a.id = b.contract_id
@@ -107,6 +108,9 @@
             and b.unit_type = 1
             and b.id = #{supplyEntId}
         </if>
+        <if test="agentFlag != null">
+            and a.agent_flag = #{agentFlag}
+        </if>
         order by a.create_time desc
     </select>
 
@@ -159,7 +163,8 @@
                e.firm_name        purchaseEntName,
                a.contract_pid     contractPid,
                a.performed_amount performedAmount,
-               f.name             contractPname
+               f.name             contractPname,
+               a.agent_flag       agentFlag
         from kwc_contract_trade a
                  left join kwc_contract_trade_unit b on a.id = b.contract_id and b.del_flag = 0 and b.unit_type = 1
                  left join kwc_contract_trade_unit e on a.id = e.contract_id and e.del_flag = 0 and e.unit_type = 2
@@ -203,6 +208,9 @@
         <if test="reqVo.signingWay != null">
             and a.signing_way = #{reqVo.signingWay}
         </if>
+        <if test="reqVo.agentFlag != null">
+            and a.agent_flag = #{reqVo.agentFlag}
+        </if>
         order by a.create_time desc
     </select>
 
@@ -231,7 +239,8 @@
                f.name             contractPname,
                f.contract_no      contractPidNo,
                a.unload_way       unloadWay,
-               a.signing_way      signingWay
+               a.signing_way      signingWay,
+               a.agent_flag       agentFlag
         from kwc_contract_trade a
                  left join kwc_contract_trade_unit b
                            on a.id = b.contract_id
@@ -274,6 +283,9 @@
             and b.unit_type = 1
             and b.id = #{supplyEntId}
         </if>
+        <if test="agentFlag != null">
+            and a.agent_flag = #{agentFlag}
+        </if>
         <if test="allEnt != null and allEnt.size() > 0">
             and a.ent_id in
             <foreach collection="allEnt" separator="," open="(" close=")" item="item">

+ 46 - 0
sckw-modules/sckw-contract/src/test/java/com/sckw/contract/service/operateService/KwcContractTradeServiceTest.java

@@ -0,0 +1,46 @@
+package com.sckw.contract.service.operateService;
+
+import com.sckw.system.api.model.dto.res.EntTypeResDto;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+/**
+ * 贸易合同服务单元测试。
+ */
+public class KwcContractTradeServiceTest {
+
+    /**
+     * 验证供应单位存在类型为4的企业属性时,识别为代理属性。
+     */
+    @Test
+    public void hasSupplyAgentAttributeWhenSupplyEntTypeIsFour() {
+        EntTypeResDto supplierType = new EntTypeResDto();
+        supplierType.setEntId(1001L);
+        supplierType.setType(1);
+
+        EntTypeResDto agentType = new EntTypeResDto();
+        agentType.setEntId(1001L);
+        agentType.setType(4);
+
+        boolean result = KwcContractTradeService.hasSupplyAgentAttribute(Arrays.asList(supplierType, agentType), 1001L);
+
+        Assert.assertTrue(result);
+    }
+
+    /**
+     * 验证其他企业即使存在类型为4的企业属性,也不会误判当前供应单位。
+     */
+    @Test
+    public void hasSupplyAgentAttributeWhenTypeFourBelongsToOtherEnt() {
+        EntTypeResDto agentType = new EntTypeResDto();
+        agentType.setEntId(2002L);
+        agentType.setType(4);
+
+        boolean result = KwcContractTradeService.hasSupplyAgentAttribute(Collections.singletonList(agentType), 1001L);
+
+        Assert.assertFalse(result);
+    }
+}

+ 2 - 0
sql/2026/06/2026_06_01_add_trade_contract_agent_flag.sql

@@ -0,0 +1,2 @@
+ALTER TABLE kwc_contract_trade
+    ADD COLUMN agent_flag tinyint NOT NULL DEFAULT 0 COMMENT '是否代理属性:0-否,1-是';