Bläddra i källkod

订单合同新增接口

chenxiaofei 2 månader sedan
förälder
incheckning
85b1d066f0

+ 8 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/controller/KwcLogisticsContractController.java

@@ -1,5 +1,6 @@
 package com.sckw.contract.controller;
 
+import com.sckw.contract.model.vo.req.LogisticListReq;
 import com.sckw.contract.model.vo.req.QueryLogisticListReq;
 import com.sckw.contract.model.vo.res.QueryLogisticListResp;
 import com.sckw.contract.service.operateService.KwcContractLogisticsService;
@@ -34,4 +35,11 @@ public class KwcLogisticsContractController {
     public BaseResult<PageDataResult<QueryLogisticListResp>> queryListByPage(@RequestBody QueryLogisticListReq req) {
         return BaseResult.success(kwcContractLogisticsService.queryLogisticsContractListByPage(req));
     }
+    /**
+     * 新增物流合同
+     */
+    @PostMapping("/addOrUpdateLogisticsContract")
+    public BaseResult<Boolean> addOrUpdateLogisticsContract(@RequestBody LogisticListReq req) {
+        return BaseResult.success(kwcContractLogisticsService.addOrUpdateLogisticsContract(req));
+    }
 }

+ 202 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/LogisticListReq.java

@@ -0,0 +1,202 @@
+package com.sckw.contract.model.vo.req;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.Digits;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description :
+ * @create :2025-11-06 14:17:00
+ */
+@Data
+public class LogisticListReq implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 5207417536682160933L;
+    /**
+     * 合同id 修改时必传
+     */
+    @Schema(description = "合同id")
+    private Long id;
+
+    /**
+     * 父合同ID 补充合同
+     */
+    @Schema(description = "父合同ID")
+    @NotNull(message = "父合同ID不能为空")
+    private Long pid;
+
+    /**
+     * 基础信息
+     */
+    @Schema(description = "基础信息")
+    @NotNull(message = "基础信息不能为空")
+    private TradeBaseInfo baseInfo;
+
+    /**
+     * 合同文件
+     */
+    @Schema(description = "合同文件")
+    @NotBlank(message = "合同文件不能为空")
+    private String contractFile;
+
+    /**
+     * 标的信息
+     */
+    @Schema(description = "标的信息")
+    @NotNull(message = "标的信息不能为空")
+    private List<TradeGoodsInfo> goodsInfo;
+
+    /**
+     * 备注
+     */
+    @Schema(description = "备注")
+    private String remark;
+    @Data
+    public static class TradeBaseInfo implements Serializable{
+
+        @Serial
+        private static final long serialVersionUID = -5828478625710244673L;
+
+        /**
+         * 采购单位id
+         */
+        @Schema(description = "采购单位id")
+        @NotNull(message = "采购单位不能为空")
+        private Long purchaseEntId;
+
+        /**
+         * 采购单位联系电话
+         */
+        @Schema(description = "采购单位联系电话")
+        @NotBlank(message = "采购单位联系电话不能为空")
+        private String purchasePhone;
+
+        /**
+         * 供应单位id
+         */
+        @NotNull(message = "供应单位不能为空")
+        @Schema(description = "供应单位id")
+        private Long provideEntId;
+
+        /**
+         * 供应单位联系电话
+         */
+        @Schema(description = "供应单位联系电话")
+        @NotBlank(message = "供应单位联系电话不能为空")
+        private String providePhone;
+
+        /**
+         * 合同编号
+         */
+        @Schema(description = "合同编号")
+        @NotBlank(message = "合同编号不能为空")
+        @Size(max = 20, message = "合同编号超长")
+        private String contractCode;
+
+        /**
+         * 合同名称
+         */
+        @Schema(description = "合同名称")
+        @NotBlank(message = "合同名称不能为空")
+        @Size(max = 50, message = "合同名称超长")
+        private String contractName;
+
+        /**
+         * 终止时间
+         */
+        @DateTimeFormat(pattern = "yyyy-MM-dd")
+        @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
+        @Schema(description = "终止时间")
+        private Date endTime;
+
+        /**
+         * 签约方式(1线上签约、2线下签约)
+         */
+        @NotNull(message = "签约方式不能为空")
+        @Schema(description = "签约方式")
+        private Integer signingWay;
+
+        /**
+         * 生效时间
+         */
+        @NotNull(message = "生效时间不能为空")
+        @DateTimeFormat(pattern = "yyyy-MM-dd")
+        @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
+        @Schema(description = "生效时间")
+        private Date startTime;
+        /**
+         * 通用价格
+         */
+        @Schema(description = "通用价格")
+        private BigDecimal commonPrice;
+
+
+
+    }
+    @Data
+    public static class TradeGoodsInfo implements Serializable{
+        @Serial
+        private static final long serialVersionUID = -7003603561892852639L;
+
+        /**
+         * 商品id
+         */
+        @NotNull(message = "商品不能为空")
+        @Schema(description = "商品id")
+        private Long goodsId;
+        /**
+         * 商品名称
+         */
+        @Schema(description = "商品名称")
+        private String goodsName;
+
+        /**
+         * 采购数量
+         */
+        @Schema(description = "采购数量")
+        @Digits(integer = 10, fraction = 2, message = "采购数量超长")
+        private BigDecimal amount;
+        /**
+         * 数量单位
+         */
+        private String amountUnit;
+
+        /**
+         * 单价
+         */
+        @Schema(description = "单价")
+        @Digits(integer = 10, fraction = 2, message = "单价超长")
+        private BigDecimal price;
+
+        /**
+         * 单位
+         */
+        @Schema(description = "价格单位")
+        private String unit;
+        /**
+         * 生效时间
+         */
+        @Schema(description = "生效开始时间")
+        @NotBlank(message = "生效时间不能为空")
+        private Date effectiveStartTime;
+        /**
+         * 生效时间
+         */
+        @Schema(description = "生效结束时间")
+        @NotBlank(message = "生效时间不能为空")
+        private Date effectiveEntTime;
+    }
+}

