Forráskód Böngészése

项目管理- 合同信息

suntianwu 2 éve
szülő
commit
d07c576380

+ 43 - 0
purchase-admin/src/main/java/com/ozs/web/controller/pm/PmContractInfoController.java

@@ -4,18 +4,32 @@ package com.ozs.web.controller.pm;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.ozs.common.core.controller.BaseController;
 import com.ozs.common.core.domain.AjaxResult;
+import com.ozs.common.enums.PmProjectStatus;
+import com.ozs.common.enums.SysFileRefEnum;
+import com.ozs.common.utils.StringUtils;
 import com.ozs.framework.web.service.TokenService;
+import com.ozs.pm.doman.PmDemand;
+import com.ozs.pm.doman.PmProjectConstruction;
+import com.ozs.pm.doman.vo.requestVo.PmContractInfoReqVo;
 import com.ozs.pm.doman.vo.requestVo.PmDemandReqVo;
+import com.ozs.pm.doman.vo.requestVo.PmProjectConstructionReqVo;
 import com.ozs.pm.doman.vo.responseVo.PmDemandResVo;
 import com.ozs.pm.service.IPmDemandService;
+import com.ozs.system.domain.SysFileRef;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.ObjectUtils;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.validation.constraints.NotEmpty;
+import java.util.Date;
+import java.util.List;
+
 /**
  * 合同信息Controller
  *
@@ -39,4 +53,33 @@ public class PmContractInfoController extends BaseController {
         IPage<PmDemandResVo> page  = pmDemandService.selectPmDemandList(pmDemandReqVo,4);
         return success(page);
     }
+
+    @ApiOperation(value = "合同信息填制",notes = "采购需求ID和上传附件必传")
+    @PostMapping("/insertContractInfo")
+    public AjaxResult insertContractInfo(@NotEmpty(message = "数据为空") @RequestBody PmContractInfoReqVo pmContractInfoReqVo) {
+        try {
+            pmContractInfoReqVo.setCreateBy(getUserId().toString());
+            pmContractInfoReqVo.setCreateTime(new Date());
+            pmContractInfoReqVo.setUpdateBy(getUserId().toString());
+            pmContractInfoReqVo.setUpdateTime(pmContractInfoReqVo.getCreateTime());
+            return toAjax(pmDemandService.insertContractInfo(pmContractInfoReqVo));
+        } catch (Exception e){
+            return error(e.getMessage());
+        }
+    }
+
+    /**
+     * 查看详情
+     */
+    @ApiOperation(value = "查看详情", notes = "必传demandId和详情类型(1项目计划,2需求建档,3任务下达,4中标信息,5合同信息,6建设情况),其他字段不传")
+    @PostMapping("/view")
+    public AjaxResult view(@RequestBody PmDemandReqVo pmDemandReqVo) {
+        if(pmDemandReqVo.getDemandId() == null){
+            return AjaxResult.error("demandId不能为空");
+        }
+        if(StringUtils.isEmpty(pmDemandReqVo.getDetailType())){
+            return AjaxResult.error("详情的类型不能为空");
+        }
+        return success(pmDemandService.selectPmDemandByDemandId(pmDemandReqVo.getDemandId(),pmDemandReqVo.getDetailType()));
+    }
 }

+ 8 - 34
purchase-admin/src/main/java/com/ozs/web/controller/pm/PmProjectConstructionController.java

