Kaynağa Gözat

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	purchase-system/src/main/java/com/ozs/pm/service/impl/PmDemandServiceImpl.java
buzhanyi 2 yıl önce
ebeveyn
işleme
0ba9f58c2d
21 değiştirilmiş dosya ile 1015 ekleme ve 208 silme
  1. 43 0
      purchase-admin/src/main/java/com/ozs/web/controller/pm/PmContractInfoController.java
  2. 44 2
      purchase-admin/src/main/java/com/ozs/web/controller/pm/PmProjectConstructionController.java
  3. 34 35
      purchase-admin/src/main/java/com/ozs/web/controller/pm/PmPurchaseExecutionController.java
  4. 3 1
      purchase-common/src/main/java/com/ozs/common/enums/SysFileRefEnum.java
  5. 3 3
      purchase-system/src/main/java/com/ozs/base/domain/BaseExpert.java
  6. 5 5
      purchase-system/src/main/java/com/ozs/pm/doman/PmBidOpening.java
  7. 0 5
      purchase-system/src/main/java/com/ozs/pm/doman/PmBidWinning.java
  8. 70 0
      purchase-system/src/main/java/com/ozs/pm/doman/PmBidWinningOpeningRef.java
  9. 3 0
      purchase-system/src/main/java/com/ozs/pm/doman/PmContractUnitRef.java
  10. 71 0
      purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/BaseSupplierReqVo.java
  11. 7 4
      purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/PmBidWinningReqVo.java
  12. 78 0
      purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/PmContractInfoReqVo.java
  13. 65 0
      purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/PmProjectConstructionReqVo.java
  14. 3 0
      purchase-system/src/main/java/com/ozs/pm/doman/vo/responseVo/PmDemandResVo.java
  15. 66 0
      purchase-system/src/main/java/com/ozs/pm/doman/vo/responseVo/PmProjectConstructionResVo.java
  16. 15 0
      purchase-system/src/main/java/com/ozs/pm/mapper/PmBidWinningOpeningRefMapper.java
  17. 6 0
      purchase-system/src/main/java/com/ozs/pm/service/IPmDemandService.java
  18. 14 0
      purchase-system/src/main/java/com/ozs/pm/service/PmBidWinningOpeningRefService.java
  19. 18 0
      purchase-system/src/main/java/com/ozs/pm/service/impl/PmBidWinningOpeningRefServiceImpl.java
  20. 461 153
      purchase-system/src/main/java/com/ozs/pm/service/impl/PmDemandServiceImpl.java
  21. 6 0
      purchase-system/src/main/resources/mapper/pm/PmBidWinningOpeningRefMapper.xml

+ 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()));
+    }
 }

+ 44 - 2
purchase-admin/src/main/java/com/ozs/web/controller/pm/PmProjectConstructionController.java

@@ -4,18 +4,31 @@ 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.framework.web.service.TokenService;
+import com.ozs.common.enums.PmProjectStatus;
+import com.ozs.common.enums.SysFileRefEnum;
+import com.ozs.common.utils.StringUtils;
+import com.ozs.pm.doman.PmDemand;
+import com.ozs.pm.doman.PmProjectConstruction;
 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.pm.service.PmProjectConstructionService;
+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
  *
@@ -29,7 +42,7 @@ public class PmProjectConstructionController extends BaseController {
     @Autowired
     private IPmDemandService pmDemandService;
     @Autowired
-    private TokenService tokenService;
+    private PmProjectConstructionService pmProjectConstructionService;
 
     /**
      * 项目建设查询列表
@@ -40,4 +53,33 @@ public class PmProjectConstructionController extends BaseController {
         IPage<PmDemandResVo> page  = pmDemandService.selectPmDemandList(pmDemandReqVo,5);
         return success(page);
     }
+
+    @ApiOperation(value = "建设文档填制",notes = "采购需求ID和上传附件必传")
+    @PostMapping("/insertProjectConstruction")
+    public AjaxResult insertProjectConstruction(@NotEmpty(message = "数据为空") @RequestBody PmProjectConstructionReqVo pmProjectConstructionReqVo) {
+        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());
+        }
+    }
+
+    /**
+     * 查看详情
+     */
+    @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()));
+    }
 }