+ 11 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractLogisticsGoodsRepository.java

@@ -6,6 +6,7 @@ import com.sckw.contract.dao.KwcContractLogisticsGoodsMapper;
 import com.sckw.contract.model.entity.KwcContractLogisticsGoods;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 import java.util.Set;
@@ -29,4 +30,14 @@ public class KwcContractLogisticsGoodsRepository extends ServiceImpl<KwcContract
                 .eq(KwcContractLogisticsGoods::getDelFlag,0)
                 .in(CollectionUtils.isNotEmpty(entIds),KwcContractLogisticsGoods::getContractId,entIds));
     }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void saveLogisticsGoods(List<KwcContractLogisticsGoods> goods) {
+        saveOrUpdateBatch(goods);
+    }
+
+    public void deleteByContractId(long contactId) {
+        remove(Wrappers.<KwcContractLogisticsGoods>lambdaQuery()
+                .eq(KwcContractLogisticsGoods::getContractId,contactId));
+    }
 }

+ 18 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractLogisticsRepository.java

@@ -9,6 +9,7 @@ import com.sckw.contract.dao.KwcContractLogisticsMapper;
 import com.sckw.contract.model.entity.KwcContractLogistics;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
@@ -28,4 +29,21 @@ public class KwcContractLogisticsRepository extends ServiceImpl<KwcContractLogis
                 .like(StringUtils.isNotBlank(contractNo), KwcContractLogistics::getContractNo, contractNo)
                 .like(StringUtils.isNotBlank(contractName), KwcContractLogistics::getName, contractName));
     }