@@ -57,40 +57,14 @@ public class PmProjectConstructionController extends BaseController {
     @ApiOperation(value = "建设文档填制",notes = "采购需求ID和上传附件必传")
     @PostMapping("/insertProjectConstruction")
     public AjaxResult insertProjectConstruction(@NotEmpty(message = "数据为空") @RequestBody PmProjectConstructionReqVo pmProjectConstructionReqVo) {
-        Long demandId = pmProjectConstructionReqVo.getDemandId();
-        if(ObjectUtils.isEmpty(demandId)){
-            return error("参数错误");
-        }
-
-        PmDemand pmDemand = pmDemandService.getById(demandId);
-        if(ObjectUtils.isEmpty(pmDemand)){
-            return error("参数错误");
-        }
-
-        List<SysFileRef> sysFileRefs = pmProjectConstructionReqVo.getSysFileRefs();
-        if(ObjectUtils.isEmpty(sysFileRefs)){
-            return error("参数错误");
-        }
-        PmProjectConstruction pmProjectConstruction = new PmProjectConstruction();
-        BeanUtils.copyProperties(pmProjectConstructionReqVo,pmProjectConstruction);
-        pmProjectConstruction.setCreateBy(getUserId().toString());
-        pmProjectConstruction.setCreateTime(new Date());
-        pmProjectConstruction.setUpdateBy(getUserId().toString());
-        pmProjectConstruction.setUpdateTime(pmProjectConstruction.getCreateTime());
-
-        if(pmProjectConstructionService.save(pmProjectConstruction)){
-            if (pmDemandService.uploadFile(pmProjectConstruction.getId(), SysFileRefEnum.PM_PROJECT_CONSTRUCTION.getType(),sysFileRefs,getUserId().toString())) {
-                PmDemand pmDemandUpdate = new PmDemand();
-                pmDemandUpdate.setDemandId(demandId);
-                pmDemandUpdate.setProjectStatus(Long.parseLong(PmProjectStatus.COMPLETION_CONSTRUCTION.getCode()));
-                pmDemandUpdate.setUpdateTime(new Date());
-                pmDemandUpdate.setUpdateBy(getUserId().toString());
-                return success(pmDemandService.updateById(pmDemandUpdate));
-            } else {
-                return error("保存上传附件失败");
-            }
-        } else {
-            return error("建设文档填制失败");
+        try {
+            pmProjectConstructionReqVo.setCreateBy(getUserId().toString());
+            pmProjectConstructionReqVo.setCreateTime(new Date());
+            pmProjectConstructionReqVo.setUpdateBy(getUserId().toString());
+            pmProjectConstructionReqVo.setUpdateTime(pmProjectConstructionReqVo.getCreateTime());
+            return toAjax(pmDemandService.insertProjectConstruction(pmProjectConstructionReqVo));
+        } catch (Exception e){
+            return error(e.getMessage());
         }
     }
 

+ 16 - 2
purchase-admin/src/main/java/com/ozs/web/controller/pm/PmPurchaseExecutionController.java

@@ -16,6 +16,7 @@ import com.ozs.common.enums.NameListType;
 import com.ozs.common.enums.PmProjectStatus;
 import com.ozs.common.enums.SysFileRefEnum;
 import com.ozs.common.utils.RandomUtil;
+import com.ozs.common.utils.StringUtils;
 import com.ozs.pm.doman.PmBidWinning;
 import com.ozs.pm.doman.PmDemand;
 import com.ozs.pm.doman.vo.requestVo.*;
@@ -53,8 +54,7 @@ public class PmPurchaseExecutionController extends BaseController {
     private BaseAgencyService baseAgencyService;
     @Autowired
     private BaseExpertService baseExpertService;
-    @Autowired
-    private PmBidWinningService pmBidWinningService;
+
 
     /**
      * 采购执行查询列表
@@ -417,4 +417,18 @@ public class PmPurchaseExecutionController extends BaseController {
         }
     }
 
+    /**
+     * 查看详情
+     */
+    @ApiOperation(value = "查看详情", notes = "必传demandId和详情类型(1项目计划,2需求建档,3任务下达,4中标信息,5合同信息,6建设情况),其他字段不传")
+    @PostMapping("/view")
+    public AjaxResult view(@RequestBody PmDemandReqVo pmDemandReqVo) {
+        if(pmDemandReqVo.getDemandId() == null){
+            return AjaxResult.error("demandId不能为空");
+        }
+        if(StringUtils.isEmpty(pmDemandReqVo.getDetailType())){
+            return AjaxResult.error("详情的类型不能为空");
+        }
+        return success(pmDemandService.selectPmDemandByDemandId(pmDemandReqVo.getDemandId(),pmDemandReqVo.getDetailType()));
+    }
 }

+ 3 - 0
purchase-system/src/main/java/com/ozs/pm/doman/PmContractUnitRef.java

@@ -46,6 +46,9 @@ public class PmContractUnitRef implements Serializable {
     @TableField("DEMAND_ID")
     private Long demandId;
 
+    @ApiModelProperty("单位ID(供应商或需求单位ID)")
+    @TableField("UNIT_ID")
+    private Long unitId;
 
     @ApiModelProperty("单位类型,A:甲方,B:乙方")
     @TableField("UNIT_TYPE")

+ 71 - 0
purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/BaseSupplierReqVo.java

@@ -0,0 +1,71 @@
+package com.ozs.pm.doman.vo.requestVo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ozs.common.vo.PageVo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class BaseSupplierReqVo {
+
+    @ApiModelProperty(value = "主键id")
+    private Integer id;
+
+    @ApiModelProperty("供应商名称")
+    private String supplierName;
+
+    @ApiModelProperty("供应商负责人")
+    private String supplierResponsiblePerson;
+
+    @ApiModelProperty("供应商地址")
+    private String supplierAddress;
+
+    @ApiModelProperty("供应商类型")
+    private String supplierType;
+
+    @ApiModelProperty("状态 黑白名单")
+    private String supplierState;
+
+    @ApiModelProperty("预先采购")
+    private String supplierAdvancePurchase;
+
+    @ApiModelProperty(value = "邮政编码")
+    private String postalCode;
+
+    @ApiModelProperty(value = "项目联系人")
+    private String projectPerson;
+
+    @ApiModelProperty(value = "联系电话")
+    private String telephone;
+
+    @ApiModelProperty(value = "银行账户名称")
+    private String bankAccountName;
+
+    @ApiModelProperty(value = "开户银行")
+    private String bankOfDeposit;
+
+    @ApiModelProperty(value = "银行账号")
+    private String bankAccountNumber;
+
+    @ApiModelProperty(value = "创建者")
+    private String created;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @ApiModelProperty(value = "修改者")
+    private String updated;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "修改时间")
+    private Date updateTime;
+
+    @ApiModelProperty("乙方合同签订地点")
+    private String contractSignPlaceB;
+
+    @ApiModelProperty("乙方合同签订日期")
+    private Date contractSignDateB;
+}

+ 78 - 0
purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/PmContractInfoReqVo.java

@@ -0,0 +1,78 @@
+package com.ozs.pm.doman.vo.requestVo;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ozs.system.domain.SysFileRef;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 合同信息表(PmContractInfo)实体类
+ *
+ * @author makejava
+ * @since 2023-02-02 00:47:22
+ */
+
+@Data
+@ApiModel(value = "合同信息表", description = "")
+public class PmContractInfoReqVo implements Serializable {
+    private static final long serialVersionUID = -59348130033569267L;
+
+
+    @ApiModelProperty("需求ID")
+    private Long demandId;
+
+
+    @ApiModelProperty("合同编号")
+    private String contractNumber;
+
+
+    @ApiModelProperty("合同名称")
+    private String contractName;
+
+
+    @ApiModelProperty("合同金额(万元)")
+    private Double contractAmount;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("合同终止日期")
+    private Date contractTerminationDate;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("建设(交付)时间")
+    private Date constructionDeliveryTime;
+
+    @ApiModelProperty("创建者")
+    private String createBy;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty("创建时间")
+    private Date createTime;
+
+    @ApiModelProperty("更新者")
+    private String updateBy;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty("更新时间")
+    private Date updateTime;
+
+    @ApiModelProperty("甲方合同签订地点")
+    private String contractSignPlaceA;
+
+    @ApiModelProperty("甲方合同签订日期")
+    private Date contractSignDateA;
+
+    @ApiModelProperty("供应商列表")
+    private List<BaseSupplierReqVo> baseSupplierList;
+
+    /**
+     * 上传附件
+     */
+    @ApiModelProperty("上传附件")
+    private List<SysFileRef> sysFileRefs;
+}

+ 4 - 0
purchase-system/src/main/java/com/ozs/pm/service/IPmDemandService.java

@@ -109,4 +109,8 @@ public interface IPmDemandService extends IService<PmDemand>
 
     boolean insertPmBidFailure(PmBidFailureReqVo pmBidFailureReqVo) throws Exception;
 
+    boolean insertContractInfo(PmContractInfoReqVo pmContractInfoReqVo) throws Exception;
+
+    boolean insertProjectConstruction(PmProjectConstructionReqVo pmProjectConstructionReqVo) throws Exception;
+
 }

+ 215 - 9
purchase-system/src/main/java/com/ozs/pm/service/impl/PmDemandServiceImpl.java

@@ -8,7 +8,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ozs.base.domain.BaseExpert;
+import com.ozs.base.domain.BaseSupplier;
 import com.ozs.base.service.BaseExpertService;
+import com.ozs.base.service.BaseSupplierService;
 import com.ozs.common.enums.*;
 import com.ozs.common.utils.DateUtils;
 import com.ozs.common.utils.RandomUtil;
@@ -77,9 +79,19 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
     @Autowired
     private PmBidFailureService pmBidFailureService;
     @Autowired
-    private PmProjectConstructionService pmProjectConstructionService;
-    @Autowired
     private PmBidWinningOpeningRefService pmBidWinningOpeningRefService;
+    @Autowired
+    private PmContractInfoService pmContractInfoService;
+    @Autowired
+    private BaseSupplierService baseSupplierService;
+
+    @Autowired
+    private PmContractUnitRefService pmContractUnitRefService;
+
+    @Autowired
+    private PmProjectConstructionService pmProjectConstructionService;
+
+
     /**
      * 查询采购需求
      *
@@ -428,6 +440,7 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
      * @return 结果
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public boolean bookBuilding(PmBookBuildingReqVo vo) {
         PmDemand pmDemand = this.getById(vo.getDemandId());
         String projectType = pmDemand.getProjectType();
@@ -600,6 +613,7 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
         return moduleName;
     }
 
+    @Override
     public PmFlowChartResVo getModuleInfo(Long demandId,String moduleName){
         PmDemand pmDemand = this.getById(demandId);
         String projectType = pmDemand.getProjectType();
@@ -680,6 +694,7 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
      * @return 结果
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public boolean commit(PmDemandReqVo pmDemandReqVo) {
         PmDemand pmDemand = new PmDemand();
         pmDemand.setDemandId(pmDemandReqVo.getDemandId());
@@ -696,6 +711,7 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
      * @return 结果
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public boolean reviewTo(PmDemandReqVo pmDemandReqVo) {
         PmDemand pmDemand = new PmDemand();
         pmDemand.setDemandId(pmDemandReqVo.getDemandId());
@@ -716,6 +732,7 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
      * @return 结果
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public boolean reviewReturn(PmDemandReqVo pmDemandReqVo) {
         PmDemand pmDemand = new PmDemand();
         pmDemand.setDemandId(pmDemandReqVo.getDemandId());
@@ -734,6 +751,7 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
      * @return 结果
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public boolean releaseTask(PmDemandReqVo pmDemandReqVo) {
         PmDemand pmDemand = new PmDemand();
         pmDemand.setDemandId(pmDemandReqVo.getDemandId());
@@ -747,7 +765,8 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
         return this.updateById(pmDemand);
     }
 
-
+    @Override
+    @Transactional(rollbackFor = Exception.class)
     public boolean uploadFile(Long redId,Integer fileType, List<SysFileRef> sysFileRefs,String upateBy){
 
         if (!ObjectUtils.isEmpty(sysFileRefs)) {
@@ -778,6 +797,8 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
 
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
     public boolean insertPmReleaseAnnouncement(PmReleaseAnnouncementReqVo pmReleaseAnnouncementReqVo) throws Exception {
 
         PmReleaseAnnouncement pmReleaseAnnouncement = new PmReleaseAnnouncement();
@@ -801,6 +822,7 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
 
     }
 
+    @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean insertExpertBatch(PmBaseExpertFillReqVo pmBaseExpertFillReqVo) throws Exception {
         PmDemand pmDemand = this.getById(pmBaseExpertFillReqVo.getDemandId());
@@ -811,8 +833,12 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
         List<PmDemandExpertRef> pmDemandExpertRefList = new ArrayList<>();
         Date now = new Date();
         for (BaseExpert baseExpert : baseExpertList) {
-            if(baseExpert.getStatus().equals(NameListType.WHITE.getCode())){
+            if(NameListType.BLACK.getCode().equals(baseExpert.getStatus())){
                 throw new Exception("该专家(身份证号:" +baseExpert.getIdNumber() + ")属于黑名单");
+            } else {
+                if(ObjectUtils.isEmpty(baseExpert.getStatus())){
+                    baseExpert.setStatus(NameListType.WHITE.getCode());
+                }
             }
             if(pmDemand.getProjectType().equals(baseExpert.getVarietyPurchase())){
                 throw new Exception("该专家(身份证号:" +baseExpert.getIdNumber() + ")所属采购品种和项目类型不匹配");
@@ -845,6 +871,8 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
           }
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
    public boolean extractExpertBatch(PmBaseExpertExtractReqVo pmBaseExpertExtractReqVo) throws Exception {
        Integer technicalExpertNumber = pmBaseExpertExtractReqVo.getTechnicalExpertNumber();
        if(technicalExpertNumber== null){
@@ -973,13 +1001,24 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
         return false;
     }
 
-
+    @Override
     @Transactional(rollbackFor = Exception.class)
    public boolean insertBidOpeningBatch(PmBidOpeningFillReqVo pmBidOpeningFillReqVo) throws Exception {
        PmDemand pmDemand = this.getById(pmBidOpeningFillReqVo.getDemandId());
        if(ObjectUtils.isEmpty(pmDemand)){
            throw new Exception("参数错误");
        }
+
+       //从发布公告里获取开标时间
+        LambdaQueryWrapper<PmReleaseAnnouncement> lw = new LambdaQueryWrapper<>();
+        lw.eq(PmReleaseAnnouncement::getDemandId,pmDemand.getDemandId()).orderByDesc(PmReleaseAnnouncement::getReleaseTime)
+                .last(" limit 1 ");
+        PmReleaseAnnouncement pmReleaseAnnouncement = this.pmReleaseAnnouncementService.getOne(lw);
+        if(pmReleaseAnnouncement == null){
+            throw new Exception("发布公告不存在");
+        }
+       Date tenderOpenTime = pmReleaseAnnouncement.getTenderOpenTime();
+
        Date now = new Date();
        List<PmBidOpening> pmBidOpeningList = pmBidOpeningFillReqVo.getPmBidOpeningList();
        for (PmBidOpening pmBidOpening : pmBidOpeningList) {
@@ -989,9 +1028,7 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
            if(ObjectUtils.isEmpty(pmBidOpening.getScore())){
                throw new Exception("分数不能为空");
            }
-           if(ObjectUtils.isEmpty(pmBidOpening.getOpenBidTime())){
-               throw new Exception("开标时间不能为空");
-           }
+           pmBidOpening.setOpenBidTime(tenderOpenTime);
            pmBidOpening.setDemandId(pmBidOpeningFillReqVo.getDemandId());
            pmBidOpening.setCreateBy(pmBidOpeningFillReqVo.getCreateBy());
            pmBidOpening.setCreateTime(now);
@@ -1010,6 +1047,8 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
        }
    }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
    public boolean insertPmBidWinning(PmBidWinningReqVo pmBidWinningReqVo) throws Exception {
        List<Long> pmBidOpeningIdList = pmBidWinningReqVo.getPmBidOpeningIdList();
         if(ObjectUtils.isEmpty(pmBidOpeningIdList)) {
@@ -1055,6 +1094,8 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
        }
    }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
     public boolean updatePmBidWinning(PmBidWinningReqVo pmBidWinningReqVo) throws Exception {
         List<Long> pmBidOpeningIdList = pmBidWinningReqVo.getPmBidOpeningIdList();
         if(ObjectUtils.isEmpty(pmBidOpeningIdList)) {
@@ -1101,8 +1142,9 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
         }
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
     public boolean insertPmBidFailure(PmBidFailureReqVo pmBidFailureReqVo) throws Exception {
-
         PmBidFailure pmBidFailure = new PmBidFailure();
         BeanUtils.copyProperties(pmBidFailureReqVo,pmBidFailure);
         if(pmBidFailureService.save(pmBidFailure)){
@@ -1112,4 +1154,168 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
         }
 
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean insertContractInfo(PmContractInfoReqVo pmContractInfoReqVo) throws Exception {
+        Long demandId = pmContractInfoReqVo.getDemandId();
+        if(ObjectUtils.isEmpty(demandId)){
+            throw new Exception("采购需求ID不能为空");
+        }
+
+        String contractSignPlaceA = pmContractInfoReqVo.getContractSignPlaceA();
+        if(ObjectUtils.isEmpty(contractSignPlaceA)) {
+            throw new Exception("甲方合同签订地点不能为空");
+        }
+        Date contractSignDateA = pmContractInfoReqVo.getContractSignDateA();
+        if(ObjectUtils.isEmpty(contractSignDateA)) {
+            throw new Exception("甲方合同签订日期不能为空");
+        }
+
+        PmDemand pmDemand = this.getById(demandId);
+        if(ObjectUtils.isEmpty(pmDemand)){
+            throw new Exception("采购需求ID错误");
+        }
+
+        List<BaseSupplierReqVo> baseSupplierReqVoList = pmContractInfoReqVo.getBaseSupplierList();
+        if(ObjectUtils.isEmpty(baseSupplierReqVoList)){
+            throw new Exception("乙方信息列表不能为空");
+        }
+        for(BaseSupplierReqVo baseSupplierReqVo : baseSupplierReqVoList) {
+            String contractSignPlaceB = baseSupplierReqVo.getContractSignPlaceB();
+            if(ObjectUtils.isEmpty(contractSignPlaceB)) {
+                throw new Exception("乙方合同签订地点不能为空");
+            }
+            Date contractSignDateB = baseSupplierReqVo.getContractSignDateB();
+            if(ObjectUtils.isEmpty(contractSignDateB)) {
+                throw new Exception("乙方合同签订日期不能为空");
+            }
+        }
+
+        List<SysFileRef> sysFileRefs = pmContractInfoReqVo.getSysFileRefs();
+        if(ObjectUtils.isEmpty(sysFileRefs)){
+            throw new Exception("上传附件不能为空");
+        }
+
+        PmContractInfo pmContractInfo = new PmContractInfo();
+        org.springframework.beans.BeanUtils.copyProperties(pmContractInfoReqVo,pmContractInfo);
+
+        if(pmContractInfoService.save(pmContractInfo)){
+            if (this.uploadFile(pmContractInfo.getId(), SysFileRefEnum.PM_CONTRACT_INFO.getType(),sysFileRefs,pmContractInfoReqVo.getUpdateBy())) {
+                PmContractUnitRef pmContractUnitRefA = new PmContractUnitRef();
+                pmContractUnitRefA.setContractInfoId(pmContractInfo.getId());
+                pmContractUnitRefA.setDemandId(demandId);
+                pmContractUnitRefA.setUnitId(pmDemand.getPurchaseDeptId());
+                pmContractUnitRefA.setContractSignPlace(contractSignPlaceA);
+                pmContractUnitRefA.setContractSignDate(contractSignDateA);
+                pmContractUnitRefA.setUnitType("A");
+                pmContractUnitRefA.setCreateBy(pmContractInfoReqVo.getCreateBy());
+                pmContractUnitRefA.setCreateTime(pmContractInfoReqVo.getCreateTime());
+                pmContractUnitRefA.setUpdateTime(pmContractInfoReqVo.getUpdateTime());
+                pmContractUnitRefA.setUpdateBy(pmContractInfoReqVo.getUpdateBy());
+                if(pmContractUnitRefService.save(pmContractUnitRefA)){
+
+                    for(BaseSupplierReqVo baseSupplierReqVo : baseSupplierReqVoList) {
+
+                        BaseSupplier baseSupplier = new BaseSupplier();
+                        BeanUtils.copyProperties(baseSupplierReqVo,baseSupplier);
+
+                        if(ObjectUtils.isEmpty(baseSupplier.getSupplierAdvancePurchase())){
+                            baseSupplier.setSupplierAdvancePurchase("0"); //关闭
+                        }
+
+                        if(ObjectUtils.isEmpty(baseSupplier.getSupplierType())){
+                            baseSupplier.setSupplierType(pmDemand.getProjectType());
+                        }
+
+                        if(ObjectUtils.isEmpty(baseSupplier.getSupplierState())){
+                            baseSupplier.setSupplierState(NameListType.WHITE.getCode());
+                        }
+
+                        if(ObjectUtils.isEmpty(baseSupplier.getCreated())){
+                            baseSupplier.setCreated(pmContractInfoReqVo.getCreateBy());
+                            baseSupplier.setCreateTime(pmContractInfoReqVo.getCreateTime());
+                        }
+
+                        if(ObjectUtils.isEmpty(baseSupplier.getUpdated())){
+                            baseSupplier.setUpdated(pmContractInfoReqVo.getUpdateBy());
+                            baseSupplier.setUpdateTime(pmContractInfoReqVo.getUpdateTime());
+                        }
+                       if(baseSupplierService.saveOrUpdate(baseSupplier)) {
+                           String contractSignPlaceB = baseSupplierReqVo.getContractSignPlaceB();
+                           Date contractSignDateB = baseSupplierReqVo.getContractSignDateB();
+
+                           PmContractUnitRef pmContractUnitRefB = new PmContractUnitRef();
+                           pmContractUnitRefB.setContractInfoId(pmContractInfo.getId());
+                           pmContractUnitRefB.setDemandId(demandId);
+                           pmContractUnitRefA.setUnitId(baseSupplier.getId().longValue());
+                           pmContractUnitRefB.setContractSignPlace(contractSignPlaceB);
+                           pmContractUnitRefB.setContractSignDate(contractSignDateB);
+                           pmContractUnitRefB.setUnitType("B");
+                           pmContractUnitRefB.setCreateBy(pmContractInfoReqVo.getCreateBy());
+                           pmContractUnitRefB.setCreateTime(pmContractInfoReqVo.getCreateTime());
+                           pmContractUnitRefB.setUpdateTime(pmContractInfoReqVo.getUpdateTime());
+                           pmContractUnitRefB.setUpdateBy(pmContractInfoReqVo.getUpdateBy());
+                           if(!this.pmContractUnitRefService.save(pmContractUnitRefB)){
+                               throw new Exception("保存合同单位关系失败");
+                           }
+                       } else {
+                           throw new Exception("保存或更新供应商失败");
+                       }
+                    }
+
+                } else {
+                    throw new Exception("保存合同单位关系失败");
+                }
+
+                PmDemand pmDemandUpdate = new PmDemand();
+                pmDemandUpdate.setDemandId(demandId);
+                pmDemandUpdate.setProjectStatus(Long.parseLong(PmProjectStatus.UNDER_CONSTRUCTION.getCode()));
+                pmDemandUpdate.setUpdateTime(pmContractInfoReqVo.getUpdateTime());
+                pmDemandUpdate.setUpdateBy(pmContractInfoReqVo.getUpdateBy());
+                return this.updateById(pmDemandUpdate);
+            } else {
+                throw new Exception("保存附件失败");
+            }
+        } else {
+            return false;
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean insertProjectConstruction(PmProjectConstructionReqVo pmProjectConstructionReqVo) throws Exception {
+        Long demandId = pmProjectConstructionReqVo.getDemandId();
+        if(ObjectUtils.isEmpty(demandId)){
+            throw new Exception("采购需求ID不能为空");
+        }
+
+        PmDemand pmDemand = this.getById(demandId);
+        if(ObjectUtils.isEmpty(pmDemand)){
+            throw new Exception("采购需求ID错误");
+        }
+
+        List<SysFileRef> sysFileRefs = pmProjectConstructionReqVo.getSysFileRefs();
+        if(ObjectUtils.isEmpty(sysFileRefs)){
+            throw new Exception("上传附件不能为空");
+        }
+
+        PmProjectConstruction pmProjectConstruction = new PmProjectConstruction();
+        org.springframework.beans.BeanUtils.copyProperties(pmProjectConstructionReqVo,pmProjectConstruction);
+
+        if(pmProjectConstructionService.save(pmProjectConstruction)){
+            if (this.uploadFile(pmProjectConstruction.getId(), SysFileRefEnum.PM_PROJECT_CONSTRUCTION.getType(),sysFileRefs,pmProjectConstructionReqVo.getUpdateBy())) {
+                PmDemand pmDemandUpdate = new PmDemand();
+                pmDemandUpdate.setDemandId(demandId);
+                pmDemandUpdate.setProjectStatus(Long.parseLong(PmProjectStatus.COMPLETION_CONSTRUCTION.getCode()));
+                pmDemandUpdate.setUpdateTime(pmProjectConstructionReqVo.getUpdateTime());
+                pmDemandUpdate.setUpdateBy(pmProjectConstructionReqVo.getUpdateBy());
+                return this.updateById(pmDemandUpdate);
+            } else {
+                return false;
+            }
+        } else {
+            return false;
+        }
+    }
 }