+ 34 - 35
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;
+
 
     /**
      * 采购执行查询列表
@@ -309,7 +309,7 @@ public class PmPurchaseExecutionController extends BaseController {
       try {
           Long demandId = pmBidWinningReqVo.getDemandId();
           if(ObjectUtils.isEmpty(demandId)){
-              return error("参数错误");
+              return error("采购需求ID不能为空");
           }
           pmBidWinningReqVo.setCreateBy(getUserId().toString());
           pmBidWinningReqVo.setCreateTime(new Date());
@@ -321,6 +321,23 @@ public class PmPurchaseExecutionController extends BaseController {
       }
     }
 
+    @ApiOperation(value = "更换中标人",notes = "采购需求ID必传")
+    @PostMapping("/updatePmBidWinning")
+    public AjaxResult updatePmBidWinning(@NotEmpty(message = "数据为空")
+                                         @RequestBody PmBidWinningReqVo pmBidWinningReqVo) {
+        try {
+            Long demandId = pmBidWinningReqVo.getDemandId();
+            if(ObjectUtils.isEmpty(demandId)){
+                return error("采购需求ID不能为空");
+            }
+            pmBidWinningReqVo.setUpdateBy(getUserId().toString());
+            pmBidWinningReqVo.setUpdateTime(new Date());
+            return toAjax(pmDemandService.updatePmBidWinning(pmBidWinningReqVo));
+        }  catch (Exception e) {
+            return error(e.getMessage());
+        }
+    }
+
     @ApiOperation(value = "流标情况填制",notes = "采购需求ID必传")
     @PostMapping("/insertPmBidFailure")
     public AjaxResult insertPmBidFailure(@NotEmpty(message = "数据为空")
@@ -371,38 +388,6 @@ public class PmPurchaseExecutionController extends BaseController {
         }
     }
 
-    @ApiOperation(value = "更换中标人",notes = "采购需求ID必传")
-    @PostMapping("/updatePmBidWinning")
-    public AjaxResult updatePmBidWinning(@NotEmpty(message = "数据为空")
-                                         @RequestBody PmBidWinningReqVo pmBidWinningReqVo) {
-        try {
-            Long demandId = pmBidWinningReqVo.getDemandId();
-            if(ObjectUtils.isEmpty(demandId)){
-                return error("缺少需求ID");
-            }
-            if(ObjectUtils.isEmpty(pmBidWinningReqVo.getBidOpeningId())){
-                return error("缺少开标信息ID bidOpeningId");
-            }
-            if(ObjectUtils.isEmpty(pmBidWinningReqVo.getBidWinningAmount())){
-                return error("缺少中标金额");
-            }
-            LambdaQueryWrapper<PmBidWinning> lw = new LambdaQueryWrapper<>();
-            lw.eq(PmBidWinning::getDemandId,demandId);
-            PmBidWinning pmBidWinning = pmBidWinningService.getOne(lw);
-            if(pmBidWinning == null){
-                return error("原中标信息不存在");
-            }
-            pmBidWinning.setBidOpeningId(pmBidWinningReqVo.getBidOpeningId());
-            pmBidWinning.setBidWinningAmount(pmBidWinningReqVo.getBidWinningAmount());
-            pmBidWinning.setUpdateBy(getUserId().toString());
-            pmBidWinning.setUpdateTime(new Date());
-
-            return toAjax(pmBidWinningService.updateById(pmBidWinning));
-        }  catch (Exception e) {
-            return error(e.getMessage());
-        }
-    }
-
     @ApiOperation(value = "上传中标通知书",notes = "采购需求ID和上传附件必传")
     @PostMapping("/uploadBidWinningNotification")
     public AjaxResult uploadBidWinningNotification(@NotEmpty(message = "数据为空") @RequestBody PmPurchaseExecutionReqVo pmPurchaseExecutionReqVo) {
@@ -432,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 - 1
purchase-common/src/main/java/com/ozs/common/enums/SysFileRefEnum.java

@@ -24,7 +24,9 @@ public enum SysFileRefEnum {
     PM_BID_WINNING_FILE(13, "中标文件"),
     PM_BID_FAILURE_FILE(14, "流标文件"),
     PM_BID_CALL_QEUSTION_FILE(15, "质疑文件"),
-    PM_BID_WINNING_NOTIFICATION (16, "中标通知书")
+    PM_BID_WINNING_NOTIFICATION(16, "中标通知书"),
+    PM_CONTRACT_INFO (17, "合同信息附件"),
+    PM_PROJECT_CONSTRUCTION (18, "建设文档附件")
     ;
 
     private Integer type;

+ 3 - 3
purchase-system/src/main/java/com/ozs/base/domain/BaseExpert.java

@@ -30,7 +30,7 @@ public class BaseExpert extends BaseDto {
     /**
      * 专家类型
      */
-    @ApiModelProperty(value = "专家类型")
+    @ApiModelProperty(value = "专家类型,多个使用英文逗号分隔")
     @TableField("expert_type")
     private String expertType;
 