+
+    public KwcContractLogistics queryByContractCode( String contractCode) {
+        return getOne(Wrappers.<KwcContractLogistics>lambdaQuery()
+                .eq(KwcContractLogistics::getDelFlag,0)
+                .eq(KwcContractLogistics::getContractNo, contractCode)
+                .last("limit 1"));
+    }
+
+    @Transactional
+    public void saveOrUpdateLogistics(KwcContractLogistics saveContractLogistics) {
+        saveOrUpdate(saveContractLogistics);
+    }
+
+    public KwcContractLogistics queryById(Long id) {
+        return getOne(Wrappers.<KwcContractLogistics>lambdaQuery()
+                .eq(KwcContractLogistics::getId, id));
+    }
 }

+ 11 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractLogisticsUnitRepository.java

@@ -6,6 +6,7 @@ import com.sckw.contract.dao.KwcContractLogisticsUnitMapper;
 import com.sckw.contract.model.entity.KwcContractLogisticsUnit;
 import com.sckw.contract.model.entity.KwcContractTradeUnit;
 import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 import java.util.Set;
@@ -29,4 +30,14 @@ public class KwcContractLogisticsUnitRepository extends ServiceImpl<KwcContractL
                 .eq(KwcContractLogisticsUnit::getDelFlag,0)
                 .in(KwcContractLogisticsUnit::getContractId, contractIds));
     }
+
+    @Transactional
+    public void saveUnits(List<KwcContractLogisticsUnit> units) {
+        saveBatch( units);
+    }
+
+    public void removeByContractId(long contactId) {
+        remove(Wrappers.<KwcContractLogisticsUnit>lambdaQuery()
+                .eq(KwcContractLogisticsUnit::getContractId, contactId));
+    }
 }

+ 138 - 9
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractLogisticsService.java

@@ -5,7 +5,6 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.google.common.collect.Lists;
@@ -13,9 +12,7 @@ import com.google.common.collect.Maps;
 import com.sckw.contract.dao.KwcContractLogisticsMapper;
 import com.sckw.contract.model.dto.req.QueryListReqDto;
 import com.sckw.contract.model.dto.res.QueryListResDto;
-import com.sckw.contract.model.entity.KwcContractLogistics;
-import com.sckw.contract.model.entity.KwcContractLogisticsGoods;
-import com.sckw.contract.model.entity.KwcContractLogisticsUnit;
+import com.sckw.contract.model.entity.*;
 import com.sckw.contract.model.report.LogisticsListExport;
 import com.sckw.contract.model.vo.req.*;
 import com.sckw.contract.model.vo.res.*;
@@ -55,6 +52,7 @@ import jakarta.servlet.http.HttpServletResponse;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -1132,11 +1130,18 @@ public class KwcContractLogisticsService {
                     ? r.getPerformedAmount().toPlainString() : null);
             List<KwcContractLogisticsGoods> goods = finalContractIdAndGoodsMap.get(r.getId());
             if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(goods)){
-                double totalTransportAmount = goods.stream()
-                        .filter(g -> Objects.nonNull(g.getAmount()))
-                        .mapToDouble(x -> Double.valueOf(String.valueOf(x.getAmount())))
-                        .sum();
-                queryLogisticListResp.setTotalTransportAmount(String.valueOf( totalTransportAmount));
+                boolean b = goods.stream().anyMatch(g -> Objects.isNull(g.getAmount()));
+                if (b){
+                    queryLogisticListResp.setContractTransportAmount(null);
+                }else {
+                    double totalTransportAmount = goods.stream()
+                            .filter(g -> Objects.nonNull(g.getAmount()))
+                            .mapToDouble(x -> Double.parseDouble(String.valueOf(x.getAmount())))
+                            .sum();
+                    queryLogisticListResp.setTotalTransportAmount(String.valueOf( totalTransportAmount));
+                }
+
+
              }
 
 
@@ -1158,4 +1163,128 @@ public class KwcContractLogisticsService {
 
         return PageDataResult.of(page, resp);
     }
