瀏覽代碼

项目管理-采购执行

suntianwu 2 年之前
父節點
當前提交
c82ec1cb53
共有 16 個文件被更改,包括 489 次插入68 次删除
  1. 70 2
      purchase-admin/src/main/java/com/ozs/web/controller/pm/PmProjectConstructionController.java
  2. 18 33
      purchase-admin/src/main/java/com/ozs/web/controller/pm/PmPurchaseExecutionController.java
  3. 3 1
      purchase-common/src/main/java/com/ozs/common/enums/SysFileRefEnum.java
  4. 5 5
      purchase-system/src/main/java/com/ozs/pm/doman/PmBidOpening.java
  5. 0 5
      purchase-system/src/main/java/com/ozs/pm/doman/PmBidWinning.java
  6. 70 0
      purchase-system/src/main/java/com/ozs/pm/doman/PmBidWinningOpeningRef.java
  7. 7 4
      purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/PmBidWinningReqVo.java
  8. 65 0
      purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/PmProjectConstructionReqVo.java
  9. 3 0
      purchase-system/src/main/java/com/ozs/pm/doman/vo/responseVo/PmDemandResVo.java
  10. 66 0
      purchase-system/src/main/java/com/ozs/pm/doman/vo/responseVo/PmProjectConstructionResVo.java
  11. 15 0
      purchase-system/src/main/java/com/ozs/pm/mapper/PmBidWinningOpeningRefMapper.java
  12. 2 0
      purchase-system/src/main/java/com/ozs/pm/service/IPmDemandService.java
  13. 14 0
      purchase-system/src/main/java/com/ozs/pm/service/PmBidWinningOpeningRefService.java
  14. 18 0
      purchase-system/src/main/java/com/ozs/pm/service/impl/PmBidWinningOpeningRefServiceImpl.java
  15. 127 18
      purchase-system/src/main/java/com/ozs/pm/service/impl/PmDemandServiceImpl.java
  16. 6 0
      purchase-system/src/main/resources/mapper/pm/PmBidWinningOpeningRefMapper.xml

+ 70 - 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,59 @@ 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) {
+        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("建设文档填制失败");
+        }
+    }
+
+    /**
+     * 查看详情
+     */
+    @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()));
+    }
 }

+ 18 - 33
purchase-admin/src/main/java/com/ozs/web/controller/pm/PmPurchaseExecutionController.java

@@ -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) {

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

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

+ 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;
+
     /**
      * 上传附件
      */

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

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

@@ -105,6 +105,8 @@ public interface IPmDemandService extends IService<PmDemand>
 
     boolean insertPmBidWinning(PmBidWinningReqVo pmBidWinningReqVo) throws Exception;
 
+    boolean updatePmBidWinning(PmBidWinningReqVo pmBidWinningReqVo) throws Exception;
+
     boolean insertPmBidFailure(PmBidFailureReqVo pmBidFailureReqVo) 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 {
+
+}

+ 127 - 18
purchase-system/src/main/java/com/ozs/pm/service/impl/PmDemandServiceImpl.java

@@ -17,6 +17,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,7 +76,10 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
     private PmBidWinningService pmBidWinningService;
     @Autowired
     private PmBidFailureService pmBidFailureService;
-
+    @Autowired
+    private PmProjectConstructionService pmProjectConstructionService;
+    @Autowired
+    private PmBidWinningOpeningRefService pmBidWinningOpeningRefService;
     /**
      * 查询采购需求
      *
@@ -278,6 +282,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);
+                }
 
             }
 
@@ -859,6 +877,7 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
            throw new Exception("参数错误");
        }
 
+       //从专家库中查询符合项目类型的以及是白名单的全部列表
        LambdaQueryWrapper<BaseExpert> lw = new LambdaQueryWrapper<BaseExpert>();
        lw.eq(BaseExpert::getVarietyPurchase,pmDemand.getProjectType())
                .eq(BaseExpert::getStatus,NameListType.WHITE.getCode());
@@ -867,26 +886,29 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
            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(ExpertType.TECHNICAL_EXPERT.getCode().equals(baseExpert.getExpertType())){
+               if(baseExpert.getExpertType().contains(ExpertType.TECHNICAL_EXPERT.getCode())){
                    technicalExpertList.add(baseExpert);
                }
            }
 
            if(economicExpertNumber > 0) {
-               if(ExpertType.ECONOMIC_EXPERT.getCode().equals(baseExpert.getExpertType())){
+               if(baseExpert.getExpertType().contains(ExpertType.ECONOMIC_EXPERT.getCode())){
                    economicExpertList.add(baseExpert);
                }
            }
 
            if (legalAffairsExpertNumber > 0) {
-               if(ExpertType.LEGALAFFAIRS_EXPERT.getCode().equals(baseExpert.getExpertType())){
+               if(baseExpert.getExpertType().contains(ExpertType.LEGALAFFAIRS_EXPERT.getCode())){
                    legalAffairsExpertList.add(baseExpert);
                }
            }
@@ -895,16 +917,17 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
                String[] arr = professional.split(",");
                List<String> professionalList = Arrays.asList(arr);
                String majorType = baseExpert.getMajorType();
-               //TODO 所在区域判读
-
                if(!ObjectUtils.isEmpty(majorType)){
-                   if(professionalList.contains(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));
@@ -938,6 +961,19 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
       }
     }
 
+    //二个列表是否有交集
+    private boolean hasIntersection(List<String> professionalList, List<String> majorTypeList) {
+        for (String professiona : professionalList) {
+            for(String majorType : majorTypeList) {
+                if(professiona.equals(majorType)){
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+
     @Transactional(rollbackFor = Exception.class)
    public boolean insertBidOpeningBatch(PmBidOpeningFillReqVo pmBidOpeningFillReqVo) throws Exception {
        PmDemand pmDemand = this.getById(pmBidOpeningFillReqVo.getDemandId());
@@ -953,8 +989,10 @@ 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.setDemandId(pmBidOpeningFillReqVo.getDemandId());
-           pmBidOpening.setOpenBidTime(now); //TODO
            pmBidOpening.setCreateBy(pmBidOpeningFillReqVo.getCreateBy());
            pmBidOpening.setCreateTime(now);
            pmBidOpening.setUpdateBy(pmBidOpeningFillReqVo.getUpdateBy());
@@ -973,25 +1011,96 @@ public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> i
    }
 
    public boolean insertPmBidWinning(PmBidWinningReqVo pmBidWinningReqVo) throws Exception {
-       uploadFile(pmBidWinningReqVo.getId(), SysFileRefEnum.PM_BID_WINNING_FILE.getType(),pmBidWinningReqVo.getSysFileRefs(),pmBidWinningReqVo.getUpdateBy());
+       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)){
-           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;
+           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;
        }
    }
 
+    public boolean updatePmBidWinning(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("中标金额不能为空");
+        }
+
+        LambdaQueryWrapper<PmBidWinning> lw = new LambdaQueryWrapper<>();
+        lw.eq(PmBidWinning::getDemandId,pmBidWinningReqVo.getDemandId());
+        PmBidWinning pmBidWinning = pmBidWinningService.getOne(lw);
+        if(pmBidWinning == null){
+            throw new Exception("原中标信息不存在");
+        }
+
+        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;
+        }
+    }
+
     public boolean insertPmBidFailure(PmBidFailureReqVo pmBidFailureReqVo) throws Exception {
 
         PmBidFailure pmBidFailure = new PmBidFailure();

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