@@ -59,7 +59,7 @@ public class BaseExpert extends BaseDto {
     /**
      * 专业类型
      */
-    @ApiModelProperty(value = "专业类型")
+    @ApiModelProperty(value = "专业类型,多个使用英文逗号分隔")
     @TableField("major_type")
     private String majorType;
 
@@ -80,7 +80,7 @@ public class BaseExpert extends BaseDto {
     /**
      * 采购品种
      */
-    @ApiModelProperty(value = "采购品种")
+    @ApiModelProperty(value = "采购品种,多个使用英文逗号分隔")
     @TableField("variety_purchase")
     private String varietyPurchase;
 

+ 5 - 5
purchase-system/src/main/java/com/ozs/pm/doman/PmBidOpening.java

@@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 
 import java.io.Serializable;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -51,17 +52,16 @@ public class PmBidOpening implements Serializable {
     @TableField("SCORE")
     private Double score;
 
-
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("开标时间")
+    @TableField("OPEN_BID_TIME")
+    private Date openBidTime;
 
     @ApiModelProperty("创建者")
     @TableField("CREATE_BY")
     private String createBy;
 
 
-    @ApiModelProperty("开标时间")
-    @TableField("OPEN_BID_TIME")
-    private Date openBidTime;
-
     @ApiModelProperty("创建时间")
     @TableField("CREATE_TIME")
     private Date createTime;

+ 0 - 5
purchase-system/src/main/java/com/ozs/pm/doman/PmBidWinning.java

@@ -42,11 +42,6 @@ public class PmBidWinning implements Serializable {
     private Long demandId;
 
 
-    @ApiModelProperty("开标信息ID")
-    @TableField("BID_OPENING_ID")
-    private Long bidOpeningId;
-
-
     @ApiModelProperty("中标金额(万元)")
     @TableField("BID_WINNING_AMOUNT")
     private Double bidWinningAmount;

+ 70 - 0
purchase-system/src/main/java/com/ozs/pm/doman/PmBidWinningOpeningRef.java

@@ -0,0 +1,70 @@
+package com.ozs.pm.doman;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.time.LocalDateTime;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * 中标开标关联表(PmBidWinningOpeningRef)实体类
+ *
+ * @author makejava
+ * @since 2023-02-05 09:44:12
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("pm_bid_winning_opening_ref")
+@ApiModel(value = "中标开标关联表", description = "")
+public class PmBidWinningOpeningRef implements Serializable {
+    private static final long serialVersionUID = -83530061962122026L;
+
+    @TableId(value = "ID", type = IdType.AUTO)
+    private Long id;
+
+
+    @ApiModelProperty("中标ID")
+    @TableField("WINNING_ID")
+    private Long winningId;
+
+
+    @ApiModelProperty("开标ID")
+    @TableField("OPENING_ID")
+    private Long openingId;
+
+
+    @ApiModelProperty("创建者")
+    @TableField("CREATE_BY")
+    private String createBy;
+
+
+    @ApiModelProperty("创建时间")
+    @TableField("CREATE_TIME")
+    private Date createTime;
+
+
+    @ApiModelProperty("更新者")
+    @TableField("UPDATE_BY")
+    private String updateBy;
+
+
+    @ApiModelProperty("更新时间")
+    @TableField("UPDATE_TIME")
+    private Date updateTime;
+
+
+}

+ 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;
+}

+ 7 - 4
purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/PmBidWinningReqVo.java

@@ -2,6 +2,7 @@ package com.ozs.pm.doman.vo.requestVo;
 
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ozs.pm.doman.PmBidOpening;
 import com.ozs.system.domain.SysFileRef;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -30,10 +31,6 @@ public class PmBidWinningReqVo implements Serializable {
     private Long demandId;
 
 
-    @ApiModelProperty("开标信息ID")
-    private Long bidOpeningId;
-
-
     @ApiModelProperty("中标金额(万元)")
     private Double bidWinningAmount;
 
@@ -61,6 +58,12 @@ public class PmBidWinningReqVo implements Serializable {
     @ApiModelProperty("更新时间")
     private Date updateTime;
 
+    /**
+     * 中标单位信息列表
+     */
+    @ApiModelProperty("中标单位信息列表")
+    private List<Long> pmBidOpeningIdList;
+
     /**
      * 上传附件
      */

+ 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;
+}

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

@@ -0,0 +1,65 @@
+package com.ozs.pm.doman.vo.requestVo;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ozs.system.domain.SysFileRef;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 项目建设表(PmProjectConstruction)实体类
+ *
+ * @author makejava
+ * @since 2023-02-02 00:47:23
+ */
+
+@Data
+public class PmProjectConstructionReqVo implements Serializable {
+    private static final long serialVersionUID = -98627692890895867L;
+
+
+    @ApiModelProperty("需求ID")
+    private Long demandId;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("开始时间")
+    private Date startTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("初步验收时间")
+    private Date preliminaryInspectionTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("终验时间")
+    private Date finalInspectionTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("结束时间")
+    private Date endTime;
+
+
+    @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 List<SysFileRef> sysFileRefs;
+}

+ 3 - 0
purchase-system/src/main/java/com/ozs/pm/doman/vo/responseVo/PmDemandResVo.java

@@ -215,6 +215,9 @@ public class PmDemandResVo extends BaseEntity
     @ApiModelProperty("采购需求工程类对象")
     private PmDemandEngineeringResVo pmDemandEngineeringResVo;
 
+    /** 项目建设对象  */
+    @ApiModelProperty("项目建设对象")
+    private  PmProjectConstructionResVo pmProjectConstructionResVo;
 
     /**
      * 采购需求附件

+ 66 - 0
purchase-system/src/main/java/com/ozs/pm/doman/vo/responseVo/PmProjectConstructionResVo.java

@@ -0,0 +1,66 @@
+package com.ozs.pm.doman.vo.responseVo;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ozs.system.domain.SysFileRef;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 项目建设表(PmProjectConstruction)实体类
+ *
+ * @author makejava
+ * @since 2023-02-02 00:47:23
+ */
+
+@Data
+public class PmProjectConstructionResVo implements Serializable {
+    private static final long serialVersionUID = -98627692890895867L;
+
+
+    @ApiModelProperty("需求ID")
+    private Long demandId;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("开始时间")
+    private Date startTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("初步验收时间")
+    private Date preliminaryInspectionTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("终验时间")
+    private Date finalInspectionTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("结束时间")
+    private Date endTime;
+
+
+    @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;
+
+    /**
+     * 上传附件的URL
+     */
+    @ApiModelProperty("上传附件的URL")
+    HashMap<String, String> fileMap;
+}

+ 15 - 0
purchase-system/src/main/java/com/ozs/pm/mapper/PmBidWinningOpeningRefMapper.java

@@ -0,0 +1,15 @@
+package com.ozs.pm.mapper;
+
+import com.ozs.pm.doman.PmBidWinningOpeningRef;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+
+/**
+ * 中标开标关联表(PmBidWinningOpeningRef)表数据库访问层
+ *
+ * @author makejava
+ * @since 2023-02-05 09:44:14
+ */
+public interface PmBidWinningOpeningRefMapper extends BaseMapper<PmBidWinningOpeningRef> {
+
+}

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

@@ -105,6 +105,12 @@ public interface IPmDemandService extends IService<PmDemand>
 
     boolean insertPmBidWinning(PmBidWinningReqVo pmBidWinningReqVo) throws Exception;
 
+    boolean updatePmBidWinning(PmBidWinningReqVo pmBidWinningReqVo) throws Exception;
+
     boolean insertPmBidFailure(PmBidFailureReqVo pmBidFailureReqVo) throws Exception;
 
+    boolean insertContractInfo(PmContractInfoReqVo pmContractInfoReqVo) throws Exception;
+
+    boolean insertProjectConstruction(PmProjectConstructionReqVo pmProjectConstructionReqVo) throws Exception;
+
 }

+ 14 - 0
purchase-system/src/main/java/com/ozs/pm/service/PmBidWinningOpeningRefService.java

@@ -0,0 +1,14 @@
+package com.ozs.pm.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ozs.pm.doman.PmBidWinningOpeningRef;
+
+/**
+ * 中标开标关联表(PmBidWinningOpeningRef)表服务接口
+ *
+ * @author makejava
+ * @since 2023-02-05 09:44:14
+ */
+public interface PmBidWinningOpeningRefService extends IService<PmBidWinningOpeningRef> {
+
+}

+ 18 - 0
purchase-system/src/main/java/com/ozs/pm/service/impl/PmBidWinningOpeningRefServiceImpl.java

@@ -0,0 +1,18 @@
+package com.ozs.pm.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ozs.pm.mapper.PmBidWinningOpeningRefMapper;
+import com.ozs.pm.doman.PmBidWinningOpeningRef;
+import com.ozs.pm.service.PmBidWinningOpeningRefService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 中标开标关联表(PmBidWinningOpeningRef)表服务实现类
+ *
+ * @author makejava
+ * @since 2023-02-05 09:44:14
+ */
+@Service
+public class PmBidWinningOpeningRefServiceImpl extends ServiceImpl<PmBidWinningOpeningRefMapper, PmBidWinningOpeningRef> implements PmBidWinningOpeningRefService {
+
+}

+ 461 - 153
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;
@@ -17,6 +19,7 @@ import com.ozs.common.utils.bean.BeanUtils;
 import com.ozs.pm.doman.*;
 import com.ozs.pm.doman.vo.requestVo.*;
 import com.ozs.pm.doman.vo.responseVo.*;
+import com.ozs.pm.mapper.PmBidWinningOpeningRefMapper;
 import com.ozs.pm.mapper.PmDemandMapper;
 import com.ozs.pm.service.*;
 import com.ozs.system.domain.SysFileInfo;
@@ -75,6 +78,19 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
     private PmBidWinningService pmBidWinningService;
     @Autowired
     private PmBidFailureService pmBidFailureService;
+    @Autowired
+    private PmBidWinningOpeningRefService pmBidWinningOpeningRefService;
+    @Autowired
+    private PmContractInfoService pmContractInfoService;
+    @Autowired
+    private BaseSupplierService baseSupplierService;
+
+    @Autowired
+    private PmContractUnitRefService pmContractUnitRefService;
+
+    @Autowired
+    private PmProjectConstructionService pmProjectConstructionService;
+
 
     /**
      * 查询采购需求
@@ -278,6 +294,20 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
             } else if("5".equals(detailType)) { //合同信息
 
             } else if("6".equals(detailType)) { //建设情况
+                LambdaQueryWrapper<PmProjectConstruction> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+                lambdaQueryWrapper.eq(PmProjectConstruction::getDemandId,demandId);
+                PmProjectConstruction pmProjectConstruction = pmProjectConstructionService.getOne(lambdaQueryWrapper);
+                if(pmProjectConstruction != null){
+                    PmProjectConstructionResVo pmProjectConstructionResVo = new PmProjectConstructionResVo();
+                    BeanUtils.copyProperties(pmProjectConstruction,pmProjectConstructionResVo);
+
+                    //建设情况文件
+                    HashMap<String, String> projectConstructionFileMap = getFileMap(vo.getDemandId(),SysFileRefEnum.PM_PROJECT_CONSTRUCTION.getType());
+                    if(projectConstructionFileMap != null){
+                        pmProjectConstructionResVo.setFileMap(projectConstructionFileMap);
+                    }
+                    vo.setPmProjectConstructionResVo(pmProjectConstructionResVo);
+                }
 
             }
 
@@ -410,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();
@@ -582,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();
@@ -662,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());
@@ -678,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());
@@ -698,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());
@@ -716,32 +751,33 @@ 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());
         pmDemand.setProjectStatus(Long.parseLong(PmProjectStatus.WAIT_SELECT_AGENT.getCode()));
         List<SysFileRef> sysFileRefs = pmDemandReqVo.getSysFileRefs();
 
-        uploadFile(pmDemandReqVo.getDemandId(), SysFileRefEnum.PM_TAST_RELEASE.getType(), sysFileRefs, pmDemandReqVo.getUpdateBy());
+        uploadFile(pmDemandReqVo.getDemandId(),SysFileRefEnum.PM_TAST_RELEASE.getType(),sysFileRefs,pmDemandReqVo.getUpdateBy());
         pmDemand.setUpdateBy(pmDemandReqVo.getUpdateBy());
         pmDemand.setUpdateTime(DateUtils.getNowDate());
         pmDemand.setAuditTime(DateUtils.getNowDate());
         return this.updateById(pmDemand);
     }
 
-
     @Override
-    public boolean uploadFile(Long redId, Integer fileType, List<SysFileRef> sysFileRefs, String upateBy) {
+    @Transactional(rollbackFor = Exception.class)
+    public boolean uploadFile(Long redId,Integer fileType, List<SysFileRef> sysFileRefs,String upateBy){
 
         if (!ObjectUtils.isEmpty(sysFileRefs)) {
             for (SysFileRef ref : sysFileRefs) {
-                if (ref.getFileId() == null) {
+                if(ref.getFileId() == null){
                     continue;
                 }
                 QueryWrapper<SysFileRef> queryWrapper = new QueryWrapper<>();
-                queryWrapper.lambda().eq(SysFileRef::getFileId, ref.getFileId())
-                        .eq(SysFileRef::getRedId, redId)
-                        .eq(SysFileRef::getType, fileType);
+                queryWrapper.lambda().eq(SysFileRef::getFileId,ref.getFileId())
+                        .eq(SysFileRef::getRedId,redId)
+                        .eq(SysFileRef::getType,fileType);
                 List<SysFileRef> sysFileRefList = sysFileRefService.list(queryWrapper);
                 if(!CollectionUtils.isEmpty(sysFileRefList)){
                     sysFileRefService.remove(queryWrapper);
@@ -762,6 +798,7 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public boolean insertPmReleaseAnnouncement(PmReleaseAnnouncementReqVo pmReleaseAnnouncementReqVo) throws Exception {
 
         PmReleaseAnnouncement pmReleaseAnnouncement = new PmReleaseAnnouncement();
@@ -773,8 +810,8 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
                 pmDemandUpdate.setProjectStatus(Long.parseLong(PmProjectStatus.WAIT_OPEN_BID.getCode()));
                 pmDemandUpdate.setUpdateTime(pmReleaseAnnouncementReqVo.getUpdateTime());
                 pmDemandUpdate.setUpdateBy(pmReleaseAnnouncementReqVo.getUpdateBy());
-                return this.updateById(pmDemandUpdate);
-                //TODO 发布公告生成后,会默认将该数据同步到公告管理和首页中
+                 return this.updateById(pmDemandUpdate);
+                 //TODO 发布公告生成后,会默认将该数据同步到公告管理和首页中
 
             } else {
                 return false;
@@ -796,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() + ")所属采购品种和项目类型不匹配");
@@ -823,175 +864,418 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
             pmDemandExpertRefList.add(pmDemandExpertRef);
         }
 
-        if (baseExpertService.saveOrUpdateBatch(baseExpertList)){
-            return pmDemandExpertRefService.saveBatch(pmDemandExpertRefList);
-        } else {
-            return false;
-        }
+          if (baseExpertService.saveOrUpdateBatch(baseExpertList)){
+              return pmDemandExpertRefService.saveBatch(pmDemandExpertRefList);
+          } else {
+              return false;
+          }
     }
 
     @Override
-    public boolean extractExpertBatch(PmBaseExpertExtractReqVo pmBaseExpertExtractReqVo) throws Exception {
-        Integer technicalExpertNumber = pmBaseExpertExtractReqVo.getTechnicalExpertNumber();
-        if(technicalExpertNumber== null){
-            technicalExpertNumber = 0;
-        }
-        Integer economicExpertNumber = pmBaseExpertExtractReqVo.getEconomicExpertNumber();
-        if(economicExpertNumber == null){
-            economicExpertNumber = 0;
+    @Transactional(rollbackFor = Exception.class)
+   public boolean extractExpertBatch(PmBaseExpertExtractReqVo pmBaseExpertExtractReqVo) throws Exception {
+       Integer technicalExpertNumber = pmBaseExpertExtractReqVo.getTechnicalExpertNumber();
+       if(technicalExpertNumber== null){
+           technicalExpertNumber = 0;
+       }
+       Integer economicExpertNumber = pmBaseExpertExtractReqVo.getEconomicExpertNumber();
+       if(economicExpertNumber == null){
+           economicExpertNumber = 0;
+       }
+       Integer legalAffairsExpertNumber = pmBaseExpertExtractReqVo.getLegalAffairsExpertNumber();
+       if(legalAffairsExpertNumber == null){
+           legalAffairsExpertNumber = 0;
+       }
+       Integer spareExpertNumber = pmBaseExpertExtractReqVo.getSpareExpertNumber();
+       if(spareExpertNumber == null){
+           spareExpertNumber = 0;
+       }
+
+       String  professional = pmBaseExpertExtractReqVo.getProfessional();
+       if(spareExpertNumber > 0 && ObjectUtils.isEmpty(professional)){
+           throw new Exception("抽取备用专家必须选择专家专业");
+       }
+       String  localArea = pmBaseExpertExtractReqVo.getLocalArea();
+       if(spareExpertNumber > 0 && ObjectUtils.isEmpty(localArea)){
+           throw new Exception("抽取备用专家必须选择所在区域");
+       }
+
+       PmDemand pmDemand = this.getById(pmBaseExpertExtractReqVo.getDemandId());
+       if(ObjectUtils.isEmpty(pmDemand)){
+           throw new Exception("参数错误");
+       }
+
+       //从专家库中查询符合项目类型的以及是白名单的全部列表
+       LambdaQueryWrapper<BaseExpert> lw = new LambdaQueryWrapper<BaseExpert>();
+       lw.eq(BaseExpert::getVarietyPurchase,pmDemand.getProjectType())
+               .eq(BaseExpert::getStatus,NameListType.WHITE.getCode());
+       List<BaseExpert> baseExpertList = baseExpertService.list(lw);
+       if(ObjectUtils.isEmpty(baseExpertList)){
+           throw new Exception("没抽取到符合条件的专家");
+       }
+
+       //从列表中挑出来各个类型的子列表
+       List<BaseExpert> technicalExpertList = new ArrayList<>();
+       List<BaseExpert> economicExpertList = new ArrayList<>();
+       List<BaseExpert> legalAffairsExpertList = new ArrayList<>();
+       List<BaseExpert> spareExpertList = new ArrayList<>();
+
+       //TODO 所在区域判读
+
+       for(BaseExpert baseExpert : baseExpertList){
+           if(technicalExpertNumber > 0) {
+               if(baseExpert.getExpertType().contains(ExpertType.TECHNICAL_EXPERT.getCode())){
+                   technicalExpertList.add(baseExpert);
+               }
+           }
+
+           if(economicExpertNumber > 0) {
+               if(baseExpert.getExpertType().contains(ExpertType.ECONOMIC_EXPERT.getCode())){
+                   economicExpertList.add(baseExpert);
+               }
+           }
+
+           if (legalAffairsExpertNumber > 0) {
+               if(baseExpert.getExpertType().contains(ExpertType.LEGALAFFAIRS_EXPERT.getCode())){
+                   legalAffairsExpertList.add(baseExpert);
+               }
+           }
+
+           if (spareExpertNumber > 0) {
+               String[] arr = professional.split(",");
+               List<String> professionalList = Arrays.asList(arr);
+               String majorType = baseExpert.getMajorType();
+               if(!ObjectUtils.isEmpty(majorType)){
+                   String[] arr2 = majorType.split(",");
+                   List<String> majorTypeList =  Arrays.asList(arr2);
+                   if(hasIntersection(professionalList,majorTypeList)){
+                       spareExpertList.add(baseExpert);
+                   }
+               }
+           }
+       }
+
+       //从子列表中随机抽取符合数据量的
+       List<BaseExpert> alltExpertList = new ArrayList<>();
+       if(!ObjectUtils.isEmpty(technicalExpertList)){
+           alltExpertList.addAll(RandomUtil.getRandomList(technicalExpertList,technicalExpertNumber));
+       }
+       if(!ObjectUtils.isEmpty(economicExpertList)){
+           alltExpertList.addAll(RandomUtil.getRandomList(economicExpertList,economicExpertNumber));
+       }
+       if(!ObjectUtils.isEmpty(legalAffairsExpertList)){
+           alltExpertList.addAll(RandomUtil.getRandomList(legalAffairsExpertList,legalAffairsExpertNumber));
+       }
+       if(!ObjectUtils.isEmpty(spareExpertList)){
+           alltExpertList.addAll(RandomUtil.getRandomList(spareExpertList,spareExpertNumber));
+       }
+
+      if(ObjectUtils.isEmpty(alltExpertList)){
+          throw new Exception("没抽取到符合条件的专家");
+      } else {
+          List<PmDemandExpertRef> pmDemandExpertRefList = new ArrayList<>();
+          for(BaseExpert baseExpert :alltExpertList ) {
+              PmDemandExpertRef pmDemandExpertRef = new PmDemandExpertRef();
+              pmDemandExpertRef.setDemandId(pmDemand.getDemandId());
+              pmDemandExpertRef.setExpertId(baseExpert.getId().longValue());
+              pmDemandExpertRef.setCreateBy(pmBaseExpertExtractReqVo.getCreateBy());
+              pmDemandExpertRef.setAccessTime(DateUtils.parseDate(pmBaseExpertExtractReqVo.getAccessTime()));
+              pmDemandExpertRef.setCreateTime(new Date());
+              pmDemandExpertRef.setUpdateBy(pmBaseExpertExtractReqVo.getCreateBy());
+              pmDemandExpertRef.setUpdateTime(pmDemandExpertRef.getCreateTime());
+              pmDemandExpertRefList.add(pmDemandExpertRef);
+          }
+          return pmDemandExpertRefService.saveBatch(pmDemandExpertRefList);
+      }
+    }
+
+    //二个列表是否有交集
+    private boolean hasIntersection(List<String> professionalList, List<String> majorTypeList) {
+        for (String professiona : professionalList) {
+            for(String majorType : majorTypeList) {
+                if(professiona.equals(majorType)){
+                    return true;
+                }
+            }
         }
-        Integer legalAffairsExpertNumber = pmBaseExpertExtractReqVo.getLegalAffairsExpertNumber();
-        if(legalAffairsExpertNumber == null){
-            legalAffairsExpertNumber = 0;
+        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("发布公告不存在");
         }
-        Integer spareExpertNumber = pmBaseExpertExtractReqVo.getSpareExpertNumber();
-        if(spareExpertNumber == null){
-            spareExpertNumber = 0;
+       Date tenderOpenTime = pmReleaseAnnouncement.getTenderOpenTime();
+
+       Date now = new Date();
+       List<PmBidOpening> pmBidOpeningList = pmBidOpeningFillReqVo.getPmBidOpeningList();
+       for (PmBidOpening pmBidOpening : pmBidOpeningList) {
+           if(ObjectUtils.isEmpty(pmBidOpening.getBidderName())){
+               throw new Exception("投标人名称不能为空");
+           }
+           if(ObjectUtils.isEmpty(pmBidOpening.getScore())){
+               throw new Exception("分数不能为空");
+           }
+           pmBidOpening.setOpenBidTime(tenderOpenTime);
+           pmBidOpening.setDemandId(pmBidOpeningFillReqVo.getDemandId());
+           pmBidOpening.setCreateBy(pmBidOpeningFillReqVo.getCreateBy());
+           pmBidOpening.setCreateTime(now);
+           pmBidOpening.setUpdateBy(pmBidOpeningFillReqVo.getUpdateBy());
+           pmBidOpening.setUpdateTime(now);
+       }
+       if(pmBidOpeningService.saveBatch(pmBidOpeningList)) {
+           PmDemand pmDemandUpdate = new PmDemand();
+           pmDemandUpdate.setDemandId(pmDemand.getDemandId());
+           pmDemandUpdate.setProjectStatus(Long.parseLong(PmProjectStatus.WAIT_BID_ANNOUNCEMENT.getCode()));
+           pmDemandUpdate.setUpdateTime(now);
+           pmDemandUpdate.setUpdateBy(pmBidOpeningFillReqVo.getUpdateBy());
+           return this.updateById(pmDemandUpdate);
+       } else {
+           return false;
+       }
+   }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+   public boolean insertPmBidWinning(PmBidWinningReqVo pmBidWinningReqVo) throws Exception {
+       List<Long> pmBidOpeningIdList = pmBidWinningReqVo.getPmBidOpeningIdList();
+        if(ObjectUtils.isEmpty(pmBidOpeningIdList)) {
+            throw new Exception("中标单位信息列表不能为空");
         }
+       if(ObjectUtils.isEmpty(pmBidWinningReqVo.getSysFileRefs())){
+           throw new Exception("上传附件不能为空");
+       }
+       if(ObjectUtils.isEmpty(pmBidWinningReqVo.getBidWinningAmount())){
+           throw new Exception("中标金额不能为空");
+       }
+       PmBidWinning pmBidWinning = new PmBidWinning();
+       BeanUtils.copyProperties(pmBidWinningReqVo,pmBidWinning);
+       if(pmBidWinningService.save(pmBidWinning)){
+           List<PmBidWinningOpeningRef> pmBidWinningOpeningRefList = new ArrayList<>();
+           for(Long pmBidOpeningId : pmBidOpeningIdList){
+               PmBidWinningOpeningRef pmBidWinningOpeningRef = new PmBidWinningOpeningRef();
+               pmBidWinningOpeningRef.setOpeningId(pmBidOpeningId);
+               pmBidWinningOpeningRef.setWinningId(pmBidWinning.getId());
+               pmBidWinningOpeningRef.setCreateBy(pmBidWinningReqVo.getCreateBy());
+               pmBidWinningOpeningRef.setCreateTime(pmBidWinningReqVo.getCreateTime());
+               pmBidWinningOpeningRef.setUpdateBy(pmBidWinningReqVo.getUpdateBy());
+               pmBidWinningOpeningRef.setUpdateTime(pmBidWinningReqVo.getUpdateTime());
+               pmBidWinningOpeningRefList.add(pmBidWinningOpeningRef);
+           }
+          if (pmBidWinningOpeningRefService.saveBatch(pmBidWinningOpeningRefList)) {
+              if(uploadFile(pmBidWinning.getId(), SysFileRefEnum.PM_BID_WINNING_FILE.getType(),pmBidWinningReqVo.getSysFileRefs(),pmBidWinningReqVo.getUpdateBy())) {
+                  PmDemand pmDemandUpdate = new PmDemand();
+                  pmDemandUpdate.setDemandId(pmBidWinningReqVo.getDemandId());
+                  pmDemandUpdate.setProjectStatus(Long.parseLong(PmProjectStatus.BIDDING_PUBLICITY.getCode()));
+                  pmDemandUpdate.setUpdateTime(pmBidWinningReqVo.getUpdateTime());
+                  pmDemandUpdate.setUpdateBy(pmBidWinningReqVo.getUpdateBy());
+                  return this.updateById(pmDemandUpdate);
+              } else {
+                  return false;
+              }
+          } else {
+              return false;
+          }
+
+       } else {
+           return false;
+       }
+   }
 
-        String  professional = pmBaseExpertExtractReqVo.getProfessional();
-        if(spareExpertNumber > 0 && ObjectUtils.isEmpty(professional)){
-            throw new Exception("抽取备用专家必须选择专家专业");
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean updatePmBidWinning(PmBidWinningReqVo pmBidWinningReqVo) throws Exception {
+        List<Long> pmBidOpeningIdList = pmBidWinningReqVo.getPmBidOpeningIdList();
+        if(ObjectUtils.isEmpty(pmBidOpeningIdList)) {
+            throw new Exception("中标单位信息列表不能为空");
         }
-        String  localArea = pmBaseExpertExtractReqVo.getLocalArea();
-        if(spareExpertNumber > 0 && ObjectUtils.isEmpty(localArea)){
-            throw new Exception("抽取备用专家必须选择所在区域");
+        if(ObjectUtils.isEmpty(pmBidWinningReqVo.getSysFileRefs())){
+            throw new Exception("上传附件不能为空");
         }
-
-        PmDemand pmDemand = this.getById(pmBaseExpertExtractReqVo.getDemandId());
-        if(ObjectUtils.isEmpty(pmDemand)){
-            throw new Exception("参数错误");
+        if(ObjectUtils.isEmpty(pmBidWinningReqVo.getBidWinningAmount())){
+            throw new Exception("中标金额不能为空");
         }
 
-        LambdaQueryWrapper<BaseExpert> lw = new LambdaQueryWrapper<BaseExpert>();
-        lw.eq(BaseExpert::getVarietyPurchase,pmDemand.getProjectType())
-                .eq(BaseExpert::getStatus,NameListType.WHITE.getCode());
-        List<BaseExpert> baseExpertList = baseExpertService.list(lw);
-        if(ObjectUtils.isEmpty(baseExpertList)){
-            throw new Exception("没抽取到符合条件的专家");
+        LambdaQueryWrapper<PmBidWinning> lw = new LambdaQueryWrapper<>();
+        lw.eq(PmBidWinning::getDemandId,pmBidWinningReqVo.getDemandId());
+        PmBidWinning pmBidWinning = pmBidWinningService.getOne(lw);
+        if(pmBidWinning == null){
+            throw new Exception("原中标信息不存在");
         }
 
-        List<BaseExpert> technicalExpertList = new ArrayList<>();
-        List<BaseExpert> economicExpertList = new ArrayList<>();
-        List<BaseExpert> legalAffairsExpertList = new ArrayList<>();
-        List<BaseExpert> spareExpertList = new ArrayList<>();
-
-        for(BaseExpert baseExpert : baseExpertList){
-            if(technicalExpertNumber > 0) {
-                if(ExpertType.TECHNICAL_EXPERT.getCode().equals(baseExpert.getExpertType())){
-                    technicalExpertList.add(baseExpert);
-                }
-            }
-
-            if(economicExpertNumber > 0) {
-                if(ExpertType.ECONOMIC_EXPERT.getCode().equals(baseExpert.getExpertType())){
-                    economicExpertList.add(baseExpert);
-                }
+        pmBidWinning.setBidWinningAmount(pmBidWinningReqVo.getBidWinningAmount());
+        pmBidWinning.setUpdateBy(pmBidWinningReqVo.getUpdateBy());
+        pmBidWinning.setUpdateTime(pmBidWinningReqVo.getUpdateTime());
+        if(pmBidWinningService.updateById(pmBidWinning)){
+            //删除老的:
+            QueryWrapper<PmBidWinningOpeningRef> queryWrapper = new QueryWrapper<>();
+            queryWrapper.lambda().eq(PmBidWinningOpeningRef::getWinningId,pmBidWinning.getId());
+            pmBidWinningOpeningRefService.remove(queryWrapper);
+
+            //添加新的
+            List<PmBidWinningOpeningRef> pmBidWinningOpeningRefList = new ArrayList<>();
+            for(Long pmBidOpeningId : pmBidOpeningIdList){
+                PmBidWinningOpeningRef pmBidWinningOpeningRef = new PmBidWinningOpeningRef();
+                pmBidWinningOpeningRef.setOpeningId(pmBidOpeningId);
+                pmBidWinningOpeningRef.setWinningId(pmBidWinning.getId());
+                pmBidWinningOpeningRef.setCreateBy(pmBidWinningReqVo.getCreateBy());
+                pmBidWinningOpeningRef.setCreateTime(pmBidWinningReqVo.getCreateTime());
+                pmBidWinningOpeningRef.setUpdateBy(pmBidWinningReqVo.getUpdateBy());
+                pmBidWinningOpeningRef.setUpdateTime(pmBidWinningReqVo.getUpdateTime());
+                pmBidWinningOpeningRefList.add(pmBidWinningOpeningRef);
             }
+           return pmBidWinningOpeningRefService.saveBatch(pmBidWinningOpeningRefList);
+        } else {
+            return false;
+        }
+    }
 
-            if (legalAffairsExpertNumber > 0) {
-                if(ExpertType.LEGALAFFAIRS_EXPERT.getCode().equals(baseExpert.getExpertType())){
-                    legalAffairsExpertList.add(baseExpert);
-                }
-            }
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean insertPmBidFailure(PmBidFailureReqVo pmBidFailureReqVo) throws Exception {
+        PmBidFailure pmBidFailure = new PmBidFailure();
+        BeanUtils.copyProperties(pmBidFailureReqVo,pmBidFailure);
+        if(pmBidFailureService.save(pmBidFailure)){
+            return uploadFile(pmBidFailure.getId(), SysFileRefEnum.PM_BID_FAILURE_FILE.getType(),pmBidFailureReqVo.getSysFileRefs(),pmBidFailureReqVo.getUpdateBy());
+        } else {
+            return false;
+        }
 
-            if (spareExpertNumber > 0) {
-                String[] arr = professional.split(",");
-                List<String> professionalList = Arrays.asList(arr);
-                String majorType = baseExpert.getMajorType();
-                //TODO 所在区域判读
+    }
 
-                if(!ObjectUtils.isEmpty(majorType)){
-                    if(professionalList.contains(majorType)){
-                        spareExpertList.add(baseExpert);
-                    }
-                }
-            }
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean insertContractInfo(PmContractInfoReqVo pmContractInfoReqVo) throws Exception {
+        Long demandId = pmContractInfoReqVo.getDemandId();
+        if(ObjectUtils.isEmpty(demandId)){
+            throw new Exception("采购需求ID不能为空");
         }
 
-        List<BaseExpert> alltExpertList = new ArrayList<>();
-        if(!ObjectUtils.isEmpty(technicalExpertList)){
-            alltExpertList.addAll(RandomUtil.getRandomList(technicalExpertList,technicalExpertNumber));
-        }
-        if(!ObjectUtils.isEmpty(economicExpertList)){
-            alltExpertList.addAll(RandomUtil.getRandomList(economicExpertList,economicExpertNumber));
+        String contractSignPlaceA = pmContractInfoReqVo.getContractSignPlaceA();
+        if(ObjectUtils.isEmpty(contractSignPlaceA)) {
+            throw new Exception("甲方合同签订地点不能为空");
         }
-        if(!ObjectUtils.isEmpty(legalAffairsExpertList)){
-            alltExpertList.addAll(RandomUtil.getRandomList(legalAffairsExpertList,legalAffairsExpertNumber));
-        }
-        if(!ObjectUtils.isEmpty(spareExpertList)){
-            alltExpertList.addAll(RandomUtil.getRandomList(spareExpertList,spareExpertNumber));
+        Date contractSignDateA = pmContractInfoReqVo.getContractSignDateA();
+        if(ObjectUtils.isEmpty(contractSignDateA)) {
+            throw new Exception("甲方合同签订日期不能为空");
         }
 
-        if(ObjectUtils.isEmpty(alltExpertList)){
-            throw new Exception("没抽取到符合条件的专家");
-        } else {
-            List<PmDemandExpertRef> pmDemandExpertRefList = new ArrayList<>();
-            for(BaseExpert baseExpert :alltExpertList ) {
-                PmDemandExpertRef pmDemandExpertRef = new PmDemandExpertRef();
-                pmDemandExpertRef.setDemandId(pmDemand.getDemandId());
-                pmDemandExpertRef.setExpertId(baseExpert.getId().longValue());
-                pmDemandExpertRef.setCreateBy(pmBaseExpertExtractReqVo.getCreateBy());
-                pmDemandExpertRef.setAccessTime(DateUtils.parseDate(pmBaseExpertExtractReqVo.getAccessTime()));
-                pmDemandExpertRef.setCreateTime(new Date());
-                pmDemandExpertRef.setUpdateBy(pmBaseExpertExtractReqVo.getCreateBy());
-                pmDemandExpertRef.setUpdateTime(pmDemandExpertRef.getCreateTime());
-                pmDemandExpertRefList.add(pmDemandExpertRef);
-            }
-            return pmDemandExpertRefService.saveBatch(pmDemandExpertRefList);
+        PmDemand pmDemand = this.getById(demandId);
+        if(ObjectUtils.isEmpty(pmDemand)){
+            throw new Exception("采购需求ID错误");
         }
-    }
 
-    @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("参数错误");
+        List<BaseSupplierReqVo> baseSupplierReqVoList = pmContractInfoReqVo.getBaseSupplierList();
+        if(ObjectUtils.isEmpty(baseSupplierReqVoList)){
+            throw new Exception("乙方信息列表不能为空");
         }
-        Date now = new Date();
-        List<PmBidOpening> pmBidOpeningList = pmBidOpeningFillReqVo.getPmBidOpeningList();
-        for (PmBidOpening pmBidOpening : pmBidOpeningList) {
-            if(ObjectUtils.isEmpty(pmBidOpening.getBidderName())){
-                throw new Exception("投标人名称不能为空");
+        for(BaseSupplierReqVo baseSupplierReqVo : baseSupplierReqVoList) {
+            String contractSignPlaceB = baseSupplierReqVo.getContractSignPlaceB();
+            if(ObjectUtils.isEmpty(contractSignPlaceB)) {
+                throw new Exception("乙方合同签订地点不能为空");
             }
-            if(ObjectUtils.isEmpty(pmBidOpening.getScore())){
-                throw new Exception("分数不能为空");
+            Date contractSignDateB = baseSupplierReqVo.getContractSignDateB();
+            if(ObjectUtils.isEmpty(contractSignDateB)) {
+                throw new Exception("乙方合同签订日期不能为空");
             }
-            pmBidOpening.setDemandId(pmBidOpeningFillReqVo.getDemandId());
-            pmBidOpening.setOpenBidTime(now); //TODO
-            pmBidOpening.setCreateBy(pmBidOpeningFillReqVo.getCreateBy());
-            pmBidOpening.setCreateTime(now);
-            pmBidOpening.setUpdateBy(pmBidOpeningFillReqVo.getUpdateBy());
-            pmBidOpening.setUpdateTime(now);
-        }
-        if(pmBidOpeningService.saveBatch(pmBidOpeningList)) {
-            PmDemand pmDemandUpdate = new PmDemand();
-            pmDemandUpdate.setDemandId(pmDemand.getDemandId());
-            pmDemandUpdate.setProjectStatus(Long.parseLong(PmProjectStatus.WAIT_BID_ANNOUNCEMENT.getCode()));
-            pmDemandUpdate.setUpdateTime(now);
-            pmDemandUpdate.setUpdateBy(pmBidOpeningFillReqVo.getUpdateBy());
-            return this.updateById(pmDemandUpdate);
-        } else {
-            return false;
         }
-    }
 
-    @Override
-    public boolean insertPmBidWinning(PmBidWinningReqVo pmBidWinningReqVo) throws Exception {
-        uploadFile(pmBidWinningReqVo.getId(), SysFileRefEnum.PM_BID_WINNING_FILE.getType(),pmBidWinningReqVo.getSysFileRefs(),pmBidWinningReqVo.getUpdateBy());
-        PmBidWinning pmBidWinning = new PmBidWinning();
-        BeanUtils.copyProperties(pmBidWinningReqVo,pmBidWinning);
-        if(pmBidWinningService.save(pmBidWinning)){
-            if(uploadFile(pmBidWinning.getId(), SysFileRefEnum.PM_BID_WINNING_FILE.getType(),pmBidWinningReqVo.getSysFileRefs(),pmBidWinningReqVo.getUpdateBy())) {
+        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(pmBidWinningReqVo.getDemandId());
-                pmDemandUpdate.setProjectStatus(Long.parseLong(PmProjectStatus.BIDDING_PUBLICITY.getCode()));
-                pmDemandUpdate.setUpdateTime(pmBidWinningReqVo.getUpdateTime());
-                pmDemandUpdate.setUpdateBy(pmBidWinningReqVo.getUpdateBy());
+                pmDemandUpdate.setDemandId(demandId);
+                pmDemandUpdate.setProjectStatus(Long.parseLong(PmProjectStatus.UNDER_CONSTRUCTION.getCode()));
+                pmDemandUpdate.setUpdateTime(pmContractInfoReqVo.getUpdateTime());
+                pmDemandUpdate.setUpdateBy(pmContractInfoReqVo.getUpdateBy());
                 return this.updateById(pmDemandUpdate);
             } else {
-                return false;
+                throw new Exception("保存附件失败");
             }
         } else {
             return false;
@@ -999,15 +1283,39 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
     }
 
     @Override
-    public boolean insertPmBidFailure(PmBidFailureReqVo pmBidFailureReqVo) throws Exception {
+    @Transactional(rollbackFor = Exception.class)
+    public boolean insertProjectConstruction(PmProjectConstructionReqVo pmProjectConstructionReqVo) throws Exception {
+        Long demandId = pmProjectConstructionReqVo.getDemandId();
+        if(ObjectUtils.isEmpty(demandId)){
+            throw new Exception("采购需求ID不能为空");
+        }
 
-        PmBidFailure pmBidFailure = new PmBidFailure();
-        BeanUtils.copyProperties(pmBidFailureReqVo,pmBidFailure);
-        if(pmBidFailureService.save(pmBidFailure)){
-            return uploadFile(pmBidFailure.getId(), SysFileRefEnum.PM_BID_FAILURE_FILE.getType(),pmBidFailureReqVo.getSysFileRefs(),pmBidFailureReqVo.getUpdateBy());
+        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;
         }
-
     }
 }

+ 6 - 0
purchase-system/src/main/resources/mapper/pm/PmBidWinningOpeningRefMapper.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ozs.pm.mapper.PmBidWinningOpeningRefMapper">
+
+
+</mapper>