+
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean addOrUpdateLogisticsContract(LogisticListReq req) {
+        log.info("新增物流合同,请求参数 :{}", JSON.toJSONString(req));
+        //查询物流合同
+        KwcContractLogistics kwcContractLogistics =
+                kwcContractLogisticsRepository.queryById(req.getId());
+        if (org.apache.commons.lang3.StringUtils.equals(kwcContractLogistics.getContractNo(),
+                req.getBaseInfo().getContractCode())){
+            throw new BusinessException("合同已存在,合同编号:{}", req.getBaseInfo().getContractCode());
+        }
+        long contactId = new IdWorker(1L).nextId();
+
+        KwcContractLogistics saveContractLogistics = new KwcContractLogistics();
+        Date date = new Date();
+        LogisticListReq.TradeBaseInfo baseInfo = req.getBaseInfo();
+        if (Objects.nonNull(req.getId())){
+            saveContractLogistics.setId(contactId);
+        }else {
+            saveContractLogistics.setId(contactId);
+        }
+        saveContractLogistics.setEntId(LoginUserHolder.getEntId());
+        saveContractLogistics.setContractNo(baseInfo.getContractCode());
+        saveContractLogistics.setName(baseInfo.getContractName());
+        saveContractLogistics.setSigningWay(baseInfo.getSigningWay());
+        saveContractLogistics.setStartTime(baseInfo.getStartTime());
+        saveContractLogistics.setEndTime(baseInfo.getEndTime());
+        saveContractLogistics.setStatus(ContractStatusEnum.WAIT_APPROVE.getCode());
+        saveContractLogistics.setCreateBy(LoginUserHolder.getUserId());
+        saveContractLogistics.setCreateTime(date);
+        saveContractLogistics.setUpdateBy(LoginUserHolder.getUserId());
+        saveContractLogistics.setUpdateTime(date);
+        kwcContractLogisticsRepository.saveOrUpdateLogistics(saveContractLogistics);
+
+        //保存交易商品信息
+        saveLogisticsGoods(req, contactId);
+        //保存物流企业信息
+        List<Long> entIdList = new ArrayList<>();
+        if (Objects.nonNull(baseInfo.getProvideEntId())) {
+            entIdList.add(baseInfo.getProvideEntId());
+        }
+
+        if (Objects.nonNull(baseInfo.getPurchaseEntId())) {
+            entIdList.add(baseInfo.getPurchaseEntId());
+        }
+        if (CollectionUtils.isEmpty(entIdList)) {
+            return false;
+        }
+
+        saveLogisticListUnit(entIdList, baseInfo, contactId, date);
+
+        return Boolean.TRUE;
+    }
+
+    private void saveLogisticsGoods(LogisticListReq req, long contactId) {
+        //删除商品
+        kwcContractLogisticsGoodsRepository.deleteByContractId(contactId);
+        List<LogisticListReq.TradeGoodsInfo> goodsInfos = req.getGoodsInfo();
+        List<KwcContractLogisticsGoods> goods = goodsInfos.stream()
+                .map(x -> getKwcContractLogisticsGoods(x, contactId))
+                .collect(Collectors.toList());
+        kwcContractLogisticsGoodsRepository.saveLogisticsGoods(goods);
+    }
+
+    @NotNull
+    private static KwcContractLogisticsGoods getKwcContractLogisticsGoods(LogisticListReq.TradeGoodsInfo x, long contactId) {
+        KwcContractLogisticsGoods logisticsGoods = new KwcContractLogisticsGoods();
+        Date date1 = new Date();
+        logisticsGoods.setId(x.getGoodsId());
+        logisticsGoods.setContractId(contactId);
+        logisticsGoods.setGoodsId(x.getGoodsId());
+        logisticsGoods.setGoodsName(x.getGoodsName());
+        logisticsGoods.setSkuId(0L);
+        logisticsGoods.setAmount(x.getAmount());
+        logisticsGoods.setUnit(x.getUnit());
+        logisticsGoods.setPrice(x.getPrice());
+        logisticsGoods.setPriceUnit(x.getAmountUnit());
+        logisticsGoods.setCreateBy(LoginUserHolder.getUserId());
+        logisticsGoods.setCreateTime(date1);
+        logisticsGoods.setUpdateBy(LoginUserHolder.getUserId());
+        logisticsGoods.setUpdateTime(date1);
+        return logisticsGoods;
+    }
+
+    private void saveLogisticListUnit(List<Long> entIdList, LogisticListReq.TradeBaseInfo baseInfo, long contactId, Date date) {
+        Map<Long, EntCacheResDto> entCacheResDtoMap = commonBusinessService.queryEntCacheMapByIds(entIdList);
+        List<KwcContractLogisticsUnit> units = Lists.newArrayList();
+        //存供应商
+        if(Objects.nonNull(baseInfo.getProvideEntId())) {
+            buildLogisticsUnit(contactId, baseInfo.getProvideEntId(), baseInfo.getProvidePhone(), entCacheResDtoMap, date, units);
+        }
+        //存采购商
+        if (Objects.nonNull(baseInfo.getPurchaseEntId())) {
+            buildLogisticsUnit(contactId, baseInfo.getPurchaseEntId(), baseInfo.getPurchasePhone(), entCacheResDtoMap, date, units);
+        }
+        //删除企业
+        kwcContractLogisticsUnitRepository.removeByContractId(contactId);
+        kwcContractLogisticsUnitRepository.saveUnits(units);
+    }
+
+
+    private static void buildLogisticsUnit(long contactId, Long entId, String phone ,
+                                           Map<Long
+            , EntCacheResDto> entCacheResDtoMap, Date date, List<KwcContractLogisticsUnit> units) {
+        KwcContractLogisticsUnit kwcContractTradeUnit = new KwcContractLogisticsUnit();
+        kwcContractTradeUnit.setId(new IdWorker(1L).nextId());
+        kwcContractTradeUnit.setContractId(contactId);
+        kwcContractTradeUnit.setUnitType(CooperateTypeEnum.SUPPLIER.getCode());
+        kwcContractTradeUnit.setEntId(entId);
+        EntCacheResDto entCacheResDto = entCacheResDtoMap.get(kwcContractTradeUnit.getEntId());
+        if (Objects.nonNull(entCacheResDto)) {
+            kwcContractTradeUnit.setFirmName(entCacheResDto.getFirmName());
+        }
+        kwcContractTradeUnit.setContacts(entCacheResDto.getContacts());
+        kwcContractTradeUnit.setPhone(entCacheResDto.getPhone());
+        kwcContractTradeUnit.setSignPhone(phone);
+        kwcContractTradeUnit.setStatus(Global.NO);
+        kwcContractTradeUnit.setCreateBy(LoginUserHolder.getUserId());
+        kwcContractTradeUnit.setCreateTime(date);
+        kwcContractTradeUnit.setUpdateBy(LoginUserHolder.getUserId());
+        kwcContractTradeUnit.setUpdateTime(date);
+        kwcContractTradeUnit.setDelFlag(Global.NO);
+        units.add(kwcContractTradeUnit);
+    }
 }

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

@@ -252,7 +252,7 @@ public class KwcContractTradeService {
         KwcContractTrade kwcContractTrade = getKwcContractTrade(baseInfo, reqVo.getGoodsInfo(), reqVo.getRemark(), reqVo.getPid());
         long contactId = new IdWorker(1L).nextId();
         kwcContractTrade.setId(contactId);
-        kwcContractTrade.setStatus(ContractStatusEnum.SAVE.getCode());
+        kwcContractTrade.setStatus(ContractStatusEnum.WAIT_APPROVE.getCode());
         kwcContractTrade.setSigningUrl(changeFile(reqVo.getContractFile()));
         if (kwcContractTradeMapper.insert(kwcContractTrade) <= 0) {
             throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.INSERT_FAIL);