Quellcode durchsuchen

Merge branch 'master' of http://124.70.58.209:3000/ytrd-project-management/purchase

 Conflicts:
	purchase-admin/src/main/java/com/ozs/web/controller/system/SysUserController.java
gao.qiang vor 2 Jahren
Ursprung
Commit
7b4426aa79
100 geänderte Dateien mit 4810 neuen und 1908 gelöschten Zeilen
  1. 1 10
      purchase-admin/src/main/java/com/ozs/PurchaseApplication.java
  2. 51 2
      purchase-admin/src/main/java/com/ozs/web/controller/base/BaseExpertController.java
  3. 42 9
      purchase-admin/src/main/java/com/ozs/web/controller/base/BasePolicyController.java
  4. 37 6
      purchase-admin/src/main/java/com/ozs/web/controller/home/HomeNoticeController.java
  5. 3 4
      purchase-admin/src/main/java/com/ozs/web/controller/home/HomeNotificationMessageController.java
  6. 142 1
      purchase-admin/src/main/java/com/ozs/web/controller/home/SystemHomepageController.java
  7. 49 7
      purchase-admin/src/main/java/com/ozs/web/controller/plan/MonthlyReconciliationController.java
  8. 203 11
      purchase-admin/src/main/java/com/ozs/web/controller/plan/PlanQuarterController.java
  9. 207 14
      purchase-admin/src/main/java/com/ozs/web/controller/plan/PlanYearsController.java
  10. 12 16
      purchase-admin/src/main/java/com/ozs/web/controller/plan/ProvisionalPlanController.java
  11. 53 0
      purchase-admin/src/main/java/com/ozs/web/controller/pm/PmContractInfoController.java
  12. 50 7
      purchase-admin/src/main/java/com/ozs/web/controller/pm/PmDemandController.java
  13. 53 3
      purchase-admin/src/main/java/com/ozs/web/controller/pm/PmProjectConstructionController.java
  14. 411 32
      purchase-admin/src/main/java/com/ozs/web/controller/pm/PmPurchaseExecutionController.java
  15. 10 0
      purchase-admin/src/main/java/com/ozs/web/controller/pm/PmTaskReleaseController.java
  16. 269 0
      purchase-admin/src/main/java/com/ozs/web/controller/statisticalAnalysis/StatisticalAnalysisController.java
  17. 94 0
      purchase-admin/src/main/java/com/ozs/web/controller/system/SysRegionController.java
  18. 16 3
      purchase-admin/src/main/java/com/ozs/web/controller/system/SysUserController.java
  19. 85 0
      purchase-admin/src/main/java/com/ozs/web/controller/tool/PmTaskServer.java
  20. 16 0
      purchase-admin/src/main/java/com/ozs/web/controller/tool/TestTaskServer.java
  21. 1 1
      purchase-admin/src/main/resources/application-test.yml
  22. 2 2
      purchase-admin/src/main/resources/logback.xml
  23. 8 0
      purchase-common/src/main/java/com/ozs/common/constant/Constants.java
  24. 24 0
      purchase-common/src/main/java/com/ozs/common/constant/ModularConstans.java
  25. 13 0
      purchase-common/src/main/java/com/ozs/common/core/domain/entity/SysUser.java
  26. 28 0
      purchase-common/src/main/java/com/ozs/common/enums/BidWinningStatus.java
  27. 59 0
      purchase-common/src/main/java/com/ozs/common/enums/ExpertType.java
  28. 59 0
      purchase-common/src/main/java/com/ozs/common/enums/MajorType.java
  29. 27 0
      purchase-common/src/main/java/com/ozs/common/enums/NameListType.java
  30. 59 0
      purchase-common/src/main/java/com/ozs/common/enums/PurchaseType.java
  31. 35 0
      purchase-common/src/main/java/com/ozs/common/enums/QuarterEnum.java
  32. 11 7
      purchase-common/src/main/java/com/ozs/common/enums/SysFileRefEnum.java
  33. 30 0
      purchase-common/src/main/java/com/ozs/common/enums/SysRoleKey.java
  34. 29 0
      purchase-common/src/main/java/com/ozs/common/utils/RandomUtil.java
  35. 12 6
      purchase-common/src/main/java/com/ozs/common/utils/file/FileUtils.java
  36. 17 32
      purchase-framework/src/main/java/com/ozs/framework/web/service/SysLoginService.java
  37. 42 4
      purchase-system/src/main/java/com/ozs/base/domain/BaseExpert.java
  38. 4 0
      purchase-system/src/main/java/com/ozs/base/domain/BasePolicy.java
  39. 1 1
      purchase-system/src/main/java/com/ozs/base/domain/BaseSupplier.java
  40. 68 4
      purchase-system/src/main/java/com/ozs/base/domain/vo/BaseExpertVo.java
  41. 2 0
      purchase-system/src/main/java/com/ozs/base/mapper/BaseProfessionalMapper.java
  42. 6 0
      purchase-system/src/main/java/com/ozs/base/service/BaseExpertService.java
  43. 121 4
      purchase-system/src/main/java/com/ozs/base/service/impl/BaseExpertServiceImpl.java
  44. 31 1
      purchase-system/src/main/java/com/ozs/base/service/impl/BaseProfessionalServiceImpl.java
  45. 133 0
      purchase-system/src/main/java/com/ozs/home/domain/vo/HomeToDoQueryResVo.java
  46. 5 0
      purchase-system/src/main/java/com/ozs/plan/doman/MonthlyReconciliation.java
  47. 8 16
      purchase-system/src/main/java/com/ozs/plan/doman/PlanQuarter.java
  48. 8 15
      purchase-system/src/main/java/com/ozs/plan/doman/PlanYears.java
  49. 14 5
      purchase-system/src/main/java/com/ozs/plan/doman/vo/requestVo/PlanQuarterStandardVo.java
  50. 15 5
      purchase-system/src/main/java/com/ozs/plan/doman/vo/requestVo/PlanYearsStandardVo.java
  51. 5 0
      purchase-system/src/main/java/com/ozs/plan/doman/vo/requestVo/ProvisionalPlanVo.java
  52. 32 14
      purchase-system/src/main/java/com/ozs/plan/doman/vo/responseVo/PlanQuarterResponseVo.java
  53. 35 18
      purchase-system/src/main/java/com/ozs/plan/doman/vo/responseVo/PlanYearsResponseVo.java
  54. 10 1
      purchase-system/src/main/java/com/ozs/plan/mapper/PlanQuarterMapper.java
  55. 3 2
      purchase-system/src/main/java/com/ozs/plan/mapper/PlanYearsMapper.java
  56. 9 1
      purchase-system/src/main/java/com/ozs/plan/mapper/ProvisionalPlanMapper.java
  57. 6 20
      purchase-system/src/main/java/com/ozs/plan/service/PlanQuarterService.java
  58. 57 18
      purchase-system/src/main/java/com/ozs/plan/service/PlanYearsService.java
  59. 2 2
      purchase-system/src/main/java/com/ozs/plan/service/ProvisionalPlanService.java
  60. 180 125
      purchase-system/src/main/java/com/ozs/plan/service/impl/PlanQuarterServiceImpl.java
  61. 572 74
      purchase-system/src/main/java/com/ozs/plan/service/impl/PlanYearsServiceImpl.java
  62. 53 6
      purchase-system/src/main/java/com/ozs/plan/service/impl/ProvisionalPlanServiceImpl.java
  63. 5 1
      purchase-system/src/main/java/com/ozs/pm/doman/PmBidOpening.java
  64. 3 5
      purchase-system/src/main/java/com/ozs/pm/doman/PmBidWinning.java
  65. 73 0
      purchase-system/src/main/java/com/ozs/pm/doman/PmBidWinningOpeningRef.java
  66. 15 20
      purchase-system/src/main/java/com/ozs/pm/doman/PmContractUnitRef.java
  67. 5 5
      purchase-system/src/main/java/com/ozs/pm/doman/PmContractInfo.java
  68. 95 47
      purchase-system/src/main/java/com/ozs/pm/doman/PmDemand.java
  69. 0 118
      purchase-system/src/main/java/com/ozs/pm/doman/PmDemandEngineering.java
  70. 0 77
      purchase-system/src/main/java/com/ozs/pm/doman/PmDemandEquip.java
  71. 73 0
      purchase-system/src/main/java/com/ozs/pm/doman/PmDemandExpertRef.java
  72. 0 101
      purchase-system/src/main/java/com/ozs/pm/doman/PmDemandMaterials.java
  73. 0 74
      purchase-system/src/main/java/com/ozs/pm/doman/PmDemandServe.java
  74. 57 23
      purchase-system/src/main/java/com/ozs/pm/doman/PmFlowChart.java
  75. 1 1
      purchase-system/src/main/java/com/ozs/pm/doman/PmReleaseAnnouncement.java
  76. 60 0
      purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/PmBaseExpertExtractReqVo.java
  77. 43 0
      purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/PmBaseExpertFillReqVo.java
  78. 60 0
      purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/PmBidFailureReqVo.java
  79. 42 0
      purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/PmBidOpeningFillReqVo.java
  80. 72 0
      purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/PmBidWinningReqVo.java
  81. 43 23
      purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/PmBookBuildingReqVo.java
  82. 54 0
      purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/PmCallQuestionReqVo.java
  83. 73 0
      purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/PmContractInfoReqVo.java
  84. 0 171
      purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/PmDemandEngineeringReqVo.java
  85. 0 102
      purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/PmDemandEquipReqVo.java
  86. 0 125
      purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/PmDemandMaterialsReqVo.java
  87. 13 0
      purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/PmDemandReqVo.java
  88. 0 105
      purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/PmDemandServeReqVo.java
  89. 67 0
      purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/PmProjectConstructionReqVo.java
  90. 6 6
      purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/PmReleaseAnnouncementReqVo.java
  91. 20 0
      purchase-system/src/main/java/com/ozs/pm/doman/vo/responseVo/PmBaseExpertResVo.java
  92. 60 0
      purchase-system/src/main/java/com/ozs/pm/doman/vo/responseVo/PmBidFailureResVo.java
  93. 20 0
      purchase-system/src/main/java/com/ozs/pm/doman/vo/responseVo/PmBidOpeningResVo.java
  94. 69 0
      purchase-system/src/main/java/com/ozs/pm/doman/vo/responseVo/PmBidWinningResVo.java
  95. 67 0
      purchase-system/src/main/java/com/ozs/pm/doman/vo/responseVo/PmBookBuildingResVo.java
  96. 74 0
      purchase-system/src/main/java/com/ozs/pm/doman/vo/responseVo/PmContractInfoResVo.java
  97. 0 170
      purchase-system/src/main/java/com/ozs/pm/doman/vo/responseVo/PmDemandEngineeringResVo.java
  98. 0 101
      purchase-system/src/main/java/com/ozs/pm/doman/vo/responseVo/PmDemandEquipResVo.java
  99. 0 124
      purchase-system/src/main/java/com/ozs/pm/doman/vo/responseVo/PmDemandMaterialsResVo.java
  100. 0 0
      purchase-system/src/main/java/com/ozs/pm/doman/vo/responseVo/PmDemandResVo.java

+ 1 - 10
purchase-admin/src/main/java/com/ozs/PurchaseApplication.java

@@ -16,15 +16,6 @@ public class PurchaseApplication
     {
         // System.setProperty("spring.devtools.restart.enabled", "false");
         SpringApplication.run(PurchaseApplication.class, args);
-        System.out.println("(♥◠‿◠)ノ゙  采购管理信息系统启动成功   ლ(´ڡ`ლ)゙  \n" +
-                " .-------.       ____     __        \n" +
-                " |  _ _   \\      \\   \\   /  /    \n" +
-                " | ( ' )  |       \\  _. /  '       \n" +
-                " |(_ o _) /        _( )_ .'         \n" +
-                " | (_,_).' __  ___(_ o _)'          \n" +
-                " |  |\\ \\  |  ||   |(_,_)'         \n" +
-                " |  | \\ `'   /|   `-'  /           \n" +
-                " |  |  \\    /  \\      /           \n" +
-                " ''-'   `'-'    `-..-'              ");
+        System.out.println("(♥◠‿◠)ノ゙  采购管理信息系统启动成功   ლ(´ڡ`ლ)゙");
     }
 }

+ 51 - 2
purchase-admin/src/main/java/com/ozs/web/controller/base/BaseExpertController.java

@@ -5,13 +5,17 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ozs.base.domain.BaseExpert;
 import com.ozs.base.domain.vo.BaseExpertVo;
+import com.ozs.base.domain.vo.BaseProfessionalVo;
 import com.ozs.base.service.BaseExpertService;
 import com.ozs.common.annotation.Log;
 import com.ozs.common.constant.ModularConstans;
 import com.ozs.common.core.controller.BaseController;
 import com.ozs.common.core.domain.AjaxResult;
 import com.ozs.common.enums.BusinessType;
+import com.ozs.common.utils.PageUtils;
 import com.ozs.common.utils.StringUtils;
+import com.ozs.common.utils.bean.BeanUtils;
+import com.ozs.system.service.SysRegionService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.joda.time.DateTime;
@@ -24,6 +28,8 @@ 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;
 
 /**
  * 专家库管理
@@ -37,6 +43,8 @@ public class BaseExpertController extends BaseController {
 
     @Autowired
     private BaseExpertService baseExpertService;
+    @Autowired
+    private SysRegionService sysRegionService;
 
     @ApiOperation(value = "新增专家库", notes = "必传 专家库名称")
     @PostMapping("/insertExpert")
@@ -46,6 +54,10 @@ public class BaseExpertController extends BaseController {
         if (StringUtils.isNull(baseExpert) || StringUtils.isNull(baseExpert.getExpertName())) {
             return error("专家库名称不能为空");
         }
+        baseExpert.setCreated(getUserId().toString());
+        baseExpert.setCreateTime(new Date());
+        baseExpert.setUpdated(baseExpert.getCreated());
+        baseExpert.setUpdateTime(baseExpert.getCreateTime());
         return toAjax(baseExpertService.insertExpert(baseExpert));
     }
 
@@ -64,6 +76,9 @@ public class BaseExpertController extends BaseController {
         if (StringUtils.isNull(baseExpert) || StringUtils.isNull(baseExpert.getId())) {
             return error("专家库id和修改数据不能为空");
         }
+
+        baseExpert.setUpdated(getUserId().toString());
+        baseExpert.setUpdateTime(new Date());
         return toAjax(baseExpertService.updateById(baseExpert));
     }
 
@@ -80,8 +95,19 @@ public class BaseExpertController extends BaseController {
         if (!ObjectUtils.isEmpty(baseExpertVo.getMajorGrade())) {
             lw.eq(BaseExpert::getMajorGrade, baseExpertVo.getMajorGrade());
         }
-        IPage<BaseExpert> page = baseExpertService.page(new Page<BaseExpert>(baseExpertVo.getPageNum(), baseExpertVo.getPageSize()), lw);
-        return success(page);
+        List<BaseExpert> list = baseExpertService.list(lw);
+        // IPage<BaseExpert> page = baseExpertService.page(new Page<BaseExpert>(baseExpertVo.getPageNum(), baseExpertVo.getPageSize()), lw);
+        // List<BaseExpert> records = page.getRecords();
+        // 把 localArea 翻译为 省/市/县,存localAreaName中,(使用SysRegionService的getParentAdministrativeDivisionNames方法)
+        List<BaseExpertVo> listVo = BeanUtils.entityListToVOList(list, BaseExpertVo.class);
+        for (BaseExpertVo vo : listVo) {
+            if (StringUtils.isNotNull(vo.getLocalArea())) {
+                String parentAdministrativeDivisionNames = sysRegionService.getParentAdministrativeDivisionNames(vo.getLocalArea());
+                vo.setLocalAreaName(parentAdministrativeDivisionNames);
+            }
+        }
+        Page pages = PageUtils.getPages(baseExpertVo.getPageNum().intValue(), baseExpertVo.getPageSize().intValue(), listVo);
+        return success(pages);
     }
 
     @ApiOperation(value = "黑白名单开关", notes = "必传id,status 其他字段不传; 黑名单传0,白名单传1")
@@ -100,4 +126,27 @@ public class BaseExpertController extends BaseController {
 //        }
         return toAjax(baseExpertService.updateSupplierType(baseExpert));
     }
+
+    @ApiOperation(value = "评审项目", notes = "必传:分页,专家ID")
+    @PostMapping("/selectReviewProject")
+    public AjaxResult selectReviewProject(@RequestBody BaseExpertVo baseExpertVo) {
+        if (StringUtils.isNull(baseExpertVo)
+                || StringUtils.isNull(baseExpertVo.getPageNum())
+                || StringUtils.isNull(baseExpertVo.getPageSize())
+                || StringUtils.isNull(baseExpertVo.getId())) {
+            return error("专家ID、分页 不能为空");
+        }
+        return baseExpertService.selectReviewProject(baseExpertVo);
+    }
+
+    @ApiOperation(value = "抽取专家", notes = "必传:分页;非必传:专家名称,开始结束时间")
+    @PostMapping("/selectExtractionExpert")
+    public AjaxResult selectExtractionExpert(@RequestBody BaseExpertVo baseExpertVo) {
+        if (StringUtils.isNull(baseExpertVo)
+                || StringUtils.isNull(baseExpertVo.getPageNum())
+                || StringUtils.isNull(baseExpertVo.getPageSize())) {
+            return error("分页 不能为空");
+        }
+        return baseExpertService.selectExtractionExpert(baseExpertVo);
+    }
 }

+ 42 - 9
purchase-admin/src/main/java/com/ozs/web/controller/base/BasePolicyController.java

@@ -58,9 +58,9 @@ public class BasePolicyController extends BaseController {
     @PreAuthorize("@ss.hasPermi('base:policy:list')")
     @Log(title = ModularConstans.policy, businessType = BusinessType.QUERY)
     public AjaxResult page(@NotEmpty(message = "数据为空")
-                               @RequestBody BasePolicyPageReqVo vo) {
+                           @RequestBody BasePolicyPageReqVo vo) {
         LambdaQueryWrapper<BasePolicy> lw = new LambdaQueryWrapper<>();
-        if(!StringUtils.isBlank(vo.getName())){
+        if (!StringUtils.isBlank(vo.getName())) {
             List<EsMessage> maps = null;
             try {
                 maps = FileUtils.eSearch(vo.getName());
@@ -69,13 +69,18 @@ public class BasePolicyController extends BaseController {
             }
             List<String> ids = maps.stream().map(EsMessage::getId).collect(Collectors.toList());
 //            lw.like(BasePolicy::getName,vo.getName());
-            lw.in(BasePolicy::getEsId,ids);
+            if(!ObjectUtils.isEmpty(ids)){
+                lw.in(BasePolicy::getEsId, ids);
+            }else {
+                lw.like(BasePolicy::getName, vo.getName());
+            }
+
         }
-        if(!ObjectUtils.isEmpty(vo.getStartTime())){
-            lw.ge(BasePolicy::getReleaseTime,vo.getStartTime());
+        if (!ObjectUtils.isEmpty(vo.getStartTime())) {
+            lw.ge(BasePolicy::getReleaseTime, vo.getStartTime());
         }
-        if(!ObjectUtils.isEmpty(vo.getStartTime())){
-            lw.le(BasePolicy::getReleaseTime,vo.getEntTime());
+        if (!ObjectUtils.isEmpty(vo.getStartTime())) {
+            lw.le(BasePolicy::getReleaseTime, vo.getEntTime());
         }
         IPage<BasePolicy> page = basePolicyService.page(new Page<>(vo.getPageNum(), vo.getPageSize()), lw);
         return success(page);
@@ -94,7 +99,8 @@ public class BasePolicyController extends BaseController {
             String filePath = PurchaseConfig.getUploadPath();
             // 上传并返回新文件名称
             String upload = FileUploadUtils.upload(filePath, file);
-            FileUtils.uploadESFile(upload,esId);
+            String filePathStr = filePath + upload.substring("/profile/upload".length(),upload.length());
+            FileUtils.uploadESFile(filePathStr, esId);
             AjaxResult ajax = AjaxResult.success();
             String url = serverConfig.getUrl() + upload;
             ajax.put("url", url);
@@ -113,14 +119,33 @@ public class BasePolicyController extends BaseController {
     @PreAuthorize("@ss.hasPermi('base:policy:add')")
     @Log(title = ModularConstans.policy, businessType = BusinessType.INSERT)
     public AjaxResult insert(@NotEmpty(message = "数据为空")
-                                 @RequestBody BasePolicy vo) {
+                             @RequestBody BasePolicy vo) {
         vo.setCreated(getUserId().toString());
         vo.setCreateTime(new Date());
         vo.setUpdated(vo.getCreated());
         vo.setUpdateTime(vo.getCreateTime());
+        vo.setState("1");
         return toAjax(basePolicyService.save(vo));
     }
 
+    @ApiOperation(value = "在用")
+    @PostMapping("/statusUse")
+    @PreAuthorize("@ss.hasPermi('base:policy:update')")
+    @Log(title = ModularConstans.policy, businessType = BusinessType.INSERT)
+    public AjaxResult statusUse(@NotEmpty(message = "数据为空") @RequestBody BasePolicy vo) {
+        vo.setState("1");
+        return toAjax(basePolicyService.updateById(vo));
+    }
+
+    @ApiOperation(value = "止用")
+    @PostMapping("/statusNonUse")
+    @PreAuthorize("@ss.hasPermi('base:policy:update')")
+    @Log(title = ModularConstans.policy, businessType = BusinessType.INSERT)
+    public AjaxResult statusNonUse(@NotEmpty(message = "数据为空") @RequestBody BasePolicy vo) {
+        vo.setState("0");
+        return toAjax(basePolicyService.updateById(vo));
+    }
+
     @ApiOperation(value = "删除政策法规")
     @PostMapping("/remove")
     @PreAuthorize("@ss.hasPermi('base:policy:remove')")
@@ -140,4 +165,12 @@ public class BasePolicyController extends BaseController {
         return success(basePolicyService.getById(id));
     }
 
+    public static void main(String[] args) {
+        String  filePath ="/home/purchase/uploadPath/upload";
+
+        String  upload = "/profile/upload/2023/02/14/bookinfo应用_20230214124044A001.pdf";
+        String filePathStr = filePath + upload.substring("/profile/upload".length(),upload.length());
+        System.out.println(filePathStr);
+        System.out.println(upload.indexOf("/profile/upload"));
+    }
 }

+ 37 - 6
purchase-admin/src/main/java/com/ozs/web/controller/home/HomeNoticeController.java

@@ -12,7 +12,11 @@ import com.ozs.common.utils.StringUtils;
 import com.ozs.home.domain.HomeNotice;
 import com.ozs.home.domain.vo.HomeNoticeVo;
 import com.ozs.home.service.HomeNoticeService;
+import com.ozs.plan.doman.PlanYears;
+import com.ozs.plan.doman.vo.requestVo.PlanYearsStandardVo;
+import com.ozs.plan.service.PlanYearsService;
 import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.util.ObjectUtils;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -21,6 +25,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 首页公告控制层
@@ -30,9 +36,11 @@ import javax.annotation.Resource;
 @RestController
 @RequestMapping("/home/homeNotice")
 public class HomeNoticeController extends BaseController {
-    
+
     @Resource
-    private  HomeNoticeService homeNoticeService;
+    private HomeNoticeService homeNoticeService;
+    @Autowired
+    private PlanYearsService planYearsService;
 
     @ApiOperation(value = "查询首页公告")
     @PostMapping("/selectHomeNotice")
@@ -49,13 +57,36 @@ public class HomeNoticeController extends BaseController {
         if (!StringUtils.isBlank(homeNoticeVo.getHomepageClassification())) {
             lw.eq(HomeNotice::getHomepageClassification, homeNoticeVo.getHomepageClassification());
         }
-        if(!ObjectUtils.isEmpty(homeNoticeVo.getNoticeTime())){
-            lw.ge(HomeNotice::getNoticeTime,homeNoticeVo.getNoticeTime());
+        if (!ObjectUtils.isEmpty(homeNoticeVo.getNoticeTime())) {
+            lw.ge(HomeNotice::getNoticeTime, homeNoticeVo.getNoticeTime());
         }
-        if(!ObjectUtils.isEmpty(homeNoticeVo.getNoticeTime())){
-            lw.le(HomeNotice::getNoticeTime,homeNoticeVo.getNoticeTime());
+        if (!ObjectUtils.isEmpty(homeNoticeVo.getNoticeTime())) {
+            lw.le(HomeNotice::getNoticeTime, homeNoticeVo.getNoticeTime());
         }
         IPage<HomeNotice> page = homeNoticeService.page(new Page<HomeNotice>(homeNoticeVo.getPageNum(), homeNoticeVo.getPageSize()), lw);
         return success(page);
     }
+
+    @ApiOperation(value = "搜索项目列表")
+    @PostMapping("/listPlanYears")
+    public AjaxResult listPlanYears(@RequestBody PlanYearsStandardVo yearsStandardVo) {
+        if (StringUtils.isNull(yearsStandardVo.getProjectName())) {
+            return error("查询项目名称不能为空!");
+        }
+        LambdaQueryWrapper<PlanYears> lw = new LambdaQueryWrapper<PlanYears>();
+        if (!StringUtils.isBlank(yearsStandardVo.getProjectName())) {
+            lw.like(PlanYears::getProjectName, "%" + yearsStandardVo.getProjectName() + "%");
+        }
+        List<PlanYears> list = planYearsService.list(lw);
+        return AjaxResult.success(list);
+    }
+
+    @ApiOperation(value = "搜索项目--选择项目查看详情")
+    @PostMapping("/projectDetails")
+    public AjaxResult projectDetails(@RequestBody PlanYearsStandardVo yearsStandardVo) {
+        if (StringUtils.isNull(yearsStandardVo.getPlanYearId())) {
+            return error("查询年度ID不能为空!");
+        }
+        return planYearsService.projectDetails(yearsStandardVo);
+    }
 }

+ 3 - 4
purchase-admin/src/main/java/com/ozs/web/controller/home/HomeNotificationMessageController.java

@@ -61,14 +61,13 @@ public class HomeNotificationMessageController extends BaseController {
 //    @PreAuthorize("@ss.hasPermi('home:homeNotificationMessage:saveReasonsForLag')")
     @Log(title = ModularConstans.notice, businessType = BusinessType.UPDATE)
     public AjaxResult saveReasonsForLag(@RequestBody ReasonsForLagVo reasonsForLagVo) {
-        HomeNotificationMessage homeNotificationMessage = homeNotificationMessageService.getById(reasonsForLagVo.getHomeNotificationMessageId());
-        homeNotificationMessage.setState(0);
+
         QueryWrapper<PmDemand> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("demand_id", homeNotificationMessage.getDemandId());
+        queryWrapper.eq("demand_id", reasonsForLagVo.getHomeNotificationMessageId());
         PmDemand pmDemand = pmDemandMapper.selectOne(queryWrapper);
         pmDemand.setDelayReason(reasonsForLagVo.getDelayReason());
         pmDemand.setAdjustAdvice(reasonsForLagVo.getAdjustAdvice());
-        if (pmDemandMapper.updateById(pmDemand) > 0 && homeNotificationMessageService.updateById(homeNotificationMessage)) {
+        if (pmDemandMapper.updateById(pmDemand) > 0) {
             return success();
         } else {
             return error();

+ 142 - 1
purchase-admin/src/main/java/com/ozs/web/controller/home/SystemHomepageController.java

@@ -1,14 +1,21 @@
 package com.ozs.web.controller.home;
 
+import com.ozs.common.annotation.Log;
+import com.ozs.common.constant.ModularConstans;
 import com.ozs.common.core.controller.BaseController;
 import com.ozs.common.core.domain.AjaxResult;
+import com.ozs.common.enums.BusinessType;
+import com.ozs.plan.doman.vo.responseVo.PlanQuarterResponseVo;
 import com.ozs.plan.service.PlanYearsService;
+import com.ozs.pm.doman.vo.responseVo.PmDemandResVo;
+import com.ozs.pm.service.IPmDemandService;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import java.util.List;
 
 
 /**
@@ -21,6 +28,8 @@ import javax.annotation.Resource;
 public class SystemHomepageController extends BaseController {
     @Resource
     private PlanYearsService planYearsService;
+    @Resource
+    private IPmDemandService pmDemandService;
 
     @ApiOperation(value = "需求单位首页计划管理总数")
     @GetMapping("/demandUnit/planManagement/total")
@@ -81,5 +90,137 @@ public class SystemHomepageController extends BaseController {
     public AjaxResult procurementOfficeFailureToWinTheBidTotal() {
         return planYearsService.procurementOfficeFailureToWinTheBidTotal();
     }
-    
+
+    @ApiOperation(value = "需求单位首页待办事项(全部)")
+    @GetMapping("/demandUnit/will/total")
+    @Log(title = ModularConstans.systemHome, businessType = BusinessType.QUERY)
+    public AjaxResult demandUnitWillManipulateTotal() {
+        return planYearsService.demandUnitWillManipulateTotal();
+    }
+
+    @ApiOperation(value = "需求单位首页待办事项(计划待提交)")
+    @GetMapping("/demandUnit/will/planWaitCommit")
+    @Log(title = ModularConstans.systemHome, businessType = BusinessType.QUERY)
+    public AjaxResult planWaitCommit() {
+        List<PlanQuarterResponseVo> vos = planYearsService.planWaitCommit();
+        return AjaxResult.success(vos);
+    }
+
+    @ApiOperation(value = "需求单位首页待办事项(需求待提交)")
+    @GetMapping("/demandUnit/will/demandWaitCommit")
+    @Log(title = ModularConstans.systemHome, businessType = BusinessType.QUERY)
+    public AjaxResult demandUnit() {
+        List<PmDemandResVo> resVos = pmDemandService.demandWaitCommit();
+        return AjaxResult.success(resVos);
+    }
+
+    @ApiOperation(value = "需求单位首页待办事项(合同待填制)")
+    @GetMapping("/demandUnit/will/contractWaitFilled")
+    @Log(title = ModularConstans.systemHome, businessType = BusinessType.QUERY)
+    public AjaxResult contractWaitFilled() {
+        List<PmDemandResVo> resVos = pmDemandService.contractWaitFilled();
+        return AjaxResult.success(resVos);
+    }
+
+    @ApiOperation(value = "需求单位首页待办事项(项目建设待完成)")
+    @GetMapping("/demandUnit/will/projectWaitFinish")
+    @Log(title = ModularConstans.systemHome, businessType = BusinessType.QUERY)
+    public AjaxResult projectWaitFinish() {
+        List<PmDemandResVo> resVos = pmDemandService.projectWaitFinish();
+        return AjaxResult.success(resVos);
+    }
+
+    @ApiOperation(value = "采购管理部门首页待办事项(全部)")
+    @GetMapping("/purchasingManagement/will/total")
+    @Log(title = ModularConstans.systemHome, businessType = BusinessType.QUERY)
+    public AjaxResult purchasingManagementWillManipulateTotal() {
+        return planYearsService.purchasingManagementWillManipulateTotal();
+    }
+
+    @ApiOperation(value = "采购管理部门首页待办事项(计划待审核)")
+    @GetMapping("/purchasingManagement/will/planWaitExamine")
+    @Log(title = ModularConstans.systemHome, businessType = BusinessType.QUERY)
+    public AjaxResult planWaitExamine() {
+        List<PlanQuarterResponseVo> resVos = planYearsService.planWaitExamine();
+        return AjaxResult.success(resVos);
+    }
+
+    @ApiOperation(value = "采购管理部门首页待办事项(需求待审核)")
+    @GetMapping("/purchasingManagement/will/demandWaitExamine")
+    @Log(title = ModularConstans.systemHome, businessType = BusinessType.QUERY)
+    public AjaxResult demandWaitExamine() {
+        List<PmDemandResVo> resVos = pmDemandService.demandWaitExamine();
+        return AjaxResult.success(resVos);
+    }
+
+    @ApiOperation(value = "采购管理部门首页待办事项(任务待下达)")
+    @GetMapping("/purchasingManagement/will/taskWaitRelease")
+    @Log(title = ModularConstans.systemHome, businessType = BusinessType.QUERY)
+    public AjaxResult taskWaitRelease() {
+        List<PmDemandResVo> resVos = pmDemandService.taskWaitRelease();
+        return AjaxResult.success(resVos);
+    }
+
+    @ApiOperation(value = "采购办首页待办事项(全部)")
+    @GetMapping("/procurementOffice/will/total")
+    @Log(title = ModularConstans.systemHome, businessType = BusinessType.QUERY)
+    public AjaxResult procurementOfficeWillManipulateTotal() {
+        return pmDemandService.procurementOfficeWillManipulateTotal();
+    }
+
+    @ApiOperation(value = "采购办首页待办事项(待选取代理)")
+    @GetMapping("/procurementOffice/will/waitSelectAgent")
+    @Log(title = ModularConstans.systemHome, businessType = BusinessType.QUERY)
+    public AjaxResult waitSelectAgent() {
+        List<PmDemandResVo> resVos = pmDemandService.waitSelectAgent();
+        return AjaxResult.success(resVos);
+    }
+
+    @ApiOperation(value = "采购办首页待办事项(待上传招标文件)")
+    @GetMapping("/procurementOffice/will/waitUpBidFile")
+    @Log(title = ModularConstans.systemHome, businessType = BusinessType.QUERY)
+    public AjaxResult waitUpBidFile() {
+        List<PmDemandResVo> resVos = pmDemandService.waitUpBidFile();
+        return AjaxResult.success(resVos);
+    }
+
+    @ApiOperation(value = "采购办首页待办事项(待发布公告)")
+    @GetMapping("/procurementOffice/will/waitAnnouncement")
+    @Log(title = ModularConstans.systemHome, businessType = BusinessType.QUERY)
+    public AjaxResult waitAnnouncement() {
+        List<PmDemandResVo> resVos = pmDemandService.waitAnnouncement();
+        return AjaxResult.success(resVos);
+    }
+
+    @ApiOperation(value = "采购办首页待办事项(待开标)")
+    @GetMapping("/procurementOffice/will/waitOpenBid")
+    @Log(title = ModularConstans.systemHome, businessType = BusinessType.QUERY)
+    public AjaxResult waitOpenBid() {
+        List<PmDemandResVo> resVos = pmDemandService.waitOpenBid();
+        return AjaxResult.success(resVos);
+    }
+
+    @ApiOperation(value = "采购办首页待办事项(待发布中标公告)")
+    @GetMapping("/procurementOffice/will/waitBidAnnouncement")
+    @Log(title = ModularConstans.systemHome, businessType = BusinessType.QUERY)
+    public AjaxResult waitBidAnnouncement() {
+        List<PmDemandResVo> resVos = pmDemandService.waitBidAnnouncement();
+        return AjaxResult.success(resVos);
+    }
+
+    @ApiOperation(value = "采购办首页待办事项(中标公示中)")
+    @GetMapping("/procurementOffice/will/biddingPublicity")
+    @Log(title = ModularConstans.systemHome, businessType = BusinessType.QUERY)
+    public AjaxResult biddingPublicity() {
+        List<PmDemandResVo> resVos = pmDemandService.biddingPublicity();
+        return AjaxResult.success(resVos);
+    }
+
+    @ApiOperation(value = "采购办首页待办事项(发函催告)")
+    @GetMapping("/procurementOffice/will/sendLetter")
+    @Log(title = ModularConstans.systemHome, businessType = BusinessType.QUERY)
+    public AjaxResult willSendLetter() {
+        List<PlanQuarterResponseVo> vos = planYearsService.willSendLetter();
+        return AjaxResult.success(vos);
+    }
 }

+ 49 - 7
purchase-admin/src/main/java/com/ozs/web/controller/plan/MonthlyReconciliationController.java

@@ -9,7 +9,9 @@ import com.ozs.common.constant.Constants;
 import com.ozs.common.constant.ModularConstans;
 import com.ozs.common.core.controller.BaseController;
 import com.ozs.common.core.domain.AjaxResult;
+import com.ozs.common.core.domain.entity.SysDept;
 import com.ozs.common.core.domain.entity.SysDictData;
+import com.ozs.common.core.domain.entity.SysRole;
 import com.ozs.common.enums.BusinessType;
 import com.ozs.common.enums.SysFileRefEnum;
 import com.ozs.plan.doman.MonthlyReconciliation;
@@ -31,6 +33,7 @@ import org.springframework.util.ObjectUtils;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.constraints.NotEmpty;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -69,14 +72,53 @@ public class MonthlyReconciliationController extends BaseController {
         if (!StringUtils.isBlank(vo.getPurchaseServices())) {
             lw.eq(MonthlyReconciliation::getPurchaseServices, vo.getPurchaseServices());
         }
-        if(!ObjectUtils.isEmpty(vo.getStartTime())){
-            lw.ge(MonthlyReconciliation::getPlanDemandSubTime,vo.getStartTime());
+        if (!ObjectUtils.isEmpty(vo.getStartTime())) {
+            lw.ge(MonthlyReconciliation::getPlanDemandSubTime, vo.getStartTime());
         }
-        if(!ObjectUtils.isEmpty(vo.getStartTime())){
-            lw.le(MonthlyReconciliation::getPlanDemandSubTime,vo.getEntTime());
+        if (!ObjectUtils.isEmpty(vo.getStartTime())) {
+            lw.le(MonthlyReconciliation::getPlanDemandSubTime, vo.getEntTime());
         }
+
+        // 添加数据权限
+        List<String> roleKeys = getLoginUser().getUser().getRoles().stream().map(SysRole::getRoleKey).collect(Collectors.toList());
+        if (roleKeys.contains(Constants.DEMAND_UNIT)) {
+            // 需求单位
+            /*(purchase_dept_id = 当前用户deptID) */
+            lw.eq(MonthlyReconciliation::getPurchaseDeptId, getDeptId());
+        } else if (roleKeys.contains(Constants.PURCHASING_MANAGEMENT)
+                || roleKeys.contains(Constants.PURCHASE_SERVICES)) {
+            // 采购管理部门  或  采购办
+            /*  (purchase_dept_id = 当前用户deptID  AND  is_excess = 0)
+                OR
+                (purchase_dept_id IN (当前用户 子deptId 集合) and AND  is_excess = 1)
+             */
+            SysDept sysDept = new SysDept();
+            sysDept.setParentId(getDeptId());
+            sysDept.setStatus("0");
+            List<Long> childDeptIds = iSysDeptService.selectDeptList(sysDept)
+                    .stream()
+                    .map(SysDept::getDeptId)
+                    .collect(Collectors.toList());
+            if(ObjectUtils.isEmpty(childDeptIds)){
+                lw.and((wrapper) -> {
+                    wrapper.eq(MonthlyReconciliation::getIsExcess, 0);
+                    wrapper.eq(MonthlyReconciliation::getPurchaseDeptId, getDeptId());
+                });
+            }else {
+                lw.and((wrapper) -> {
+                    wrapper.eq(MonthlyReconciliation::getIsExcess, 0);
+                    wrapper.eq(MonthlyReconciliation::getPurchaseDeptId, getDeptId());
+                })
+                        .or((wrapper) -> {
+                            wrapper.eq(MonthlyReconciliation::getIsExcess, 1);
+                            wrapper.in(MonthlyReconciliation::getPurchaseDeptId, childDeptIds);
+                        });
+            }
+        }
+
+        // 分页查询
         IPage<MonthlyReconciliation> page = monthlyReconciliationService.page(new Page<>(vo.getPageNum(), vo.getPageSize()), lw);
-        if (!ObjectUtils.isEmpty(page.getRecords())) {
+        if (!ObjectUtils.isEmpty(page.getRecords()) && page.getRecords().size() > 0) {
             page.setRecords(page.getRecords().stream().map(dto -> {
                 // 采购单位名称
                 Map<String, Object> stringObjectMap = iSysDeptService.selectDeptById(dto.getPurchaseDeptId());
@@ -89,7 +131,7 @@ public class MonthlyReconciliationController extends BaseController {
                 if (!ObjectUtils.isEmpty(data)) {
                     List<SysDictData> collect = data.stream()
                             .filter(d -> d.getDictValue().equals(dto.getPurchaseServices())).collect(Collectors.toList());
-                    if(!ObjectUtils.isEmpty(collect)){
+                    if (!ObjectUtils.isEmpty(collect)) {
                         dto.setPurchaseServicesName(collect.get(0).getDictLabel());
                     }
                 }
@@ -131,7 +173,7 @@ public class MonthlyReconciliationController extends BaseController {
             if (!ObjectUtils.isEmpty(data)) {
                 List<SysDictData> collect = data.stream()
                         .filter(d -> d.getDictValue().equals(vo.getPurchaseServices())).collect(Collectors.toList());
-                if(!ObjectUtils.isEmpty(collect)){
+                if (!ObjectUtils.isEmpty(collect)) {
                     vo.setPurchaseServicesName(collect.get(0).getDictLabel());
                 }
             }

+ 203 - 11
purchase-admin/src/main/java/com/ozs/web/controller/plan/PlanQuarterController.java

@@ -1,17 +1,31 @@
 package com.ozs.web.controller.plan;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.github.pagehelper.PageInfo;
+import com.ozs.common.annotation.Log;
+import com.ozs.common.constant.Constants;
+import com.ozs.common.constant.ModularConstans;
 import com.ozs.common.core.controller.BaseController;
 import com.ozs.common.core.domain.AjaxResult;
+import com.ozs.common.core.domain.entity.SysDept;
+import com.ozs.common.core.domain.entity.SysRole;
 import com.ozs.common.core.domain.model.LoginUser;
+import com.ozs.common.enums.BusinessType;
+import com.ozs.common.enums.DataIsDelete;
+import com.ozs.common.utils.PageUtils;
 import com.ozs.common.utils.poi.ExcelUtil;
 import com.ozs.framework.web.service.TokenService;
 import com.ozs.plan.doman.PlanQuarter;
 import com.ozs.plan.doman.vo.requestVo.PlanQuarterStandardVo;
+import com.ozs.plan.doman.vo.responseVo.PlanQuarterResponseVo;
 import com.ozs.plan.service.PlanQuarterService;
+import com.ozs.plan.service.impl.PlanQuarterServiceImpl;
+import com.ozs.system.service.ISysDeptService;
+import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+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;
@@ -20,53 +34,211 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 季度计划信息控制层
  *
  * @author buzhanyi
  */
+@Api(tags = "季度计划")
 @RestController
 @RequestMapping("/plan/quarter")
 public class PlanQuarterController extends BaseController {
     @Autowired
     private PlanQuarterService quarterService;
     @Autowired
+    private PlanQuarterServiceImpl quarterServiceImpl;
+    @Autowired
     private TokenService tokenService;
+    @Autowired
+    private ISysDeptService iSysDeptService;
 
     @ApiOperation(value = "查询季度计划")
     @PostMapping("/list")
-    public AjaxResult list(@RequestBody PlanQuarterStandardVo quarterStandardVo) {
-        Page page = quarterService.selectPlanQuarterList(quarterStandardVo);
-        return AjaxResult.success(page);
+    @Log(title = ModularConstans.planQuarter, businessType = BusinessType.QUERY)
+    @PreAuthorize("@ss.hasPermi('plan:quarter:list')")
+    public AjaxResult list(@RequestBody PlanQuarterStandardVo vo, HttpServletRequest request) {
+        List<PlanQuarterResponseVo> planQuarterList = new ArrayList<>();
+        try {
+            LambdaQueryWrapper<PlanQuarter> lw = new LambdaQueryWrapper<>();
+            if (!ObjectUtils.isEmpty(vo.getProjectName())) {
+                lw.like(PlanQuarter::getProjectName, vo.getProjectName());
+            }
+            if (!ObjectUtils.isEmpty(vo.getPurchaseServices())) {
+                lw.eq(PlanQuarter::getPurchaseServices, vo.getPurchaseServices());
+            }
+            if (!ObjectUtils.isEmpty(vo.getIsExcess())) {
+                lw.eq(PlanQuarter::getIsExcess, vo.getIsExcess());
+            }
+            if (!ObjectUtils.isEmpty(vo.getProjectStatus())) {
+                lw.eq(PlanQuarter::getProjectStatus, vo.getProjectStatus());
+            } else {
+                lw.in(PlanQuarter::getProjectStatus, "1,3");
+            }
+            if (!ObjectUtils.isEmpty(vo.getBeginTime())) {
+                lw.ge(PlanQuarter::getPlanDemandSubTime, vo.getBeginTime());
+            }
+            if (!ObjectUtils.isEmpty(vo.getEndTime())) {
+                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+                SimpleDateFormat dateFormatT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
+                Date parse = dateFormatT.parse(dateFormat.format(vo.getEndTime()) + " 23:59:59:999");
+                lw.le(PlanQuarter::getPlanDemandSubTime, parse);
+            }
+            lw.eq(PlanQuarter::getDelFlay, DataIsDelete.DataNOTDelete.getCode());
+
+            LoginUser loginUser = tokenService.getLoginUser(request);
+            // 添加数据权限
+            List<String> roleKeys = loginUser.getUser().getRoles().stream().map(SysRole::getRoleKey).collect(Collectors.toList());
+            if (roleKeys.contains(Constants.DEMAND_UNIT)) {
+                // 需求单位
+                /*(purchase_dept_id = 当前用户deptID) */
+                lw.eq(PlanQuarter::getPurchaseDeptId, loginUser.getDeptId());
+            } else if (roleKeys.contains(Constants.PURCHASING_MANAGEMENT)
+                    || roleKeys.contains(Constants.PURCHASE_SERVICES)) {
+                // 采购管理部门  或  采购办
+            /*  (purchase_dept_id = 当前用户deptID  AND  is_excess = 0)
+                OR
+                (purchase_dept_id IN (当前用户 子deptId 集合) and AND  is_excess = 1)
+             */
+                SysDept sysDept = new SysDept();
+                sysDept.setParentId(loginUser.getDeptId());
+                sysDept.setStatus("0");
+                List<Long> childDeptIds = iSysDeptService.selectDeptList(sysDept)
+                        .stream()
+                        .map(SysDept::getDeptId)
+                        .collect(Collectors.toList());
+                if (ObjectUtils.isEmpty(childDeptIds)) {
+                    lw.and((wrapper) -> {
+                        wrapper.eq(PlanQuarter::getIsExcess, 0);
+                        wrapper.eq(PlanQuarter::getPurchaseDeptId, loginUser.getDeptId());
+                    });
+                } else {
+                    lw.and((wrapper) -> {
+                        wrapper.eq(PlanQuarter::getIsExcess, 0);
+                        wrapper.eq(PlanQuarter::getPurchaseDeptId, loginUser.getDeptId());
+                    })
+                            .or((wrapper) -> {
+                                wrapper.eq(PlanQuarter::getIsExcess, 1);
+                                wrapper.in(PlanQuarter::getPurchaseDeptId, childDeptIds);
+                            });
+                }
+            }
+            List<PlanQuarter> list = quarterService.list(lw);
+            planQuarterList = quarterServiceImpl.changeTo(list);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        Page pages = PageUtils.getPages(vo.getPageNum().intValue(), vo.getPageSize().intValue(), planQuarterList);
+
+        return AjaxResult.success(pages);
     }
 
     @ApiOperation(value = "审核单位查询季度计划")
     @PostMapping("/examineList")
-    public AjaxResult examineList(@RequestBody PlanQuarterStandardVo quarterStandardVo) {
-        Page page = quarterService.selectPlanQuarterExamineList(quarterStandardVo);
-        return AjaxResult.success(page);
+    @PreAuthorize("@ss.hasPermi('plan:quarter:examineList')")
+    @Log(title = ModularConstans.planQuarter, businessType = BusinessType.QUERY)
+    public AjaxResult examineList(@RequestBody PlanQuarterStandardVo vo, HttpServletRequest request) {
+        List<PlanQuarterResponseVo> planQuarterList = new ArrayList<>();
+        try {
+            LambdaQueryWrapper<PlanQuarter> lw = new LambdaQueryWrapper<>();
+            if (!ObjectUtils.isEmpty(vo.getProjectName())) {
+                lw.like(PlanQuarter::getProjectName, vo.getProjectName());
+            }
+            if (!ObjectUtils.isEmpty(vo.getPurchaseServices())) {
+                lw.eq(PlanQuarter::getPurchaseServices, vo.getPurchaseServices());
+            }
+            if (!ObjectUtils.isEmpty(vo.getIsExcess())) {
+                lw.eq(PlanQuarter::getIsExcess, vo.getIsExcess());
+            }
+            if (!ObjectUtils.isEmpty(vo.getProjectStatus())) {
+                lw.eq(PlanQuarter::getProjectStatus, vo.getProjectStatus());
+            }
+            if (!ObjectUtils.isEmpty(vo.getBeginTime())) {
+                lw.ge(PlanQuarter::getPlanDemandSubTime, vo.getBeginTime());
+            }
+            if (!ObjectUtils.isEmpty(vo.getEndTime())) {
+                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+                SimpleDateFormat dateFormatT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
+                Date parse = dateFormatT.parse(dateFormat.format(vo.getEndTime()) + " 23:59:59:999");
+                lw.le(PlanQuarter::getPlanDemandSubTime, parse);
+            }
+            lw.eq(PlanQuarter::getDelFlay, DataIsDelete.DataNOTDelete.getCode());
+
+            LoginUser loginUser = tokenService.getLoginUser(request);
+            // 添加数据权限
+            List<String> roleKeys = loginUser.getUser().getRoles().stream().map(SysRole::getRoleKey).collect(Collectors.toList());
+            if (roleKeys.contains(Constants.DEMAND_UNIT)) {
+                // 需求单位
+                /*(purchase_dept_id = 当前用户deptID) */
+                lw.eq(PlanQuarter::getPurchaseDeptId, loginUser.getDeptId());
+            } else if (roleKeys.contains(Constants.PURCHASING_MANAGEMENT)
+                    || roleKeys.contains(Constants.PURCHASE_SERVICES)) {
+                // 采购管理部门  或  采购办
+            /*  (purchase_dept_id = 当前用户deptID  AND  is_excess = 0)
+                OR
+                (purchase_dept_id IN (当前用户 子deptId 集合) and AND  is_excess = 1)
+             */
+                SysDept sysDept = new SysDept();
+                sysDept.setParentId(loginUser.getDeptId());
+                sysDept.setStatus("0");
+                List<Long> childDeptIds = iSysDeptService.selectDeptList(sysDept)
+                        .stream()
+                        .map(SysDept::getDeptId)
+                        .collect(Collectors.toList());
+                if (ObjectUtils.isEmpty(childDeptIds)) {
+                    lw.and((wrapper) -> {
+                        wrapper.eq(PlanQuarter::getIsExcess, 0);
+                        wrapper.eq(PlanQuarter::getPurchaseDeptId, loginUser.getDeptId());
+                    });
+                } else {
+                    lw.and((wrapper) -> {
+                        wrapper.eq(PlanQuarter::getIsExcess, 0);
+                        wrapper.eq(PlanQuarter::getPurchaseDeptId, loginUser.getDeptId());
+                    })
+                            .or((wrapper) -> {
+                                wrapper.eq(PlanQuarter::getIsExcess, 1);
+                                wrapper.in(PlanQuarter::getPurchaseDeptId, childDeptIds);
+                            });
+                }
+            }
+            List<PlanQuarter> list = quarterService.list(lw);
+            planQuarterList = quarterServiceImpl.changeTo(list);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        Page pages = PageUtils.getPages(vo.getPageNum().intValue(), vo.getPageSize().intValue(), planQuarterList);
+        return AjaxResult.success(pages);
     }
 
     @ApiOperation(value = "导出季度计划数据")
+    @Log(title = ModularConstans.planQuarter, businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('plan:quarter:exportPlan')")
     @PostMapping("/exportPlan")
     public void exportPlan(HttpServletResponse response, @RequestBody PlanQuarterStandardVo quarterStandardVo) throws Exception {
-        List<PlanQuarter> list = quarterService.selectPlanQuarterListEXP(quarterStandardVo);
-        ExcelUtil<PlanQuarter> util = new ExcelUtil<>(PlanQuarter.class);
+        List<PlanQuarterResponseVo> list = quarterService.selectPlanQuarterListEXP(quarterStandardVo);
+        ExcelUtil<PlanQuarterResponseVo> util = new ExcelUtil<>(PlanQuarterResponseVo.class);
         util.exportExcel(response, list, "季度计划数据");
     }
 
     @ApiOperation(value = "导出季度计划数据(审核单位)")
     @PostMapping("/exportPlanExamine")
+    @PreAuthorize("@ss.hasPermi('plan:quarter:exportPlanExamine')")
+    @Log(title = ModularConstans.planQuarter, businessType = BusinessType.EXPORT)
     public void exportPlanExamine(HttpServletResponse response, @RequestBody PlanQuarterStandardVo quarterStandardVo) throws Exception {
-        List<PlanQuarter> list = quarterService.selectPlanQuarterExamineListEXP(quarterStandardVo);
-        ExcelUtil<PlanQuarter> util = new ExcelUtil<>(PlanQuarter.class);
+        List<PlanQuarterResponseVo> list = quarterService.selectPlanQuarterExamineListEXP(quarterStandardVo);
+        ExcelUtil<PlanQuarterResponseVo> util = new ExcelUtil<>(PlanQuarterResponseVo.class);
         util.exportExcel(response, list, "季度计划数据(审核单位)");
     }
 
     @ApiOperation(value = "创建季度计划")
     @PostMapping("/add")
+    @PreAuthorize("@ss.hasPermi('plan:quarter:add')")
+    @Log(title = ModularConstans.planQuarter, businessType = BusinessType.INSERT)
     public AjaxResult add(@RequestBody PlanQuarterStandardVo quarterStandardVo, HttpServletRequest request) {
         //获取采购单位-
         LoginUser loginUser = tokenService.getLoginUser(request);
@@ -77,6 +249,8 @@ public class PlanQuarterController extends BaseController {
 
     @ApiOperation(value = "修改季度计划")
     @PostMapping("/update")
+    @PreAuthorize("@ss.hasPermi('plan:quarter:update')")
+    @Log(title = ModularConstans.planQuarter, businessType = BusinessType.UPDATE)
     public AjaxResult update(@RequestBody PlanQuarterStandardVo quarterStandardVo, HttpServletRequest request) {
         LoginUser loginUser = tokenService.getLoginUser(request);
         quarterStandardVo.setUpdated(String.valueOf(loginUser.getUserId()));
@@ -85,24 +259,32 @@ public class PlanQuarterController extends BaseController {
 
     @ApiOperation(value = "提交季度计划")
     @PostMapping("/commit")
+    @PreAuthorize("@ss.hasPermi('plan:quarter:commit')")
+    @Log(title = ModularConstans.planQuarter, businessType = BusinessType.UPDATE)
     public AjaxResult commit(@RequestBody PlanQuarterStandardVo quarterStandardVo) {
         return quarterService.commit(quarterStandardVo);
     }
 
     @ApiOperation(value = "删除季度计划")
     @PostMapping("/delete")
+    @PreAuthorize("@ss.hasPermi('plan:quarter:delete')")
+    @Log(title = ModularConstans.planQuarter, businessType = BusinessType.DELETE)
     public AjaxResult delete(@RequestBody PlanQuarterStandardVo quarterStandardVo) {
         return quarterService.deletePlanQuarterById(quarterStandardVo.getPlanPracticalId());
     }
 
     @ApiOperation(value = "根据id获取季度计划信息")
     @PostMapping("/view")
+    @PreAuthorize("@ss.hasPermi('plan:quarter:view')")
+    @Log(title = ModularConstans.planQuarter, businessType = BusinessType.QUERY)
     public AjaxResult view(@RequestBody PlanQuarterStandardVo quarterStandardVo) {
         return quarterService.view(quarterStandardVo);
     }
 
     @ApiOperation(value = "审核季度计划通过")
     @PostMapping("/reviewTo")
+    @PreAuthorize("@ss.hasPermi('plan:quarter:reviewTo')")
+    @Log(title = ModularConstans.planQuarter, businessType = BusinessType.UPDATE)
     public AjaxResult reviewTo(@RequestBody PlanQuarterStandardVo quarterStandardVo, HttpServletRequest request) {
         LoginUser loginUser = tokenService.getLoginUser(request);
         quarterStandardVo.setUpdated(String.valueOf(loginUser.getUserId()));
@@ -111,6 +293,8 @@ public class PlanQuarterController extends BaseController {
 
     @ApiOperation(value = "审核季度计划退回")
     @PostMapping("/reviewReturn")
+    @PreAuthorize("@ss.hasPermi('plan:quarter:reviewReturn')")
+    @Log(title = ModularConstans.planQuarter, businessType = BusinessType.UPDATE)
     public AjaxResult reviewReturn(@RequestBody PlanQuarterStandardVo quarterStandardVo, HttpServletRequest request) {
         LoginUser loginUser = tokenService.getLoginUser(request);
         quarterStandardVo.setUpdated(String.valueOf(loginUser.getUserId()));
@@ -119,18 +303,24 @@ public class PlanQuarterController extends BaseController {
 
     @ApiOperation(value = "申请修改季度计划")
     @PostMapping("/appUpdate")
+    @PreAuthorize("@ss.hasPermi('plan:quarter:appUpdate')")
+    @Log(title = ModularConstans.planQuarter, businessType = BusinessType.UPDATE)
     public AjaxResult appUpdate(@RequestBody PlanQuarterStandardVo quarterStandardVo) {
         return quarterService.appUpdate(quarterStandardVo);
     }
 
     @ApiOperation(value = "发函催告")
     @PostMapping("/sendLetter")
+    @PreAuthorize("@ss.hasPermi('plan:quarter:sendLetter')")
+    @Log(title = ModularConstans.planQuarter, businessType = BusinessType.UPDATE)
     public AjaxResult sendLetter(@RequestBody PlanQuarterStandardVo quarterStandardVo) {
         return quarterService.sendLetter(quarterStandardVo);
     }
 
     @ApiOperation(value = "上传计划关联文件后保存文件信息")
     @PostMapping("/upLoadPlanFile")
+    @PreAuthorize("@ss.hasPermi('plan:quarter:upLoadPlanFile')")
+    @Log(title = ModularConstans.planQuarter, businessType = BusinessType.OTHER)
     public AjaxResult upLoadPlanFile(@RequestBody PlanQuarterStandardVo quarterStandardVo) {
         return quarterService.upLoadPlanFile(quarterStandardVo);
     }
@@ -143,6 +333,8 @@ public class PlanQuarterController extends BaseController {
 
     @ApiOperation(value = "导入季度计划数据")
     @PostMapping("/importData")
+    @PreAuthorize("@ss.hasPermi('plan:quarter:importData')")
+    @Log(title = ModularConstans.planQuarter, businessType = BusinessType.INSERT)
     public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception {
         ExcelUtil<PlanQuarterStandardVo> util = new ExcelUtil<>(PlanQuarterStandardVo.class);
         List<PlanQuarterStandardVo> quarter = util.importExcel(file.getInputStream());

+ 207 - 14
purchase-admin/src/main/java/com/ozs/web/controller/plan/PlanYearsController.java

@@ -1,16 +1,31 @@
 package com.ozs.web.controller.plan;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ozs.common.annotation.Log;
+import com.ozs.common.constant.Constants;
+import com.ozs.common.constant.ModularConstans;
 import com.ozs.common.core.controller.BaseController;
 import com.ozs.common.core.domain.AjaxResult;
+import com.ozs.common.core.domain.entity.SysDept;
+import com.ozs.common.core.domain.entity.SysRole;
 import com.ozs.common.core.domain.model.LoginUser;
+import com.ozs.common.enums.BusinessType;
+import com.ozs.common.enums.DataIsDelete;
+import com.ozs.common.utils.PageUtils;
 import com.ozs.common.utils.poi.ExcelUtil;
 import com.ozs.framework.web.service.TokenService;
 import com.ozs.plan.doman.PlanYears;
 import com.ozs.plan.doman.vo.requestVo.PlanYearsStandardVo;
+import com.ozs.plan.doman.vo.responseVo.PlanYearsResponseVo;
 import com.ozs.plan.service.PlanYearsService;
+import com.ozs.plan.service.impl.PlanYearsServiceImpl;
+import com.ozs.system.service.ISysDeptService;
+import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.ObjectUtils;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -20,13 +35,18 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 年度计划信息控制层
  *
  * @author buzhanyi
  */
+@Api(tags = "年度计划")
 @RestController
 @RequestMapping("/plan/planYears")
 public class PlanYearsController extends BaseController {
@@ -34,40 +54,191 @@ public class PlanYearsController extends BaseController {
     private PlanYearsService planYearsService;
     @Autowired
     private TokenService tokenService;
+    @Autowired
+    private ISysDeptService iSysDeptService;
+    @Autowired
+    private PlanYearsServiceImpl planYearsServiceImpl;
+
 
     @ApiOperation(value = "查询年度计划")
     @PostMapping("/list")
-    public AjaxResult list(@RequestBody PlanYearsStandardVo yearsStandardVo) {
-        //List<PlanYears> list = planYearsService.selectPlanYearsList(yearsStandardVo);
-        Page page = planYearsService.selectPlanYearsList(yearsStandardVo);
-        return AjaxResult.success(page);
+    @PreAuthorize("@ss.hasPermi('plan:planYears:list')")
+    @Log(title = ModularConstans.planYear, businessType = BusinessType.QUERY)
+    public AjaxResult list(@RequestBody PlanYearsStandardVo vo, HttpServletRequest request) {
+        List<PlanYearsResponseVo> planYearsList = new ArrayList<>();
+        try {
+            LambdaQueryWrapper<PlanYears> lw = new LambdaQueryWrapper<PlanYears>();
+            if (!ObjectUtils.isEmpty(vo.getProjectName())) {
+                lw.like(PlanYears::getProjectName, vo.getProjectName());
+            }
+            if (!ObjectUtils.isEmpty(vo.getPurchaseServices())) {
+                lw.eq(PlanYears::getPurchaseServices, vo.getPurchaseServices());
+            }
+            if (!ObjectUtils.isEmpty(vo.getIsExcess())) {
+                lw.eq(PlanYears::getIsExcess, vo.getIsExcess());
+            }
+            if (!ObjectUtils.isEmpty(vo.getProjectStatus())) {
+                lw.eq(PlanYears::getProjectStatus, vo.getProjectStatus());
+            }
+            if (!ObjectUtils.isEmpty(vo.getBeginTime())) {
+                lw.ge(PlanYears::getPlanDemandSubTime, vo.getBeginTime());
+            }
+            if (!ObjectUtils.isEmpty(vo.getEndTime())) {
+                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+                SimpleDateFormat dateFormatT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
+                Date parse = dateFormatT.parse(dateFormat.format(vo.getEndTime()) + " 23:59:59:999");
+                lw.le(PlanYears::getPlanDemandSubTime, parse);
+            }
+            lw.eq(PlanYears::getDelFlay, DataIsDelete.DataNOTDelete.getCode());
+
+            LoginUser loginUser = tokenService.getLoginUser(request);
+            // 添加数据权限
+            List<String> roleKeys = loginUser.getUser().getRoles().stream().map(SysRole::getRoleKey).collect(Collectors.toList());
+            if (roleKeys.contains(Constants.DEMAND_UNIT)) {
+                // 需求单位
+                /*(purchase_dept_id = 当前用户deptID) */
+                lw.eq(PlanYears::getPurchaseDeptId, loginUser.getDeptId());
+            } else if (roleKeys.contains(Constants.PURCHASING_MANAGEMENT)
+                    || roleKeys.contains(Constants.PURCHASE_SERVICES)) {
+                // 采购管理部门  或  采购办
+            /*  (purchase_dept_id = 当前用户deptID  AND  is_excess = 0)
+                OR
+                (purchase_dept_id IN (当前用户 子deptId 集合) and AND  is_excess = 1)
+             */
+                SysDept sysDept = new SysDept();
+                sysDept.setParentId(loginUser.getDeptId());
+                sysDept.setStatus("0");
+                List<Long> childDeptIds = iSysDeptService.selectDeptList(sysDept)
+                        .stream()
+                        .map(SysDept::getDeptId)
+                        .collect(Collectors.toList());
+                if (ObjectUtils.isEmpty(childDeptIds)) {
+                    lw.and((wrapper) -> {
+                        wrapper.eq(PlanYears::getIsExcess, 0);
+                        wrapper.eq(PlanYears::getPurchaseDeptId, loginUser.getDeptId());
+                    });
+                } else {
+                    lw.and((wrapper) -> {
+                        wrapper.eq(PlanYears::getIsExcess, 0);
+                        wrapper.eq(PlanYears::getPurchaseDeptId, loginUser.getDeptId());
+                    })
+                            .or((wrapper) -> {
+                                wrapper.eq(PlanYears::getIsExcess, 1);
+                                wrapper.in(PlanYears::getPurchaseDeptId, childDeptIds);
+                            });
+                }
+            }
+            List<PlanYears> planYears = planYearsService.list(lw);
+            planYearsList = planYearsServiceImpl.changeTo(planYears);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        Page pages = PageUtils.getPages(vo.getPageNum().intValue(), vo.getPageSize().intValue(), planYearsList);
+
+        return AjaxResult.success(pages);
     }
 
     @ApiOperation(value = "审核单位查询年度计划")
     @PostMapping("/examineList")
-    public AjaxResult examineList(@RequestBody PlanYearsStandardVo yearsStandardVo) {
-        Page page = planYearsService.selectPlanYearsExamineList(yearsStandardVo);
-        return AjaxResult.success(page);
+    @PreAuthorize("@ss.hasPermi('plan:planYears:examineList')")
+    @Log(title = ModularConstans.planYear, businessType = BusinessType.QUERY)
+    public AjaxResult examineList(@RequestBody PlanYearsStandardVo vo, HttpServletRequest request) {
+        List<PlanYearsResponseVo> planYearsList = new ArrayList<>();
+
+        try {
+            LambdaQueryWrapper<PlanYears> lw = new LambdaQueryWrapper<PlanYears>();
+            if (!ObjectUtils.isEmpty(vo.getProjectName())) {
+                lw.like(PlanYears::getProjectName, vo.getProjectName());
+            }
+            if (!ObjectUtils.isEmpty(vo.getPurchaseServices())) {
+                lw.eq(PlanYears::getPurchaseServices, vo.getPurchaseServices());
+            }
+            if (!ObjectUtils.isEmpty(vo.getIsExcess())) {
+                lw.eq(PlanYears::getIsExcess, vo.getIsExcess());
+            }
+
+            if (!ObjectUtils.isEmpty(vo.getBeginTime())) {
+                lw.ge(PlanYears::getPlanDemandSubTime, vo.getBeginTime());
+            }
+            if (!ObjectUtils.isEmpty(vo.getEndTime())) {
+                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+                SimpleDateFormat dateFormatT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
+                Date parse = dateFormatT.parse(dateFormat.format(vo.getEndTime()) + " 23:59:59:999");
+                lw.le(PlanYears::getPlanDemandSubTime, parse);
+            }
+            lw.eq(PlanYears::getDelFlay, DataIsDelete.DataNOTDelete.getCode());
+
+
+            LoginUser loginUser = tokenService.getLoginUser(request);
+            // 添加数据权限
+            List<String> roleKeys = loginUser.getUser().getRoles().stream().map(SysRole::getRoleKey).collect(Collectors.toList());
+            if (roleKeys.contains(Constants.DEMAND_UNIT)) {
+                // 需求单位
+                /*(purchase_dept_id = 当前用户deptID) */
+                lw.eq(PlanYears::getPurchaseDeptId, loginUser.getDeptId());
+            } else if (roleKeys.contains(Constants.PURCHASING_MANAGEMENT)
+                    || roleKeys.contains(Constants.PURCHASE_SERVICES)) {
+                // 采购管理部门  或  采购办
+            /*  (purchase_dept_id = 当前用户deptID  AND  is_excess = 0)
+                OR
+                (purchase_dept_id IN (当前用户 子deptId 集合) and AND  is_excess = 1)
+             */
+                SysDept sysDept = new SysDept();
+                sysDept.setParentId(loginUser.getDeptId());
+                sysDept.setStatus("0");
+                List<Long> childDeptIds = iSysDeptService.selectDeptList(sysDept)
+                        .stream()
+                        .map(SysDept::getDeptId)
+                        .collect(Collectors.toList());
+                if (ObjectUtils.isEmpty(childDeptIds)) {
+                    lw.and((wrapper) -> {
+                        wrapper.eq(PlanYears::getIsExcess, 0);
+                        wrapper.eq(PlanYears::getPurchaseDeptId, loginUser.getDeptId());
+                    });
+                } else {
+                    lw.and((wrapper) -> {
+                        wrapper.eq(PlanYears::getIsExcess, 0);
+                        wrapper.eq(PlanYears::getPurchaseDeptId, loginUser.getDeptId());
+                    })
+                            .or((wrapper) -> {
+                                wrapper.eq(PlanYears::getIsExcess, 1);
+                                wrapper.in(PlanYears::getPurchaseDeptId, childDeptIds);
+                            });
+                }
+            }
+            List<PlanYears> planYears = planYearsService.list(lw);
+            planYearsList = planYearsServiceImpl.changeTo(planYears);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        Page pages = PageUtils.getPages(vo.getPageNum().intValue(), vo.getPageSize().intValue(), planYearsList);
+        return AjaxResult.success(pages);
     }
 
     @ApiOperation(value = "导出年度计划数据")
     @PostMapping("/exportPlan")
+    @PreAuthorize("@ss.hasPermi('plan:planYears:exportPlan')")
+    @Log(title = ModularConstans.planYear, businessType = BusinessType.EXPORT)
     public void exportPlan(HttpServletResponse response, @RequestBody PlanYearsStandardVo yearsStandardVo) throws Exception {
-        List<PlanYears> list = planYearsService.selectPlanYearsListEXP(yearsStandardVo);
-        ExcelUtil<PlanYears> util = new ExcelUtil<>(PlanYears.class);
+        List<PlanYearsResponseVo> list = planYearsService.selectPlanYearsListEXP(yearsStandardVo);
+        ExcelUtil<PlanYearsResponseVo> util = new ExcelUtil<>(PlanYearsResponseVo.class);
         util.exportExcel(response, list, "年度计划数据");
     }
 
     @ApiOperation(value = "导出年度计划数据(审核单位)")
+    @PreAuthorize("@ss.hasPermi('plan:planYears:exportPlanExamine')")
     @PostMapping("/exportPlanExamine")
+    @Log(title = ModularConstans.planYear, businessType = BusinessType.EXPORT)
     public void exportPlanExamine(HttpServletResponse response, @RequestBody PlanYearsStandardVo yearsStandardVo) throws Exception {
-        List<PlanYears> list = planYearsService.selectPlanYearsExamineListEXP(yearsStandardVo);
-        ExcelUtil<PlanYears> util = new ExcelUtil<>(PlanYears.class);
+        List<PlanYearsResponseVo> list = planYearsService.selectPlanYearsExamineListEXP(yearsStandardVo);
+        ExcelUtil<PlanYearsResponseVo> util = new ExcelUtil<>(PlanYearsResponseVo.class);
         util.exportExcel(response, list, "年度计划数据(审核单位)");
     }
 
     @ApiOperation(value = "创建年度计划")
     @PostMapping("/add")
+    @PreAuthorize("@ss.hasPermi('plan:planYears:add')")
+    @Log(title = ModularConstans.planYear, businessType = BusinessType.INSERT)
     public AjaxResult add(@RequestBody PlanYearsStandardVo yearsStandardVo, HttpServletRequest request) {
         //获取采购单位-
         LoginUser loginUser = tokenService.getLoginUser(request);
@@ -78,6 +249,8 @@ public class PlanYearsController extends BaseController {
 
     @ApiOperation(value = "修改年度计划")
     @PostMapping("/update")
+    @PreAuthorize("@ss.hasPermi('plan:planYears:update')")
+    @Log(title = ModularConstans.planYear, businessType = BusinessType.UPDATE)
     public AjaxResult update(@RequestBody PlanYearsStandardVo yearsStandardVo, HttpServletRequest request) {
         LoginUser loginUser = tokenService.getLoginUser(request);
         yearsStandardVo.setUpdated(String.valueOf(loginUser.getUserId()));
@@ -86,24 +259,32 @@ public class PlanYearsController extends BaseController {
 
     @ApiOperation(value = "提交年度计划")
     @PostMapping("/commit")
+    @PreAuthorize("@ss.hasPermi('plan:planYears:commit')")
+    @Log(title = ModularConstans.planYear, businessType = BusinessType.UPDATE)
     public AjaxResult commit(@RequestBody PlanYearsStandardVo yearsStandardVo) {
         return planYearsService.commit(yearsStandardVo);
     }
 
     @ApiOperation(value = "删除年度计划")
     @PostMapping("/delete")
+    @PreAuthorize("@ss.hasPermi('plan:planYears:delete')")
+    @Log(title = ModularConstans.planYear, businessType = BusinessType.DELETE)
     public AjaxResult delete(@RequestBody PlanYearsStandardVo yearsStandardVo) {
         return planYearsService.deletePlanYearsById(yearsStandardVo.getPlanYearId());
     }
 
     @ApiOperation(value = "根据id获取年度计划信息")
     @PostMapping("/view")
+    @PreAuthorize("@ss.hasPermi('plan:planYears:view')")
+    @Log(title = ModularConstans.planYear, businessType = BusinessType.QUERY)
     public AjaxResult view(@RequestBody PlanYearsStandardVo yearsStandardVo) {
         return planYearsService.view(yearsStandardVo);
     }
 
     @ApiOperation(value = "审核年度计划通过")
     @PostMapping("/reviewTo")
+    @Log(title = ModularConstans.planYear, businessType = BusinessType.UPDATE)
+    @PreAuthorize("@ss.hasPermi('plan:planYears:reviewTo')")
     public AjaxResult reviewTo(@RequestBody PlanYearsStandardVo yearsStandardVo, HttpServletRequest request) {
         LoginUser loginUser = tokenService.getLoginUser(request);
         yearsStandardVo.setUpdated(String.valueOf(loginUser.getUserId()));
@@ -112,6 +293,8 @@ public class PlanYearsController extends BaseController {
 
     @ApiOperation(value = "审核年度计划退回")
     @PostMapping("/reviewReturn")
+    @PreAuthorize("@ss.hasPermi('plan:planYears:reviewReturn')")
+    @Log(title = ModularConstans.planYear, businessType = BusinessType.UPDATE)
     public AjaxResult reviewReturn(@RequestBody PlanYearsStandardVo yearsStandardVo, HttpServletRequest request) {
         LoginUser loginUser = tokenService.getLoginUser(request);
         yearsStandardVo.setUpdated(String.valueOf(loginUser.getUserId()));
@@ -120,18 +303,24 @@ public class PlanYearsController extends BaseController {
 
     @ApiOperation(value = "申请修改年度计划")
     @PostMapping("/appUpdate")
+    @PreAuthorize("@ss.hasPermi('plan:planYears:appUpdate')")
+    @Log(title = ModularConstans.planYear, businessType = BusinessType.UPDATE)
     public AjaxResult appUpdate(@RequestBody PlanYearsStandardVo yearsStandardVo) {
         return planYearsService.appUpdate(yearsStandardVo);
     }
 
     @ApiOperation(value = "发函催告")
     @PostMapping("/sendLetter")
+    @PreAuthorize("@ss.hasPermi('plan:planYears:sendLetter')")
+    @Log(title = ModularConstans.planYear, businessType = BusinessType.UPDATE)
     public AjaxResult sendLetter(@RequestBody PlanYearsStandardVo yearsStandardVo) {
         return planYearsService.sendLetter(yearsStandardVo);
     }
 
     @ApiOperation(value = "上传计划关联文件后保存文件信息")
     @PostMapping("/upLoadPlanFile")
+    @PreAuthorize("@ss.hasPermi('plan:planYears:upLoadPlanFile')")
+    @Log(title = ModularConstans.planYear, businessType = BusinessType.OTHER)
     public AjaxResult upLoadPlanFile(@RequestBody PlanYearsStandardVo yearsStandardVo) {
         return planYearsService.upLoadPlanFile(yearsStandardVo);
     }
@@ -140,10 +329,11 @@ public class PlanYearsController extends BaseController {
     //@PostMapping("/downLoadPlanFile")
     //public AjaxResult downLoadPlanFile(@RequestBody PlanYearsStandardVo yearsStandardVo) {
     //    return planYearsService.downLoadPlanFile(yearsStandardVo);
-    //}
 
     @ApiOperation(value = "导入年度计划数据")
     @PostMapping("/importData")
+    @PreAuthorize("@ss.hasPermi('plan:planYears:importData')")
+    @Log(title = ModularConstans.planYear, businessType = BusinessType.INSERT)
     public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception {
         ExcelUtil<PlanYearsStandardVo> util = new ExcelUtil<>(PlanYearsStandardVo.class);
         List<PlanYearsStandardVo> planYears = util.importExcel(file.getInputStream());
@@ -152,10 +342,13 @@ public class PlanYearsController extends BaseController {
         String message = planYearsService.importPlanYears(planYears, updateSupport, loginUser);
         return success(message);
     }
+    //}
 
     @ApiOperation(value = "系统首页计划管理")
     @GetMapping("/planYearsTotal")
-    public AjaxResult planYearsTotal(){
-     return    success(planYearsService.count());
+    @PreAuthorize("@ss.hasPermi('plan:planYears:planYearsTotal')")
+    @Log(title = ModularConstans.planYear, businessType = BusinessType.QUERY)
+    public AjaxResult planYearsTotal() {
+        return success(planYearsService.count());
     }
 }

+ 12 - 16
purchase-admin/src/main/java/com/ozs/web/controller/plan/ProvisionalPlanController.java

@@ -1,8 +1,5 @@
 package com.ozs.web.controller.plan;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.pagehelper.PageInfo;
 import com.ozs.common.annotation.Log;
 import com.ozs.common.constant.ModularConstans;
@@ -14,23 +11,18 @@ import com.ozs.common.exception.ServiceException;
 import com.ozs.common.utils.StringUtils;
 import com.ozs.common.utils.poi.ExcelUtil;
 import com.ozs.framework.web.service.TokenService;
-import com.ozs.plan.doman.PlanYears;
 import com.ozs.plan.doman.ProvisionalPlan;
-import com.ozs.plan.doman.vo.requestVo.PlanQuarterStandardVo;
-import com.ozs.plan.doman.vo.requestVo.PlanYearsStandardVo;
 import com.ozs.plan.doman.vo.requestVo.ProvisionalPlanVo;
 import com.ozs.plan.service.ProvisionalPlanService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
-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 org.springframework.web.multipart.MultipartFile;
-
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.util.Date;
@@ -48,14 +40,13 @@ public class ProvisionalPlanController extends BaseController {
 
     @Autowired
     private ProvisionalPlanService provisionalPlanService;
-
     @Autowired
     private TokenService tokenService;
 
     @ApiOperation(value = "新增临时计划")
     @PostMapping("/insertProvisionalPlan")
     @PreAuthorize("@ss.hasPermi('base:provisionalPlan:insertProvisionalPlan')")
-    @Log(title = ModularConstans.policy, businessType = BusinessType.INSERT)
+    @Log(title = ModularConstans.provisionalPlan, businessType = BusinessType.INSERT)
     public AjaxResult insertProvisionalPlan(@RequestBody ProvisionalPlan provisionalPlan, HttpServletRequest request) {
         //获取采购单位
         LoginUser loginUser = tokenService.getLoginUser(request);
@@ -72,7 +63,7 @@ public class ProvisionalPlanController extends BaseController {
     @ApiOperation(value = "删除临时计划", notes = "必传 plan_practical_id")
     @PostMapping("/deleteProvisionalPlan")
     @PreAuthorize("@ss.hasPermi('base:provisionalPlan:deleteProvisionalPlan')")
-    @Log(title = ModularConstans.policy, businessType = BusinessType.DELETE)
+    @Log(title = ModularConstans.provisionalPlan, businessType = BusinessType.DELETE)
     public AjaxResult deleteProvisionalPlan(@RequestBody ProvisionalPlan provisionalPlan) {
         if (StringUtils.isNull(provisionalPlan) || StringUtils.isNull(provisionalPlan.getPlanPracticalId())) {
             return error("临时计划id不能为空");
@@ -83,7 +74,7 @@ public class ProvisionalPlanController extends BaseController {
     @ApiOperation(value = "修改临时计划", notes = "必传 plan_year_id 及修改数据")
     @PostMapping("/updateProvisionalPlan")
     @PreAuthorize("@ss.hasPermi('base:provisionalPlan:updateProvisionalPlan')")
-    @Log(title = ModularConstans.policy, businessType = BusinessType.UPDATE)
+    @Log(title = ModularConstans.provisionalPlan, businessType = BusinessType.UPDATE)
     public AjaxResult updateProvisionalPlan(@RequestBody ProvisionalPlanVo provisionalPlan) {
         if (StringUtils.isNull(provisionalPlan) || StringUtils.isNull(provisionalPlan.getPlanPracticalId())) {
             return error("临时计划id和修改数据不能为空");
@@ -93,6 +84,7 @@ public class ProvisionalPlanController extends BaseController {
 
     @ApiOperation(value = "查询临时计划")
     @PostMapping("/selectProvisionalPlan")
+    @Log(title = ModularConstans.provisionalPlan, businessType = BusinessType.QUERY)
     public AjaxResult selectProvisionalPlan(@RequestBody ProvisionalPlanVo provisionalPlanVo) {
 //        LambdaQueryWrapper<ProvisionalPlan> lw = new LambdaQueryWrapper<ProvisionalPlan>();
 //        // planType计划类型(0:季度计划,1:临时计划)
@@ -122,6 +114,7 @@ public class ProvisionalPlanController extends BaseController {
 
     @ApiOperation(value = "查询临时计划-审核单位")
     @PostMapping("/selectProvisionalPlanAudit")
+    @Log(title = ModularConstans.provisionalPlan, businessType = BusinessType.QUERY)
     public AjaxResult selectProvisionalPlanAudit(@RequestBody ProvisionalPlanVo provisionalPlanVo) {
         if (StringUtils.isNull(provisionalPlanVo)
                 || StringUtils.isNull(provisionalPlanVo.getPageNum())
@@ -134,18 +127,18 @@ public class ProvisionalPlanController extends BaseController {
 
     @ApiOperation(value = "查询临时计划详情")
     @PostMapping("/selectById")
+    @Log(title = ModularConstans.provisionalPlan, businessType = BusinessType.QUERY)
     public AjaxResult selectById(@RequestBody ProvisionalPlanVo provisionalPlanVo) {
         if (StringUtils.isNull(provisionalPlanVo) || StringUtils.isNull(provisionalPlanVo.getPlanPracticalId())) {
             throw new ServiceException("id不能为空!");
         }
-        ProvisionalPlan provisionalPlan = provisionalPlanService.seletById(provisionalPlanVo.getPlanPracticalId());
-        return success(provisionalPlan);
+        return provisionalPlanService.seletById(provisionalPlanVo.getPlanPracticalId());
     }
 
     @ApiOperation(value = "导入临时计划")
     @PostMapping("/importProvisionalPlan")
     @PreAuthorize("@ss.hasPermi('base:provisionalPlan:importProvisionalPlan')")
-    @Log(title = ModularConstans.policy, businessType = BusinessType.INSERT)
+    @Log(title = ModularConstans.provisionalPlan, businessType = BusinessType.INSERT)
     public AjaxResult importProvisionalPlan(MultipartFile file, boolean updateSupport) throws Exception {
         ExcelUtil<ProvisionalPlan> util = new ExcelUtil<>(ProvisionalPlan.class);
         List<ProvisionalPlan> provisionalPlans = util.importExcel(file.getInputStream());
@@ -160,6 +153,7 @@ public class ProvisionalPlanController extends BaseController {
 
     @ApiOperation(value = "导出临时计划")
     @PostMapping("/exportProvisionalPlan")
+    @Log(title = ModularConstans.provisionalPlan, businessType = BusinessType.EXPORT)
     public void exportProvisionalPlan(HttpServletResponse response, @RequestBody ProvisionalPlanVo provisionalPlanVo) throws Exception {
         List<ProvisionalPlan> list = provisionalPlanService.selectProvisionalPlanExport(provisionalPlanVo);
         ExcelUtil<ProvisionalPlan> util = new ExcelUtil<>(ProvisionalPlan.class);
@@ -169,7 +163,7 @@ public class ProvisionalPlanController extends BaseController {
     @ApiOperation(value = "提交临时计划")
     @PostMapping("/commitProvisionalPlan")
     @PreAuthorize("@ss.hasPermi('base:provisionalPlan:commitProvisionalPlan')")
-    @Log(title = ModularConstans.policy, businessType = BusinessType.UPDATE)
+    @Log(title = ModularConstans.provisionalPlan, businessType = BusinessType.UPDATE)
     public AjaxResult commitProvisionalPlan(@RequestBody ProvisionalPlanVo provisionalPlanVo) {
         if (StringUtils.isNull(provisionalPlanVo) || StringUtils.isNull(provisionalPlanVo.getPlanPracticalId())) {
             return error("提交的临时计划ID不能为空!");
@@ -179,6 +173,7 @@ public class ProvisionalPlanController extends BaseController {
 
     @ApiOperation(value = "审核通过")
     @PostMapping("/auditPass")
+    @Log(title = ModularConstans.provisionalPlan, businessType = BusinessType.UPDATE)
     public AjaxResult auditPass(@RequestBody ProvisionalPlanVo provisionalPlanVo, HttpServletRequest request) {
         if (StringUtils.isNull(provisionalPlanVo) || StringUtils.isNull(provisionalPlanVo.getPlanPracticalId())) {
             return error("审核数据ID不能为空!");
@@ -190,6 +185,7 @@ public class ProvisionalPlanController extends BaseController {
 
     @ApiOperation(value = "审核不通过")
     @PostMapping("/auditNoPass")
+    @Log(title = ModularConstans.provisionalPlan, businessType = BusinessType.UPDATE)
     public AjaxResult auditNoPass(@RequestBody ProvisionalPlanVo provisionalPlanVo, HttpServletRequest request) {
         if (StringUtils.isNull(provisionalPlanVo) || StringUtils.isNull(provisionalPlanVo.getPlanPracticalId())) {
             return error("审核数据ID不能为空!");

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

@@ -2,20 +2,38 @@ package com.ozs.web.controller.pm;
 
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.ozs.common.annotation.Log;
+import com.ozs.common.constant.ModularConstans;
 import com.ozs.common.core.controller.BaseController;
 import com.ozs.common.core.domain.AjaxResult;
+import com.ozs.common.enums.BusinessType;
+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.security.access.prepost.PreAuthorize;
+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
  *
@@ -35,8 +53,43 @@ public class PmContractInfoController extends BaseController {
      */
     @ApiOperation(value = "合同信息查询列表", notes = "参数非必传")
     @PostMapping("/list")
+    @PreAuthorize("@ss.hasPermi('pm:contractInfo:list')")
+    @Log(title = ModularConstans.contractInfo, businessType = BusinessType.QUERY)
     public AjaxResult list(@RequestBody PmDemandReqVo pmDemandReqVo) {
         IPage<PmDemandResVo> page  = pmDemandService.selectPmDemandList(pmDemandReqVo,4);
         return success(page);
     }
+
+    @ApiOperation(value = "合同信息填制",notes = "采购需求ID和上传附件必传")
+    @PostMapping("/insertContractInfo")
+    @PreAuthorize("@ss.hasPermi('pm:contractInfo:insertContractInfo')")
+    @Log(title = ModularConstans.contractInfo, businessType = BusinessType.INSERT)
+    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")
+    @PreAuthorize("@ss.hasPermi('pm:contractInfo:view')")
+    @Log(title = ModularConstans.contractInfo, businessType = BusinessType.QUERY)
+    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()));
+    }
 }

+ 50 - 7
purchase-admin/src/main/java/com/ozs/web/controller/pm/PmDemandController.java

@@ -2,17 +2,22 @@ package com.ozs.web.controller.pm;
 
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.ozs.common.annotation.Log;
+import com.ozs.common.constant.ModularConstans;
 import com.ozs.common.core.domain.model.LoginUser;
+import com.ozs.common.enums.BusinessType;
 import com.ozs.common.utils.StringUtils;
 import com.ozs.framework.web.service.TokenService;
+import com.ozs.pm.doman.PmDemand;
 import com.ozs.pm.doman.vo.requestVo.PmBookBuildingReqVo;
 import com.ozs.pm.doman.vo.requestVo.PmDemandReqVo;
 import com.ozs.pm.doman.vo.responseVo.PmDemandResVo;
 import com.ozs.pm.service.IPmDemandService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import org.apache.poi.util.StringUtil;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+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;
@@ -21,6 +26,8 @@ import com.ozs.common.core.controller.BaseController;
 import com.ozs.common.core.domain.AjaxResult;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.validation.constraints.NotEmpty;
+import java.util.Date;
 
 /**
  * 采购需求Controller
@@ -42,6 +49,8 @@ public class PmDemandController extends BaseController {
      */
     @ApiOperation(value = "查询采购需求列表", notes = "参数非必传")
     @PostMapping("/list")
+    @PreAuthorize("@ss.hasPermi('pm:demand:list')")
+    @Log(title = ModularConstans.demand, businessType = BusinessType.QUERY)
     public AjaxResult list(@RequestBody PmDemandReqVo pmDemandReqVo) {
         IPage<PmDemandResVo> page  = pmDemandService.selectPmDemandList(pmDemandReqVo,0);
         return success(page);
@@ -53,6 +62,8 @@ public class PmDemandController extends BaseController {
      */
     @ApiOperation(value = "查看详情", notes = "必传demandId和详情类型(1项目计划,2需求建档,3任务下达,4中标信息,5合同信息,6建设情况),其他字段不传")
     @PostMapping("/view")
+    @PreAuthorize("@ss.hasPermi('pm:demand:view')")
+    @Log(title = ModularConstans.demand, businessType = BusinessType.QUERY)
     public AjaxResult view(@RequestBody PmDemandReqVo pmDemandReqVo) {
         if(pmDemandReqVo.getDemandId() == null){
             return AjaxResult.error("demandId不能为空");
@@ -68,21 +79,43 @@ public class PmDemandController extends BaseController {
      */
     @ApiOperation(value = "需求建档", notes = "必传demandId,根据项目类型必传pmDemandEngineeringResponseVo(3:工程类)、pmDemandEquipResponseVo(0:装备类)、pmDemandMaterialsResponseVo(1:物资类)、pmDemandServeResponseVo(2:服务类)其中之一")
     @PostMapping("/bookBuilding")
-    public AjaxResult bookBuilding(@RequestBody PmBookBuildingReqVo pmBookBuildingReqVo, HttpServletRequest request) {
-        if(pmBookBuildingReqVo.getDemandId() == null){
-            return AjaxResult.error("demandId不能为空");
+    @PreAuthorize("@ss.hasPermi('pm:demand:bookBuilding')")
+    @Log(title = ModularConstans.demand, businessType = BusinessType.INSERT)
+    public AjaxResult bookBuilding(@NotEmpty(message = "数据为空") @RequestBody PmBookBuildingReqVo pmBookBuildingReqVo, HttpServletRequest request) {
+        try {
+            if (pmBookBuildingReqVo.getDemandId() == null) {
+                return AjaxResult.error("demandId不能为空");
+            }
+            PmDemand pmDemand = pmDemandService.getById(pmBookBuildingReqVo.getDemandId());
+            if (ObjectUtils.isEmpty(pmDemand)) {
+                return error("demandId参数错误");
+            }
+            if (ObjectUtils.isEmpty(pmBookBuildingReqVo.getBudgetAmount())) {
+                return error("预算金额不能为空");
+            }
+            if (ObjectUtils.isEmpty(pmBookBuildingReqVo.getDemandCommitTime())) {
+                return error("需求提报时间不能为空");
+            }
+            LoginUser loginUser = tokenService.getLoginUser(request);
+            pmBookBuildingReqVo.setCreateBy(String.valueOf(loginUser.getUserId()));
+            pmBookBuildingReqVo.setCreateTime(new Date());
+            pmBookBuildingReqVo.setUpdateBy(String.valueOf(loginUser.getUserId()));
+            pmBookBuildingReqVo.setUpdateTime(pmBookBuildingReqVo.getCreateTime());
+            return toAjax(pmDemandService.bookBuilding(pmBookBuildingReqVo));
+        } catch (Exception e) {
+            return error(e.getMessage());
         }
-        LoginUser loginUser = tokenService.getLoginUser(request);
-        pmBookBuildingReqVo.setUpdateBy(String.valueOf(loginUser.getUserId()));
-        return toAjax(pmDemandService.bookBuilding(pmBookBuildingReqVo));
     }
 
     @ApiOperation(value = "提交采购需求", notes = "必传demandId,其他字段不传")
     @PostMapping("/commit")
+    @PreAuthorize("@ss.hasPermi('pm:demand:commit')")
+    @Log(title = ModularConstans.demand, businessType = BusinessType.UPDATE)
     public AjaxResult commit(@RequestBody PmDemandReqVo pmDemandReqVo, HttpServletRequest request) {
         if(pmDemandReqVo.getDemandId() == null){
             return AjaxResult.error("demandId不能为空");
         }
+
         LoginUser loginUser = tokenService.getLoginUser(request);
         pmDemandReqVo.setUpdateBy(String.valueOf(loginUser.getUserId()));
         return toAjax(pmDemandService.commit(pmDemandReqVo));
@@ -93,6 +126,8 @@ public class PmDemandController extends BaseController {
      */
     @ApiOperation(value = "查看流程图,获取当前阶段名字", notes = "必传demandId,其他字段不传")
     @PostMapping("/viewFlowChart")
+    @PreAuthorize("@ss.hasPermi('pm:demand:viewFlowChart')")
+    @Log(title = ModularConstans.demand, businessType = BusinessType.QUERY)
     public AjaxResult viewFlowChart(@RequestBody PmDemandReqVo pmRequestVo) {
         if(pmRequestVo.getDemandId() == null){
             return AjaxResult.error("demandId不能为空");
@@ -105,6 +140,8 @@ public class PmDemandController extends BaseController {
      */
     @ApiOperation(value = "查看流程图,鼠标移到对应模块后,显示悬浮框提示", notes = "必传demandId和模块名称,其他字段不传")
     @PostMapping("/getModuleInfo")
+    @PreAuthorize("@ss.hasPermi('pm:demand:getModuleInfo')")
+    @Log(title = ModularConstans.demand, businessType = BusinessType.QUERY)
     public AjaxResult getModuleInfo(@RequestBody PmDemandReqVo pmRequestVo) {
         if(pmRequestVo.getDemandId() == null){
             return AjaxResult.error("demandId不能为空");
@@ -121,6 +158,8 @@ public class PmDemandController extends BaseController {
      */
     @ApiOperation(value = "审核单位查询采购需求列表", notes = "参数非必传")
     @PostMapping("/examineList")
+    @PreAuthorize("@ss.hasPermi('pm:examine:list')")
+    @Log(title = ModularConstans.demandExamine, businessType = BusinessType.QUERY)
     public AjaxResult examineList(@RequestBody PmDemandReqVo pmDemandReqVo) {
         IPage<PmDemandResVo> page  = pmDemandService.selectPmDemandList(pmDemandReqVo,1);
         return success(page);
@@ -128,6 +167,8 @@ public class PmDemandController extends BaseController {
 
     @ApiOperation(value = "审核采购需求通过", notes = "必传demandId和上传附件,其他字段不传")
     @PostMapping("/reviewTo")
+    @PreAuthorize("@ss.hasPermi('pm:examine:reviewTo')")
+    @Log(title = ModularConstans.demandExamine, businessType = BusinessType.UPDATE)
     public AjaxResult reviewTo(@RequestBody PmDemandReqVo pmDemandReqVo, HttpServletRequest request) {
         if(pmDemandReqVo.getDemandId() == null){
             return AjaxResult.error("demandId不能为空");
@@ -142,6 +183,8 @@ public class PmDemandController extends BaseController {
 
     @ApiOperation(value = "审核采购需求退回", notes = "必传demandId和退回原因,其他字段不传")
     @PostMapping("/reviewReturn")
+    @PreAuthorize("@ss.hasPermi('pm:examine:reviewReturn')")
+    @Log(title = ModularConstans.demandExamine, businessType = BusinessType.UPDATE)
     public AjaxResult reviewReturn(@RequestBody PmDemandReqVo pmDemandReqVo, HttpServletRequest request) {
         if(pmDemandReqVo.getDemandId() == null){
             return AjaxResult.error("demandId不能为空");

+ 53 - 3
purchase-admin/src/main/java/com/ozs/web/controller/pm/PmProjectConstructionController.java

@@ -2,20 +2,37 @@ package com.ozs.web.controller.pm;
 
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.ozs.common.annotation.Log;
+import com.ozs.common.constant.ModularConstans;
 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.BusinessType;
+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.security.access.prepost.PreAuthorize;
+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
  *
@@ -28,16 +45,49 @@ import org.springframework.web.bind.annotation.RestController;
 public class PmProjectConstructionController extends BaseController {
     @Autowired
     private IPmDemandService pmDemandService;
-    @Autowired
-    private TokenService tokenService;
 
     /**
      * 项目建设查询列表
      */
     @ApiOperation(value = "项目建设查询列表", notes = "参数非必传")
     @PostMapping("/list")
+    @PreAuthorize("@ss.hasPermi('pm:projectConstruction:list')")
+    @Log(title = ModularConstans.projectConstruction, businessType = BusinessType.QUERY)
     public AjaxResult list(@RequestBody PmDemandReqVo pmDemandReqVo) {
         IPage<PmDemandResVo> page  = pmDemandService.selectPmDemandList(pmDemandReqVo,5);
         return success(page);
     }
+
+    @ApiOperation(value = "建设文档填制",notes = "采购需求ID和上传附件必传")
+    @PostMapping("/insertProjectConstruction")
+    @PreAuthorize("@ss.hasPermi('pm:projectConstruction:insertProjectConstruction')")
+    @Log(title = ModularConstans.projectConstruction, businessType = BusinessType.INSERT)
+    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")
+    @PreAuthorize("@ss.hasPermi('pm:projectConstruction:view')")
+    @Log(title = ModularConstans.projectConstruction, businessType = BusinessType.QUERY)
+    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()));
+    }
 }

+ 411 - 32
purchase-admin/src/main/java/com/ozs/web/controller/pm/PmPurchaseExecutionController.java

@@ -4,33 +4,39 @@ package com.ozs.web.controller.pm;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.ozs.base.domain.BaseAgency;
+import com.ozs.base.domain.BaseExpert;
+import com.ozs.base.domain.vo.BaseExpertVo;
 import com.ozs.base.service.BaseAgencyService;
+import com.ozs.base.service.BaseExpertService;
 import com.ozs.common.annotation.Log;
 import com.ozs.common.constant.ModularConstans;
 import com.ozs.common.core.controller.BaseController;
 import com.ozs.common.core.domain.AjaxResult;
-import com.ozs.common.enums.BusinessType;
-import com.ozs.common.enums.SysFileRefEnum;
+import com.ozs.common.enums.*;
+import com.ozs.common.utils.RandomUtil;
+import com.ozs.common.utils.StringUtils;
+import com.ozs.pm.doman.PmBidOpening;
+import com.ozs.pm.doman.PmBidWinning;
 import com.ozs.pm.doman.PmDemand;
-import com.ozs.pm.doman.PmReleaseAnnouncement;
-import com.ozs.pm.doman.vo.requestVo.PmDemandReqVo;
-import com.ozs.pm.doman.vo.requestVo.PmPurchaseExecutionReqVo;
-import com.ozs.pm.doman.vo.requestVo.PmReleaseAnnouncementReqVo;
+import com.ozs.pm.doman.PmDemandExpertRef;
+import com.ozs.pm.doman.vo.requestVo.*;
 import com.ozs.pm.doman.vo.responseVo.PmDemandResVo;
 import com.ozs.pm.service.IPmDemandService;
-import com.ozs.pm.service.PmReleaseAnnouncementService;
+import com.ozs.pm.service.PmBidOpeningService;
+import com.ozs.pm.service.PmBidWinningService;
+import com.ozs.pm.service.PmDemandExpertRefService;
 import com.ozs.system.domain.SysFileRef;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
+import org.springframework.beans.BeanUtils;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.util.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.constraints.NotEmpty;
-import java.util.Date;
-import java.util.List;
-import java.util.Optional;
+import java.util.*;
 
 /**
  * 采购执行Controller
@@ -46,13 +52,19 @@ public class PmPurchaseExecutionController extends BaseController {
     private IPmDemandService pmDemandService;
     @Autowired
     private BaseAgencyService baseAgencyService;
-
-
+    @Autowired
+    private BaseExpertService baseExpertService;
+    @Autowired
+    private PmDemandExpertRefService pmDemandExpertRefService;
+    @Autowired
+    private PmBidOpeningService pmBidOpeningService;
     /**
      * 采购执行查询列表
      */
     @ApiOperation(value = "采购执行查询列表", notes = "参数非必传")
     @PostMapping("/list")
+    @PreAuthorize("@ss.hasPermi('pm:purchaseExecution:list')")
+    @Log(title = ModularConstans.purchaseExecution, businessType = BusinessType.QUERY)
     public AjaxResult list(@RequestBody PmDemandReqVo pmDemandReqVo) {
         IPage<PmDemandResVo> page  = pmDemandService.selectPmDemandList(pmDemandReqVo,3);
         return success(page);
@@ -62,7 +74,9 @@ public class PmPurchaseExecutionController extends BaseController {
      * 查询代理机构列表
      */
     @ApiOperation(value = "查询代理机构列表", notes = "采购需求ID必传")
-    @PostMapping("/getAgencyList")
+    @GetMapping("/getAgencyList")
+    @PreAuthorize("@ss.hasPermi('pm:purchaseExecution:getAgencyList')")
+    @Log(title = ModularConstans.purchaseExecution, businessType = BusinessType.QUERY)
     public AjaxResult getAgencyList(@NotEmpty(message = "采购需求ID不能为空")
                                @RequestParam(value = "demandId", required = true) Long demandId) {
         PmDemand pmDemand = pmDemandService.getById(demandId);
@@ -71,7 +85,7 @@ public class PmPurchaseExecutionController extends BaseController {
         }
         LambdaQueryWrapper<BaseAgency> lw = new LambdaQueryWrapper<>();
         lw.eq(BaseAgency::getCompanyType,pmDemand.getProjectType());
-        lw.eq(BaseAgency::getStatus,0);
+        lw.eq(BaseAgency::getStatus,0);//白名单
         List<BaseAgency> agencyList = baseAgencyService.list(lw);
         return success(agencyList);
     }
@@ -80,7 +94,9 @@ public class PmPurchaseExecutionController extends BaseController {
      * 选取代理-选择填写招标代理机构信息
      */
     @ApiOperation(value = "选取代理-选择填写招标代理机构信息",notes = "采购需求ID和代理机构ID必传")
-    @PostMapping("/selectAgency")
+    @GetMapping("/selectAgency")
+    @PreAuthorize("@ss.hasPermi('pm:purchaseExecution:selectAgency')")
+    @Log(title = ModularConstans.purchaseExecution, businessType = BusinessType.UPDATE)
     public AjaxResult selectAgency(@NotEmpty(message = "采购需求ID不能为空")
                                    @RequestParam(value = "demandId", required = true) Long demandId,
                                    @NotEmpty(message = "代理机构ID不能为空")
@@ -96,6 +112,7 @@ public class PmPurchaseExecutionController extends BaseController {
         }
         PmDemand pmDemandUpdate = new PmDemand();
         pmDemandUpdate.setDemandId(demandId);
+        pmDemandUpdate.setProjectStatus(PmProjectStatus.WAIT_UPLOAD_BID_FILE.getCode());
         pmDemandUpdate.setAgencyId(agencyId);
         pmDemandUpdate.setExtractAgencyTime(new Date());
         pmDemandUpdate.setUpdateTime(pmDemandUpdate.getExtractAgencyTime());
@@ -107,7 +124,9 @@ public class PmPurchaseExecutionController extends BaseController {
      * 选取代理-抽取招标代理机构信息
      */
     @ApiOperation(value = "选取代理-抽取招标代理机构信息",notes = "采购需求ID必传")
-    @PostMapping("/extractAgency")
+    @GetMapping("/extractAgency")
+    @PreAuthorize("@ss.hasPermi('pm:purchaseExecution:extractAgency')")
+    @Log(title = ModularConstans.purchaseExecution, businessType = BusinessType.UPDATE)
     public AjaxResult extractAgency(@NotEmpty(message = "采购需求id不能为空")
                                      @RequestParam(value = "demandId", required = true) Long demandId) {
 
@@ -117,14 +136,18 @@ public class PmPurchaseExecutionController extends BaseController {
         }
         LambdaQueryWrapper<BaseAgency> lw = new LambdaQueryWrapper<>();
         lw.eq(BaseAgency::getCompanyType,pmDemand.getProjectType());
-        lw.eq(BaseAgency::getStatus,0);
-        Optional<BaseAgency> any = baseAgencyService.list(lw).stream().findAny();
-        if(ObjectUtils.isEmpty(any)){
+        lw.eq(BaseAgency::getStatus,0); //白名单
+        List<BaseAgency> baseAgencyList = baseAgencyService.list(lw);
+        if (ObjectUtils.isEmpty(baseAgencyList)){
             return error("没有符合的招标代理机构,抽取失败!");
         }
+
+        BaseAgency any = (BaseAgency)(RandomUtil.getRandomList(baseAgencyList,1).get(0));
+
         PmDemand pmDemandUpdate = new PmDemand();
         pmDemandUpdate.setDemandId(demandId);
-        pmDemandUpdate.setAgencyId(any.get().getId());
+        pmDemandUpdate.setProjectStatus(PmProjectStatus.WAIT_UPLOAD_BID_FILE.getCode());
+        pmDemandUpdate.setAgencyId(any.getId());
         pmDemandUpdate.setExtractAgencyTime(new Date());
         pmDemandUpdate.setUpdateTime(pmDemandUpdate.getExtractAgencyTime());
         pmDemandUpdate.setUpdateBy(getUserId().toString());
@@ -132,8 +155,10 @@ public class PmPurchaseExecutionController extends BaseController {
     }
 
     @ApiOperation(value = "上传招标文件",notes = "采购需求ID和上传附件必传")
-    @PostMapping("/upLoadBidFile")
-    public AjaxResult upLoadBidFile(@NotEmpty(message = "数据为空") @RequestBody PmPurchaseExecutionReqVo pmPurchaseExecutionReqVo) {
+    @PostMapping("/uploadBidFile")
+    @PreAuthorize("@ss.hasPermi('pm:purchaseExecution:uploadBidFile')")
+    @Log(title = ModularConstans.purchaseExecution, businessType = BusinessType.IMPORT)
+    public AjaxResult uploadBidFile(@NotEmpty(message = "数据为空") @RequestBody PmPurchaseExecutionReqVo pmPurchaseExecutionReqVo) {
         Long demandId = pmPurchaseExecutionReqVo.getDemandId();
         if(ObjectUtils.isEmpty(demandId)){
             return error("参数错误");
@@ -146,24 +171,378 @@ public class PmPurchaseExecutionController extends BaseController {
 
         List<SysFileRef> sysFileRefs = pmPurchaseExecutionReqVo.getSysFileRefs();
         if(ObjectUtils.isEmpty(sysFileRefs)){
-            return error("参数错误");
+            return error("上传附件不能为空");
         }
         if (pmDemandService.uploadFile(demandId, SysFileRefEnum.PM_BID_FILE.getType(),sysFileRefs,getUserId().toString())) {
-            return AjaxResult.success();
+            PmDemand pmDemandUpdate = new PmDemand();
+            pmDemandUpdate.setDemandId(demandId);
+            pmDemandUpdate.setProjectStatus(PmProjectStatus.WAIT_ANNOUNCEMENT.getCode());
+            pmDemandUpdate.setUpdateTime(new Date());
+            pmDemandUpdate.setUpdateBy(getUserId().toString());
+            return success(pmDemandService.updateById(pmDemandUpdate));
         } else {
-            return error("上传失败");
+            return error("保存上传附件失败");
         }
     }
 
     @ApiOperation(value = "发布公告")
-    @PostMapping("/insertBaseAgency")
-    public AjaxResult insertBaseAgency(@NotEmpty(message = "数据为空")
+    @PostMapping("/insertPmReleaseAnnouncement")
+    @PreAuthorize("@ss.hasPermi('pm:purchaseExecution:insertPmReleaseAnnouncement')")
+    @Log(title = ModularConstans.purchaseExecution, businessType = BusinessType.INSERT)
+    public AjaxResult insertPmReleaseAnnouncement(@NotEmpty(message = "数据为空")
                                        @RequestBody PmReleaseAnnouncementReqVo pmReleaseAnnouncementReqVo) {
-        pmReleaseAnnouncementReqVo.setCreateBy(getUserId().toString());
-        pmReleaseAnnouncementReqVo.setCreateTime(new Date());
-        pmReleaseAnnouncementReqVo.setUpdateBy(pmReleaseAnnouncementReqVo.getCreateBy());
-        pmReleaseAnnouncementReqVo.setUpdateTime(pmReleaseAnnouncementReqVo.getCreateTime());
-        return toAjax(pmDemandService.insertBaseAgency(pmReleaseAnnouncementReqVo));
+        try {
+            Long demandId = pmReleaseAnnouncementReqVo.getDemandId();
+            if(ObjectUtils.isEmpty(demandId)){
+                return error("参数错误");
+            }
+            pmReleaseAnnouncementReqVo.setCreateBy(getUserId().toString());
+            pmReleaseAnnouncementReqVo.setCreateTime(new Date());
+            pmReleaseAnnouncementReqVo.setUpdateBy(pmReleaseAnnouncementReqVo.getCreateBy());
+            pmReleaseAnnouncementReqVo.setUpdateTime(pmReleaseAnnouncementReqVo.getCreateTime());
+            return toAjax(pmDemandService.insertPmReleaseAnnouncement(pmReleaseAnnouncementReqVo));
+        }  catch (Exception e) {
+            return error(e.getMessage());
+        }
+
+    }
+
+    @ApiOperation(value = "获取专家身份证号列表")
+    @GetMapping("/getExpertIdNumberList")
+    @PreAuthorize("@ss.hasPermi('pm:purchaseExecution:getExpertIdNumberList')")
+    @Log(title = ModularConstans.purchaseExecution, businessType = BusinessType.QUERY)
+    public AjaxResult getExpertIdNumberList(@NotEmpty(message = "采购需求id不能为空")
+                                                @RequestParam(value = "demandId", required = true) Long demandId) {
+        PmDemand pmDemand = pmDemandService.getById(demandId);
+        if(ObjectUtils.isEmpty(pmDemand)){
+            return error("参数错误");
+        }
+
+        LambdaQueryWrapper<BaseExpert> lw = new LambdaQueryWrapper<BaseExpert>();
+        lw.eq(BaseExpert::getVarietyPurchase,pmDemand.getProjectType())
+                .eq(BaseExpert::getStatus,NameListType.WHITE.getCode());
+        List<BaseExpert> baseExpertList = baseExpertService.list(lw);
+        List<String> idNumberList = new ArrayList<>();
+        if (!ObjectUtils.isEmpty(baseExpertList)) {
+            for(BaseExpert baseExpert :baseExpertList ){
+                idNumberList.add(baseExpert.getIdNumber());
+            }
+        }
+        return success(idNumberList);
+    }
+
+    @ApiOperation(value = "根据身份证号查询专家", notes = "必传 查询条件:身份证号")
+    @GetMapping("/findExpertWithIdNumber")
+    @PreAuthorize("@ss.hasPermi('pm:purchaseExecution:findExpertWithIdNumber')")
+    @Log(title = ModularConstans.purchaseExecution, businessType = BusinessType.QUERY)
+    public AjaxResult findExpertWithIdNumber(@NotEmpty(message = "采购需求id不能为空")
+                                                 @RequestParam(value = "demandId", required = true) Long demandId,
+                                             @NotEmpty(message = "身份证号不能为空")
+                                       @RequestParam(value = "idNumber", required = true) String idNumber) {
+        PmDemand pmDemand = pmDemandService.getById(demandId);
+        if(ObjectUtils.isEmpty(pmDemand)){
+            return error("参数错误");
+        }
+        LambdaQueryWrapper<BaseExpert> lw = new LambdaQueryWrapper<>();
+        lw.eq(BaseExpert::getIdNumber,idNumber);
+        BaseExpert baseExpert = baseExpertService.getOne(lw);
+        if(baseExpert != null){
+            if(NameListType.BLACK.getCode().equals(baseExpert.getStatus())){
+                return error("该专家属于黑名单");
+            }
+            if(!ObjectUtils.isEmpty(pmDemand.getProjectType()) && !pmDemand.getProjectType().equals(baseExpert.getVarietyPurchase())){
+                return error("该专家所属采购品种和项目类型不匹配");
+            }
+        }
+
+        return success(baseExpert);
+    }
+
+
+    @ApiOperation(value = "填写专家信息批量提交", notes = "必传 采购需求ID和专家信息列表,注意:若该专家已经在库里存在,需要传专家对象BaseExpert的ID")
+    @PostMapping("/insertExpertBatch")
+    @PreAuthorize("@ss.hasPermi('pm:purchaseExecution:insertExpertBatch')")
+    @Log(title = ModularConstans.purchaseExecution, businessType = BusinessType.INSERT)
+    public AjaxResult insertExpertBatch(@NotEmpty(message = "参数不能为空") @RequestBody PmBaseExpertFillReqVo pmBaseExpertFillReqVo) {
+
+        try {
+            if (ObjectUtils.isEmpty(pmBaseExpertFillReqVo)
+                    || ObjectUtils.isEmpty(pmBaseExpertFillReqVo.getDemandId())
+                    || ObjectUtils.isEmpty(pmBaseExpertFillReqVo.getAccessTime())
+                    || ObjectUtils.isEmpty(pmBaseExpertFillReqVo.getBaseExpertList())) {
+                return error("参数错误");
+            }
+            pmBaseExpertFillReqVo.setCreateBy(getUserId().toString());
+            pmBaseExpertFillReqVo.setUpdateBy(pmBaseExpertFillReqVo.getCreateBy());
+
+            return toAjax(pmDemandService.insertExpertBatch(pmBaseExpertFillReqVo));
+        } catch (Exception e) {
+            return error(e.getMessage());
+        }
+    }
+
+    @ApiOperation(value = "获取回避单位下拉列表")
+    @GetMapping("/getExpertUnitList")
+    @PreAuthorize("@ss.hasPermi('pm:purchaseExecution:getExpertUnitList')")
+    @Log(title = ModularConstans.purchaseExecution, businessType = BusinessType.QUERY)
+    public AjaxResult getExpertUnitList() {
+        List<BaseExpert> baseExperts = baseExpertService.list();
+        if(ObjectUtils.isEmpty(baseExperts)){
+            return error("专家列表是空的");
+        }
+        Set<String> set = new HashSet<>();
+        for(BaseExpert baseExpert : baseExperts) {
+            set.add(baseExpert.getUnitInformation());
+        }
+        return success(set);
+    }
+
+    /**
+     * 抽取专家
+     */
+    @ApiOperation(value = "抽取专家",notes = "采购需求ID必传")
+    @PostMapping("/extractExpertBatch")
+    @PreAuthorize("@ss.hasPermi('pm:purchaseExecution:extractExpertBatch')")
+    @Log(title = ModularConstans.purchaseExecution, businessType = BusinessType.UPDATE)
+    public AjaxResult extractExpertBatch(@NotEmpty(message = "参数不能为空")
+                                             @RequestBody PmBaseExpertExtractReqVo pmBaseExpertExtractReqVo) {
+
+        try {
+            if (ObjectUtils.isEmpty(pmBaseExpertExtractReqVo)
+                    || ObjectUtils.isEmpty(pmBaseExpertExtractReqVo.getDemandId())
+                    || ObjectUtils.isEmpty(pmBaseExpertExtractReqVo.getAccessTime())) {
+                return error("参数错误");
+            }
+            return toAjax(pmDemandService.extractExpertBatch(pmBaseExpertExtractReqVo));
+        } catch (Exception e) {
+            return error(e.getMessage());
+        }
+    }
+
+    @ApiOperation(value = "填写开标信息",notes = "采购需求ID必传")
+    @PostMapping("/insertBidOpeningBatch")
+    @PreAuthorize("@ss.hasPermi('pm:purchaseExecution:insertBidOpeningBatch')")
+    @Log(title = ModularConstans.purchaseExecution, businessType = BusinessType.INSERT)
+    public AjaxResult insertBidOpeningBatch(@NotEmpty(message = "数据为空")
+                                                  @RequestBody PmBidOpeningFillReqVo pmBidOpeningFillReqVo) {
+
+        try {
+            if (ObjectUtils.isEmpty(pmBidOpeningFillReqVo)
+                    || ObjectUtils.isEmpty(pmBidOpeningFillReqVo.getDemandId())
+                    || ObjectUtils.isEmpty(pmBidOpeningFillReqVo.getPmBidOpeningList())) {
+                return error("参数错误");
+            }
+            pmBidOpeningFillReqVo.setCreateBy(getUserId().toString());
+            pmBidOpeningFillReqVo.setUpdateBy(getUserId().toString());
+            return toAjax(pmDemandService.insertBidOpeningBatch(pmBidOpeningFillReqVo));
+        } catch (Exception e) {
+            return error(e.getMessage());
+        }
+    }
+
+    /**
+     * 中标基本情况填制-开标信息下拉列表
+     */
+    @ApiOperation(value = "中标基本情况填制-开标信息下拉列表", notes = "必传选需求ID")
+    @GetMapping("/getPullDownBidOpeningList")
+    @PreAuthorize("@ss.hasPermi('pm:purchaseExecution:getPullDownBidOpeningList')")
+    @Log(title = ModularConstans.purchaseExecution, businessType = BusinessType.QUERY)
+    public AjaxResult getPullDownBidOpeningList(@NotEmpty(message = "需求ID不能为空")
+                                        @RequestParam(value = "demandId", required = true) Long demandId) {
+        LambdaQueryWrapper<PmBidOpening> pmBidOpeningLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        pmBidOpeningLambdaQueryWrapper.eq(PmBidOpening::getDemandId,demandId)
+                .orderByDesc(PmBidOpening::getScore)
+        ;
+        List<PmBidOpening> pmBidOpeningList = pmBidOpeningService.list(pmBidOpeningLambdaQueryWrapper);
+        return success(pmBidOpeningList);
+    }
+
+    @ApiOperation(value = "中标基本情况填制-中标情况填制提交",notes = "采购需求ID必传")
+    @PostMapping("/insertPmBidWinning")
+    @PreAuthorize("@ss.hasPermi('pm:purchaseExecution:insertPmBidWinning')")
+    @Log(title = ModularConstans.purchaseExecution, businessType = BusinessType.INSERT)
+    public AjaxResult insertPmBidWinning(@NotEmpty(message = "数据为空")
+                                                  @RequestBody PmBidWinningReqVo pmBidWinningReqVo) {
+      try {
+          Long demandId = pmBidWinningReqVo.getDemandId();
+          if(ObjectUtils.isEmpty(demandId)){
+              return error("采购需求ID不能为空");
+          }
+          pmBidWinningReqVo.setCreateBy(getUserId().toString());
+          pmBidWinningReqVo.setCreateTime(new Date());
+          pmBidWinningReqVo.setUpdateBy(pmBidWinningReqVo.getCreateBy());
+          pmBidWinningReqVo.setUpdateTime(pmBidWinningReqVo.getCreateTime());
+          return toAjax(pmDemandService.insertPmBidWinning(pmBidWinningReqVo));
+      }  catch (Exception e) {
+          return error(e.getMessage());
+      }
+    }
+
+    @ApiOperation(value = "中标基本情况填制-更换中标人提交",notes = "采购需求ID必传")
+    @PostMapping("/updatePmBidWinning")
+    @PreAuthorize("@ss.hasPermi('pm:purchaseExecution:updatePmBidWinning')")
+    @Log(title = ModularConstans.purchaseExecution, businessType = BusinessType.UPDATE)
+    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")
+    @PreAuthorize("@ss.hasPermi('pm:purchaseExecution:insertPmBidFailure')")
+    @Log(title = ModularConstans.purchaseExecution, businessType = BusinessType.INSERT)
+    public AjaxResult insertPmBidFailure(@NotEmpty(message = "数据为空")
+                                         @RequestBody PmBidFailureReqVo pmBidFailureReqVo) {
+        try {
+            Long demandId = pmBidFailureReqVo.getDemandId();
+            if(ObjectUtils.isEmpty(demandId)){
+                return error("参数错误");
+            }
+            pmBidFailureReqVo.setCreateBy(getUserId().toString());
+            pmBidFailureReqVo.setCreateTime(new Date());
+            pmBidFailureReqVo.setUpdateBy(pmBidFailureReqVo.getCreateBy());
+            pmBidFailureReqVo.setUpdateTime(pmBidFailureReqVo.getCreateTime());
+            return toAjax(pmDemandService.insertPmBidFailure(pmBidFailureReqVo));
+        }  catch (Exception e) {
+            return error(e.getMessage());
+        }
+    }
+
+    @ApiOperation(value = "质疑处理",notes = "采购需求ID必传")
+    @PostMapping("/handleCallQuestion")
+    @PreAuthorize("@ss.hasPermi('pm:purchaseExecution:handleCallQuestion')")
+    @Log(title = ModularConstans.purchaseExecution, businessType = BusinessType.UPDATE)
+    public AjaxResult handleCallQuestion(@NotEmpty(message = "数据为空")
+                                         @RequestBody PmCallQuestionReqVo pmCallQuestionReqVo) {
+        try {
+            Long demandId = pmCallQuestionReqVo.getDemandId();
+            if(ObjectUtils.isEmpty(demandId)){
+                return error("参数错误");
+            }
+            PmDemand pmDemand = pmDemandService.getById(demandId);
+            if(ObjectUtils.isEmpty(pmDemand)){
+                return error("参数错误");
+            }
+            List<SysFileRef> sysFileRefs = pmCallQuestionReqVo.getSysFileRefs();
+            pmDemandService.uploadFile(demandId, SysFileRefEnum.PM_BID_CALL_QEUSTION_FILE.getType(),sysFileRefs,getUserId().toString());
+            pmDemand.setCallQuestion(pmCallQuestionReqVo.getCallQuestion());
+            pmDemand.setUpdateBy(getUserId().toString());
+            pmDemand.setUpdateTime(new Date());
+            return toAjax(pmDemandService.updateById(pmDemand));
+
+        }  catch (Exception e) {
+            return error(e.getMessage());
+        }
+    }
+
+    @ApiOperation(value = "上传中标通知书",notes = "采购需求ID和上传附件必传")
+    @PostMapping("/uploadBidWinningNotification")
+    @PreAuthorize("@ss.hasPermi('pm:purchaseExecution:uploadBidWinningNotification')")
+    @Log(title = ModularConstans.purchaseExecution, businessType = BusinessType.IMPORT)
+    public AjaxResult uploadBidWinningNotification(@NotEmpty(message = "数据为空") @RequestBody PmPurchaseExecutionReqVo pmPurchaseExecutionReqVo) {
+        Long demandId = pmPurchaseExecutionReqVo.getDemandId();
+        if(ObjectUtils.isEmpty(demandId)){
+            return error("参数错误");
+        }
+
+        PmDemand pmDemand = pmDemandService.getById(demandId);
+        if(ObjectUtils.isEmpty(pmDemand)){
+            return error("参数错误");
+        }
+
+        List<SysFileRef> sysFileRefs = pmPurchaseExecutionReqVo.getSysFileRefs();
+        if(ObjectUtils.isEmpty(sysFileRefs)){
+            return error("上传附件不能为空");
+        }
+        if (pmDemandService.uploadFile(demandId, SysFileRefEnum.PM_BID_WINNING_NOTIFICATION.getType(),sysFileRefs,getUserId().toString())) {
+            PmDemand pmDemandUpdate = new PmDemand();
+            pmDemandUpdate.setDemandId(demandId);
+            pmDemandUpdate.setProjectStatus(PmProjectStatus.CONTRACT_WAIT_FILL.getCode());
+            pmDemandUpdate.setRealPurchaseFinishTime(new Date());
+            pmDemandUpdate.setUpdateTime(new Date());
+            pmDemandUpdate.setUpdateBy(getUserId().toString());
+            return success(pmDemandService.updateById(pmDemandUpdate));
+        } else {
+            return error("保存上传附件失败");
+        }
+    }
+
+    /**
+     * 查看详情
+     */
+    @ApiOperation(value = "查看详情", notes = "必传demandId和详情类型(1项目计划,2需求建档,3任务下达,4中标信息,5合同信息,6建设情况),其他字段不传")
+    @PostMapping("/view")
+    @PreAuthorize("@ss.hasPermi('pm:purchaseExecution:view')")
+    @Log(title = ModularConstans.purchaseExecution, businessType = BusinessType.QUERY)
+    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()));
+    }
+
+    /**
+     * 专家信息查看详情列表
+     */
+    @ApiOperation(value = "专家信息查看详情列表", notes = "必传需求ID和选取时间(yyyy-MM-dd)")
+    @GetMapping("/getBaseExpertList")
+    @PreAuthorize("@ss.hasPermi('pm:purchaseExecution:getBaseExpertList')")
+    @Log(title = ModularConstans.purchaseExecution, businessType = BusinessType.QUERY)
+    public AjaxResult getBaseExpertList(@NotEmpty(message = "需求ID不能为空")
+                                            @RequestParam(value = "demandId", required = true) Long demandId,
+                                         @NotEmpty(message = "选取时间不能为空")
+                                            @RequestParam(value = "accessTime", required = true) String accessTime) {
+        LambdaQueryWrapper<PmDemandExpertRef> pmDemandExpertRefLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        pmDemandExpertRefLambdaQueryWrapper.eq(PmDemandExpertRef::getDemandId,demandId);
+        pmDemandExpertRefLambdaQueryWrapper.eq(PmDemandExpertRef::getAccessTime,accessTime);
+        List<PmDemandExpertRef> pmDemandExpertRefList = pmDemandExpertRefService.list(pmDemandExpertRefLambdaQueryWrapper);
+        List<BaseExpertVo> baseExpertVoList = new ArrayList<>();
+        if(!ObjectUtils.isEmpty(pmDemandExpertRefList)) {
+            for(PmDemandExpertRef pmDemandExpertRef : pmDemandExpertRefList) {
+                BaseExpert baseExpert = baseExpertService.getById(pmDemandExpertRef.getExpertId());
+                if(baseExpert != null){
+                    BaseExpertVo baseExpertVo = new BaseExpertVo();
+                    BeanUtils.copyProperties(baseExpert,baseExpertVo);
+                    baseExpertVo.setMajorTypeName(MajorType.getCodeToInfo(baseExpertVo.getMajorType()));
+                    baseExpertVo.setExpertTypeName(ExpertType.getCodeToInfo(baseExpertVo.getExpertType()));
+                    baseExpertVo.setVarietyPurchaseName(PurchaseType.getCodeToInfo(baseExpertVo.getVarietyPurchase()));
+                    baseExpertVoList.add(baseExpertVo);
+                }
+            }
+        }
+
+        return success(baseExpertVoList);
+    }
+
+  /**
+     * 开标信息查看详情列表
+     */
+    @ApiOperation(value = "开标信息查看详情列表", notes = "必传选需求ID和开标时间(yyyy-MM-dd)")
+    @GetMapping("/getBidOpeningList")
+    @PreAuthorize("@ss.hasPermi('pm:purchaseExecution:getBidOpeningList')")
+    @Log(title = ModularConstans.purchaseExecution, businessType = BusinessType.QUERY)
+    public AjaxResult getBidOpeningList(@NotEmpty(message = "需求ID不能为空")
+                                        @RequestParam(value = "demandId", required = true) Long demandId,
+                                        @NotEmpty(message = "开标时间不能为空")
+                                        @RequestParam(value = "openBidTime", required = true) String openBidTime) {
+        LambdaQueryWrapper<PmBidOpening> pmBidOpeningLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        pmBidOpeningLambdaQueryWrapper.eq(PmBidOpening::getDemandId,demandId)
+        .eq(PmBidOpening::getOpenBidTime,openBidTime).orderByDesc(PmBidOpening::getScore);
+        List<PmBidOpening> pmBidOpeningList = pmBidOpeningService.list(pmBidOpeningLambdaQueryWrapper);
+        return success(pmBidOpeningList);
     }
 
 }

+ 10 - 0
purchase-admin/src/main/java/com/ozs/web/controller/pm/PmTaskReleaseController.java

@@ -2,9 +2,12 @@ package com.ozs.web.controller.pm;
 
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.ozs.common.annotation.Log;
+import com.ozs.common.constant.ModularConstans;
 import com.ozs.common.core.controller.BaseController;
 import com.ozs.common.core.domain.AjaxResult;
 import com.ozs.common.core.domain.model.LoginUser;
+import com.ozs.common.enums.BusinessType;
 import com.ozs.common.utils.StringUtils;
 import com.ozs.framework.web.service.TokenService;
 import com.ozs.pm.doman.vo.requestVo.PmBookBuildingReqVo;
@@ -14,6 +17,7 @@ import com.ozs.pm.service.IPmDemandService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -41,6 +45,8 @@ public class PmTaskReleaseController extends BaseController {
      */
     @ApiOperation(value = "任务下达查询列表", notes = "参数非必传")
     @PostMapping("/list")
+    @PreAuthorize("@ss.hasPermi('pm:taskRelease:list')")
+    @Log(title = ModularConstans.taskRelease, businessType = BusinessType.QUERY)
     public AjaxResult list(@RequestBody PmDemandReqVo pmDemandReqVo) {
         IPage<PmDemandResVo> page  = pmDemandService.selectPmDemandList(pmDemandReqVo,2);
         return success(page);
@@ -48,6 +54,8 @@ public class PmTaskReleaseController extends BaseController {
 
     @ApiOperation(value = "下达任务", notes = "必传demandId和上传附件,其他字段不传")
     @PostMapping("/releaseTask")
+    @PreAuthorize("@ss.hasPermi('pm:taskRelease:releaseTask')")
+    @Log(title = ModularConstans.taskRelease, businessType = BusinessType.UPDATE)
     public AjaxResult releaseTask(@RequestBody PmDemandReqVo pmDemandReqVo, HttpServletRequest request) {
         if(pmDemandReqVo.getDemandId() == null){
             return AjaxResult.error("demandId不能为空");
@@ -65,6 +73,8 @@ public class PmTaskReleaseController extends BaseController {
      */
     @ApiOperation(value = "查看详情", notes = "必传demandId和详情类型(1项目计划,2需求建档,3任务下达,4中标信息,5合同信息,6建设情况),其他字段不传")
     @PostMapping("/view")
+    @PreAuthorize("@ss.hasPermi('pm:taskRelease:view')")
+    @Log(title = ModularConstans.taskRelease, businessType = BusinessType.QUERY)
     public AjaxResult view(@RequestBody PmDemandReqVo pmDemandReqVo) {
         if(pmDemandReqVo.getDemandId() == null){
             return AjaxResult.error("demandId不能为空");

+ 269 - 0
purchase-admin/src/main/java/com/ozs/web/controller/statisticalAnalysis/StatisticalAnalysisController.java

@@ -0,0 +1,269 @@
+package com.ozs.web.controller.statisticalAnalysis;
+
+import com.ozs.base.domain.BaseSupplier;
+import com.ozs.common.annotation.Log;
+import com.ozs.common.constant.ModularConstans;
+import com.ozs.common.core.controller.BaseController;
+import com.ozs.common.core.domain.AjaxResult;
+import com.ozs.common.enums.BusinessType;
+import com.ozs.common.utils.StringUtils;
+import com.ozs.plan.service.PlanYearsService;
+import com.ozs.pm.doman.vo.requestVo.PmDemandReqVo;
+import com.ozs.pm.doman.vo.responseVo.StatisticalChartsResVo;
+import com.ozs.pm.service.IPmDemandService;
+import com.ozs.system.domain.SysFileInfo;
+import io.swagger.annotations.ApiOperation;
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.util.Units;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.apache.poi.xwpf.usermodel.XWPFParagraph;
+import org.apache.poi.xwpf.usermodel.XWPFRun;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author buzhanyi
+ */
+@RestController
+@RequestMapping("/statistical")
+public class StatisticalAnalysisController extends BaseController {
+    @Resource
+    private PlanYearsService planYearsService;
+    @Resource
+    private IPmDemandService pmDemandService;
+
+
+    @ApiOperation(value = "项目属性分布")
+    @PostMapping("/countByProjectAttr")
+    @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
+    public AjaxResult countByProjectAttr(@RequestBody PmDemandReqVo pmDemandReqVo) {
+        //按照项目属性统计所有的项目
+        if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
+            return error("登录账号的单位 不能为空!");
+        }
+        List<StatisticalChartsResVo> resVos = pmDemandService.countByProjectAttr();
+        return AjaxResult.success(resVos);
+    }
+
+    @ApiOperation(value = "项目金额分布")
+    @PostMapping("/countByEvaluation")
+    @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
+    public AjaxResult countByEvaluation(@RequestBody PmDemandReqVo pmDemandReqVo) {
+        //按照概算金额统计所有的项目
+        //概算金额包括:100万以下采购任务、100至500万元采购任务、500至1000万元采购任务、1000至5000万元采购任务、5000至1亿元采购任务、1亿元及以上采购任务
+        if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
+            return error("登录账号的单位 不能为空!");
+        }
+        List<StatisticalChartsResVo> resVos = pmDemandService.countByEvaluation(pmDemandReqVo);
+        return AjaxResult.success(resVos);
+    }
+
+    @ApiOperation(value = "执行滞后采购项目情况")
+    @PostMapping("/countProjectExceed")
+    @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
+    public AjaxResult countProjectExceed(@RequestBody PmDemandReqVo pmDemandReqVo) {
+        //执行滞后采购项目:本年度所有的逾期项目数
+        //预算金额:本年度所有逾期项目累加的预算金额
+        //滞后项目数量占比:指本年度逾期项目数量/本年度所有项目数量
+        if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
+            return error("登录账号的单位 不能为空!");
+        }
+        return pmDemandService.countProjectExceed(pmDemandReqVo);
+    }
+
+    @ApiOperation(value = "滞后项目数量分析")
+    @PostMapping("/exceedAnalysis")
+    @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
+    public AjaxResult exceedAnalysis(@RequestBody PmDemandReqVo pmDemandReqVo) {
+        //统计不同时间维度的逾期项目
+        // 需求单位可查看本单位及其下属单位的统计数据
+        if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
+            return error("登录账号的单位 不能为空!");
+        }
+        if (StringUtils.isNull(pmDemandReqVo.getTimeType())) {
+            return error("统计时间类型不能为空, 1:年度,2:季度,3:月份!");
+        }
+        return pmDemandService.exceedAnalysis(pmDemandReqVo);
+    }
+
+    @ApiOperation(value = "滞后项目时长分析")
+    @PostMapping("/exceedMarketAnalysis")
+    @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
+    public AjaxResult exceedMarketAnalysis(@RequestBody PmDemandReqVo pmDemandReqVo) {
+        //按照滞后时长统计项目数量
+        //滞后时长包括:滞后1个月以内的采购任务、滞后1至3个月采购任务、滞后3至6个月采购任务、滞后6个月至1年采购任务、滞后1年以上采购任务
+        if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
+            return error("登录账号的单位 不能为空!");
+        }
+        return pmDemandService.exceedMarketAnalysis(pmDemandReqVo);
+    }
+
+    @ApiOperation(value = "采购项目信息统计")
+    @PostMapping("/purchaseProjectStatistical")
+    @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
+    public AjaxResult purchaseProjectStatistical(@RequestBody PmDemandReqVo pmDemandReqVo) {
+        // 需求单位可查看本单位及其下属单位的统计数据
+        if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
+            return error("登录账号的单位 不能为空!");
+        }
+        Map<String, Integer> map = pmDemandService.purchaseProjectStatistical(pmDemandReqVo);
+        return success(map);
+    }
+
+    @ApiOperation(value = "重大规划采购任务专项计划管理情况")
+    @PostMapping("/countMajorProject")
+    @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
+    public AjaxResult countMajorProject(@RequestBody PmDemandReqVo pmDemandReqVo) {
+        if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
+            return error("登录账号的单位 不能为空!");
+        }
+        return pmDemandService.countMajorProject(pmDemandReqVo);
+    }
+
+
+    @ApiOperation(value = "任务数量趋势分析")
+    @PostMapping("/taskQuantityAnalysis")
+    @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
+    public AjaxResult taskQuantityAnalysis(@RequestBody PmDemandReqVo pmDemandReqVo) {
+        //任务数量趋势分析:按照月、季度、年统计“项目属性”字段中“重大规划”属性的项目
+        // 需求单位可查看本单位及其下属单位的统计数据
+        if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
+            return error("登录账号的单位 不能为空!");
+        }
+        if (StringUtils.isNull(pmDemandReqVo.getTimeType())) {
+            return error("统计时间类型不能为空, 1:年度,2:季度,3:月份!");
+        }
+        return pmDemandService.taskQuantityAnalysis(pmDemandReqVo);
+    }
+
+    //@ApiOperation(value = "新完成采购任务数量")--------接口作废
+    // @PostMapping("/newFinishPro")
+    //public AjaxResult newFinishPro(@RequestBody PmDemandReqVo pmDemandReqVo) {
+    //    // 新完成采购任务数量:本年度状态为“合同待填制”、“项目建设中”、“项目建设完成”的项目
+    //    //        预算金额:“合同待填制”、“项目建设中”、“项目建设完成”的项目累加的预算金额
+    //    //合同金额:“合同待填制”、“项目建设中”、“项目建设完成”的项目累加的合同金额
+    //    return pmDemandService.newFinishPro();
+    //}
+
+    @ApiOperation(value = "各阶段采购任务数量分布")
+    @PostMapping("/countEveryStatusNum")
+    @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
+    public AjaxResult countEveryStatusNum(@RequestBody PmDemandReqVo pmDemandReqVo) {
+        //指项目进行到各个阶段的数量
+        //阶段包括:待选取代理、待上传招标文件、待发布公告、待开标、待发布中标公告、中标公式中
+        //展示信息包括:鼠标上到图表时,展示项目数量和平均消耗时长(平均消耗时长,指所有项目在该阶段完成的平均时间)
+        if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
+            return error("登录账号的单位 不能为空!");
+        }
+        return pmDemandService.countEveryStatusNum(pmDemandReqVo);
+    }
+
+    @ApiOperation(value = "采购项目--项目数量分析")
+    @PostMapping("/purchaseProjectNumber")
+    @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
+    public AjaxResult purchaseProjectNumber(@RequestBody PmDemandReqVo pmDemandReqVo) {
+        // 需求单位可查看本单位及其下属单位的统计数据
+        if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
+            return error("登录账号的单位 不能为空!");
+        }
+        Map<String, Integer> map = pmDemandService.purchaseProjectNumber(pmDemandReqVo);
+        return success(map);
+    }
+
+    @ApiOperation(value = "项目执行进度统计")
+    @PostMapping("/purchaseProjectExecute")
+    @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
+    public AjaxResult purchaseProjectExecute(@RequestBody PmDemandReqVo pmDemandReqVo) {
+        // 需求单位可查看本单位及其下属单位的统计数据
+        if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
+            return error("登录账号的单位 不能为空!");
+        }
+        Map<String, Integer> map = pmDemandService.purchaseProjectExecute(pmDemandReqVo);
+        return success(map);
+    }
+
+    @ApiOperation(value = "已完成项目数量统计")
+    @PostMapping("/purchaseProjectCompleteNumber")
+    @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
+    public AjaxResult purchaseProjectCompleteNumber(@RequestBody PmDemandReqVo pmDemandReqVo) {
+        // 需求单位可查看本单位及其下属单位的统计数据
+        if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
+            return error("登录账号的单位 不能为空!");
+        }
+        if (StringUtils.isNull(pmDemandReqVo.getTimeType())) {
+            return error("统计时间类型不能为空, 1:年度,2:季度,3:月份!");
+        }
+        List<Map<String, Integer>> map = pmDemandService.purchaseProjectCompleteNumber(pmDemandReqVo);
+        return success(map);
+    }
+
+    @ApiOperation(value = "各阶段项目数量分布")
+    @PostMapping("/purchaseProjectDistribution")
+    @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
+    public AjaxResult purchaseProjectDistribution(@RequestBody PmDemandReqVo pmDemandReqVo) {
+        // 需求单位可查看本单位及其下属单位的统计数据
+        if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
+            return error("登录账号的单位 不能为空!");
+        }
+        List<Map<String, String>> map = pmDemandService.purchaseProjectDistribution(pmDemandReqVo);
+        return success(map);
+    }
+
+    @ApiOperation(value = "项目数量分析")
+    @PostMapping("/purchaseProjectNumberAnalysis")
+    @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
+    public AjaxResult purchaseProjectNumberAnalysis(@RequestBody PmDemandReqVo pmDemandReqVo) {
+        // 需求单位可查看本单位及其下属单位的统计数据
+        if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
+            return error("登录账号的单位 不能为空!");
+        }
+        if (StringUtils.isNull(pmDemandReqVo.getTimeType())) {
+            return error("统计时间类型不能为空, 1:年度,2:季度,3:月份!");
+        }
+        List<Map<String, String>> map = pmDemandService.purchaseProjectNumberAnalysis(pmDemandReqVo);
+        return success(map);
+    }
+
+    @ApiOperation(value = "生成分析报告")
+    @PostMapping("/generateAnalysisReport")
+    @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
+    public AjaxResult generateAnalysisReport(@RequestBody SysFileInfo file) {
+        //  创建一个document对象,相当于新建一个word文档(后缀名为.docx)。
+        XWPFDocument document = new XWPFDocument();
+        //        创建一个段落对象。
+        XWPFParagraph paragraph = document.createParagraph();
+        //        创建一个run。run具体是什么,我也不知道。但是run是这里面的最小单元了。
+        XWPFRun run = paragraph.createRun();
+        //        插入图片
+        //        创建一个输出流 即是该文档的保存位置
+        try {
+            //文件路径位置和文件名称
+            run.addPicture(new FileInputStream(file.getFileUrl()),
+                    XWPFDocument.PICTURE_TYPE_PNG,
+                    file.getFileName(),
+                    Units.toEMU(400),
+                    Units.toEMU(200));
+            //文件保存地址
+            OutputStream outputStream = new FileOutputStream(file.getFileMappingPath());
+            document.write(outputStream);
+            outputStream.close();
+            return AjaxResult.success("分析文档已生成");
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (InvalidFormatException e) {
+            e.printStackTrace();
+        }
+        return AjaxResult.success("分析文档已生成");
+    }
+
+
+}

+ 94 - 0
purchase-admin/src/main/java/com/ozs/web/controller/system/SysRegionController.java

@@ -0,0 +1,94 @@
+package com.ozs.web.controller.system;
+
+
+import com.ozs.common.core.controller.BaseController;
+import com.ozs.common.core.domain.AjaxResult;
+import com.ozs.common.core.domain.model.LoginUser;
+import com.ozs.system.domain.vo.SysRegionVO;
+import com.ozs.system.service.SysRegionService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+
+/**
+ * @author
+ * @version 1.0.0 创建于 2019-12-04
+ **/
+@RestController
+@Api(value = "SysRegionController", tags = {"行政区划管理"})
+@Slf4j
+@RequestMapping("/system/region")
+public class SysRegionController extends BaseController {
+
+    @Resource
+    private SysRegionService sysRegionService;
+
+    @ApiOperation(value = "获取省列表不限权", notes = "获取省列表不限权")
+    @GetMapping(value = "/getProvinceListNoneLimit", produces = "application/json;charset=utf-8")
+    public AjaxResult getProvinceList(HttpServletRequest request) {
+        List<SysRegionVO> list = this.sysRegionService.geAdministrativeDivisionList(null, 1);
+        return success(list);
+    }
+
+    @ApiOperation(value = "获取地级市列表不限权", notes = "获取地级市列表不限权")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", name = "provinceId", value = "省区划ID", required = true)
+    })
+    @GetMapping(value = "/getCityListNoneLimit", produces = "application/json;charset=utf-8")
+    public AjaxResult getCityList(HttpServletRequest request,
+                                  @RequestParam(value = "provinceId", required = true)
+                                          Long provinceId) {
+        List<SysRegionVO> list = this.sysRegionService.geAdministrativeDivisionList(provinceId, 2);
+        return success(list);
+    }
+
+    @ApiOperation(value = "获取区县列表不限权", notes = "获取区县列表不限权")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", name = "cityId", value = "地级市ID", required = true)
+    })
+    @GetMapping(value = "/getDistrictListNoneLimit", produces = "application/json;charset=utf-8")
+    public AjaxResult getDistrictList(HttpServletRequest request,
+                                      @RequestParam(value = "cityId", required = true)
+                                              Long cityId) {
+        List<SysRegionVO> list = this.sysRegionService.geAdministrativeDivisionList(cityId, 3);
+        return success(list);
+    }
+
+
+    @ApiOperation(value = "获取父级编码列表,省/市/县 -test", notes = "获取父级编码列表,省/市/县 -test")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", required = true, name = "token", dataType = "String", value = "token验证信息"),
+            @ApiImplicitParam(paramType = "query", name = "code", value = "行政区划编码", required = true)
+    })
+    @GetMapping(value = "/getParentAdministrativeDivisionCodeList", produces = "application/json;charset=utf-8")
+    public AjaxResult getParentAdministrativeDivisionCodeList(HttpServletRequest request,
+                                                              @RequestParam(value = "code", required = true)
+                                                                      String code) {
+
+        List<String> list = this.sysRegionService.getParentAdministrativeDivisionCodeList(code, true);
+        return success(list);
+
+    }
+
+    @ApiOperation(value = "获取父级名称列表,省/市/县 -test", notes = "获取父级名称列表,省/市/县 -test")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", required = true, name = "token", dataType = "String", value = "token验证信息"),
+            @ApiImplicitParam(paramType = "query", name = "code", value = "行政区划编码", required = true)
+    })
+    @GetMapping(value = "/getParentAdministrativeDivisionNames", produces = "application/json;charset=utf-8")
+    public AjaxResult getParentAdministrativeDivisionNames(HttpServletRequest request,
+                                                           @RequestParam(value = "code", required = true)
+                                                                   String code){
+            String list = this.sysRegionService.getParentAdministrativeDivisionNames(code);
+            return success(list);
+    }
+
+}

+ 16 - 3
purchase-admin/src/main/java/com/ozs/web/controller/system/SysUserController.java

@@ -115,6 +115,19 @@ public class SysUserController extends BaseController
                 return dto;
             }).collect(Collectors.toList()));
         }
+        if(!ObjectUtils.isEmpty(page) && !ObjectUtils.isEmpty(page.getRecords())){
+            List<SysUser> dto1 = page.getRecords().stream().map(o -> {
+                Map<String, Object> stringObjectMap = deptService.selectDeptById(o.getDeptId());
+                Object sysDept = stringObjectMap.get("dto");
+                if (!ObjectUtils.isEmpty(sysDept)) {
+                    SysDept dto = (SysDept) sysDept;
+                    o.setDept(dto);
+                    o.setDeptName(dto.getDeptName());
+                }
+                return o;
+            }).collect(Collectors.toList());
+            page.setRecords(dto1);
+        }
         return success(page);
     }
 
@@ -200,8 +213,8 @@ public class SysUserController extends BaseController
 //        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
 //        return toAjax(userService.insertUser(user));
 //    }
-    
-    
+
+
 
     /**
      * 新增用户
@@ -278,7 +291,7 @@ public class SysUserController extends BaseController
         user.setUpdateBy(getUsername());
         return toAjax(userService.updateUsers(user));
     }
-    
+
     /**
      * 删除用户
      */

+ 85 - 0
purchase-admin/src/main/java/com/ozs/web/controller/tool/PmTaskServer.java

@@ -0,0 +1,85 @@
+package com.ozs.web.controller.tool;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ozs.common.enums.PmProjectStatus;
+import com.ozs.common.utils.DateUtils;
+import com.ozs.pm.doman.PmDemand;
+import com.ozs.pm.service.IPmDemandService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.ObjectUtils;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 项目管理任务调度
+ */
+@Component
+@Slf4j
+public class PmTaskServer {
+    @Autowired
+    private IPmDemandService pmDemandService;
+
+    /**
+     * 更新预警状态
+     */
+    public void updateDemandWarnStatus(){
+        log.info("******** 项目管理任务  开始");
+        LambdaQueryWrapper<PmDemand> lw = new LambdaQueryWrapper<>();
+        lw.in(PmDemand::getProjectStatus,
+                PmProjectStatus.DEMAND_WAIT_FILL.getCode(),
+                PmProjectStatus.DEMAND_WAIT_COMMIT.getCode(),
+                PmProjectStatus.DEMAND_AUDIT_RETURN.getCode(),
+
+                PmProjectStatus.DEMAND_WAIT_AUDIT.getCode(),
+                PmProjectStatus.TASK_WAIT_RELEASE.getCode(),
+                PmProjectStatus.CONTRACT_WAIT_FILL.getCode(),
+                PmProjectStatus.UNDER_CONSTRUCTION.getCode()
+        );
+
+        List<PmDemand> list = this.pmDemandService.list(lw);
+        if(ObjectUtils.isEmpty(list)){
+            return;
+        }
+        List<PmDemand> updateList = new ArrayList<>();
+
+        list.forEach(item-> {
+            if(PmProjectStatus.DEMAND_WAIT_FILL.getCode().equals(item.getProjectStatus())
+                    || PmProjectStatus.DEMAND_WAIT_COMMIT.getCode().equals(item.getProjectStatus())
+                    || PmProjectStatus.DEMAND_AUDIT_RETURN.getCode().equals(item.getProjectStatus())){
+                //需求提报时间:根据数据阈值中设置的提报时间进行判断,进行预警
+                int diff = DateUtils.differentDaysByMillisecond(item.getPlanDemandSubTime(), new Date());
+                if (diff > 30 && ObjectUtils.isEmpty(item.getRealDemandCommitTime())) {
+                    updateList.add(item);
+                }
+            } else if(PmProjectStatus.TASK_WAIT_RELEASE.getCode().equals(item.getProjectStatus())){
+                //采购完成时间:根据数据阈值中设置的采购完成时间进行判断,进行预警
+                int diff = DateUtils.differentDaysByMillisecond(item.getPlanDemandSubTime(), new Date());
+                if (diff > 30 && ObjectUtils.isEmpty(item.getRealDemandCommitTime())) {
+                    updateList.add(item);
+                }
+
+            } else if(PmProjectStatus.CONTRACT_WAIT_FILL.getCode().equals(item.getProjectStatus())){
+                //计划交付时间:根据数据阈值中设置的交付时间进行判断,进行预警和发函催告
+                int diff = DateUtils.differentDaysByMillisecond(item.getPlanDemandSubTime(), new Date());
+                if (diff > 30 && ObjectUtils.isEmpty(item.getRealDemandCommitTime())) {
+                    updateList.add(item);
+                }
+
+            }
+
+        });
+
+
+
+
+
+
+
+        log.info("******** 项目管理任务  结束");
+    }
+
+}

+ 16 - 0
purchase-admin/src/main/java/com/ozs/web/controller/tool/TestTaskServer.java

@@ -0,0 +1,16 @@
+package com.ozs.web.controller.tool;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Component
+@Slf4j
+public class TestTaskServer {
+
+    public void logStr(){
+        log.info("******** 测试定时任务  开始");
+        log.info("******** testTaskServer.logStr");
+        log.info("******** 测试定时任务  结束");
+    }
+
+}

+ 1 - 1
purchase-admin/src/main/resources/application-test.yml

@@ -15,7 +15,7 @@ purchase:
   # 验证码类型 math 数组计算 char 字符验证
   captchaType: math
   # 全部用户是否开启接口权限校验,排除admin用户
-  permissionsEnable: false
+  permissionsEnable: true
 
 # 开发环境配置
 server:

+ 2 - 2
purchase-admin/src/main/resources/logback.xml

@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration>
     <!-- 日志存放路径 -->
-    <!--    <property name="log.path" value="/home/purchase/logs"/>-->
-    <property name="log.path" value="/Users/sunhuanhuan/Documents/project/106/文档/purchase/logs"/>
+    <property name="log.path" value="/home/purchase/logs"/>
+<!--    <property name="log.path" value="/Users/sunhuanhuan/Documents/project/106/文档/purchase/logs"/>-->
     <!-- 日志输出格式 -->
     <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
 

+ 8 - 0
purchase-common/src/main/java/com/ozs/common/constant/Constants.java

@@ -147,4 +147,12 @@ public class Constants {
 
     // 采购服务站
     public static final String PURCHASE_SERVICES = "purchase_services";
+
+
+    // 需求单位
+    public static final String DEMAND_UNIT ="demand_unit";
+    // 采购管理部门
+    public static final String PURCHASING_MANAGEMENT ="purchasing_management";
+    // 采购办
+    public static final String PROCUREMENT_OFFICE ="procurement_office";
 }

+ 24 - 0
purchase-common/src/main/java/com/ozs/common/constant/ModularConstans.java

@@ -13,4 +13,28 @@ public class ModularConstans {
     public static final String fileTemplate = "文件模板管理";
 
     public static final String monthly = "月度对表";
+
+    public static final String demand = "采购需求管理";
+
+    public static final String demandExamine = "采购需求审核";
+
+    public static final String taskRelease = "任务下达管理";
+
+    public static final String purchaseExecution = "采购执行管理";
+
+    public static final String contractInfo = "合同信息管理";
+
+    public static final String projectConstruction = "项目建设管理";
+
+    public static final String planYear = "年度计划";
+
+    public static final String planQuarter = "季度计划";
+
+    public static final String provisionalPlan = "临时计划";
+
+    public static final String statisticalAnalysis = "统计分析";
+
+    public static final String systemHome = "系统首页";
+
+
 }

+ 13 - 0
purchase-common/src/main/java/com/ozs/common/core/domain/entity/SysUser.java

@@ -32,6 +32,11 @@ public class SysUser extends BaseEntity
     @Excel(name = "部门编号", type = Type.IMPORT)
     private Long deptId;
 
+    /** 部门ID */
+    @Excel(name = "部门名称")
+    @TableField(exist = false)
+    private String deptName;
+
     /** 用户账号 */
     @Excel(name = "登录名称")
     private String userName;
@@ -305,6 +310,14 @@ public class SysUser extends BaseEntity
         this.roleId = roleId;
     }
 
+    public String getDeptName() {
+        return deptName;
+    }
+
+    public void setDeptName(String deptName) {
+        this.deptName = deptName;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

+ 28 - 0
purchase-common/src/main/java/com/ozs/common/enums/BidWinningStatus.java

@@ -0,0 +1,28 @@
+package com.ozs.common.enums;
+
+/**
+ * 中标状态
+ *
+ * @author buzhanyi
+ */
+public enum BidWinningStatus {
+    NORMAL("0", "正常"),
+    BE_REPLACED("1", "被替换"),
+    BE_BID_FAILURE("2", "被质疑流标");
+
+    private final String code;
+    private final String info;
+
+    BidWinningStatus(String code, String info) {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getInfo() {
+        return info;
+    }
+}

+ 59 - 0
purchase-common/src/main/java/com/ozs/common/enums/ExpertType.java

@@ -0,0 +1,59 @@
+package com.ozs.common.enums;
+
+import org.springframework.util.ObjectUtils;
+
+/**
+ * 专家类型
+ *
+ * @author buzhanyi
+ */
+public enum ExpertType {
+    TECHNICAL_EXPERT("1", "技术专家"),
+    ECONOMIC_EXPERT("2", "经济专家"),
+    LEGALAFFAIRS_EXPERT("3", "法务专家"),
+    SPARE_EXPERT("4", "备用专家");
+
+    private final String code;
+    private final String info;
+
+    ExpertType(String code, String info) {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getInfo() {
+        return info;
+    }
+
+    public static String getCodeToInfo(String code){
+        if (ObjectUtils.isEmpty(code)){
+            return null;
+        }
+
+        StringBuilder infos = new StringBuilder();
+        String[] codes = code.split(",");
+        if (codes.length > 0){
+            for(String item : codes){
+                if (TECHNICAL_EXPERT.getCode().equals(item)){
+                    infos.append(ECONOMIC_EXPERT.getInfo()).append(",");
+                } else if (ECONOMIC_EXPERT.getCode().equals(item)){
+                    infos.append(ECONOMIC_EXPERT.getInfo()).append(",");
+                } else if (LEGALAFFAIRS_EXPERT.getCode().equals(item)){
+                    infos.append(LEGALAFFAIRS_EXPERT.getInfo()).append(",");
+                } else if (SPARE_EXPERT.getCode().equals(item)){
+                    infos.append(SPARE_EXPERT.getInfo()).append(",");
+                }
+            }
+        }
+        String infoStr = infos.toString();
+        if(infoStr.endsWith(",")) {
+            infoStr = infoStr.substring(0,infos.length() - 1);
+        }
+        return infoStr;
+
+    }
+}

+ 59 - 0
purchase-common/src/main/java/com/ozs/common/enums/MajorType.java

@@ -0,0 +1,59 @@
+package com.ozs.common.enums;
+
+import org.springframework.util.ObjectUtils;
+
+/**
+ * 专家类型
+ *
+ * @author buzhanyi
+ */
+public enum MajorType {
+    TECHNICAL_EXPERT("1", "机电设备安装工程"),
+    ECONOMIC_EXPERT("2", "城市供热工程"),
+    LEGALAFFAIRS_EXPERT("3", "电子通信"),
+    SPARE_EXPERT("4", "房主建筑");
+
+    private final String code;
+    private final String info;
+
+    MajorType(String code, String info) {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getInfo() {
+        return info;
+    }
+
+    public static String getCodeToInfo(String code){
+        if (ObjectUtils.isEmpty(code)){
+            return null;
+        }
+
+        StringBuilder infos = new StringBuilder();
+        String[] codes = code.split(",");
+        if (codes.length > 0){
+            for(String item : codes){
+                if (TECHNICAL_EXPERT.getCode().equals(item)){
+                    infos.append(ECONOMIC_EXPERT.getInfo()).append(",");
+                } else if (ECONOMIC_EXPERT.getCode().equals(item)){
+                    infos.append(ECONOMIC_EXPERT.getInfo()).append(",");
+                } else if (LEGALAFFAIRS_EXPERT.getCode().equals(item)){
+                    infos.append(LEGALAFFAIRS_EXPERT.getInfo()).append(",");
+                } else if (SPARE_EXPERT.getCode().equals(item)){
+                    infos.append(SPARE_EXPERT.getInfo()).append(",");
+                }
+            }
+        }
+        String infoStr = infos.toString();
+        if(infoStr.endsWith(",")) {
+            infoStr = infoStr.substring(0,infos.length() - 1);
+        }
+        return infoStr;
+
+    }
+}

+ 27 - 0
purchase-common/src/main/java/com/ozs/common/enums/NameListType.java

@@ -0,0 +1,27 @@
+package com.ozs.common.enums;
+
+/**
+ * 黑白名单类型
+ *
+ * @author buzhanyi
+ */
+public enum NameListType {
+    BLACK("0", "黑名单"),
+    WHITE("1", "白名单");
+
+    private final String code;
+    private final String info;
+
+    NameListType(String code, String info) {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getInfo() {
+        return info;
+    }
+}

+ 59 - 0
purchase-common/src/main/java/com/ozs/common/enums/PurchaseType.java

@@ -0,0 +1,59 @@
+package com.ozs.common.enums;
+
+import org.springframework.util.ObjectUtils;
+
+/**
+ * 专家类型
+ *
+ * @author buzhanyi
+ */
+public enum PurchaseType {
+    TECHNICAL_EXPERT("0", "装备类"),
+    ECONOMIC_EXPERT("1", "物资类"),
+    LEGALAFFAIRS_EXPERT("2", "服务类"),
+    SPARE_EXPERT("3", "工程类");
+
+    private final String code;
+    private final String info;
+
+    PurchaseType(String code, String info) {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getInfo() {
+        return info;
+    }
+
+    public static String getCodeToInfo(String code){
+        if (ObjectUtils.isEmpty(code)){
+            return null;
+        }
+
+        StringBuilder infos = new StringBuilder();
+        String[] codes = code.split(",");
+        if (codes.length > 0){
+            for(String item : codes){
+                if (TECHNICAL_EXPERT.getCode().equals(item)){
+                    infos.append(ECONOMIC_EXPERT.getInfo()).append(",");
+                } else if (ECONOMIC_EXPERT.getCode().equals(item)){
+                    infos.append(ECONOMIC_EXPERT.getInfo()).append(",");
+                } else if (LEGALAFFAIRS_EXPERT.getCode().equals(item)){
+                    infos.append(LEGALAFFAIRS_EXPERT.getInfo()).append(",");
+                } else if (SPARE_EXPERT.getCode().equals(item)){
+                    infos.append(SPARE_EXPERT.getInfo()).append(",");
+                }
+            }
+        }
+        String infoStr = infos.toString();
+        if(infoStr.endsWith(",")) {
+            infoStr = infoStr.substring(0,infos.length() - 1);
+        }
+        return infoStr;
+
+    }
+}

+ 35 - 0
purchase-common/src/main/java/com/ozs/common/enums/QuarterEnum.java

@@ -0,0 +1,35 @@
+package com.ozs.common.enums;
+
+/**
+ * 项目审核状态
+ *
+ * @author buzhanyi
+ */
+public enum QuarterEnum {
+    FIRST("1", "1,2,3"),
+    SECOND("2", "4,5,6"),
+    THIRD("3", "7,8,9"),
+    FOURTH("4", "10,11,12");
+
+    /**
+     * 季度
+     */
+    private final String quarter;
+    /**
+     * 月份
+     */
+    private final String mounth;
+
+    QuarterEnum(String quarter, String mounth) {
+        this.quarter = quarter;
+        this.mounth = mounth;
+    }
+
+    public String getCode() {
+        return quarter;
+    }
+
+    public String getInfo() {
+        return mounth;
+    }
+}

+ 11 - 7
purchase-common/src/main/java/com/ozs/common/enums/SysFileRefEnum.java

@@ -13,13 +13,17 @@ public enum SysFileRefEnum {
     PLAN_TEMPORARY(2, "临时、季度计划附件"),
     PLAN_YEAR_EXAMINE(3, "年度计划审核文件"),
     PM_DEMAND(4, "采购需求附件"),
-    PM_DEMAND_EQUIP(5, "采购需求装备类附件"),
-    PM_DEMAND_MATERIALS(6, "采购需求物资类附件"),
-    PM_DEMAND_SERVE(7, "采购需求服务类附件"),
-    PM_DEMAND_ENGINEERING(8, "采购需求工程类附件"),
-    PM_DEMAND_EXAMINE(9, "采购需求审核文件"),
-    PM_TAST_RELEASE(10, "任务下达文件"),
-    PM_BID_FILE(11, "招标文件")
+    PM_BOOK_BUILDING(5, "需求建档附件"),
+    PM_DEMAND_EXAMINE(6, "采购需求审核文件"),
+    PM_TAST_RELEASE(7, "任务下达文件"),
+    PM_BID_FILE(8, "招标文件"),
+    PM_ANNOUNCEMENT_FILE(9, "公告文件"),
+    PM_BID_WINNING_FILE(10, "中标文件"),
+    PM_BID_FAILURE_FILE(11, "流标文件"),
+    PM_BID_CALL_QEUSTION_FILE(12, "质疑文件"),
+    PM_BID_WINNING_NOTIFICATION(13, "中标通知书"),
+    PM_CONTRACT_INFO (14, "合同信息附件"),
+    PM_PROJECT_CONSTRUCTION (15, "建设文档附件")
     ;
 
     private Integer type;

+ 30 - 0
purchase-common/src/main/java/com/ozs/common/enums/SysRoleKey.java

@@ -0,0 +1,30 @@
+package com.ozs.common.enums;
+
+/**
+ * 系统角色权限字符串
+ *
+ * @author buzhanyi
+ */
+public enum SysRoleKey {
+    ADMIN("admin", "超级管理员"),
+    COMMON("common", "普通角色"),
+    DEMAND_UNIT("demand_unit", "需求单位管理员"),
+    PURCHASING_MANAGEMENT("purchasing_management", "采购管理部门管理员"),
+    PROCUREMENT_OFFICE("procurement_office", "采购办管理员");
+
+    private final String code;
+    private final String info;
+
+    SysRoleKey(String code, String info) {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getInfo() {
+        return info;
+    }
+}

+ 29 - 0
purchase-common/src/main/java/com/ozs/common/utils/RandomUtil.java

@@ -0,0 +1,29 @@
+package com.ozs.common.utils;
+
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class RandomUtil {
+    public static List getRandomList(List list, int randomSeriesLength){
+        if(randomSeriesLength >  list.size()){
+            randomSeriesLength = list.size();
+        }
+        Collections.shuffle(list);
+        List randomSeries = list.subList(0, randomSeriesLength);
+        return randomSeries;
+    }
+    public static void main(String args[]){
+        List<Object> list = new ArrayList<>();
+        list.add("1");
+        list.add("2");
+        list.add("3");
+        list.add("4");
+        list.add("5");
+        list = getRandomList(list,8);
+        for(Object o: list){
+            System.out.println(o);
+        }
+    }
+}

+ 12 - 6
purchase-common/src/main/java/com/ozs/common/utils/file/FileUtils.java

@@ -37,6 +37,7 @@ import org.elasticsearch.index.query.QueryBuilders;
 import org.elasticsearch.search.SearchHit;
 import org.elasticsearch.search.SearchHits;
 import org.elasticsearch.search.builder.SearchSourceBuilder;
+import org.springframework.util.ObjectUtils;
 
 /**
  * 文件处理工具类
@@ -341,12 +342,17 @@ public class FileUtils {
 
         //builder.query(QueryBuilders.matchQuery("attachment.content", msg).analyzer("ik_smart"));
         SearchResponse searchResponse = EsUtil.selectDocument("fileindex", builder);
-        SearchHits hits = searchResponse.getHits();
-
-        for (SearchHit hit : hits.getHits()) {
-            hit.getSourceAsMap().put("msg", "");
-            matchRsult.add(JSON.parseObject(JSON.toJSONString(hit.getSourceAsMap()),EsMessage.class));
-            // System.out.println(hit.getSourceAsString());
+        log.info("searchResponse:{}",searchResponse);
+        if(!ObjectUtils.isEmpty(searchResponse)){
+            SearchHits hits = searchResponse.getHits();
+
+            for (SearchHit hit : hits.getHits()) {
+                hit.getSourceAsMap().put("msg", "");
+                matchRsult.add(JSON.parseObject(JSON.toJSONString(hit.getSourceAsMap()),EsMessage.class));
+                // System.out.println(hit.getSourceAsString());
+            }
+        }else {
+            log.info("查询条件msg:{}, es查询结果为空",msg);
         }
         System.out.println("over in the main");
 

+ 17 - 32
purchase-framework/src/main/java/com/ozs/framework/web/service/SysLoginService.java

@@ -34,8 +34,7 @@ import com.ozs.system.service.ISysUserService;
  * @author ruoyi
  */
 @Component
-public class SysLoginService
-{
+public class SysLoginService {
     @Autowired
     private TokenService tokenService;
 
@@ -56,42 +55,32 @@ public class SysLoginService
      *
      * @param username 用户名
      * @param password 密码
-     * @param code 验证码
-     * @param uuid 唯一标识
+     * @param code     验证码
+     * @param uuid     唯一标识
      * @return 结果
      */
-    public String login(String username, String password, String code, String uuid)
-    {
+    public String login(String username, String password, String code, String uuid) {
         boolean captchaEnabled = configService.selectCaptchaEnabled();
         // 验证码开关
-        if (captchaEnabled)
-        {
+        if (captchaEnabled) {
             validateCaptcha(username, code, uuid);
         }
         // 用户验证
         Authentication authentication = null;
-        try
-        {
+        try {
             UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password);
             AuthenticationContextHolder.setContext(authenticationToken);
             // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
             authentication = authenticationManager.authenticate(authenticationToken);
-        }
-        catch (Exception e)
-        {
-            if (e instanceof BadCredentialsException)
-            {
+        } catch (Exception e) {
+            if (e instanceof BadCredentialsException) {
                 AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
                 throw new UserPasswordNotMatchException();
-            }
-            else
-            {
+            } else {
                 AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));
                 throw new ServiceException(e.getMessage());
             }
-        }
-        finally
-        {
+        } finally {
             AuthenticationContextHolder.clearContext();
         }
 
@@ -99,7 +88,7 @@ public class SysLoginService
         AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
         LoginUser loginUser = (LoginUser) authentication.getPrincipal();
 
-       //记录登录信息
+        //记录登录信息
         recordLoginInfo(loginUser.getUserId());
         // 生成token
         return tokenService.createToken(loginUser);
@@ -109,22 +98,19 @@ public class SysLoginService
      * 校验验证码
      *
      * @param username 用户名
-     * @param code 验证码
-     * @param uuid 唯一标识
+     * @param code     验证码
+     * @param uuid     唯一标识
      * @return 结果
      */
-    public void validateCaptcha(String username, String code, String uuid)
-    {
+    public void validateCaptcha(String username, String code, String uuid) {
         String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, "");
         String captcha = redisCache.getCacheObject(verifyKey);
         redisCache.deleteObject(verifyKey);
-        if (captcha == null)
-        {
+        if (captcha == null) {
             AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")));
             throw new CaptchaExpireException();
         }
-        if (!code.equalsIgnoreCase(captcha))
-        {
+        if (!code.equalsIgnoreCase(captcha)) {
             AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
             throw new CaptchaException();
         }
@@ -135,8 +121,7 @@ public class SysLoginService
      *
      * @param userId 用户ID
      */
-    public void recordLoginInfo(Long userId)
-    {
+    public void recordLoginInfo(Long userId) {
         SysUser sysUser = new SysUser();
         sysUser.setUserId(userId);
         sysUser.setLoginIp(IpUtils.getIpAddr(ServletUtils.getRequest()));

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

@@ -4,13 +4,16 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ozs.base.domain.vo.BaseExpertVo;
+import com.ozs.common.vo.BaseDto;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.joda.time.DateTime;
 
+import java.util.Date;
+
 @Data
 @TableName("base_expert")
-public class BaseExpert {
+public class BaseExpert extends BaseDto {
 
     /**
      * 主键ID
@@ -26,6 +29,13 @@ public class BaseExpert {
     @TableField("expert_name")
     private String expertName;
 
+    /**
+     * 专家类型
+     */
+    @ApiModelProperty(value = "专家类型,多个使用英文逗号分隔")
+    @TableField("expert_type")
+    private String expertType;
+
     /**
      * 专家性别
      */
@@ -51,7 +61,7 @@ public class BaseExpert {
     /**
      * 专业类型
      */
-    @ApiModelProperty(value = "专业类型")
+    @ApiModelProperty(value = "专业类型,多个使用英文逗号分隔")
     @TableField("major_type")
     private String majorType;
 
@@ -72,7 +82,7 @@ public class BaseExpert {
     /**
      * 采购品种
      */
-    @ApiModelProperty(value = "采购品种")
+    @ApiModelProperty(value = "采购品种,多个使用英文逗号分隔")
     @TableField("variety_purchase")
     private String varietyPurchase;
 
@@ -93,7 +103,7 @@ public class BaseExpert {
     /**
      * 所在区域
      */
-    @ApiModelProperty(value = "所在区域")
+    @ApiModelProperty(value = "所在区域(行政区域表的code)")
     @TableField("local_area")
     private String localArea;
 
@@ -103,4 +113,32 @@ public class BaseExpert {
     @ApiModelProperty(value = "身份证号")
     @TableField("id_number")
     private String idNumber;
+
+    /**
+     * 创建人
+     */
+    @ApiModelProperty(value = "创建人")
+    @TableField("created")
+    private String created;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新人
+     */
+    @ApiModelProperty(value = "更新人")
+    @TableField("updated")
+    private String updated;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间")
+    @TableField("update_time")
+    private Date updateTime;
 }

+ 4 - 0
purchase-system/src/main/java/com/ozs/base/domain/BasePolicy.java

@@ -81,4 +81,8 @@ public class BasePolicy extends BaseDto
     @NotBlank(message = "es存储id")
     private String esId;
 
+    /** 1:在用,0:止用 */
+    @Excel(name = "状态 1:在用,0:止用")
+    @ApiModelProperty("1:在用,0:止用")
+    private String state;
 }

+ 1 - 1
purchase-system/src/main/java/com/ozs/base/domain/BaseSupplier.java

@@ -23,7 +23,7 @@ public class BaseSupplier {
     private Integer id;
 
     @NotBlank(message = "供应商名称不能为空")
-    @ApiModelProperty(value = "供应商名称不能为空")
+    @ApiModelProperty(value = "供应商名称")
     @TableField("supplier_name")
     private String supplierName;
 

+ 68 - 4
purchase-system/src/main/java/com/ozs/base/domain/vo/BaseExpertVo.java

@@ -1,13 +1,23 @@
 package com.ozs.base.domain.vo;
 
-import com.baomidou.mybatisplus.annotation.TableField;
+
 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 BaseExpertVo extends PageVo {
+
+    /**
+     * 查询抽取专家列表条件:项目名称,开始时间,结束时间
+     */
+    private String projectName;
+    private Date startTime;
+    private Date endTime;
+
     /**
      * 主键ID
      */
@@ -20,6 +30,18 @@ public class BaseExpertVo extends PageVo {
     @ApiModelProperty(value = "专家名称")
     private String expertName;
 
+    /**
+     * 专家类型
+     */
+    @ApiModelProperty(value = "专家类型,多个使用英文逗号分隔")
+    private String expertType;
+
+    /**
+     * 专家类型名
+     */
+    @ApiModelProperty(value = "专家类型名,多个使用英文逗号分隔")
+    private String expertTypeName;
+
     /**
      * 专家性别
      */
@@ -42,9 +64,15 @@ public class BaseExpertVo extends PageVo {
     /**
      * 专业类型
      */
-    @ApiModelProperty(value = "专业类型")
+    @ApiModelProperty(value = "专业类型,多个使用英文逗号分隔")
     private String majorType;
 
+    /**
+     * 专业类型名
+     */
+    @ApiModelProperty(value = "专业类型名,多个使用英文逗号分隔")
+    private String majorTypeName;
+
     /**
      * 单位信息
      */
@@ -60,9 +88,15 @@ public class BaseExpertVo extends PageVo {
     /**
      * 采购品种
      */
-    @ApiModelProperty(value = "采购品种")
+    @ApiModelProperty(value = "采购品种,多个使用英文逗号分隔")
     private String varietyPurchase;
 
+    /**
+     * 采购品种名
+     */
+    @ApiModelProperty(value = "采购品种名,多个使用英文逗号分隔")
+    private String varietyPurchaseName;
+
     /**
      * 职称
      */
@@ -78,12 +112,42 @@ public class BaseExpertVo extends PageVo {
     /**
      * 所在区域
      */
-    @ApiModelProperty(value = "所在区域")
+    @ApiModelProperty(value = "所在区域(行政区域表的code)")
     private String localArea;
 
+    /**
+     * 所在区域
+     */
+    @ApiModelProperty(value = "所在区域名(省/市/县)")
+    private String localAreaName;
+
     /**
      * 身份证号
      */
     @ApiModelProperty(value = "身份证号")
     private String idNumber;
+
+    /**
+     * 创建人
+     */
+    @ApiModelProperty(value = "创建人")
+    private String created;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新人
+     */
+    @ApiModelProperty(value = "更新人")
+    private String updated;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
 }

+ 2 - 0
purchase-system/src/main/java/com/ozs/base/mapper/BaseProfessionalMapper.java

@@ -32,4 +32,6 @@ public interface BaseProfessionalMapper extends BaseMapper<BaseProfessional> {
     List<BaseProfessional> selectByProfessionalName(BaseProfessional baseProfessional);
 
     List<BaseProfessional> selectByParentCodes(BaseProfessional baseProfessional);
+
+    BaseProfessional selectByCode(@Param("parentCode") String parentCode);
 }

+ 6 - 0
purchase-system/src/main/java/com/ozs/base/service/BaseExpertService.java

@@ -3,9 +3,15 @@ package com.ozs.base.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ozs.base.domain.BaseAgency;
 import com.ozs.base.domain.BaseExpert;
+import com.ozs.base.domain.vo.BaseExpertVo;
+import com.ozs.common.core.domain.AjaxResult;
 
 public interface BaseExpertService  extends IService<BaseExpert> {
     int insertExpert(BaseExpert baseExpert);
 
     int updateSupplierType(BaseExpert baseExpert);
+
+    AjaxResult selectReviewProject(BaseExpertVo baseExpertVo);
+
+    AjaxResult selectExtractionExpert(BaseExpertVo baseExpertVo);
 }

+ 121 - 4
purchase-system/src/main/java/com/ozs/base/service/impl/BaseExpertServiceImpl.java

@@ -1,31 +1,58 @@
 package com.ozs.base.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+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.BaseAgency;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
 import com.ozs.base.domain.BaseExpert;
 import com.ozs.base.domain.BaseUnitInformation;
+import com.ozs.base.domain.vo.BaseExpertVo;
 import com.ozs.base.mapper.BaseExpertMapper;
-import com.ozs.base.mapper.BaseSupplierMapper;
 import com.ozs.base.service.BaseExpertService;
-import com.ozs.common.core.domain.model.LoginUser;
+import com.ozs.common.core.domain.AjaxResult;
+import com.ozs.common.enums.*;
 import com.ozs.common.utils.StringUtils;
+import com.ozs.common.utils.bean.BeanUtils;
+import com.ozs.plan.doman.PlanQuarter;
+import com.ozs.plan.doman.ProvisionalPlan;
+import com.ozs.pm.doman.PmDemand;
+import com.ozs.pm.doman.PmDemandExpertRef;
+import com.ozs.pm.doman.vo.responseVo.PmDemandResVo;
+import com.ozs.pm.service.IPmDemandService;
+import com.ozs.pm.service.PmDemandExpertRefService;
+import com.ozs.system.domain.vo.responseVo.SysDeptResponseVo;
+import com.ozs.system.service.ISysDeptService;
+import com.ozs.system.service.ISysDictDataService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 @Service
 public class BaseExpertServiceImpl extends ServiceImpl<BaseExpertMapper, BaseExpert> implements BaseExpertService {
 
     @Autowired
     private BaseExpertMapper baseExpertMapper;
+    @Autowired
+    private PmDemandExpertRefService pmDemandExpertRefService;
+    @Autowired
+    private IPmDemandService pmDemandService;
+    @Autowired
+    private ISysDeptService deptService;
+    @Autowired
+    private ISysDictDataService dictDataService;
 
     @Override
     public int insertExpert(BaseExpert baseExpert) {
         // base_unit_information 单位信息表
-        if(StringUtils.isNotNull(baseExpert.getUnitInformation())) {
+        if (StringUtils.isNotNull(baseExpert.getUnitInformation())) {
             List<BaseUnitInformation> baseUnitInformationList = baseExpertMapper.selectByUnitInformation(baseExpert.getUnitInformation());
             if (baseUnitInformationList.size() <= 0) {
                 BaseUnitInformation baseUnitInformation = new BaseUnitInformation();
@@ -48,4 +75,94 @@ public class BaseExpertServiceImpl extends ServiceImpl<BaseExpertMapper, BaseExp
                 .set(BaseExpert::getStatus, baseExpert.getStatus());
         return baseExpertMapper.update(null, lambdaUpdateWrapper);
     }
+
+    @Override
+    public AjaxResult selectReviewProject(BaseExpertVo baseExpertVo) {
+        // 通过专家ID查询 与专家库关联的采购执行管理ID
+        List<Integer> demandIdList = pmDemandExpertRefService.selectByExpertId(baseExpertVo.getId());
+        if (demandIdList.size() == 0) {
+            return AjaxResult.error("当前专家还有有被抽取!");
+        }
+        List<PmDemand> pmDemandList = pmDemandService.selectByDemandIdList(demandIdList);
+        List<PmDemandResVo> pmDemandResponseVoList = changTo(pmDemandList);
+        PageHelper.startPage(baseExpertVo.getPageNum().intValue(), baseExpertVo.getPageSize().intValue());
+        PageInfo<PmDemandResVo> pageInfo = new PageInfo<>(pmDemandResponseVoList);
+        return AjaxResult.success(pageInfo);
+    }
+
+    @Override
+    public AjaxResult selectExtractionExpert(BaseExpertVo baseExpertVo) {
+        List<PmDemand> pmDemandList = pmDemandService.selectExtractionExpert(baseExpertVo);
+        List<PmDemandResVo> pmDemandResponseVoList = changTo(pmDemandList);
+        PageHelper.startPage(baseExpertVo.getPageNum().intValue(), baseExpertVo.getPageSize().intValue());
+        PageInfo<PmDemandResVo> pageInfo = new PageInfo<>(pmDemandResponseVoList);
+        return AjaxResult.success(pageInfo);
+    }
+
+    private List<PmDemandResVo> changTo(List<PmDemand> pmDemandList) {
+        List<PmDemandResVo> pmDemandResponseVoList = new ArrayList<>();
+        if (pmDemandList != null && pmDemandList.size() > 0) {
+            for (PmDemand pmDemand1 : pmDemandList) {
+                PmDemandResVo vo = new PmDemandResVo();
+                BeanUtils.copyProperties(pmDemand1, vo);
+                if (vo.getPurchaseDeptId() != null) {
+                    Map<String, Object> deptMap = deptService.selectDeptById(vo.getPurchaseDeptId());
+                    if (deptMap != null) {
+                        SysDeptResponseVo sysDeptResponseVo = (SysDeptResponseVo) deptMap.get("sysDept");
+                        if (sysDeptResponseVo != null) {
+                            vo.setPurchaseDeptName(sysDeptResponseVo.getDeptName());
+                        }
+                    }
+                }
+                String purchaseServicesName = dictDataService.selectDictLabel("purchase_services", vo.getPurchaseServices());
+                if (StringUtils.isNotEmpty(purchaseServicesName)) {
+                    vo.setPurchaseServicesName(purchaseServicesName);
+                }
+                //项目类型
+                for (ProjectTypes value : ProjectTypes.values()) {
+                    if (vo.getProjectType() != null && vo.getProjectType().equals(value.getCode())) {
+                        vo.setProjectTypeName(value.getInfo());
+                        break;
+                    }
+                }
+                //是否为超限额计划
+                for (IsExcess value : IsExcess.values()) {
+                    if (vo.getIsExcess() != null && vo.getIsExcess().equals(value.getCode())) {
+                        vo.setIsExcessName(value.getInfo());
+                        break;
+                    }
+                }
+                //采购方式
+                for (PlanPurchaseMode value : PlanPurchaseMode.values()) {
+                    if (vo.getPurchaseMode() != null && vo.getPurchaseMode().equals(value.getCode())) {
+                        vo.setPurchaseModeName(value.getInfo());
+                        break;
+                    }
+                }
+                //项目属性
+                for (ProjectAttribute value : ProjectAttribute.values()) {
+                    if (vo.getProjectAttr() != null && vo.getProjectAttr().equals(value.getCode())) {
+                        vo.setProjectAttrName(value.getInfo());
+                        break;
+                    }
+                }
+                //预警状态
+                for (WarnStatus value : WarnStatus.values()) {
+                    if (vo.getWarnStatus() != null && vo.getWarnStatus().equals(value.getCode())) {
+                        vo.setWarnStatusName(value.getInfo());
+                        break;
+                    }
+                }
+                //项目状态
+                for (PmProjectStatus value : PmProjectStatus.values()) {
+                    if (vo.getProjectStatus() != null && vo.getProjectStatus().equals(value.getCode())) {
+                        vo.setProjectStatusName(value.getInfo());
+                        break;
+                    }
+                }
+                pmDemandResponseVoList.add(vo);
+            }
+        }
+        return pmDemandResponseVoList;
+    }
 }

+ 31 - 1
purchase-system/src/main/java/com/ozs/base/service/impl/BaseProfessionalServiceImpl.java

@@ -9,6 +9,7 @@ import com.ozs.common.core.domain.entity.SysDictType;
 import com.ozs.common.core.domain.entity.SysUser;
 import com.ozs.common.exception.ServiceException;
 import com.ozs.common.utils.DictUtils;
+import com.ozs.common.utils.StringUtils;
 import com.ozs.common.utils.bean.BeanUtils;
 import com.ozs.common.utils.bean.BeanValidators;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -79,7 +80,18 @@ public class BaseProfessionalServiceImpl extends ServiceImpl<BaseProfessionalMap
 
     @Override
     public List<BaseProfessionalVo> selectBaseProfessionalVo(BaseProfessionalVo baseProfessionalVo) {
-        List<BaseProfessional> allList = baseProfessionalMapper.selectBaseProfessional(baseProfessionalVo);
+        List<BaseProfessional> allList = new ArrayList<>();
+        List<BaseProfessional> list = baseProfessionalMapper.selectBaseProfessional(baseProfessionalVo);
+        allList.addAll(list);
+        // 传惨"品目名称professionalName" 需查询是否有上级数据
+        if (StringUtils.isNotNull(baseProfessionalVo.getProfessionalName())) {
+            for (BaseProfessional baseProfessional : list) {
+                // 遍历数据父级code 在列表中是否存在;如果不存在查询code等于当前数据父级code的数据,放入列表
+                List<BaseProfessional> listStream = new ArrayList<>();
+                listStream = listStream(list, listStream, baseProfessional.getParentCode());
+                allList.addAll(listStream);
+            }
+        }
         // 将实体类转换为Vo类
         List<BaseProfessionalVo> allListVo = BeanUtils.entityListToVOList(allList, BaseProfessionalVo.class);
         List<BaseProfessionalVo> treeList = buildTree(allListVo);
@@ -92,6 +104,24 @@ public class BaseProfessionalServiceImpl extends ServiceImpl<BaseProfessionalMap
         return allList;
     }
 
+    /**
+     * 遍历list 是否存在当前数据code
+     */
+    public List<BaseProfessional> listStream(List<BaseProfessional> list, List<BaseProfessional> listStream, String parentCode) {
+        // 遍历数据父级code 在列表中是否存在;如果不存在查询code等于当前数据父级code的数据,放入列表
+        boolean check = list.stream().anyMatch(voList -> voList.getProfessionalCode().equals(parentCode));
+        if (!check) {
+            BaseProfessional baseProfessional = baseProfessionalMapper.selectByCode(parentCode);
+            if (StringUtils.isNotNull(baseProfessional)) {
+                listStream.add(baseProfessional);
+                if (!"0".equals(baseProfessional.getParentCode())) {
+                    listStream(list, listStream, baseProfessional.getParentCode());
+                }
+            }
+        }
+        return listStream;
+    }
+
     /**
      * 构建树形结构
      *

+ 133 - 0
purchase-system/src/main/java/com/ozs/home/domain/vo/HomeToDoQueryResVo.java

@@ -0,0 +1,133 @@
+package com.ozs.home.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ozs.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 查询系统首页待办事项的返回数据对象
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("系统首页待办事项计划与项目数据融合对象")
+public class HomeToDoQueryResVo implements Serializable {
+
+    /**
+     * 季度计划id
+     */
+    private Long planPracticalId;
+    /**
+     * 年度计划id(年度计划审批后同步到季度计划)
+     */
+    private Long planYearId;
+    /**
+     * 项目id
+     */
+    private Long demandId;
+
+    /**
+     * 项目关联计划ID
+     */
+    @Excel(name = "计划ID")
+    @ApiModelProperty("计划ID")
+    private Long planId;
+
+    /**
+     * 采购单位(登录账号的单位名称)
+     */
+    @ApiModelProperty("采购单位(登录账号的单位名称)")
+    private String purchaseDeptName;
+
+
+    /**
+     * 项目名称
+     */
+    @Excel(name = "项目名称")
+    @ApiModelProperty("项目名称")
+    private String projectName;
+
+    /**
+     * 项目类型(0:装备类;1:物资类;2:服务类;3:工程类)
+     */
+    @Excel(name = "项目类型(0:装备类;1:物资类;2:服务类;3:工程类)")
+    @ApiModelProperty("项目类型(0:装备类;1:物资类;2:服务类;3:工程类)")
+    private String projectType;
+
+    /**
+     * 项目类型名(0:装备类;1:物资类;2:服务类;3:工程类)
+     */
+    @Excel(name = "项目类型名(0:装备类;1:物资类;2:服务类;3:工程类)")
+    @ApiModelProperty("项目类型名(0:装备类;1:物资类;2:服务类;3:工程类)")
+    private String projectTypeName;
+
+    /**
+     * 需求概况
+     */
+    @Excel(name = "需求概况")
+    @ApiModelProperty("需求概况")
+    private String demandOverview;
+
+    /**
+     * 概算金额(万元(保留小数点后两位)
+     */
+    @Excel(name = "概算金额(万元 保留小数点后两位")
+    @ApiModelProperty("概算金额(万元(保留小数点后两位)")
+    private BigDecimal evaluation;
+
+    /**
+     * 计划提报需求时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "计划提报需求时间")
+    @ApiModelProperty("计划提报需求时间")
+    private Date planDemandSubTime;
+
+    /**
+     * 计划完成采购时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "计划完成采购时间")
+    @ApiModelProperty("计划完成采购时间")
+    private Date planPurchaseFinishTime;
+
+    /**
+     * 计划交付时间-
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "计划交付时间", width = 30, dateFormat = "yyyy-MM-dd")
+    @ApiModelProperty("计划交付时间")
+    private Date planDeliverTime;
+    /**
+     * 计划类型(0:季度计划,1:临时计划)
+     */
+    private Integer planType;
+    /**
+     * 待办事项提示信息
+     */
+    private String tipsMessage;
+    /**
+     * 项目状态(4:需求待填制,5:需求待提交,6:需求待审核,7:任务待下达,8:任务已下达,9:中标信息待填制,10:中标信息已填制,11:合同待填制,12:合同已填制,13:项目建设中,14:项目建设完成)
+     */
+    @ApiModelProperty("项目状态(4:需求待填制,5:需求待提交,6:需求待审核,7:任务待下达,8:任务已下达,9:中标信息待填制,10:中标信息已填制,11:合同待填制,12:合同已填制,13:项目建设中,14:项目建设完成)")
+    private String projectStatus;
+    /**
+     * 项目状态名称
+     */
+    @ApiModelProperty("项目状态名称")
+    private String projectStatusName;
+    /**
+     * 项目是否滞后
+     */
+    private String isExceedProject;
+}

+ 5 - 0
purchase-system/src/main/java/com/ozs/plan/doman/MonthlyReconciliation.java

@@ -85,10 +85,12 @@ public class MonthlyReconciliation extends BaseEntity
 
     /** 计划提报需求时间--->需求单位成功提报采购需求的日期(具体到月) */
     @Excel(name = "计划提报需求时间--->需求单位成功提报采购需求的日期", readConverterExp = "具=体到月")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     private Date planDemandSubTime;
 
     /** 计划完成采购时间--->公示中标结果的日期,即填制中标信息的日期(具体到月) */
     @Excel(name = "计划完成采购时间--->公示中标结果的日期,即填制中标信息的日期", readConverterExp = "具=体到月")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     private Date planPurchaseFinishTime;
 
     /** 计划交付时间--->供应商完成并交付后,使用单位收到标的日期,即填制建设文档的日期 */
@@ -110,14 +112,17 @@ public class MonthlyReconciliation extends BaseEntity
 
     /** 实际提报需求时间--->需求单位成功提报采购需求的日期(具体到日) */
     @Excel(name = "实际提报需求时间--->需求单位成功提报采购需求的日期", readConverterExp = "具=体到日")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date realDemandCommitTime;
 
     /** 实际完成采购时间--->公示中标结果的日期,即填制中标信息的日期(具体到日) */
     @Excel(name = "实际完成采购时间--->公示中标结果的日期,即填制中标信息的日期", readConverterExp = "具=体到日")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date realPurchaseFinishTime;
 
     /** 实际交付(实施)时间--->供应商完成并交付后,使用单位收到标的日期,即填制建设文档的日期 */
     @Excel(name = "实际交付", readConverterExp = "实=施")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date realDeliverTime;
 
     /** 审核时间 */

+ 8 - 16
purchase-system/src/main/java/com/ozs/plan/doman/PlanQuarter.java

@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.ozs.common.annotation.Excel;
 import lombok.Data;
 import nonapi.io.github.classgraph.json.Id;
 
@@ -39,13 +38,11 @@ public class PlanQuarter {
     @NotNull(message = "采购单位不能为空")
     private String purchaseDeptId;
 
-    @Excel(name = "采购单位")
     @TableField(exist = false)
     private String purchaseDeptName;
     /**
      * 项目名称
      */
-    @Excel(name = "项目名称")
     @NotNull(message = "项目名称不能为空")
     private String projectName;
     /**
@@ -53,19 +50,16 @@ public class PlanQuarter {
      */
     @NotNull(message = "项目类型不能为空")
     private String projectType;
-    @Excel(name = "项目类型")
     @TableField(exist = false)
     private String projectTypeStr;
     /**
      * 需求概况
      */
-    @Excel(name = "需求概况")
     @NotNull(message = "需求概况不能为空")
     private String demandOverview;
     /**
      * 概算金额(万元(保留小数点后两位)
      */
-    @Excel(name = "概算金额(万元)")
     @NotNull(message = "概算金额不能为空")
     private BigDecimal evaluation;
     /**
@@ -78,7 +72,6 @@ public class PlanQuarter {
      */
     @NotNull(message = "采购服务站不能为空")
     private String purchaseServices;
-    @Excel(name = "采购服务站")
     @TableField(exist = false)
     private String purchaseServicesStr;
     /**
@@ -86,27 +79,23 @@ public class PlanQuarter {
      */
     @NotNull(message = "采购方式不能为空")
     private String purchaseMode;
-    @Excel(name = "采购方式")
     @TableField(exist = false)
     private String purchaseModeStr;
     /**
      * 计划提报需求时间--->需求单位成功提报采购需求的日期(具体到月)
      */
-    @Excel(name = "提报需求时间", dateFormat = "yyyy-MM-dd")
     @NotNull(message = "计划提报需求时间不能为空")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date planDemandSubTime;
     /**
      * 计划完成采购时间--->公示中标结果的日期,即填制中标信息的日期(具体到月)
      */
-    @Excel(name = "完成采购时间", dateFormat = "yyyy-MM-dd")
     @NotNull(message = "计划完成采购时间不能为空")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date planPurchaseFinishTime;
     /**
      * 计划交付时间--->供应商完成并交付后,使用单位收到标的日期,即填制建设文档的日期
      */
-    @Excel(name = "交付(实施)时间", dateFormat = "yyyy-MM-dd")
     @NotNull(message = "计划交付时间不能为空")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date planDeliverTime;
@@ -116,24 +105,24 @@ public class PlanQuarter {
     @NotNull(message = "项目属性不能为空")
     private String projectAttr;
 
-    @Excel(name = "项目属性")
     @TableField(exist = false)
     private String projectAttrStr;
     /**
      * 退回原因--->审核不通过就是退回
      */
-    @Excel(name = "退回原因")
     private String refuseReason;
+    /**
+     * 滞后原因
+     */
+    private String delayReason;
     /**
      * 计划调整情况及理由--->如计划需要变更,在填写申请修改时需填写调整情况及理由,审核单位审核通过后显示
      */
-    @Excel(name = "计划调整情况及理由")
     @NotNull(message = "计划调整情况及理由不能为空")
     private String adjustReason;
     /**
      * 备注
      */
-    @Excel(name = "备注")
     private String remarks;
 
     /**
@@ -145,7 +134,10 @@ public class PlanQuarter {
      * 发函状态(0:未发函或已处理,1:确认发函)
      */
     private String sendLetter;
-
+    /**
+     * 发函内容
+     */
+    private String letterStr;
     /**
      * 创建者
      */

+ 8 - 15
purchase-system/src/main/java/com/ozs/plan/doman/PlanYears.java

@@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.ozs.common.annotation.Excel;
 import lombok.Data;
 import nonapi.io.github.classgraph.json.Id;
 
@@ -31,13 +30,11 @@ public class PlanYears {
     @NotNull(message = "采购单位不能为空")
     private String purchaseDeptId;
 
-    @Excel(name = "采购单位")
     @TableField(exist = false)
     private String purchaseDeptName;
     /**
      * 项目名称
      */
-    @Excel(name = "项目名称")
     @NotNull(message = "项目名称不能为空")
     private String projectName;
     /**
@@ -45,19 +42,16 @@ public class PlanYears {
      */
     @NotNull(message = "项目类型不能为空")
     private String projectType;
-    @Excel(name = "项目类型")
     @TableField(exist = false)
     private String projectTypeStr;
     /**
      * 需求概况
      */
-    @Excel(name = "需求概况")
     @NotNull(message = "需求概况不能为空")
     private String demandOverview;
     /**
      * 概算金额(万元(保留小数点后两位)
      */
-    @Excel(name = "概算金额(万元)")
     @NotNull(message = "概算金额不能为空")
     private BigDecimal evaluation;
     /**
@@ -70,7 +64,6 @@ public class PlanYears {
      */
     @NotNull(message = "采购服务站不能为空")
     private String purchaseServices;
-    @Excel(name = "采购服务站")
     @TableField(exist = false)
     private String purchaseServicesStr;
     /**
@@ -78,27 +71,23 @@ public class PlanYears {
      */
     @NotNull(message = "采购方式不能为空")
     private String purchaseMode;
-    @Excel(name = "采购方式")
     @TableField(exist = false)
     private String purchaseModeStr;
     /**
      * 计划提报需求时间--->需求单位成功提报采购需求的日期(具体到月)
      */
-    @Excel(name = "提报需求时间", dateFormat = "yyyy-MM-dd")
     @NotNull(message = "计划提报需求时间不能为空")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date planDemandSubTime;
     /**
      * 计划完成采购时间--->公示中标结果的日期,即填制中标信息的日期(具体到月)
      */
-    @Excel(name = "完成采购时间", dateFormat = "yyyy-MM-dd")
     @NotNull(message = "计划完成采购时间不能为空")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date planPurchaseFinishTime;
     /**
      * 计划交付时间--->供应商完成并交付后,使用单位收到标的日期,即填制建设文档的日期
      */
-    @Excel(name = "交付(实施)时间", dateFormat = "yyyy-MM-dd")
     @NotNull(message = "计划交付时间不能为空")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date planDeliverTime;
@@ -108,24 +97,24 @@ public class PlanYears {
     @NotNull(message = "项目属性不能为空")
     private String projectAttr;
 
-    @Excel(name = "项目属性")
     @TableField(exist = false)
     private String projectAttrStr;
     /**
      * 退回原因--->审核不通过就是退回
      */
-    @Excel(name = "退回原因")
     private String refuseReason;
+    /**
+     * 滞后原因
+     */
+    private String delayReason;
     /**
      * 计划调整情况及理由--->如计划需要变更,在填写申请修改时需填写调整情况及理由,审核单位审核通过后显示
      */
-    @Excel(name = "计划调整情况及理由")
     @NotNull(message = "计划调整情况及理由不能为空")
     private String adjustReason;
     /**
      * 备注
      */
-    @Excel(name = "备注")
     private String remarks;
 
     /**
@@ -137,6 +126,10 @@ public class PlanYears {
      * 发函状态(0:未发函或已处理,1:确认发函)
      */
     private String sendLetter;
+    /**
+     * 发函内容
+     */
+    private String letterStr;
 
 
     /**

+ 14 - 5
purchase-system/src/main/java/com/ozs/plan/doman/vo/requestVo/PlanQuarterStandardVo.java

@@ -8,6 +8,7 @@ import com.ozs.system.domain.SysFileRef;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
@@ -119,12 +120,21 @@ public class PlanQuarterStandardVo extends PageVo {
      */
     @ApiModelProperty(value = "项目状态(0:计划待提交,1:计划待审核,2:计划已退回,3:计划已审核)")
     private String projectStatus;
-
+    /**
+     * 发函内容
+     */
+    @ApiModelProperty(value = "发函内容")
+    private String letterStr;
     /**
      * 退回原因--->审核不通过就是退回
      */
+    @ApiModelProperty(value = "退回原因")
     private String refuseReason;
-
+    /**
+     * 滞后原因
+     */
+    @ApiModelProperty(value = "滞后原因")
+    private String delayReason;
     /**
      * 备注
      */
@@ -133,10 +143,9 @@ public class PlanQuarterStandardVo extends PageVo {
     private String remarks;
 
     /**
-     * 退回原因--->审核不通过就是退回
+     * 计划调整情况及理由--->如计划需要变更,在填写申请修改时需填写调整情况及理由,审核单位审核通过后显示
      */
-    @ApiModelProperty(value = "退回原因")
-    private String reasonOfReturn;
+    private String adjustReason;
 
     /**
      * 创建者

+ 15 - 5
purchase-system/src/main/java/com/ozs/plan/doman/vo/requestVo/PlanYearsStandardVo.java

@@ -8,6 +8,7 @@ import com.ozs.system.domain.SysFileRef;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
@@ -115,12 +116,19 @@ public class PlanYearsStandardVo extends PageVo {
      */
     @ApiModelProperty(value = "项目状态(0:计划待提交,1:计划待审核,2:计划已退回,3:计划已审核)")
     private String projectStatus;
-
+    /**
+     * 发函内容
+     */
+    private String letterStr;
     /**
      * 退回原因--->审核不通过就是退回
      */
+    @ApiModelProperty(value = "退回原因")
     private String refuseReason;
-
+    /**
+     * 滞后原因
+     */
+    private String delayReason;
     /**
      * 备注
      */
@@ -129,10 +137,9 @@ public class PlanYearsStandardVo extends PageVo {
     private String remarks;
 
     /**
-     * 退回原因--->审核不通过就是退回
+     * 计划调整情况及理由--->如计划需要变更,在填写申请修改时需填写调整情况及理由,审核单位审核通过后显示
      */
-    @ApiModelProperty(value = "退回原因")
-    private String reasonOfReturn;
+    private String adjustReason;
 
     /**
      * 创建者
@@ -157,4 +164,7 @@ public class PlanYearsStandardVo extends PageVo {
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date endTime;
 
+    /** 查看详情的类型 */
+    @ApiModelProperty("详情类型,1项目计划,2需求建档,3任务下达,4中标信息,5合同信息,6建设情况")
+    private String detailType;
 }

+ 5 - 0
purchase-system/src/main/java/com/ozs/plan/doman/vo/requestVo/ProvisionalPlanVo.java

@@ -3,6 +3,7 @@ package com.ozs.plan.doman.vo.requestVo;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ozs.common.vo.PageVo;
+import com.ozs.system.domain.SysFileInfo;
 import com.ozs.system.domain.SysFileRef;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -21,6 +22,10 @@ public class ProvisionalPlanVo extends PageVo {
      * 上传附件
      */
     private List<SysFileRef> sysFileRefs;
+    /**
+     * 已上传的关联附件信息
+     */
+    List<SysFileInfo> fileInfos;
 
     @ApiModelProperty(value = "主键ID")
     private Integer planPracticalId;

+ 32 - 14
purchase-system/src/main/java/com/ozs/plan/doman/vo/responseVo/PlanQuarterResponseVo.java

@@ -28,18 +28,20 @@ public class PlanQuarterResponseVo implements Serializable {
     /**
      * 采购单位(登录账号的单位)
      */
+    private String purchaseDeptId;
     @Excel(name = "采购单位")
-    private Long purchaseDeptId;
+    private String purchaseDeptName;
     /**
      * 项目名称
      */
     @Excel(name = "项目名称")
     private String projectName;
     /**
-     * 项目名称
+     * 项目类型
      */
-    @Excel(name = "项目类型")
     private String projectType;
+    @Excel(name = "项目类型")
+    private String projectTypeStr;
     /**
      * 需求概况
      */
@@ -48,46 +50,49 @@ public class PlanQuarterResponseVo implements Serializable {
     /**
      * 概算金额(万元(保留小数点后两位)
      */
-    @Excel(name = "概算金额")
+    @Excel(name = "概算金额(万元)")
     private BigDecimal evaluation;
     /**
      * 是否为超限额计划(0:未超额,1:超额)
      */
-    @Excel(name = "是否为超限额计划")
     private String isExcess;
     /**
      * 采购服务站
      */
-    @Excel(name = "采购服务站")
     private String purchaseServices;
+    @Excel(name = "采购服务站")
+    private String purchaseServicesStr;
     /**
      * 采购方式 (0:公开招标, 1:单一来源,2:邀请招标,3:竞争式谈判,4:询价)
      */
-    @Excel(name = "采购方式")
     private String purchaseMode;
+    @Excel(name = "采购方式")
+    private String purchaseModeStr;
     /**
      * 计划提报需求时间--->需求单位成功提报采购需求的日期(具体到月)
      */
-    @Excel(name = "计划提报需求时间")
+    @Excel(name = "提报需求时间", dateFormat = "yyyy-MM-dd")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date planDemandSubTime;
     /**
      * 计划完成采购时间--->公示中标结果的日期,即填制中标信息的日期(具体到月)
      */
-    @Excel(name = "计划完成采购时间")
+    @Excel(name = "完成采购时间", dateFormat = "yyyy-MM-dd")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date planPurchaseFinishTime;
     /**
      * 计划交付时间--->供应商完成并交付后,使用单位收到标的日期,即填制建设文档的日期
      */
-    @Excel(name = "计划交付时间")
+    @Excel(name = "交付(实施)时间", dateFormat = "yyyy-MM-dd")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date planDeliverTime;
     /**
      * 项目属性--->应急应战项目、重大规划任务项目、规划任务项目或一般项目
      */
-    @Excel(name = "项目属性")
     private String projectAttr;
+    @Excel(name = "项目属性")
+    private String projectAttrStr;
+
     /**
      * 计划调整情况及理由--->如计划需要变更,在填写申请修改时需填写调整情况及理由,审核单位审核通过后显示
      */
@@ -102,13 +107,20 @@ public class PlanQuarterResponseVo implements Serializable {
      * 项目状态--->包括计划待提交、计划待审核、计划已退回、计划已审核
      * (0:计划待提交,1:计划待审核,2:计划已退回,3:计划已审核)
      */
-    @Excel(name = "项目状态")
     private String projectStatus;
 
     /**
      * 发函状态(0:未发函或已处理,1:确认发函)
      */
     private String sendLetter;
+    /**
+     * 发函内容
+     */
+    private String letterStr;
+    /**
+     * 逻辑删除字段--->(0:正常,1:已删除)
+     */
+    private Integer delFlay;
     /**
      * 计划类型(0:季度计划,1:临时计划)
      */
@@ -117,10 +129,16 @@ public class PlanQuarterResponseVo implements Serializable {
      * 退回原因--->审核不通过就是退回
      */
     private String refuseReason;
-
+    /**
+     * 滞后原因
+     */
+    private String delayReason;
     /**
      * 已上传的关联附件信息
      */
     List<SysFileInfo> fileInfos;
-
+    /**
+     * 待办事项提示信息
+     */
+    private String tipsMessage;
 }

+ 35 - 18
purchase-system/src/main/java/com/ozs/plan/doman/vo/responseVo/PlanYearsResponseVo.java

@@ -9,7 +9,6 @@ import lombok.Data;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
-import java.util.HashMap;
 import java.util.List;
 
 /**
@@ -25,8 +24,12 @@ public class PlanYearsResponseVo implements Serializable {
     /**
      * 采购单位(登录账号的单位)
      */
+    private String purchaseDeptId;
+    /**
+     * 采购单位名称
+     */
     @Excel(name = "采购单位")
-    private Long purchaseDeptId;
+    private String purchaseDeptName;
     /**
      * 项目名称
      */
@@ -35,8 +38,9 @@ public class PlanYearsResponseVo implements Serializable {
     /**
      * 项目名称
      */
-    @Excel(name = "项目类型")
     private String projectType;
+    @Excel(name = "项目类型")
+    private String projectTypeStr;
     /**
      * 需求概况
      */
@@ -45,50 +49,59 @@ public class PlanYearsResponseVo implements Serializable {
     /**
      * 概算金额(万元(保留小数点后两位)
      */
-    @Excel(name = "概算金额")
+    @Excel(name = "概算金额(万元)")
     private BigDecimal evaluation;
     /**
      * 是否为超限额计划(0:未超额,1:超额)
      */
-    @Excel(name = "是否为超限额计划")
     private String isExcess;
     /**
      * 采购服务站
      */
-    @Excel(name = "采购服务站")
     private String purchaseServices;
+    @Excel(name = "采购服务站")
+    private String purchaseServicesStr;
     /**
      * 采购方式 (0:公开招标, 1:单一来源,2:邀请招标,3:竞争式谈判,4:询价)
      */
-    @Excel(name = "采购方式")
     private String purchaseMode;
+    @Excel(name = "采购方式")
+    private String purchaseModeStr;
     /**
      * 计划提报需求时间--->需求单位成功提报采购需求的日期(具体到月)
      */
-    @Excel(name = "计划提报需求时间")
+    @Excel(name = "计划提报需求时间", dateFormat = "yyyy-MM-dd")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date planDemandSubTime;
     /**
      * 计划完成采购时间--->公示中标结果的日期,即填制中标信息的日期(具体到月)
      */
-    @Excel(name = "计划完成采购时间")
+    @Excel(name = "计划完成采购时间", dateFormat = "yyyy-MM-dd")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date planPurchaseFinishTime;
     /**
      * 计划交付时间--->供应商完成并交付后,使用单位收到标的日期,即填制建设文档的日期
      */
-    @Excel(name = "计划交付时间")
+    @Excel(name = "计划交付(实施)时间", dateFormat = "yyyy-MM-dd")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date planDeliverTime;
     /**
      * 项目属性--->应急应战项目、重大规划任务项目、规划任务项目或一般项目
      */
-    @Excel(name = "项目属性")
     private String projectAttr;
+    @Excel(name = "项目属性")
+    private String projectAttrStr;
+    /**
+     * 退回原因--->审核不通过就是退回
+     */
+    private String refuseReason;
+    /**
+     * 滞后原因
+     */
+    private String delayReason;
     /**
      * 计划调整情况及理由--->如计划需要变更,在填写申请修改时需填写调整情况及理由,审核单位审核通过后显示
      */
-    @Excel(name = "计划调整情况及理由")
     private String adjustReason;
     /**
      * 备注
@@ -99,22 +112,26 @@ public class PlanYearsResponseVo implements Serializable {
      * 项目状态--->包括计划待提交、计划待审核、计划已退回、计划已审核
      * (0:计划待提交,1:计划待审核,2:计划已退回,3:计划已审核)
      */
-    @Excel(name = "项目状态")
     private String projectStatus;
 
     /**
      * 发函状态(0:未发函或已处理,1:确认发函)
      */
     private String sendLetter;
-
     /**
-     * 退回原因--->审核不通过就是退回
+     * 发函内容
      */
-    private String refuseReason;
-
+    private String letterStr;
     /**
      * 已上传的关联附件信息
      */
     List<SysFileInfo> fileInfos;
-
+    /**
+     * 逻辑删除字段--->(0:正常,1:已删除)
+     */
+    private Integer delFlay;
+    /**
+     * 待办事项提示信息
+     */
+    private String tipsMessage;
 }

+ 10 - 1
purchase-system/src/main/java/com/ozs/plan/mapper/PlanQuarterMapper.java

@@ -4,6 +4,7 @@ package com.ozs.plan.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ozs.plan.doman.PlanQuarter;
 import com.ozs.plan.doman.PlanQuarter;
+import com.ozs.plan.doman.vo.requestVo.PlanQuarterStandardVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -64,6 +65,14 @@ public interface PlanQuarterMapper extends BaseMapper<PlanQuarter> {
      */
     public PlanQuarter getById(Long planPracticalId);
 
+    /**
+     * 根据年度计划id查询季度计划
+     *
+     * @param planYearId 年度计划ID
+     * @return 结果
+     */
+    public PlanQuarter getByPlanYearId(Long planYearId);
+
     /**
      * 查询项目名称是否存在(除自己以外)
      *
@@ -84,7 +93,7 @@ public interface PlanQuarterMapper extends BaseMapper<PlanQuarter> {
 
     public Integer commit(Long planPracticalId);
 
-    public Integer review(PlanQuarter ofYears);
+    public Integer review(PlanQuarterStandardVo vo);
 
     Integer sendLetter(Long planPracticalId);
 }

+ 3 - 2
purchase-system/src/main/java/com/ozs/plan/mapper/PlanYearsMapper.java

@@ -3,6 +3,7 @@ package com.ozs.plan.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ozs.plan.doman.PlanYears;
+import com.ozs.plan.doman.vo.requestVo.PlanYearsStandardVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -83,7 +84,7 @@ public interface PlanYearsMapper extends BaseMapper<PlanYears> {
 
     public Integer commit(Long planYearId);
 
-    public Integer review(PlanYears ofYears);
+    public Integer review(PlanYearsStandardVo vo);
 
-    Integer sendLetter(Long planYearId);
+    public Integer sendLetter(PlanYearsStandardVo yearsStandardVo);
 }

+ 9 - 1
purchase-system/src/main/java/com/ozs/plan/mapper/ProvisionalPlanMapper.java

@@ -11,7 +11,7 @@ import java.util.List;
 
 @Mapper
 public interface ProvisionalPlanMapper extends BaseMapper<ProvisionalPlan> {
-    int deleteProvisionalPlanById(@Param("planYearId") Integer planYearId);
+    int deleteProvisionalPlanById(@Param("planPracticalId") Integer planPracticalId);
 
     int updateProvisionalPlanById(ProvisionalPlanVo provisionalPlan);
 
@@ -26,4 +26,12 @@ public interface ProvisionalPlanMapper extends BaseMapper<ProvisionalPlan> {
     List<ProvisionalPlan> selectProvisionalPlanAudit(ProvisionalPlanVo provisionalPlanVo);
 
     int review(ProvisionalPlan provisionalPlan);
+
+    /**
+     * 通过年度ID,查询季度、临时计划详情
+     *
+     * @param planYearId
+     * @return
+     */
+    ProvisionalPlan selectProvisionalPlanByYearId(@Param("planYearId") Integer planYearId);
 }

+ 6 - 20
purchase-system/src/main/java/com/ozs/plan/service/PlanQuarterService.java

@@ -2,12 +2,14 @@ package com.ozs.plan.service;
 
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
 import com.ozs.common.core.domain.AjaxResult;
 import com.ozs.common.core.domain.model.LoginUser;
 import com.ozs.plan.doman.PlanQuarter;
 import com.ozs.plan.doman.vo.requestVo.PlanQuarterStandardVo;
-import com.ozs.plan.doman.vo.requestVo.PlanYearsStandardVo;
+import com.ozs.plan.doman.vo.responseVo.PlanQuarterResponseVo;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 
 /**
@@ -15,15 +17,7 @@ import java.util.List;
  *
  * @author bu
  */
-public interface PlanQuarterService {
-
-    /**
-     * 查询季度计划记录集合
-     *
-     * @param vo 季度计划请求对象
-     * @return 季度计划记录集合
-     */
-    public Page selectPlanQuarterList(PlanQuarterStandardVo vo);
+public interface PlanQuarterService extends IService<PlanQuarter> {
 
     /**
      * 查询季度计划记录集合--导出
@@ -31,15 +25,7 @@ public interface PlanQuarterService {
      * @param vo 季度计划请求对象
      * @return 季度计划记录集合
      */
-    public List<PlanQuarter> selectPlanQuarterListEXP(PlanQuarterStandardVo vo);
-
-    /**
-     * 查询季度计划记录集合(审核单位)
-     *
-     * @param vo 季度计划请求对象
-     * @return 季度计划记录集合
-     */
-    public Page selectPlanQuarterExamineList(PlanQuarterStandardVo vo);
+    public List<PlanQuarterResponseVo> selectPlanQuarterListEXP(PlanQuarterStandardVo vo);
 
     /**
      * 查询季度计划记录集合(审核单位--导出)
@@ -47,7 +33,7 @@ public interface PlanQuarterService {
      * @param vo 季度计划请求对象
      * @return 季度计划记录集合
      */
-    public List<PlanQuarter> selectPlanQuarterExamineListEXP(PlanQuarterStandardVo vo);
+    public List<PlanQuarterResponseVo> selectPlanQuarterExamineListEXP(PlanQuarterStandardVo vo);
 
     /**
      * 创建季度计划

+ 57 - 18
purchase-system/src/main/java/com/ozs/plan/service/PlanYearsService.java

@@ -7,7 +7,8 @@ import com.ozs.common.core.domain.AjaxResult;
 import com.ozs.common.core.domain.model.LoginUser;
 import com.ozs.plan.doman.PlanYears;
 import com.ozs.plan.doman.vo.requestVo.PlanYearsStandardVo;
-import com.ozs.system.domain.SysOperLog;
+import com.ozs.plan.doman.vo.responseVo.PlanQuarterResponseVo;
+import com.ozs.plan.doman.vo.responseVo.PlanYearsResponseVo;
 
 import java.util.List;
 
@@ -18,13 +19,6 @@ import java.util.List;
  */
 public interface PlanYearsService extends IService<PlanYears> {
 
-    /**
-     * 查询年度计划记录集合
-     *
-     * @param vo 年度计划请求对象
-     * @return 年度计划记录集合
-     */
-    public Page selectPlanYearsList(PlanYearsStandardVo vo);
 
     /**
      * 查询年度计划记录集合--导出
@@ -32,15 +26,7 @@ public interface PlanYearsService extends IService<PlanYears> {
      * @param vo 年度计划请求对象
      * @return 年度计划记录集合
      */
-    public List<PlanYears> selectPlanYearsListEXP(PlanYearsStandardVo vo);
-
-    /**
-     * 查询年度计划记录集合(审核单位)
-     *
-     * @param vo 年度计划请求对象
-     * @return 年度计划记录集合
-     */
-    public Page selectPlanYearsExamineList(PlanYearsStandardVo vo);
+    public List<PlanYearsResponseVo> selectPlanYearsListEXP(PlanYearsStandardVo vo);
 
     /**
      * 查询年度计划记录集合(审核单位--导出)
@@ -48,7 +34,7 @@ public interface PlanYearsService extends IService<PlanYears> {
      * @param vo 年度计划请求对象
      * @return 年度计划记录集合
      */
-    public List<PlanYears> selectPlanYearsExamineListEXP(PlanYearsStandardVo vo);
+    public List<PlanYearsResponseVo> selectPlanYearsExamineListEXP(PlanYearsStandardVo vo);
 
     /**
      * 创建年度计划
@@ -151,56 +137,66 @@ public interface PlanYearsService extends IService<PlanYears> {
      * @return 结果
      */
     AjaxResult downLoadPlanFile(PlanYearsStandardVo yearsStandardVo);
+
     /**
      * 需求单位首页计划管理总数
+     *
      * @return
      */
     AjaxResult demandUnitPlanManagementTotal();
 
     /**
      * 采购管理部门首页计划管理总数
+     *
      * @return
      */
     AjaxResult purchasingManagementPurchasingManagementTotal();
 
     /**
      * 需求单位首页需求管理总数
+     *
      * @return
      */
     AjaxResult demandUnitDemandManagementTotal();
 
     /**
      * 采购管理部门首页需求管理总数
+     *
      * @return
      */
     AjaxResult purchasingManagementDemandManagementTotal();
 
     /**
      * 需求单位首页合同管理总数
+     *
      * @return
      */
     AjaxResult demandUnitContractManagementTotal();
 
     /**
      * 需求单位首页建设管理总数
+     *
      * @return
      */
     AjaxResult demandUnitConstructionManagementTotal();
 
     /**
      * 采购管理部门首页任务下达管理总数
+     *
      * @return
      */
     AjaxResult purchasingManagementTaskReleaseTotal();
 
     /**
      * 采购办首页采购执行管理总数
+     *
      * @return
      */
     AjaxResult procurementOfficeProcurementExecutionTotal();
 
     /**
      * 采购办首已中标项目理总数
+     *
      * @return
      */
     AjaxResult procurementOfficeWinningTheBidTotal();
@@ -211,4 +207,47 @@ public interface PlanYearsService extends IService<PlanYears> {
      * @return
      */
     AjaxResult procurementOfficeFailureToWinTheBidTotal();
+
+    /**
+     * 查询需求单位待办事项(计划待提交)
+     *
+     * @return
+     */
+    List<PlanQuarterResponseVo> planWaitCommit();
+
+    /**
+     * 采购管理部门首页待办事项(计划待审核)
+     *
+     * @return
+     */
+    List<PlanQuarterResponseVo> planWaitExamine();
+
+
+    /**
+     * 需求单位首页待办事项(全部)
+     *
+     * @return
+     */
+    AjaxResult demandUnitWillManipulateTotal();
+
+    /**
+     * 采购办首页待办事项(发函催告)
+     *
+     * @return
+     */
+    List<PlanQuarterResponseVo> willSendLetter();
+
+    /**
+     * 采购管理部门首页待办事项(全部)
+     *
+     * @return
+     */
+    AjaxResult purchasingManagementWillManipulateTotal();
+
+    /**
+     * 通过年度ID,查询季度、临时计划详情,通过季度、临时计划ID查询项目
+     * @param planYearId
+     * @return
+     */
+    AjaxResult projectDetails(PlanYearsStandardVo yearsStandardVo);
 }

+ 2 - 2
purchase-system/src/main/java/com/ozs/plan/service/ProvisionalPlanService.java

@@ -12,7 +12,7 @@ import com.ozs.plan.doman.vo.requestVo.ProvisionalPlanVo;
 import java.util.List;
 
 public interface ProvisionalPlanService extends IService<ProvisionalPlan> {
-    int deleteProvisionalPlanById(Integer planYearId);
+    int deleteProvisionalPlanById(Integer planPracticalId);
 
     int updateProvisionalPlanById(ProvisionalPlanVo provisionalPlan);
 
@@ -22,7 +22,7 @@ public interface ProvisionalPlanService extends IService<ProvisionalPlan> {
 
     int commitProvisionalPlan(ProvisionalPlanVo provisionalPlanVo);
 
-    ProvisionalPlan seletById(Integer planPracticalId);
+    AjaxResult seletById(Integer planPracticalId);
 
     PageInfo<ProvisionalPlan> selectProvisionalPlan(ProvisionalPlanVo provisionalPlanVo);
 

+ 180 - 125
purchase-system/src/main/java/com/ozs/plan/service/impl/PlanQuarterServiceImpl.java

@@ -2,14 +2,18 @@ package com.ozs.plan.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.github.pagehelper.PageHelper;
-import com.github.pagehelper.PageInfo;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ozs.common.constant.Constants;
 import com.ozs.common.core.domain.AjaxResult;
 import com.ozs.common.core.domain.entity.SysDept;
 import com.ozs.common.core.domain.entity.SysDictData;
+import com.ozs.common.core.domain.entity.SysRole;
 import com.ozs.common.core.domain.model.LoginUser;
+import com.ozs.common.enums.DataIsDelete;
+import com.ozs.common.enums.PmProjectStatus;
 import com.ozs.common.enums.ProjectStatus;
 import com.ozs.common.enums.ProjectTypes;
+import com.ozs.common.enums.QuarterEnum;
 import com.ozs.common.enums.SysFileRefEnum;
 import com.ozs.common.exception.ServiceException;
 import com.ozs.common.utils.PageUtils;
@@ -22,6 +26,8 @@ import com.ozs.plan.doman.vo.responseVo.PlanQuarterResponseVo;
 import com.ozs.plan.mapper.PlanQuarterMapper;
 import com.ozs.plan.mapper.PlanYearsMapper;
 import com.ozs.plan.service.PlanQuarterService;
+import com.ozs.pm.doman.PmDemand;
+import com.ozs.pm.mapper.PmDemandMapper;
 import com.ozs.system.domain.SysFileInfo;
 import com.ozs.system.domain.SysFileRef;
 import com.ozs.system.domain.vo.responseVo.SysDeptResponseVo;
@@ -32,25 +38,31 @@ import com.ozs.system.service.ISysDictTypeService;
 import com.ozs.system.service.SysFileService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.token.TokenService;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.ObjectUtils;
 
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import javax.validation.Validator;
 import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @author buzhanyi
  */
 @Service
 @Slf4j
-public class PlanQuarterServiceImpl implements PlanQuarterService {
+public class PlanQuarterServiceImpl extends ServiceImpl<PlanQuarterMapper, PlanQuarter> implements PlanQuarterService {
 
     @Autowired
     PlanQuarterMapper planQuarterMapper;
@@ -68,32 +80,18 @@ public class PlanQuarterServiceImpl implements PlanQuarterService {
     private SysDeptMapper deptMapper;
     @Autowired
     private SysFileService fileService;
+    @Autowired
+    private PmDemandMapper pmDemandMapper;
 
     @Override
-    public Page selectPlanQuarterList(PlanQuarterStandardVo vo) {
-        PlanQuarter quarters = new PlanQuarter();
-        List<PlanQuarter> planQuarter;
-        List<PlanQuarter> planQuarterList = new ArrayList<>();
-        try {
-            BeanUtils.copyProperties(vo, quarters);
-            planQuarter = planQuarterMapper.selectPlanQuarterList(quarters);
-            planQuarterList = changeTo(planQuarter);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        Page pages = PageUtils.getPages(vo.getPageNum().intValue(), vo.getPageSize().intValue(), planQuarterList);
-        return pages;
-    }
-
-    @Override
-    public List<PlanQuarter> selectPlanQuarterListEXP(PlanQuarterStandardVo vo) {
+    public List<PlanQuarterResponseVo> selectPlanQuarterListEXP(PlanQuarterStandardVo vo) {
         List<PlanQuarter> list = new ArrayList<>();
-        List<PlanQuarter> planQuarterList = new ArrayList<>();
+        List<PlanQuarterResponseVo> planQuarterList = new ArrayList<>();
         try {
             int num = 1;
             int size = 200;
             while (size == 200) {
-                LambdaQueryWrapper<PlanQuarter> lw = new LambdaQueryWrapper<PlanQuarter>();
+                LambdaQueryWrapper<PlanQuarter> lw = new LambdaQueryWrapper<>();
                 if (!ObjectUtils.isEmpty(vo.getProjectName())) {
                     lw.like(PlanQuarter::getProjectName, vo.getProjectName());
                 }
@@ -112,7 +110,8 @@ public class PlanQuarterServiceImpl implements PlanQuarterService {
                 if (!ObjectUtils.isEmpty(vo.getEndTime())) {
                     lw.le(PlanQuarter::getPlanDemandSubTime, vo.getEndTime());
                 }
-                Page<PlanQuarter> page = planQuarterMapper.selectPage(new Page<PlanQuarter>(num, size, false), lw);
+                lw.eq(PlanQuarter::getDelFlay, DataIsDelete.DataNOTDelete.getCode());
+                Page<PlanQuarter> page = planQuarterMapper.selectPage(new Page<>(num, size, false), lw);
                 list.addAll(page.getRecords());
                 size = page.getRecords().size();
                 num++;
@@ -125,25 +124,9 @@ public class PlanQuarterServiceImpl implements PlanQuarterService {
     }
 
     @Override
-    public Page selectPlanQuarterExamineList(PlanQuarterStandardVo vo) {
-        PlanQuarter quarters = new PlanQuarter();
-        List<PlanQuarter> planQuarter;
-        List<PlanQuarter> planQuarterList = new ArrayList<>();
-        try {
-            BeanUtils.copyProperties(vo, quarters);
-            planQuarter = planQuarterMapper.selectPlanQuarterExamineList(quarters);
-            planQuarterList = changeTo(planQuarter);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        Page pages = PageUtils.getPages(vo.getPageNum().intValue(), vo.getPageSize().intValue(), planQuarterList);
-        return pages;
-    }
-
-    @Override
-    public List<PlanQuarter> selectPlanQuarterExamineListEXP(PlanQuarterStandardVo vo) {
+    public List<PlanQuarterResponseVo> selectPlanQuarterExamineListEXP(PlanQuarterStandardVo vo) {
         List<PlanQuarter> list = new ArrayList<>();
-        List<PlanQuarter> planQuarterList = new ArrayList<>();
+        List<PlanQuarterResponseVo> planQuarterList = new ArrayList<>();
         try {
             int num = 1;
             int size = 200;
@@ -169,6 +152,7 @@ public class PlanQuarterServiceImpl implements PlanQuarterService {
                 if (!ObjectUtils.isEmpty(vo.getEndTime())) {
                     lw.le(PlanQuarter::getPlanDemandSubTime, vo.getEndTime());
                 }
+                lw.eq(PlanQuarter::getDelFlay, DataIsDelete.DataNOTDelete.getCode());
                 Page<PlanQuarter> page = planQuarterMapper.selectPage(new Page<PlanQuarter>(num, size, false), lw);
                 list.addAll(page.getRecords());
                 size = page.getRecords().size();
@@ -309,55 +293,51 @@ public class PlanQuarterServiceImpl implements PlanQuarterService {
         StringBuilder successMsg = new StringBuilder();
         StringBuilder failureMsg = new StringBuilder();
         //deptService
-        for (PlanQuarter ofYear : list) {
+        for (PlanQuarter planQuarter : list) {
             try {
                 //验证项目名称是否重复导入
                 //将录入信息中的值更改为要保存的数据
-                if (planQuarterMapper.countProjectName(ofYear.getProjectName()) == 0) {
+                if (planQuarterMapper.countProjectName(planQuarter.getProjectName()) == 0) {
                     //采购单位
-                    SysDept info = deptMapper.checkDeptNameOnlyOne(ofYear.getPurchaseDeptName());
+                    SysDept info = deptMapper.checkDeptNameOnlyOne(planQuarter.getPurchaseDeptName());
                     if (!ObjectUtils.isEmpty(info)) {
-                        ofYear.setPurchaseDeptId(String.valueOf(info.getDeptId()));
+                        planQuarter.setPurchaseDeptId(String.valueOf(info.getDeptId()));
                     } else {
                         ++failureNum;
-                        failureMsg.append("*" + failureNum + "*采购单位“" + ofYear.getPurchaseDeptName() + "”不存在");
+                        failureMsg.append("*" + failureNum + "*采购单位“" + planQuarter.getPurchaseDeptName() + "”不存在");
                     }
-                    ofYear.setProjectType(projectTypesMap.get(ofYear.getProjectType()));
-                    ofYear.setProjectStatus(ProjectStatus.PLANWAITCOMMIT.getCode());
-                    ofYear.setPurchaseMode(planPurchaseModesMap.get(ofYear.getPurchaseMode()));
+                    planQuarter.setProjectType(projectTypesMap.get(planQuarter.getProjectType()));
+                    planQuarter.setProjectStatus(ProjectStatus.PLANWAITCOMMIT.getCode());
+                    planQuarter.setPurchaseMode(planPurchaseModesMap.get(planQuarter.getPurchaseMode()));
                     //项目属性是多选字段
                     StringBuilder builder = new StringBuilder();
-                    if (ofYear.getProjectAttr().contains(",")) {
-                        String[] split = ofYear.getProjectAttr().split(",");
+                    if (planQuarter.getProjectAttr().contains(",")) {
+                        String[] split = planQuarter.getProjectAttr().split(",");
                         for (String s : split) {
-                            builder.append(projectAttributes.get(s) + ",");
+                            if (!planQuarter.getProjectAttr().endsWith(s)) {
+                                builder.append(projectAttributes.get(s) + ",");
+                            } else {
+                                builder.append(projectAttributes.get(s));
+                            }
                         }
                     } else {
-                        builder.append(projectAttributes.get(ofYear.getProjectAttr()));
+                        builder.append(projectAttributes.get(planQuarter.getProjectAttr()));
                     }
-                    ofYear.setProjectAttr(builder.toString());
-                    ofYear.setPurchaseServices(purchaseServices.get(ofYear.getPurchaseServices()));
-                    ofYear.setIsExcess(isExcessOrNo(ofYear.getProjectType(), ofYear.getEvaluation()));
-                    ofYear.setCreated(String.valueOf(loginUser.getUserId()));
-                    ofYear.setCreateTime(new Date());
-                    planQuarterMapper.insertPlanQuarter(ofYear);
+                    planQuarter.setProjectAttr(builder.toString());
+                    planQuarter.setPurchaseServices(purchaseServices.get(planQuarter.getPurchaseServices()));
+                    planQuarter.setIsExcess(isExcessOrNo(planQuarter.getProjectType(), planQuarter.getEvaluation()));
+                    planQuarter.setCreated(String.valueOf(loginUser.getUserId()));
+                    planQuarter.setCreateTime(new Date());
+                    planQuarterMapper.insertPlanQuarter(planQuarter);
                     successNum++;
-                    successMsg.append("*" + successNum + "、项目 " + ofYear.getProjectName() + " 导入成功!");
-                    //} else if (isUpdateSupport) {
-                    //    PlanQuarter quarter = plan.get(0);
-                    //    BeanValidators.validateWithException(validator, ofYear);
-                    //    quarter.setCreateTime(new Date());
-                    //    quarter.setProjectStatus(ProjectStatus.PLANWAITCOMMIT.getCode());
-                    //    planQuarterMapper.updateById(quarter);
-                    //    successNum++;
-                    //    successMsg.append("<br/>" + successNum + "、项目 " + ofYear.getProjectName() + " 更新成功");
+                    successMsg.append("*" + successNum + "、项目 " + planQuarter.getProjectName() + " 导入成功!");
                 } else {
                     failureNum++;
-                    failureMsg.append(failureNum + "*项目 " + ofYear.getProjectName() + " 已存在!/n");
+                    failureMsg.append(failureNum + "*项目 " + planQuarter.getProjectName() + " 已存在!/n");
                 }
             } catch (Exception exc) {
                 failureNum++;
-                String msg = "*" + successNum + "*项目 " + ofYear.getProjectName() + " 导入失败";
+                String msg = "*" + successNum + "*项目 " + planQuarter.getProjectName() + " 导入失败";
                 failureMsg.append(msg + exc.getMessage());
                 log.error(msg, exc);
             }
@@ -373,28 +353,7 @@ public class PlanQuarterServiceImpl implements PlanQuarterService {
 
     @Override
     public AjaxResult commit(PlanQuarterStandardVo quarterStandardVo) {
-        //PlanQuarter byId = PlanQuarterMapper.getById(quarterStandardVo.getPlanPracticalId());
-        //BigDecimal evaluation = byId.getEvaluation();
-        //BigDecimal threshold = new BigDecimal(0);
-        ////获取各个项目类型设定的概算金额阈值
-        //List<SysDictData> data = dictTypeService.selectDictDataByType("sys_over_limit_threshold");
-        //HashMap<String, String> thresholdMap = new LinkedHashMap<>();
-        ////各个类型的概算金额阈值
-        //for (SysDictData dictData : data) {
-        //    //    类型----阈值
-        //    thresholdMap.put(dictData.getDictLabel(), dictData.getDictValue());
-        //}
-        ////项目类型
-        //for (ProjectTypes value : ProjectTypes.values()) {
-        //    if (byId.getProjectType().equals(value.getCode())) {
-        //        threshold = BigDecimal.valueOf(Long.parseLong(thresholdMap.get(value.getInfo())));
-        //    }
-        //    break;
-        //}
-        //
-        //if (evaluation.compareTo(threshold) == 1) {
-        //    //是超额项目
-        //}
+
 
         int commit = planQuarterMapper.commit(quarterStandardVo.getPlanPracticalId());
         if (commit != 1) {
@@ -406,8 +365,9 @@ public class PlanQuarterServiceImpl implements PlanQuarterService {
     @Override
     @Transactional
     public AjaxResult reviewTo(PlanQuarterStandardVo vo) {
+        //季度计划审核通过后同步到年度计划和项目管理
         PlanQuarter quarters = new PlanQuarter();
-        BeanUtils.copyProperties(vo, quarters);
+        PmDemand demand = new PmDemand();
         PlanQuarter byId = planQuarterMapper.getById(vo.getPlanPracticalId());
         if (ObjectUtils.isEmpty(byId.getPlanYearId())) {
             PlanYears ofYears = new PlanYears();
@@ -416,20 +376,38 @@ public class PlanQuarterServiceImpl implements PlanQuarterService {
             planYearsMapper.insertPlanYears(ofYears);
             quarters.setPlanYearId(ofYears.getPlanYearId());
         }
-        quarters.setProjectStatus(ProjectStatus.PLANTOEXAMINE.getCode());
-        return review(vo, quarters);
+        demand.setEvaluation(byId.getEvaluation().doubleValue());
+        BeanUtils.copyProperties(byId, demand);
+        demand.setPlanId(byId.getPlanPracticalId());
+        demand.setPurchaseDeptId(Long.valueOf(byId.getPurchaseDeptId()));
+        //同步到项目管理状态为需求待填制
+        demand.setProjectStatus(PmProjectStatus.DEMAND_WAIT_FILL.getCode());
+        demand.setCreateTime(new Date());
+        pmDemandMapper.insert(demand);
+        //计划附件也进行同步---查询年度计划附件后复制一份改为项目需求附件
+        LambdaQueryWrapper<SysFileRef> sysFileRefLp = new LambdaQueryWrapper<>();
+        sysFileRefLp.eq(SysFileRef::getType, SysFileRefEnum.PLAN_YEAR.getType());
+        sysFileRefLp.eq(SysFileRef::getRedId, vo.getPlanYearId());
+        List<SysFileRef> sysFileRefs = sysFileRefMapper.selectList(sysFileRefLp);
+        if (!ObjectUtils.isEmpty(sysFileRefs)) {
+            for (SysFileRef ref : sysFileRefs) {
+                ref.setRedId(demand.getDemandId());
+                ref.setType(SysFileRefEnum.PM_DEMAND.getType());
+                sysFileRefMapper.insert(ref);
+            }
+        }
+        vo.setProjectStatus(ProjectStatus.PLANTOEXAMINE.getCode());
+        return review(vo);
     }
 
     @Override
     @Transactional
     public AjaxResult reviewReturn(PlanQuarterStandardVo vo) {
-        PlanQuarter quarters = new PlanQuarter();
-        BeanUtils.copyProperties(vo, quarters);
-        quarters.setProjectStatus(ProjectStatus.PLANTOBACK.getCode());
-        return review(vo, quarters);
+        vo.setProjectStatus(ProjectStatus.PLANTOBACK.getCode());
+        return review(vo);
     }
 
-    private AjaxResult review(PlanQuarterStandardVo vo, PlanQuarter quarters) {
+    private AjaxResult review(PlanQuarterStandardVo vo) {
         List<SysFileRef> sysFileRefs = vo.getSysFileRefs();
         if (!ObjectUtils.isEmpty(sysFileRefs)) {
             for (SysFileRef ref : sysFileRefs) {
@@ -442,7 +420,7 @@ public class PlanQuarterServiceImpl implements PlanQuarterService {
                 sysFileRefMapper.insert(ref);
             }
         }
-        int review = planQuarterMapper.review(quarters);
+        int review = planQuarterMapper.review(vo);
         if (review != 1) {
             return AjaxResult.error("项目状态数据异常");
         }
@@ -451,11 +429,16 @@ public class PlanQuarterServiceImpl implements PlanQuarterService {
 
     @Override
     public AjaxResult appUpdate(PlanQuarterStandardVo vo) {
-        PlanQuarter quarters = new PlanQuarter();
-        BeanUtils.copyProperties(vo, quarters);
+        //如果项目管理中数据已填制,则不允许申请修改
+        LambdaQueryWrapper<PmDemand> demandLp = new LambdaQueryWrapper<>();
+        demandLp.eq(PmDemand::getPlanId, vo.getPlanPracticalId());
+        PmDemand demand = pmDemandMapper.selectOne(demandLp);
+        if (!String.valueOf(demand.getProjectStatus()).equals(PmProjectStatus.DEMAND_WAIT_FILL.getCode())) {
+            return AjaxResult.error("项目信息已填制,不可更改");
+        }
         //申请后会成为未提交的状态,可以进行修改
-        quarters.setProjectStatus(ProjectStatus.PLANWAITCOMMIT.getCode());
-        int review = planQuarterMapper.review(quarters);
+        vo.setProjectStatus(ProjectStatus.PLANWAITCOMMIT.getCode());
+        int review = planQuarterMapper.review(vo);
         if (review != 1) {
             return AjaxResult.error("项目状态数据异常");
         }
@@ -517,62 +500,134 @@ public class PlanQuarterServiceImpl implements PlanQuarterService {
     }
 
     //字段赋值对应的名称
-    public List<PlanQuarter> changeTo(List<PlanQuarter> planQuarter) {
-
+    public List<PlanQuarterResponseVo> changeTo(List<PlanQuarter> planQuarters) {
+        //获取季度计划各个季度提报时间的阈值
+        List<SysDictData> supTime = dictTypeService.selectDictDataByType("sys_quarterly_plan");
+        HashMap<String, String> thresholdMap = new LinkedHashMap<>();
+        //各个季度提报时间的阈值
+        for (SysDictData dictData : supTime) {
+            //    季度----阈值
+            thresholdMap.put(dictData.getDictLabel(), dictData.getDictValue());
+        } //提前或延后*天进行提醒
+        List<SysDictData> alertTime = dictTypeService.selectDictDataByType("alert_time_setting");
+        HashMap<String, String> alertTimeMap = new LinkedHashMap<>();
+        //根据时间类别设定的提醒时间
+        for (SysDictData dictData : alertTime) {
+            //    字段名称----阈值
+            alertTimeMap.put(dictData.getDictLabel(), dictData.getDictValue());
+        }
+        //获取字典数据
         HashMap<String, HashMap<String, String>> planEnums = dictTypeService.getAboutEnums();
         HashMap<String, String> projectTypesMap = planEnums.get("projectTypes");
         HashMap<String, String> planPurchaseModesMap = planEnums.get("planPurchaseModes");
         HashMap<String, String> projectAttributes = planEnums.get("projectAttributes");
         HashMap<String, String> purchaseServices = planEnums.get("purchaseServices");
-        List<PlanQuarter> list = new ArrayList<PlanQuarter>();
-        for (PlanQuarter planYear : planQuarter) {
-            SysDeptResponseVo sysDeptResponseVo = (SysDeptResponseVo) deptService.selectDeptById(Long.valueOf(planYear.getPurchaseDeptId())).get("sysDept");
-            planYear.setPurchaseDeptName(sysDeptResponseVo.getDeptName());
+        List<PlanQuarterResponseVo> list = new ArrayList<PlanQuarterResponseVo>();
+        for (PlanQuarter planQuarter : planQuarters) {
+            PlanQuarterResponseVo responseVo = new PlanQuarterResponseVo();
+            SysDeptResponseVo sysDeptResponseVo = (SysDeptResponseVo) deptService.selectDeptById(Long.valueOf(planQuarter.getPurchaseDeptId())).get("sysDept");
+            planQuarter.setPurchaseDeptName(sysDeptResponseVo.getDeptName());
 
             for (Map.Entry<String, String> entry : projectTypesMap.entrySet()) {
-                if (planYear.getProjectType().equals(entry.getValue())) {
-                    planYear.setProjectTypeStr(entry.getKey());
+                if (planQuarter.getProjectType().equals(entry.getValue())) {
+                    planQuarter.setProjectTypeStr(entry.getKey());
                     break;
                 }
             }
             for (Map.Entry<String, String> entry : planPurchaseModesMap.entrySet()) {
-                if (planYear.getPurchaseMode().equals(entry.getValue())) {
-                    planYear.setPurchaseModeStr(entry.getKey());
+                if (planQuarter.getPurchaseMode().equals(entry.getValue())) {
+                    planQuarter.setPurchaseModeStr(entry.getKey());
                     break;
                 }
             }
             //项目属性是拼接的
-            if (!ObjectUtils.isEmpty(planYear.getProjectAttr())) {
-                if (planYear.getProjectAttr().length() > 1) {
+            if (!ObjectUtils.isEmpty(planQuarter.getProjectAttr())) {
+                if (planQuarter.getProjectAttr().length() > 1) {
                     StringBuilder builder = new StringBuilder();
-                    String[] split = planYear.getProjectAttr().split(",");
+                    String[] split = planQuarter.getProjectAttr().split(",");
                     for (String s : split) {
                         for (Map.Entry<String, String> entry : projectAttributes.entrySet()) {
                             if (s.equals(entry.getValue())) {
-                                builder.append(entry.getKey() + ",");
+                                if (!planQuarter.getProjectAttr().endsWith(s)) {
+                                    builder.append(entry.getKey() + ",");
+                                } else {
+                                    builder.append(entry.getKey());
+                                }
                                 break;
                             }
                         }
                     }
-                    planYear.setProjectAttrStr(builder.toString());
+                    planQuarter.setProjectAttrStr(builder.toString());
                 } else {
                     for (Map.Entry<String, String> entry : projectAttributes.entrySet()) {
-                        if (planYear.getProjectAttr().equals(entry.getValue())) {
-                            planYear.setProjectAttrStr(entry.getKey());
+                        if (planQuarter.getProjectAttr().equals(entry.getValue())) {
+                            planQuarter.setProjectAttrStr(entry.getKey());
                             break;
                         }
                     }
                 }
             }
             for (Map.Entry<String, String> entry : purchaseServices.entrySet()) {
-                if (planYear.getPurchaseServices().equals(entry.getValue())) {
-                    planYear.setPurchaseServicesStr(entry.getKey());
+                if (planQuarter.getPurchaseServices().equals(entry.getValue())) {
+                    planQuarter.setPurchaseServicesStr(entry.getKey());
                     break;
                 }
             }
+            BeanUtils.copyProperties(planQuarter, responseVo);
 
-            list.add(planYear);
+            try {
+                responseVo.setTipsMessage(planQuarterGetTips(thresholdMap, alertTimeMap));
+            } catch (ParseException e) {
+                e.printStackTrace();
+            }
+            list.add(responseVo);
         }
         return list;
     }
+
+    /**
+     * 根据季度计划在各个季度提报时间的阈值进行提示
+     *
+     * @return
+     */
+    public String planQuarterGetTips(HashMap<String, String> thresholdMap, HashMap<String, String> alertTimeMap) throws ParseException {
+        //提示信息:定义距离结束时间*天内提示
+        int alertDay = Integer.parseInt(alertTimeMap.get("计划提报时间"));
+        //提示信息:定义距离结束时间一周内提示
+        Integer remindTine = 1000 * 60 * 60 * 24 * alertDay;  //提示语
+        String subTips = "";
+        //季度提报时间的结束时间阈值
+        Date thresholdTime = null;
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        Date date = new Date();
+        for (QuarterEnum val : QuarterEnum.values()) {
+            if (val.getInfo().contains(date.getMonth() + "")) {
+                switch (val.getCode()) {
+                    case "1":
+                        thresholdTime = dateFormat.parse(thresholdMap.get("第一季度结束时间"));
+                    case "2":
+                        thresholdTime = dateFormat.parse(thresholdMap.get("第二季度结束时间"));
+                    case "3":
+                        thresholdTime = dateFormat.parse(thresholdMap.get("第三季度结束时间"));
+                    case "4":
+                        thresholdTime = dateFormat.parse(thresholdMap.get("第四季度结束时间"));
+                    default:
+                }
+                break;
+            }
+        }
+        thresholdTime.setYear(date.getYear());
+        double surplus = thresholdTime.getTime() - date.getTime();
+        //少于一周便提醒
+        if (surplus < remindTine && surplus > 0) {
+            //剩余天数(向上取整)
+            int i = new Double(Math.ceil(surplus / 1000 / 60 / 60 / 24)).intValue();
+            if (i > 0) {
+                subTips = "距离计划提报时间不足" + i + "天";
+            }
+        }
+        return subTips;
+    }
+
+
 }

+ 572 - 74
purchase-system/src/main/java/com/ozs/plan/service/impl/PlanYearsServiceImpl.java

@@ -4,49 +4,55 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ozs.base.domain.BaseAgency;
+import com.ozs.base.service.BaseAgencyService;
+import com.ozs.common.constant.Constants;
 import com.ozs.common.core.domain.AjaxResult;
 import com.ozs.common.core.domain.entity.SysDept;
 import com.ozs.common.core.domain.entity.SysDictData;
 import com.ozs.common.core.domain.entity.SysRole;
 import com.ozs.common.core.domain.entity.SysUser;
 import com.ozs.common.core.domain.model.LoginUser;
-import com.ozs.common.enums.IsExcess;
-import com.ozs.common.enums.PmProjectStatus;
-import com.ozs.common.enums.ProjectStatus;
-import com.ozs.common.enums.ProjectTypes;
-import com.ozs.common.enums.SysFileRefEnum;
+import com.ozs.common.enums.*;
 import com.ozs.common.exception.ServiceException;
 import com.ozs.common.utils.PageUtils;
 import com.ozs.common.utils.SecurityUtils;
 import com.ozs.common.utils.StringUtils;
 import com.ozs.common.utils.bean.BeanUtils;
+import com.ozs.home.domain.vo.HomeToDoQueryResVo;
 import com.ozs.plan.doman.PlanQuarter;
 import com.ozs.plan.doman.PlanYears;
+import com.ozs.plan.doman.ProvisionalPlan;
 import com.ozs.plan.doman.vo.requestVo.PlanYearsStandardVo;
+import com.ozs.plan.doman.vo.responseVo.PlanQuarterResponseVo;
 import com.ozs.plan.doman.vo.responseVo.PlanYearsResponseVo;
 import com.ozs.plan.mapper.PlanQuarterMapper;
 import com.ozs.plan.mapper.PlanYearsMapper;
+import com.ozs.plan.mapper.ProvisionalPlanMapper;
 import com.ozs.plan.service.PlanYearsService;
-import com.ozs.pm.doman.PmDemand;
+import com.ozs.pm.doman.*;
+import com.ozs.pm.doman.vo.responseVo.*;
 import com.ozs.pm.mapper.PmDemandMapper;
+import com.ozs.pm.service.*;
 import com.ozs.system.domain.SysFileInfo;
 import com.ozs.system.domain.SysFileRef;
 import com.ozs.system.domain.vo.responseVo.SysDeptResponseVo;
 import com.ozs.system.mapper.SysDeptMapper;
 import com.ozs.system.mapper.SysFileRefMapper;
 import com.ozs.system.mapper.SysRoleMapper;
-import com.ozs.system.service.ISysDeptService;
-import com.ozs.system.service.ISysDictTypeService;
-import com.ozs.system.service.ISysUserService;
-import com.ozs.system.service.SysFileService;
+import com.ozs.system.service.*;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.ObjectUtils;
 
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import javax.validation.Validator;
 import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
@@ -65,7 +71,7 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
     @Autowired
     PlanYearsMapper planYearsMapper;
     @Autowired
-    PlanQuarterMapper planQuarterMapper;
+    private PlanQuarterMapper planQuarterMapper;
     @Autowired
     protected Validator validator;
     @Autowired
@@ -73,7 +79,7 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
     @Autowired
     private ISysDeptService deptService;
     @Autowired
-    SysFileRefMapper sysFileRefMapper;
+    private SysFileRefMapper sysFileRefMapper;
     @Autowired
     private SysDeptMapper deptMapper;
     @Autowired
@@ -84,27 +90,41 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
     private ISysUserService userService;
     @Autowired
     private PmDemandMapper pmDemandMapper;
+    @Autowired
+    private PlanQuarterServiceImpl quartzServiceImpl;
+    @Autowired
+    private IPmDemandService demandService;
+    @Autowired
+    private ProvisionalPlanMapper provisionalPlanMapper;
+    @Autowired
+    private IPmDemandService pmDemandService;
+    @Autowired
+    private ISysDictDataService dictDataService;
+    @Autowired
+    private BaseAgencyService baseAgencyService;
+    @Autowired
+    private PmBookBuildingService pmBookBuildingService;
+    @Autowired
+    private PmReleaseAnnouncementService pmReleaseAnnouncementService;
+    @Autowired
+    private PmDemandExpertRefService pmDemandExpertRefService;
+    @Autowired
+    private PmBidOpeningService pmBidOpeningService;
+    @Autowired
+    private PmBidWinningService pmBidWinningService;
+    @Autowired
+    private PmBidFailureService pmBidFailureService;
+    @Autowired
+    private PmContractInfoService pmContractInfoService;
+    @Autowired
+    private PmProjectConstructionService pmProjectConstructionService;
+    @Autowired
+    private SysFileRefService sysFileRefService;
 
     @Override
-    public Page selectPlanYearsList(PlanYearsStandardVo vo) {
-        PlanYears ofYears = new PlanYears();
-        List<PlanYears> planYears;
-        List<PlanYears> planYearsList = new ArrayList<>();
-        try {
-            BeanUtils.copyProperties(vo, ofYears);
-            planYears = planYearsMapper.selectPlanYearsList(ofYears);
-            planYearsList = changeTo(planYears);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        Page pages = PageUtils.getPages(vo.getPageNum().intValue(), vo.getPageSize().intValue(), planYearsList);
-        return pages;
-    }
-
-    @Override
-    public List<PlanYears> selectPlanYearsListEXP(PlanYearsStandardVo vo) {
+    public List<PlanYearsResponseVo> selectPlanYearsListEXP(PlanYearsStandardVo vo) {
         List<PlanYears> list = new ArrayList<>();
-        List<PlanYears> planYearsList = new ArrayList<>();
+        List<PlanYearsResponseVo> planYearsList = new ArrayList<>();
         try {
             int num = 1;
             int size = 200;
@@ -128,6 +148,7 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
                 if (!ObjectUtils.isEmpty(vo.getEndTime())) {
                     lw.le(PlanYears::getPlanDemandSubTime, vo.getEndTime());
                 }
+                lw.eq(PlanYears::getDelFlay, DataIsDelete.DataNOTDelete.getCode());
                 Page<PlanYears> page = planYearsMapper.selectPage(new Page<PlanYears>(num, size, false), lw);
                 list.addAll(page.getRecords());
                 size = page.getRecords().size();
@@ -141,25 +162,9 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
     }
 
     @Override
-    public Page selectPlanYearsExamineList(PlanYearsStandardVo vo) {
-        PlanYears ofYears = new PlanYears();
-        List<PlanYears> planYears;
-        List<PlanYears> planYearsList = new ArrayList<>();
-        try {
-            BeanUtils.copyProperties(vo, ofYears);
-            planYears = planYearsMapper.selectPlanYearsExamineList(ofYears);
-            planYearsList = changeTo(planYears);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        Page pages = PageUtils.getPages(vo.getPageNum().intValue(), vo.getPageSize().intValue(), planYearsList);
-        return pages;
-    }
-
-    @Override
-    public List<PlanYears> selectPlanYearsExamineListEXP(PlanYearsStandardVo vo) {
+    public List<PlanYearsResponseVo> selectPlanYearsExamineListEXP(PlanYearsStandardVo vo) {
         List<PlanYears> list = new ArrayList<>();
-        List<PlanYears> planYearsList = new ArrayList<>();
+        List<PlanYearsResponseVo> planYearsList = new ArrayList<>();
         try {
             int num = 1;
             int size = 200;
@@ -185,6 +190,7 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
                 if (!ObjectUtils.isEmpty(vo.getEndTime())) {
                     lw.le(PlanYears::getPlanDemandSubTime, vo.getEndTime());
                 }
+                lw.eq(PlanYears::getDelFlay, DataIsDelete.DataNOTDelete);
                 Page<PlanYears> page = planYearsMapper.selectPage(new Page<PlanYears>(num, size, false), lw);
                 list.addAll(page.getRecords());
                 size = page.getRecords().size();
@@ -348,7 +354,11 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
                     if (ofYear.getProjectAttr().contains(",")) {
                         String[] split = ofYear.getProjectAttr().split(",");
                         for (String s : split) {
-                            builder.append(projectAttributes.get(s) + ",");
+                            if (!ofYear.getProjectAttr().endsWith(s)) {
+                                builder.append(projectAttributes.get(s) + ",");
+                            } else {
+                                builder.append(projectAttributes.get(s));
+                            }
                         }
                     } else {
                         builder.append(projectAttributes.get(ofYear.getProjectAttr()));
@@ -424,29 +434,56 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
     @Override
     @Transactional
     public AjaxResult reviewTo(PlanYearsStandardVo vo) {
+        //年度计划审核通过后同步到季度计划和项目管理
         PlanYears ofYears = new PlanYears();
-        BeanUtils.copyProperties(vo, ofYears);
-        //年度计划审核通过后同步到季度计划
-        PlanYears byId = planYearsMapper.getById(vo.getPlanYearId());
         PlanQuarter quarters = new PlanQuarter();
+        PmDemand demand = new PmDemand();
+        PlanYears byId = planYearsMapper.getById(vo.getPlanYearId());
         BeanUtils.copyProperties(byId, quarters);
-        quarters.setProjectStatus(ProjectStatus.PLANWAITCOMMIT.getCode());
-        planQuarterMapper.insertPlanQuarter(quarters);
-        ofYears.setPlanYearId(vo.getPlanYearId());
-        ofYears.setProjectStatus(ProjectStatus.PLANTOEXAMINE.getCode());
-        return review(vo, ofYears);
+        BeanUtils.copyProperties(byId, demand);
+
+        //同步到季度计划状态为已审核---(已审核过的不再同步)
+        PlanQuarter quarter = planQuarterMapper.getByPlanYearId(vo.getPlanYearId());
+        if (ObjectUtils.isEmpty(quarter)) {
+            quarters.setPlanType(0);
+            quarters.setPlanYearId(byId.getPlanYearId());
+            quarters.setProjectStatus(ProjectStatus.PLANTOEXAMINE.getCode());
+            quarters.setCreateTime(new Date());
+            planQuarterMapper.insertPlanQuarter(quarters);
+            //同步到项目管理状态为需求待填制
+            demand.setPlanId(quarters.getPlanPracticalId());
+            demand.setEvaluation(byId.getEvaluation().doubleValue());
+            demand.setProjectStatus(PmProjectStatus.DEMAND_WAIT_FILL.getCode());
+            demand.setPurchaseDeptId(Long.valueOf(byId.getPurchaseDeptId()));
+            demand.setCreateTime(new Date());
+            pmDemandMapper.insert(demand);
+            //计划附件也进行同步---查询年度计划附件后复制一份改为项目需求附件
+            LambdaQueryWrapper<SysFileRef> sysFileRefLp = new LambdaQueryWrapper<>();
+            sysFileRefLp.eq(SysFileRef::getType, SysFileRefEnum.PLAN_YEAR.getType());
+            sysFileRefLp.eq(SysFileRef::getRedId, vo.getPlanYearId());
+            List<SysFileRef> sysFileRefs = sysFileRefMapper.selectList(sysFileRefLp);
+            if (!ObjectUtils.isEmpty(sysFileRefs)) {
+                for (SysFileRef ref : sysFileRefs) {
+                    ref.setRedId(demand.getDemandId());
+                    ref.setType(SysFileRefEnum.PM_DEMAND.getType());
+                    ref.setId(null);
+                    sysFileRefMapper.insert(ref);
+                }
+            }
+        }
+
+        vo.setProjectStatus(ProjectStatus.PLANTOEXAMINE.getCode());
+        return review(vo);
     }
 
     @Override
     @Transactional
     public AjaxResult reviewReturn(PlanYearsStandardVo vo) {
-        PlanYears ofYears = new PlanYears();
-        BeanUtils.copyProperties(vo, ofYears);
-        ofYears.setProjectStatus(ProjectStatus.PLANTOBACK.getCode());
-        return review(vo, ofYears);
+        vo.setProjectStatus(ProjectStatus.PLANTOBACK.getCode());
+        return review(vo);
     }
 
-    private AjaxResult review(PlanYearsStandardVo vo, PlanYears ofYears) {
+    private AjaxResult review(PlanYearsStandardVo vo) {
         List<SysFileRef> sysFileRefs = vo.getSysFileRefs();
         if (!ObjectUtils.isEmpty(sysFileRefs)) {
             for (SysFileRef ref : sysFileRefs) {
@@ -459,7 +496,7 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
                 sysFileRefMapper.insert(ref);
             }
         }
-        int review = planYearsMapper.review(ofYears);
+        int review = planYearsMapper.review(vo);
         if (review != 1) {
             return AjaxResult.error("项目状态数据异常");
         }
@@ -468,11 +505,9 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
 
     @Override
     public AjaxResult appUpdate(PlanYearsStandardVo vo) {
-        PlanYears ofYears = new PlanYears();
-        BeanUtils.copyProperties(vo, ofYears);
         //申请后会成为未提交的状态,可以进行修改
-        ofYears.setProjectStatus(ProjectStatus.PLANWAITCOMMIT.getCode());
-        int review = planYearsMapper.review(ofYears);
+        vo.setProjectStatus(ProjectStatus.PLANWAITCOMMIT.getCode());
+        int review = planYearsMapper.review(vo);
         if (review != 1) {
             return AjaxResult.error("项目状态数据异常");
         }
@@ -481,7 +516,7 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
 
     @Override
     public AjaxResult sendLetter(PlanYearsStandardVo yearsStandardVo) {
-        int review = planYearsMapper.sendLetter(yearsStandardVo.getPlanYearId());
+        int review = planYearsMapper.sendLetter(yearsStandardVo);
         if (review != 1) {
             return AjaxResult.error("项目状态数据异常");
         }
@@ -773,6 +808,404 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
         return AjaxResult.success(pmDemands.size());
     }
 
+    /**
+     * 查询需求单位待办事项(计划待提交)
+     *
+     * @return
+     */
+    @Override
+    public List<PlanQuarterResponseVo> planWaitCommit() {
+        return getListByProjectStatus(ProjectStatus.PLANWAITCOMMIT.getCode());
+    }
+
+    /**
+     * 采购管理部门首页待办事项(计划待审核)
+     *
+     * @return
+     */
+    @Override
+    public List<PlanQuarterResponseVo> planWaitExamine() {
+        return getListByProjectStatus(ProjectStatus.PLANWAIEXAMINE.getCode());
+    }
+
+    /**
+     * 需求单位待办事项
+     */
+    @Override
+    public AjaxResult demandUnitWillManipulateTotal() {
+        List<HomeToDoQueryResVo> homeRes = new ArrayList<>();
+        //计划待提交,需求待提交,合同待填制,项目建设待完成
+        List<PlanQuarterResponseVo> planRes = getListByProjectStatus(ProjectStatus.PLANWAITCOMMIT.getCode());
+        List<PmDemandResVo> demandRes = demandService.demandWaitCommit();
+        demandRes.addAll(demandService.contractWaitFilled());
+        demandRes.addAll(demandService.projectWaitFinish());
+        //转为首页table展示数据
+        if (!ObjectUtils.isEmpty(planRes) && planRes.size() > 0) {
+            for (PlanQuarterResponseVo planVo : planRes) {
+                HomeToDoQueryResVo home = new HomeToDoQueryResVo();
+                BeanUtils.copyProperties(planVo, home);
+                homeRes.add(home);
+            }
+        }
+        if (!ObjectUtils.isEmpty(demandRes) && demandRes.size() > 0) {
+            for (PmDemandResVo demandResVo : demandRes) {
+                HomeToDoQueryResVo home = new HomeToDoQueryResVo();
+                BeanUtils.copyProperties(demandResVo, home);
+                homeRes.add(home);
+            }
+        }
+
+        return AjaxResult.success(homeRes);
+    }
+
+    @Override
+    public AjaxResult purchasingManagementWillManipulateTotal() {
+        List<HomeToDoQueryResVo> homeRes = new ArrayList<>();
+        //计划待审核,需求待审核,任务待下达
+        List<PlanQuarterResponseVo> planRes = getListByProjectStatus(ProjectStatus.PLANWAIEXAMINE.getCode());
+        List<PmDemandResVo> demandRes = demandService.demandWaitExamine();
+        demandRes.addAll(demandService.taskWaitRelease());
+        //转为首页table展示数据
+        if (!ObjectUtils.isEmpty(planRes) && planRes.size() > 0) {
+            for (PlanQuarterResponseVo planVo : planRes) {
+                HomeToDoQueryResVo home = new HomeToDoQueryResVo();
+                BeanUtils.copyProperties(planVo, home);
+                homeRes.add(home);
+            }
+        }
+        if (!ObjectUtils.isEmpty(demandRes) && demandRes.size() > 0) {
+            for (PmDemandResVo demandResVo : demandRes) {
+                HomeToDoQueryResVo home = new HomeToDoQueryResVo();
+                BeanUtils.copyProperties(demandResVo, home);
+                homeRes.add(home);
+            }
+        }
+
+        return AjaxResult.success(homeRes);
+    }
+
+    /**
+     * 通过年度ID,查询季度、临时计划详情,通过季度、临时计划ID查询项目
+     *
+     * @param yearsStandardVo
+     * @return
+     */
+    @Override
+    public AjaxResult projectDetails(PlanYearsStandardVo yearsStandardVo) {
+        Map<String, Object> returnMap = new HashMap<>();
+        // 通过年度ID查询年度详情
+        PlanYears byId = planYearsMapper.getById(yearsStandardVo.getPlanYearId());
+        if (StringUtils.isNull(byId)) {
+            return AjaxResult.error("没有查到相关数据!");
+        }
+        // 通过年度ID查询季度、临时计划详情
+        ProvisionalPlan provisionalPlan = provisionalPlanMapper.selectProvisionalPlanByYearId(yearsStandardVo.getPlanYearId().intValue());
+        if (StringUtils.isNull(provisionalPlan)) {
+            return AjaxResult.error("没有查到相关数据!");
+        }
+        // 通过季度、临时计划ID查询项目数据
+        PmDemand pmDemand = pmDemandService.selectByPlanId(provisionalPlan.getPlanPracticalId());
+        if (StringUtils.isNotNull(pmDemand)) {
+            String detailType = "";
+            if (StringUtils.isNotNull(yearsStandardVo.getDetailType())) {
+                detailType = yearsStandardVo.getDetailType();
+            } else {
+                // 详情类型(1项目计划,2需求建档,3任务下达,4中标信息,5合同信息,6建设情况)
+                // 项目计划 4之前(包括4)
+                // 需求建党 4之后(不包括4)
+                // 任务下达 8之后(不包括8)
+                // 采购执行 9之后(不包括9)
+                // 合同信息 15之后(不包括15)
+                // 项目建设 17
+                Integer projectStatus = Integer.valueOf(pmDemand.getProjectStatus());
+                if (projectStatus <= 4) {
+                    detailType = "1";
+                } else if (4 < projectStatus && projectStatus <= 8) {
+                    detailType = "2";
+                } else if (8 < projectStatus && projectStatus <= 9) {
+                    detailType = "3";
+                } else if (9 < projectStatus && projectStatus <= 15) {
+                    detailType = "4";
+                } else if (15 < projectStatus && projectStatus < 17) {
+                    detailType = "5";
+                } else if (projectStatus == 17) {
+                    detailType = "6";
+                }
+            }
+            Long demandId = pmDemand.getDemandId();
+            PmDemandResVo vo = new PmDemandResVo();
+            vo.setDemandId(demandId);
+            vo.setDetailType(detailType);
+            if ("1".equals(detailType)) { //项目计划
+                BeanUtils.copyProperties(pmDemand, vo);
+                SysDeptResponseVo sysDeptResponseVo = (SysDeptResponseVo) deptService.selectDeptById(vo.getPurchaseDeptId()).get("sysDept");
+                if (sysDeptResponseVo != null) {
+                    vo.setPurchaseDeptName(sysDeptResponseVo.getDeptName());
+                }
+                String purchaseServicesName = dictDataService.selectDictLabel("purchase_services", vo.getPurchaseServices());
+                if (StringUtils.isNotEmpty(purchaseServicesName)) {
+                    vo.setPurchaseServicesName(purchaseServicesName);
+                }
+                //采购需求附件
+                List<SysFileInfo> demandFileInfos = getSysFileInfoList(vo.getDemandId(), SysFileRefEnum.PM_DEMAND.getType());
+                if (!ObjectUtils.isEmpty(demandFileInfos)) {
+                    vo.setDemandFileInfos(demandFileInfos);
+                }
+                //项目类型
+                for (ProjectTypes value : ProjectTypes.values()) {
+                    if (vo.getProjectType() != null && vo.getProjectType().equals(value.getCode())) {
+                        vo.setProjectTypeName(value.getInfo());
+                        break;
+                    }
+                }
+                //是否为超限额计划
+                for (IsExcess value : IsExcess.values()) {
+                    if (vo.getIsExcess() != null && vo.getIsExcess().equals(value.getCode())) {
+                        vo.setIsExcessName(value.getInfo());
+                        break;
+                    }
+                }
+                //采购方式
+                for (PlanPurchaseMode value : PlanPurchaseMode.values()) {
+                    if (vo.getPurchaseMode() != null && vo.getPurchaseMode().equals(value.getCode())) {
+                        vo.setPurchaseModeName(value.getInfo());
+                        break;
+                    }
+                }
+                //项目属性
+                for (ProjectAttribute value : ProjectAttribute.values()) {
+                    if (vo.getProjectAttr() != null && vo.getProjectAttr().equals(value.getCode())) {
+                        vo.setProjectAttrName(value.getInfo());
+                        break;
+                    }
+                }
+                //预警状态
+                for (WarnStatus value : WarnStatus.values()) {
+                    if (vo.getWarnStatus() != null && vo.getWarnStatus().equals(value.getCode())) {
+                        vo.setWarnStatusName(value.getInfo());
+                        break;
+                    }
+                }
+                //项目状态
+                for (PmProjectStatus value : PmProjectStatus.values()) {
+                    if (vo.getProjectStatus() != null && vo.getProjectStatus().equals(value.getCode())) {
+                        vo.setProjectStatusName(value.getInfo());
+                        break;
+                    }
+                }
+            } else if ("2".equals(detailType)) { //需求建档
+                //采购需求审核文件
+                List<SysFileInfo> auditFileInfos = getSysFileInfoList(vo.getDemandId(), SysFileRefEnum.PM_DEMAND_EXAMINE.getType());
+                if (!ObjectUtils.isEmpty(auditFileInfos)) {
+                    vo.setAuditFileInfos(auditFileInfos);
+                }
+                LambdaQueryWrapper<PmBookBuilding> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+                lambdaQueryWrapper.eq(PmBookBuilding::getDemandId, demandId);
+                PmBookBuilding pmBookBuilding = pmBookBuildingService.getOne(lambdaQueryWrapper);
+                if (pmBookBuilding != null) {
+                    PmBookBuildingResVo responseVo = new PmBookBuildingResVo();
+                    BeanUtils.copyProperties(pmBookBuilding, responseVo);
+
+                    List<SysFileInfo> fileInfos = getSysFileInfoList(pmBookBuilding.getId(), SysFileRefEnum.PM_BOOK_BUILDING.getType());
+                    if (!ObjectUtils.isEmpty(fileInfos)) {
+                        responseVo.setFileInfos(fileInfos);
+                    }
+                    vo.setPmBookBuildingResVo(responseVo);
+                }
+            } else if ("3".equals(detailType)) { //任务下达
+                //任务下达文件
+                List<SysFileInfo> taskReleaseFileInfos = getSysFileInfoList(vo.getDemandId(), SysFileRefEnum.PM_TAST_RELEASE.getType());
+                if (!ObjectUtils.isEmpty(taskReleaseFileInfos)) {
+                    vo.setTaskReleaseFileInfos(taskReleaseFileInfos);
+                }
+            } else if ("4".equals(detailType)) { //中标信息
+                PmPurchaseExecutionResVo pmPurchaseExecutionResVo = new PmPurchaseExecutionResVo();
+                //代理商信息
+                BaseAgency baseAgency = this.baseAgencyService.getById(pmDemand.getAgencyId());
+                pmPurchaseExecutionResVo.setBaseAgency(baseAgency);
+                //发布公告列表
+                LambdaQueryWrapper<PmReleaseAnnouncement> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+                lambdaQueryWrapper.eq(PmReleaseAnnouncement::getDemandId, demandId);
+                List<PmReleaseAnnouncement> pmReleaseAnnouncementList = this.pmReleaseAnnouncementService.list(lambdaQueryWrapper);
+                if (!ObjectUtils.isEmpty(pmReleaseAnnouncementList)) {
+                    List<PmReleaseAnnouncementResVo> pmReleaseAnnouncementResVoList = new ArrayList<>();
+                    for (PmReleaseAnnouncement pmReleaseAnnouncement : pmReleaseAnnouncementList) {
+                        PmReleaseAnnouncementResVo pmReleaseAnnouncementResVo = new PmReleaseAnnouncementResVo();
+                        BeanUtils.copyProperties(pmReleaseAnnouncement, pmReleaseAnnouncementResVo);
+                        List<SysFileInfo> fileInfos = getSysFileInfoList(pmReleaseAnnouncement.getId(), SysFileRefEnum.PM_ANNOUNCEMENT_FILE.getType());
+                        if (!ObjectUtils.isEmpty(fileInfos)) {
+                            pmReleaseAnnouncementResVo.setFileInfos(fileInfos);
+                        }
+                        pmReleaseAnnouncementResVoList.add(pmReleaseAnnouncementResVo);
+                    }
+                    pmPurchaseExecutionResVo.setPmReleaseAnnouncementResVoList(pmReleaseAnnouncementResVoList);
+                }
+                //专家信息列表
+                List<PmBaseExpertResVo> pmBaseExpertResVoList = this.pmDemandExpertRefService.getPmBaseExpertResVoList(demandId);
+                pmPurchaseExecutionResVo.setPmBaseExpertResVoList(pmBaseExpertResVoList);
+                //开标信息列表
+                List<PmBidOpeningResVo> pmBidOpeningResVoList = this.pmBidOpeningService.getPmBidOpeningResVoList(demandId);
+                pmPurchaseExecutionResVo.setPmBidOpeningResVoList(pmBidOpeningResVoList);
+                //中标信息列表
+                LambdaQueryWrapper<PmBidWinning> lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
+                lambdaQueryWrapper1.eq(PmBidWinning::getDemandId, demandId).orderByDesc(PmBidWinning::getBidAnnouncementTime);
+                List<PmBidWinning> pmBidWinningList = this.pmBidWinningService.list(lambdaQueryWrapper1);
+                if (!ObjectUtils.isEmpty(pmBidWinningList)) {
+                    List<PmBidWinningResVo> pmBidWinningResVoList = new ArrayList<>();
+                    for (PmBidWinning pmBidWinning : pmBidWinningList) {
+                        PmBidWinningResVo pmBidWinningResVo = new PmBidWinningResVo();
+                        BeanUtils.copyProperties(pmBidWinning, pmBidWinningResVo);
+                        List<SysFileInfo> fileInfos = getSysFileInfoList(pmBidWinning.getId(), SysFileRefEnum.PM_BID_WINNING_FILE.getType());
+                        if (!ObjectUtils.isEmpty(fileInfos)) {
+                            pmBidWinningResVo.setFileInfos(fileInfos);
+                        }
+                        pmBidWinningResVoList.add(pmBidWinningResVo);
+                    }
+                    pmPurchaseExecutionResVo.setPmBidWinningResVoList(pmBidWinningResVoList);
+                }
+                //质疑情况
+                List<SysFileInfo> callRequestFileInfos = getSysFileInfoList(vo.getDemandId(), SysFileRefEnum.PM_BID_CALL_QEUSTION_FILE.getType());
+                if (!ObjectUtils.isEmpty(callRequestFileInfos)) {
+                    pmPurchaseExecutionResVo.setCallRequestFileInfos(callRequestFileInfos);
+                }
+                //流标情况
+                LambdaQueryWrapper<PmBidFailure> lambdaQueryWrapper2 = new LambdaQueryWrapper<>();
+                lambdaQueryWrapper2.eq(PmBidFailure::getDemandId, demandId).orderByDesc(PmBidFailure::getBidFailureTime);
+                List<PmBidFailure> pmBidFailureList = this.pmBidFailureService.list(lambdaQueryWrapper2);
+                if (!ObjectUtils.isEmpty(pmBidFailureList)) {
+                    List<PmBidFailureResVo> pmBidFailureResVoList = new ArrayList<>();
+                    for (PmBidFailure pmBidFailure : pmBidFailureList) {
+                        PmBidFailureResVo pmBidFailureResVo = new PmBidFailureResVo();
+                        BeanUtils.copyProperties(pmBidFailure, pmBidFailureResVo);
+                        List<SysFileInfo> fileInfos = getSysFileInfoList(pmBidFailure.getId(), SysFileRefEnum.PM_BID_FAILURE_FILE.getType());
+                        if (!ObjectUtils.isEmpty(fileInfos)) {
+                            pmPurchaseExecutionResVo.setFileInfos(fileInfos);
+                        }
+                        pmBidFailureResVoList.add(pmBidFailureResVo);
+                    }
+                    pmPurchaseExecutionResVo.setPmBidFailureResVoList(pmBidFailureResVoList);
+                }
+                //中标通知书
+                List<SysFileInfo> pmBidWinningNotificationFileInfos = getSysFileInfoList(vo.getDemandId(), SysFileRefEnum.PM_BID_WINNING_NOTIFICATION.getType());
+                if (!ObjectUtils.isEmpty(pmBidWinningNotificationFileInfos)) {
+                    pmPurchaseExecutionResVo.setPmBidWinningNotificationFileInfos(pmBidWinningNotificationFileInfos);
+                }
+                vo.setPmPurchaseExecutionResVo(pmPurchaseExecutionResVo);
+            } else if ("5".equals(detailType)) { //合同信息
+                LambdaQueryWrapper<PmContractInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+                lambdaQueryWrapper.eq(PmContractInfo::getDemandId, demandId);
+                PmContractInfo pmContractInfo = pmContractInfoService.getOne(lambdaQueryWrapper);
+                if (pmContractInfo != null) {
+                    PmContractInfoResVo pmContractInfoResVo = new PmContractInfoResVo();
+                    BeanUtils.copyProperties(pmContractInfo, pmContractInfoResVo);
+                    //合同信息文件
+                    List<SysFileInfo> fileInfos = getSysFileInfoList(pmContractInfo.getId(), SysFileRefEnum.PM_CONTRACT_INFO.getType());
+                    if (!ObjectUtils.isEmpty(fileInfos)) {
+                        pmContractInfoResVo.setFileInfos(fileInfos);
+                    }
+                    vo.setPmContractInfoResVo(pmContractInfoResVo);
+                }
+            } 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);
+                    //建设情况文件
+                    List<SysFileInfo> fileInfos = getSysFileInfoList(pmProjectConstruction.getId(), SysFileRefEnum.PM_PROJECT_CONSTRUCTION.getType());
+                    if (!ObjectUtils.isEmpty(fileInfos)) {
+                        pmProjectConstructionResVo.setFileInfos(fileInfos);
+                    }
+                    vo.setPmProjectConstructionResVo(pmProjectConstructionResVo);
+                }
+            }
+            return AjaxResult.success(vo);
+        } else {
+            if (StringUtils.isNotNull(provisionalPlan)) {
+                return AjaxResult.success(provisionalPlan);
+            } else {
+                if (StringUtils.isNotNull(byId)) {
+                    return AjaxResult.success(byId);
+                }
+            }
+        }
+        return AjaxResult.error("没有查到相关数据!");
+    }
+
+    private List<SysFileInfo> getSysFileInfoList(Long redId, Integer type) {
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("red_id", redId);
+        map.put("type", type);
+        List<SysFileRef> fileRefs = sysFileRefService.listByMap(map);
+        if (!ObjectUtils.isEmpty(fileRefs)) {
+            List<SysFileInfo> fileInfos = new ArrayList<>();
+            for (SysFileRef ref : fileRefs) {
+                SysFileInfo fileInfo = fileService.getById(ref.getFileId());
+                fileInfos.add(fileInfo);
+            }
+            return fileInfos;
+        } else {
+            return null;
+        }
+
+    }
+
+    /**
+     * 查询已被催告发函的计划
+     *
+     * @return
+     */
+    @Override
+    public List<PlanQuarterResponseVo> willSendLetter() {
+        LambdaQueryWrapper<PlanYears> yearsLp = new LambdaQueryWrapper<PlanYears>();
+        yearsLp.eq(PlanYears::getDelFlay, DataIsDelete.DataNOTDelete.getCode());
+        yearsLp.eq(PlanYears::getSendLetter, "1");
+        List<PlanYears> planYears = planYearsMapper.selectList(yearsLp);
+
+        LambdaQueryWrapper<PlanQuarter> quarterLp = new LambdaQueryWrapper<PlanQuarter>();
+        quarterLp.eq(PlanQuarter::getDelFlay, DataIsDelete.DataNOTDelete.getCode());
+        quarterLp.eq(PlanQuarter::getSendLetter, "1");
+        List<PlanQuarter> planQuarters = planQuarterMapper.selectList(quarterLp);
+        //融合一起
+        List<PlanQuarterResponseVo> vos = planComplex(planYears, planQuarters);
+        return vos;
+    }
+
+    public List<PlanQuarterResponseVo> getListByProjectStatus(String projectStatus) {
+        LambdaQueryWrapper<PlanYears> yearsLp = new LambdaQueryWrapper<PlanYears>();
+        yearsLp.eq(PlanYears::getDelFlay, DataIsDelete.DataNOTDelete.getCode());
+        yearsLp.eq(PlanYears::getProjectStatus, projectStatus);
+        List<PlanYears> planYears = planYearsMapper.selectList(yearsLp);
+
+        LambdaQueryWrapper<PlanQuarter> quarterLp = new LambdaQueryWrapper<PlanQuarter>();
+        quarterLp.eq(PlanQuarter::getDelFlay, DataIsDelete.DataNOTDelete.getCode());
+        quarterLp.eq(PlanQuarter::getProjectStatus, projectStatus);
+        List<PlanQuarter> planQuarters = planQuarterMapper.selectList(quarterLp);
+        //融合一起
+        List<PlanQuarterResponseVo> vos = planComplex(planYears, planQuarters);
+        return vos;
+    }
+
+    /**
+     * 年度计划与季度数据一起
+     *
+     * @return
+     */
+    public List<PlanQuarterResponseVo> planComplex(List<PlanYears> planYears, List<PlanQuarter> planQuarters) {
+        List<PlanYearsResponseVo> yearsRes = changeTo(planYears);
+        List<PlanQuarterResponseVo> quarterRes = quartzServiceImpl.changeTo(planQuarters);
+        if (!ObjectUtils.isEmpty(yearsRes) && yearsRes.size() > 0) {
+            for (PlanYearsResponseVo yearsRe : yearsRes) {
+                PlanQuarterResponseVo responseVo = new PlanQuarterResponseVo();
+
+                BeanUtils.copyProperties(yearsRe, responseVo);
+                quarterRes.add(responseVo);
+            }
+        }
+        return quarterRes;
+    }
+
     //判断是否为超额计划
     public String isExcessOrNo(String projectType, BigDecimal evaluation) {
         BigDecimal threshold = new BigDecimal(0);
@@ -800,15 +1233,32 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
     }
 
     //字段赋值对应的名称
-    public List<PlanYears> changeTo(List<PlanYears> planYears) {
-
+    public List<PlanYearsResponseVo> changeTo(List<PlanYears> planYears) {
+        //获取年度计划提报时间的阈值
+        List<SysDictData> supTime = dictTypeService.selectDictDataByType("sys_annual_plan");
+        HashMap<String, String> thresholdMap = new LinkedHashMap<>();
+        //年度提报时间的阈值
+        for (SysDictData dictData : supTime) {
+            //    字段名称----阈值
+            thresholdMap.put(dictData.getDictLabel(), dictData.getDictValue());
+        }
+        //提前或延后*天进行提醒
+        List<SysDictData> alertTime = dictTypeService.selectDictDataByType("alert_time_setting");
+        HashMap<String, String> alertTimeMap = new LinkedHashMap<>();
+        //根据时间类别设定的提醒时间
+        for (SysDictData dictData : alertTime) {
+            //    字段名称----阈值
+            alertTimeMap.put(dictData.getDictLabel(), dictData.getDictValue());
+        }
+        //获取字典数据
         HashMap<String, HashMap<String, String>> planEnums = dictTypeService.getAboutEnums();
         HashMap<String, String> projectTypesMap = planEnums.get("projectTypes");
         HashMap<String, String> planPurchaseModesMap = planEnums.get("planPurchaseModes");
         HashMap<String, String> projectAttributes = planEnums.get("projectAttributes");
         HashMap<String, String> purchaseServices = planEnums.get("purchaseServices");
-        List<PlanYears> list = new ArrayList<PlanYears>();
+        List<PlanYearsResponseVo> list = new ArrayList<PlanYearsResponseVo>();
         for (PlanYears planYear : planYears) {
+            PlanYearsResponseVo responseVo = new PlanYearsResponseVo();
             SysDeptResponseVo sysDeptResponseVo = (SysDeptResponseVo) deptService.selectDeptById(Long.valueOf(planYear.getPurchaseDeptId())).get("sysDept");
             planYear.setPurchaseDeptName(sysDeptResponseVo.getDeptName());
 
@@ -832,7 +1282,11 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
                     for (String s : split) {
                         for (Map.Entry<String, String> entry : projectAttributes.entrySet()) {
                             if (s.equals(entry.getValue())) {
-                                builder.append(entry.getKey() + ",");
+                                if (!planYear.getProjectAttr().endsWith(s)) {
+                                    builder.append(entry.getKey() + ",");
+                                } else {
+                                    builder.append(entry.getKey());
+                                }
                                 break;
                             }
                         }
@@ -853,9 +1307,53 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
                     break;
                 }
             }
-
-            list.add(planYear);
+            BeanUtils.copyProperties(planYear, responseVo);
+            try {
+                responseVo.setTipsMessage(planYearsGetTips(responseVo, thresholdMap, alertTimeMap));
+            } catch (ParseException e) {
+                e.printStackTrace();
+            }
+            list.add(responseVo);
         }
         return list;
     }
+
+    /**
+     * 根据年度计划提报时间的阈值进行提示
+     *
+     * @return
+     */
+    public String planYearsGetTips(PlanYearsResponseVo responseVo, HashMap<String, String> thresholdMap, HashMap<String, String> alertTimeMap) throws ParseException {
+        //提示信息:定义距离结束时间*天内提示
+        int alertDay = Integer.parseInt(alertTimeMap.get("计划提报时间"));
+        Integer remindTime = 1000 * 60 * 60 * 24 * alertDay;
+        //提报时间的结束时间阈值
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        Date thresholdTime = dateFormat.parse(thresholdMap.get("起止时间结束"));
+        Date date = new Date();
+        thresholdTime.setYear(date.getYear());
+        double surplus = thresholdTime.getTime() - date.getTime();
+        //少于设定天数便提醒
+        if (surplus < remindTime && surplus > 0) {
+            //剩余天数(向上取整)
+            int i = new Double(Math.ceil(surplus / 1000 / 60 / 60 / 24)).intValue();
+            if (i > 0) {
+                return "距离计划提报时间不足" + i + "天";
+            }
+        }
+        //距离计划完成采购时间一周内提醒
+        Integer alertTime = 1000 * 60 * 60 * 24 * 7;
+        double surplusTwo = responseVo.getPlanPurchaseFinishTime().getTime() - System.currentTimeMillis();
+        //少于设定阈值便提醒
+        if (surplusTwo < alertTime && surplusTwo > 0) {
+            //剩余天数(向上取整)
+            int i = new Double(Math.ceil(surplusTwo / 1000 / 60 / 60 / 24)).intValue();
+            if (i > 0) {
+                return "距离计划完成采购时间不足" + i + "天";
+            }
+        }
+
+        return "";
+    }
+
 }

+ 53 - 6
purchase-system/src/main/java/com/ozs/plan/service/impl/ProvisionalPlanServiceImpl.java

@@ -10,6 +10,7 @@ import com.ozs.common.core.domain.AjaxResult;
 import com.ozs.common.core.domain.entity.SysDept;
 import com.ozs.common.core.domain.entity.SysDictData;
 import com.ozs.common.core.domain.model.LoginUser;
+import com.ozs.common.enums.PmProjectStatus;
 import com.ozs.common.enums.ProjectStatus;
 import com.ozs.common.enums.ProjectTypes;
 import com.ozs.common.enums.SysFileRefEnum;
@@ -24,12 +25,16 @@ import com.ozs.plan.doman.vo.requestVo.ProvisionalPlanVo;
 import com.ozs.plan.mapper.PlanYearsMapper;
 import com.ozs.plan.mapper.ProvisionalPlanMapper;
 import com.ozs.plan.service.ProvisionalPlanService;
+import com.ozs.pm.doman.PmDemand;
+import com.ozs.pm.mapper.PmDemandMapper;
+import com.ozs.system.domain.SysFileInfo;
 import com.ozs.system.domain.SysFileRef;
 import com.ozs.system.domain.vo.responseVo.SysDeptResponseVo;
 import com.ozs.system.mapper.SysDeptMapper;
 import com.ozs.system.mapper.SysFileRefMapper;
 import com.ozs.system.service.ISysDeptService;
 import com.ozs.system.service.ISysDictTypeService;
+import com.ozs.system.service.SysFileService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.ObjectUtils;
@@ -52,10 +57,14 @@ public class ProvisionalPlanServiceImpl extends ServiceImpl<ProvisionalPlanMappe
     private PlanYearsMapper planYearsMapper;
     @Autowired
     private SysFileRefMapper sysFileRefMapper;
+    @Autowired
+    private SysFileService fileService;
+    @Autowired
+    private PmDemandMapper pmDemandMapper;
 
     @Override
-    public int deleteProvisionalPlanById(Integer planYearId) {
-        return provisionalPlanMapper.deleteProvisionalPlanById(planYearId);
+    public int deleteProvisionalPlanById(Integer planPracticalId) {
+        return provisionalPlanMapper.deleteProvisionalPlanById(planPracticalId);
     }
 
     @Override
@@ -175,9 +184,28 @@ public class ProvisionalPlanServiceImpl extends ServiceImpl<ProvisionalPlanMappe
     }
 
     @Override
-    public ProvisionalPlan seletById(Integer planPracticalId) {
-        ProvisionalPlan provisionalPlan = changeToProvisionalPlan(provisionalPlanMapper.seletById(planPracticalId));
-        return provisionalPlan;
+    public AjaxResult seletById(Integer planPracticalId) {
+        ProvisionalPlan provisionalPlan = provisionalPlanMapper.seletById(planPracticalId);
+        if (StringUtils.isNull(provisionalPlan)) {
+            return AjaxResult.error("数据查询失败");
+        }
+        // 转换字段中文
+        ProvisionalPlan provisionalPlanC = changeToProvisionalPlan(provisionalPlan);
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("red_id", provisionalPlanC.getPlanPracticalId());
+        map.put("type", SysFileRefEnum.PLAN_TEMPORARY.getType());
+        List<SysFileRef> fileRefs = sysFileRefMapper.selectByMap(map);
+        List<SysFileInfo> fileInfos = new ArrayList<>();
+        ProvisionalPlanVo provisionalPlanVo = new ProvisionalPlanVo();
+        BeanUtils.copyProperties(provisionalPlanC, provisionalPlanVo);
+        if (!ObjectUtils.isEmpty(fileRefs)) {
+            for (SysFileRef ref : fileRefs) {
+                SysFileInfo fileInfo = fileService.getById(ref.getFileId());
+                fileInfos.add(fileInfo);
+            }
+            provisionalPlanVo.setFileInfos(fileInfos);
+        }
+        return AjaxResult.success(provisionalPlanVo);
     }
 
     @Override
@@ -203,11 +231,30 @@ public class ProvisionalPlanServiceImpl extends ServiceImpl<ProvisionalPlanMappe
         ProvisionalPlan byId = provisionalPlanMapper.seletById(provisionalPlanVo.getPlanPracticalId());
         if (ObjectUtils.isEmpty(byId.getPlanYearId())) {
             PlanYears ofYears = new PlanYears();
-            BeanUtils.copyProperties(provisionalPlanVo, ofYears);
+            BeanUtils.copyProperties(byId, ofYears);
             planYearsMapper.insertPlanYears(ofYears);
             Long planYearId = ofYears.getPlanYearId();
             byId.setPlanYearId(ofYears.getPlanYearId().intValue());
         }
+        PmDemand demand = new PmDemand();
+        BeanUtils.copyProperties(byId, demand);
+        demand.setPlanId(Long.valueOf(byId.getPlanPracticalId()));
+        //同步到项目管理状态为需求待填制
+        demand.setProjectStatus(PmProjectStatus.DEMAND_WAIT_FILL.getCode());
+        demand.setCreateTime(new Date());
+        pmDemandMapper.insert(demand);
+        //计划附件也进行同步---查询年度计划附件后复制一份改为项目需求附件
+        LambdaQueryWrapper<SysFileRef> sysFileRefLp = new LambdaQueryWrapper<>();
+        sysFileRefLp.eq(SysFileRef::getType, SysFileRefEnum.PLAN_YEAR.getType());
+        sysFileRefLp.eq(SysFileRef::getRedId, byId.getPlanYearId());
+        List<SysFileRef> sysFileRefs = sysFileRefMapper.selectList(sysFileRefLp);
+        if (!ObjectUtils.isEmpty(sysFileRefs)) {
+            for (SysFileRef ref : sysFileRefs) {
+                ref.setRedId(demand.getDemandId());
+                ref.setType(SysFileRefEnum.PM_DEMAND.getType());
+                sysFileRefMapper.insert(ref);
+            }
+        }
         byId.setProjectStatus(ProjectStatus.PLANTOEXAMINE.getCode());
         return review(provisionalPlanVo, byId);
     }

+ 5 - 1
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,7 +52,10 @@ 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")

+ 3 - 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;
@@ -61,6 +56,9 @@ public class PmBidWinning implements Serializable {
     @TableField("BID_ANNOUNCEMENT_CLOSE_TIME")
     private Date bidAnnouncementCloseTime;
 
+    @ApiModelProperty("状态:0正常,1被替换,2被质疑流标")
+    @TableField("STATUS")
+    private String status;
 
     @ApiModelProperty("创建者")
     @TableField("CREATE_BY")

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

@@ -0,0 +1,73 @@
+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("状态:0正常,1被替换,2被质疑流标")
+    @TableField("STATUS")
+    private String status;
+
+    @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;
+
+
+}

+ 15 - 20
purchase-system/src/main/java/com/ozs/pm/doman/PmContractUnitRef.java

@@ -19,47 +19,42 @@ import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
 /**
- * 合同单位关联表(PmContractUnitRef)实体类
+ * 需求建档表(PmBookBuilding)实体类
  *
  * @author makejava
- * @since 2023-02-02 00:47:22
+ * @since 2023-02-08 12:50:30
  */
 
 @Data
 @EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
-@TableName("pm_contract_unit_ref")
-@ApiModel(value = "合同单位关联表", description = "")
-public class PmContractUnitRef implements Serializable {
-    private static final long serialVersionUID = 497813391870165785L;
+@TableName("pm_book_building")
+@ApiModel(value = "需求建档表", description = "")
+public class PmBookBuilding implements Serializable {
+    private static final long serialVersionUID = 554636460409301951L;
 
     @TableId(value = "ID", type = IdType.AUTO)
     private Long id;
 
 
-    @ApiModelProperty("合同ID")
-    @TableField("CONTRACT_INFO_ID")
-    private Long contractInfoId;
-
-
     @ApiModelProperty("需求ID")
     @TableField("DEMAND_ID")
     private Long demandId;
 
 
-    @ApiModelProperty("单位类型,A:甲方,B:乙方")
-    @TableField("UNIT_TYPE")
-    private String unitType;
+    @ApiModelProperty("预算金额(万元)")
+    @TableField("BUDGET_AMOUNT")
+    private Double budgetAmount;
 
 
-    @ApiModelProperty("合同签订地点")
-    @TableField("CONTRACT_SIGN_PLACE")
-    private String contractSignPlace;
+    @ApiModelProperty("需求提报时间")
+    @TableField("DEMAND_COMMIT_TIME")
+    private Date demandCommitTime;
 
 
-    @ApiModelProperty("合同签订日期")
-    @TableField("CONTRACT_SIGN_DATE")
-    private Date contractSignDate;
+    @ApiModelProperty("备注")
+    @TableField("REMARKS")
+    private String remarks;
 
 
     @ApiModelProperty("创建者")

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

@@ -57,16 +57,16 @@ public class PmContractInfo implements Serializable {
     private Double contractAmount;
 
 
+    @ApiModelProperty("合同起始日期")
+    @TableField("CONTRACT_START_DATE")
+    private Date contractStartDate;
+
+
     @ApiModelProperty("合同终止日期")
     @TableField("CONTRACT_TERMINATION_DATE")
     private Date contractTerminationDate;
 
 
-    @ApiModelProperty("建设(交付)时间")
-    @TableField("CONSTRUCTION_DELIVERY_TIME")
-    private Date constructionDeliveryTime;
-
-
     @ApiModelProperty("创建者")
     @TableField("CREATE_BY")
     private String createBy;

+ 95 - 47
purchase-system/src/main/java/com/ozs/pm/doman/PmDemand.java

@@ -1,18 +1,17 @@
 package com.ozs.pm.doman;
 
-import java.math.BigDecimal;
+import java.io.Serializable;
+
 import java.util.Date;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.ozs.common.annotation.Excel;
-import com.ozs.common.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+import lombok.experimental.Accessors;
 
 /**
  * 采购需求对象 pm_demand
@@ -21,121 +20,170 @@ import lombok.NoArgsConstructor;
  * @date 2023-01-16
  */
 @Data
-@AllArgsConstructor
-@NoArgsConstructor
-@Builder
-@ApiModel("采购需求对象")
-public class PmDemand extends BaseEntity
-{
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("pm_demand")
+@ApiModel(value = "采购需求表", description = "")
+public class PmDemand implements Serializable {
+
     private static final long serialVersionUID = 1L;
 
     /** 主键 */
-    @TableId(type = IdType.AUTO)
+    @TableId(value = "DEMAND_ID", type = IdType.AUTO)
     private Long demandId;
 
     /** 计划ID */
-    @Excel(name = "计划ID")
+    @ApiModelProperty("计划ID")
+    @TableField("PLAN_ID")
     private Long planId;
 
     /** 采购单位(登录账号的单位) */
-    @Excel(name = "采购单位", readConverterExp = "登=录账号的单位")
+    @ApiModelProperty("采购单位(登录账号的单位)")
+    @TableField("PURCHASE_DEPT_ID")
     private Long purchaseDeptId;
 
     /** 项目名称 */
-    @Excel(name = "项目名称")
+    @ApiModelProperty("项目名称")
+    @TableField("PROJECT_NAME")
     private String projectName;
 
     /** 项目类型(0:装备类;1:物资类;2:服务类;3:工程类) */
-    @Excel(name = "项目类型", readConverterExp = "0=:装备类;1:物资类;2:服务类;3:工程类")
+    @ApiModelProperty("项目类型(0:装备类;1:物资类;2:服务类;3:工程类)")
+    @TableField("PROJECT_TYPE")
     private String projectType;
 
     /** 需求概况 */
-    @Excel(name = "需求概况")
+    @ApiModelProperty("需求概况")
+    @TableField("DEMAND_OVERVIEW")
     private String demandOverview;
 
     /** 概算金额(万元(保留小数点后两位) */
-    @Excel(name = "概算金额(万元", readConverterExp = "保=留小数点后两位")
-    private BigDecimal evaluation;
+    @ApiModelProperty("概算金额(万元(保留小数点后两位)")
+    @TableField("EVALUATION")
+    private Double evaluation;
 
     /** 是否为超限额计划(0:未超额,1:超额) */
-    @Excel(name = "是否为超限额计划(0:未超额,1:超额)")
+    @ApiModelProperty("是否为超限额计划(0:未超额,1:超额)")
+    @TableField("IS_EXCESS")
     private Integer isExcess;
 
     /** 采购服务站 */
-    @Excel(name = "采购服务站")
+    @ApiModelProperty("采购服务站")
+    @TableField("PURCHASE_SERVICES")
     private String purchaseServices;
 
     /** 采购方式  (0:公开招标, 1:单一来源,2:邀请招标,3:竞争式谈判,4:询价) */
-    @Excel(name = "采购方式  (0:公开招标, 1:单一来源,2:邀请招标,3:竞争式谈判,4:询价)")
+    @ApiModelProperty("采购方式  (0:公开招标, 1:单一来源,2:邀请招标,3:竞争式谈判,4:询价)")
+    @TableField("PURCHASE_MODE")
     private String purchaseMode;
 
     /** 计划提报需求时间--->需求单位成功提报采购需求的日期(具体到月) */
-    @Excel(name = "计划提报需求时间--->需求单位成功提报采购需求的日期", readConverterExp = "具=体到月")
+    @ApiModelProperty("计划提报需求时间--->需求单位成功提报采购需求的日期(具体到月)")
+    @TableField("PLAN_DEMAND_SUB_TIME")
     private Date planDemandSubTime;
 
     /** 计划完成采购时间--->公示中标结果的日期,即填制中标信息的日期(具体到月) */
-    @Excel(name = "计划完成采购时间--->公示中标结果的日期,即填制中标信息的日期", readConverterExp = "具=体到月")
+    @ApiModelProperty("计划完成采购时间--->公示中标结果的日期,即填制中标信息的日期(具体到月)")
+    @TableField("PLAN_PURCHASE_FINISH_TIME")
     private Date planPurchaseFinishTime;
 
     /** 计划交付时间--->供应商完成并交付后,使用单位收到标的日期,即填制建设文档的日期 */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "计划交付时间--->供应商完成并交付后,使用单位收到标的日期,即填制建设文档的日期", width = 30, dateFormat = "yyyy-MM-dd")
+    @ApiModelProperty("计划交付时间--->供应商完成并交付后,使用单位收到标的日期,即填制建设文档的日期")
+    @TableField("PLAN_DELIVER_TIME")
     private Date planDeliverTime;
 
     /** 项目属性(0:应急应战项目, 1:重大规划任务项目, 2:规划任务项目, 3:一般项目) */
-    @Excel(name = "项目属性", readConverterExp = "0=:应急应战项目,,1=:重大规划任务项目,,2=:规划任务项目,,3=:一般项目")
+    @ApiModelProperty("项目属性(0:应急应战项目, 1:重大规划任务项目, 2:规划任务项目, 3:一般项目)")
+    @TableField("PROJECT_ATTR")
     private String projectAttr;
 
     /** 计划调整情况及理由--->如计划需要变更,在填写申请修改时需填写调整情况及理由,审核单位审核通过后显示该信息 */
-    @Excel(name = "计划调整情况及理由--->如计划需要变更,在填写申请修改时需填写调整情况及理由,审核单位审核通过后显示该信息")
+    @ApiModelProperty("计划调整情况及理由--->如计划需要变更,在填写申请修改时需填写调整情况及理由,审核单位审核通过后显示该信息")
+    @TableField("ADJUST_REASON")
     private String adjustReason;
 
     /** 备注 */
-    @Excel(name = "备注")
+    @ApiModelProperty("备注")
+    @TableField("REMARKS")
     private String remarks;
 
     /** 实际提报需求时间--->需求单位成功提报采购需求的日期(具体到日) */
-    @Excel(name = "实际提报需求时间--->需求单位成功提报采购需求的日期", readConverterExp = "具=体到日")
+    @ApiModelProperty("实际提报需求时间--->需求单位成功提报采购需求的日期(具体到日)")
+    @TableField("REAL_DEMAND_COMMIT_TIME")
     private Date realDemandCommitTime;
 
-    /** 实际完成采购时间--->公示中标结果的日期,即填制中标信息的日期(具体到日) */
-    @Excel(name = "实际完成采购时间--->公示中标结果的日期,即填制中标信息的日期", readConverterExp = "具=体到日")
+    /** 实际完成采购时间--->上传中标通知书的日期(具体到日) */
+    @ApiModelProperty("实际完成采购时间--->上传中标通知书的日期(具体到日)")
+    @TableField("REAL_PURCHASE_FINISH_TIME")
     private Date realPurchaseFinishTime;
 
     /** 实际交付(实施)时间--->供应商完成并交付后,使用单位收到标的日期,即填制建设文档的日期 */
-    @Excel(name = "实际交付", readConverterExp = "实=施")
+    @ApiModelProperty("实际交付(实施)时间--->供应商完成并交付后,使用单位收到标的日期,即填制建设文档的日期")
+    @TableField("REAL_DELIVER_TIME")
     private Date realDeliverTime;
 
     /** 审核时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "审核时间", width = 30, dateFormat = "yyyy-MM-dd")
+    @ApiModelProperty("审核时间")
+    @TableField("AUDIT_TIME")
     private Date auditTime;
 
     /** 预警状态(0:正常,1:预警) */
-    @Excel(name = "预警状态(0:正常,1:预警)")
+    @ApiModelProperty("预警状态(0:正常,1:预警)")
+    @TableField("WARN_STATUS")
     private String warnStatus;
 
-    /** 项目状态(4:需求待填制,5:需求待提交,6:需求待审核,7:任务待下达,8:任务已下达,9:中标信息待填制,10:中标信息已填制,11:合同待填制,12:合同已填制,13:项目建设中,14:项目建设完成) */
-    @Excel(name = "项目状态(4:需求待填制,5:需求待提交,6:需求待审核,7:任务待下达,8:任务已下达,9:中标信息待填制,10:中标信息已填制,11:合同待填制,12:合同已填制,13:项目建设中,14:项目建设完成)")
-    private Long projectStatus;
+    /**
+     * 项目状态(4:需求待填制,5:需求待提交,6:需求待审核,7:任务待下达,8:任务已下达,9:中标信息待填制,10:中标信息已填制,11:合同待填制,12:合同已填制,13:项目建设中,14:项目建设完成)
+     */
+    @ApiModelProperty("项目状态(4:需求待填制,5:需求待提交,6:需求待审核,7:需求已退回,8:任务待下达,9:待选取代理,10:待上传招标文件,11:待发布公告,12:待开标,13:待发布中标公告,14:中标公示中,15:合同待填制,16:项目建设中,17:项目已完成)")
+    @TableField("PROJECT_STATUS")
+    private String projectStatus;
 
     /** 退回原因 */
-    @Excel(name = "退回原因")
+    @ApiModelProperty("退回原因")
+    @TableField("REFUSE_REASON")
     private String refuseReason;
 
     /** 滞后原因 */
-    @Excel(name = "滞后原因")
+    @ApiModelProperty("滞后原因")
+    @TableField("DELAY_REASON")
     private String delayReason;
 
     /** 调整建议 */
-    @Excel(name = "调整建议")
+    @ApiModelProperty("调整建议")
+    @TableField("ADJUST_ADVICE")
     private String adjustAdvice;
 
     /** 抽取招标代理机构id */
-    @Excel(name = "抽取招标代理机构id")
+    @ApiModelProperty("抽取招标代理机构id")
+    @TableField("AGENCY_ID")
     private Long agencyId;
 
     /** 抽取招标代理机构时间 */
-    @Excel(name = "抽取招标代理机构时间")
+    @ApiModelProperty("抽取招标代理机构时间")
+    @TableField("EXTRACT_AGENCY_TIME")
     private Date extractAgencyTime;
+
+    /** 调整建议 */
+    @ApiModelProperty("是否有质疑,1是,0否")
+    @TableField("CALL_QUESTION")
+    private String callQuestion;
+    @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;
 }

+ 0 - 118
purchase-system/src/main/java/com/ozs/pm/doman/PmDemandEngineering.java

@@ -1,118 +0,0 @@
-package com.ozs.pm.doman;
-
-import java.math.BigDecimal;
-import com.ozs.common.annotation.Excel;
-import com.ozs.common.core.domain.BaseEntity;
-import io.swagger.annotations.ApiModel;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-/**
- * 采购需求工程类对象 pm_demand_engineering
- *
- * @author ruoyi
- * @date 2023-01-16
- */
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-@Builder
-@ApiModel("采购需求工程类对象")
-public class PmDemandEngineering extends BaseEntity
-{
-    private static final long serialVersionUID = 1L;
-
-    /** 主键 */
-    private Long demandEngineeringId;
-
-    /** 需求ID */
-    @Excel(name = "需求ID")
-    private Long demandId;
-
-    /** 工程项目名称 */
-    @Excel(name = "工程项目名称")
-    private String engineeringName;
-
-    /** 建设地点 */
-    @Excel(name = "建设地点")
-    private String constructionLocation;
-
-    /** 设计任务书批复文号 */
-    @Excel(name = "设计任务书批复文号")
-    private String designAssignmenApprovalNumber;
-
-    /** 工程建设计划文号 */
-    @Excel(name = "工程建设计划文号")
-    private BigDecimal projectConstructionPlanNumber;
-
-    /** 任务书批复规模(㎡): */
-    @Excel(name = "任务书批复规模(㎡):")
-    private BigDecimal tassignmentApprovalScale;
-
-    /** 任务书批复投资 */
-    @Excel(name = "任务书批复投资")
-    private String tassignmentApprovalInvestmen;
-
-    /** 规划许可文号 */
-    @Excel(name = "规划许可文号")
-    private String planningLicenseNumber;
-
-    /** 密级处理 */
-    @Excel(name = "密级处理")
-    private String classifiedTreatment;
-
-    /** 采购项目规模(㎡) */
-    @Excel(name = "采购项目规模(㎡)")
-    private BigDecimal procurementProjectScale;
-
-    /** 采购项目投资(万元) */
-    @Excel(name = "采购项目投资(万元)")
-    private BigDecimal procurementProjectInvestment;
-
-    /** 联系人 */
-    @Excel(name = "联系人")
-    private String linkman;
-
-    /** 电话 */
-    @Excel(name = "电话")
-    private String phone;
-
-    /** 项目类别 */
-    @Excel(name = "项目类别")
-    private String projectCategory;
-
-    /** 承包方式 */
-    @Excel(name = "承包方式")
-    private String contractingMode;
-
-    /** 施工图是否完成(0未完成,1完成) */
-    @Excel(name = "施工图是否完成(0未完成,1完成)")
-    private String constructionDrawing;
-
-    /** 设计单位 */
-    @Excel(name = "设计单位")
-    private String designUnit;
-
-    /** 最高限价 */
-    @Excel(name = "最高限价")
-    private BigDecimal ceilingPrice;
-
-    /** 采购方式建议 */
-    @Excel(name = "采购方式建议")
-    private String procurementMethodSuggest;
-
-    /** 投标(报价)人资质等级要求 */
-    @Excel(name = "投标(报价)人资质等级要求")
-    private String qualificationLevelRequirement;
-
-    /** 供应商 */
-    @Excel(name = "供应商")
-    private Long supplierId;
-
-    /** 备注 */
-    @Excel(name = "备注")
-    private String remarks;
-
-}

+ 0 - 77
purchase-system/src/main/java/com/ozs/pm/doman/PmDemandEquip.java

@@ -1,77 +0,0 @@
-package com.ozs.pm.doman;
-
-import java.math.BigDecimal;
-import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.ozs.common.annotation.Excel;
-import com.ozs.common.core.domain.BaseEntity;
-import io.swagger.annotations.ApiModel;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-/**
- * 采购需求装备类对象 pm_demand_equip
- *
- * @author ruoyi
- * @date 2023-01-16
- */
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-@Builder
-@ApiModel("采购需求装备类对象")
-public class PmDemandEquip extends BaseEntity
-{
-    private static final long serialVersionUID = 1L;
-
-    /** 主键 */
-    private Long demandEquipId;
-
-    /** 需求ID */
-    @Excel(name = "需求ID")
-    private Long demandId;
-
-    /** 物资类别及品种名称 */
-    @Excel(name = "物资类别及品种名称")
-    private String typeAndName;
-
-    /** 规格型号长*宽*高 */
-    @Excel(name = "规格型号长*宽*高")
-    private String specification;
-
-    /** 质量技术标准(技术参数): */
-    @Excel(name = "质量技术标准(技术参数):")
-    private String qualityTechnicalStandard;
-
-    /** 计量单位 */
-    @Excel(name = "计量单位")
-    private String measurementUnit;
-
-    /** 采购数量 */
-    @Excel(name = "采购数量")
-    private BigDecimal procurementQuantity;
-
-    /** 单价(元) */
-    @Excel(name = "单价(元)")
-    private BigDecimal price;
-
-    /** 预算金额(万元) */
-    @Excel(name = "预算金额(万元)")
-    private BigDecimal budgetAmount;
-
-    /** 需求提报时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "需求提报时间", width = 30, dateFormat = "yyyy-MM-dd")
-    private Date demandCommitTime;
-
-    /** 采购方式建议 */
-    @Excel(name = "采购方式建议")
-    private String procurementMethodSuggest;
-
-    /** 备注 */
-    @Excel(name = "备注")
-    private String remarks;
-
-}

+ 73 - 0
purchase-system/src/main/java/com/ozs/pm/doman/PmDemandExpertRef.java

@@ -0,0 +1,73 @@
+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;
+
+/**
+ * 项目专家关联表(PmDemandExpertRef)实体类
+ *
+ * @author makejava
+ * @since 2023-02-03 15:37:02
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("pm_demand_expert_ref")
+@ApiModel(value = "项目专家关联表", description = "")
+public class PmDemandExpertRef implements Serializable {
+    private static final long serialVersionUID = 193148255064096336L;
+
+    @TableId(value = "ID", type = IdType.AUTO)
+    private Long id;
+
+
+    @ApiModelProperty("需求ID")
+    @TableField("DEMAND_ID")
+    private Long demandId;
+
+
+    @ApiModelProperty("专家ID")
+    @TableField("EXPERT_ID")
+    private Long expertId;
+
+
+    @ApiModelProperty("创建者")
+    @TableField("CREATE_BY")
+    private String createBy;
+
+    @ApiModelProperty("选取时间")
+    @TableField("ACCESS_TIME")
+    private Date accessTime;
+
+    @ApiModelProperty("创建时间")
+    @TableField("CREATE_TIME")
+    private Date createTime;
+
+
+    @ApiModelProperty("更新者")
+    @TableField("UPDATE_BY")
+    private String updateBy;
+
+
+    @ApiModelProperty("更新时间")
+    @TableField("UPDATE_TIME")
+    private Date updateTime;
+
+
+}

+ 0 - 101
purchase-system/src/main/java/com/ozs/pm/doman/PmDemandMaterials.java

@@ -1,101 +0,0 @@
-package com.ozs.pm.doman;
-
-import java.math.BigDecimal;
-import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.ozs.common.annotation.Excel;
-import com.ozs.common.core.domain.BaseEntity;
-import io.swagger.annotations.ApiModel;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-/**
- * 采购需求物资类对象 pm_demand_materials
- *
- * @author ruoyi
- * @date 2023-01-16
- */
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-@Builder
-@ApiModel("采购需求物资类对象")
-public class PmDemandMaterials extends BaseEntity {
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 主键
-     */
-    private Long demandMaterialsId;
-
-    /**
-     * 需求ID
-     */
-    @Excel(name = "需求ID")
-    private Long demandId;
-
-    /**
-     * 物资类别及品种名称
-     */
-    @Excel(name = "物资类别及品种名称")
-    private String typeAndName;
-
-    /**
-     * 规格型号长*宽*高
-     */
-    @Excel(name = "规格型号长*宽*高")
-    private String specification;
-
-    /**
-     * 质量技术标准(技术参数):
-     */
-    @Excel(name = "质量技术标准(技术参数):")
-    private String qualityTechnicalStandard;
-
-    /**
-     * 计量单位
-     */
-    @Excel(name = "计量单位")
-    private String measurementUnit;
-
-    /**
-     * 采购数量
-     */
-    @Excel(name = "采购数量")
-    private BigDecimal procurementQuantity;
-
-    /**
-     * 单价(元)
-     */
-    @Excel(name = "单价(元)")
-    private BigDecimal price;
-
-    /**
-     * 预算金额(万元)
-     */
-    @Excel(name = "预算金额(万元)")
-    private BigDecimal budgetAmount;
-
-    /**
-     * 需求提报时间
-     */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "需求提报时间", width = 30, dateFormat = "yyyy-MM-dd")
-    private Date demandCommitTime;
-
-    /**
-     * 采购方式建议
-     */
-    @Excel(name = "采购方式建议")
-    private String procurementMethodSuggest;
-
-    /**
-     * 备注
-     */
-    @Excel(name = "备注")
-    private String remarks;
-
-
-}

+ 0 - 74
purchase-system/src/main/java/com/ozs/pm/doman/PmDemandServe.java

@@ -1,74 +0,0 @@
-package com.ozs.pm.doman;
-
-import java.math.BigDecimal;
-import com.ozs.common.annotation.Excel;
-import com.ozs.common.core.domain.BaseEntity;
-import io.swagger.annotations.ApiModel;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-/**
- * 采购需求服务类对象 pm_demand_serve
- *
- * @author ruoyi
- * @date 2023-01-16
- */
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-@Builder
-@ApiModel("采购需求服务类对象")
-public class PmDemandServe extends BaseEntity
-{
-    private static final long serialVersionUID = 1L;
-
-    /** 主键 */
-    private Long demandServeId;
-
-    /** 需求ID */
-    @Excel(name = "需求ID")
-    private Long demandId;
-
-    /** 服务项目名称 */
-    @Excel(name = "服务项目名称")
-    private String serviceName;
-
-    /** 技术服务要求 */
-    @Excel(name = "技术服务要求")
-    private String technicalServiceRequirement;
-
-    /** 计量单位 */
-    @Excel(name = "计量单位")
-    private String measurementUnit;
-
-    /** 采购数量 */
-    @Excel(name = "采购数量")
-    private BigDecimal procurementQuantity;
-
-    /** 单价(元) */
-    @Excel(name = "单价(元)")
-    private BigDecimal price;
-
-    /** 预算金额(万元) */
-    @Excel(name = "预算金额(万元)")
-    private BigDecimal budgetAmount;
-
-    /** 交货期限 */
-    @Excel(name = "交货期限")
-    private String deliveryTimeLimit;
-
-    /** 采购方式建议 */
-    @Excel(name = "采购方式建议")
-    private String procurementMethodSuggest;
-
-    /** 供应商 */
-    @Excel(name = "供应商")
-    private Long supplierId;
-
-    /** 备注 */
-    @Excel(name = "备注")
-    private String remarks;
-
-}

+ 57 - 23
purchase-system/src/main/java/com/ozs/pm/doman/PmFlowChart.java

@@ -1,42 +1,76 @@
 package com.ozs.pm.doman;
 
-import com.ozs.common.annotation.Excel;
-import com.ozs.common.core.domain.BaseEntity;
+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 lombok.AllArgsConstructor;
-import lombok.Builder;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import lombok.NoArgsConstructor;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
 
 /**
- * 流程图对象 pm_flow_chart
+ * 流程图表(PmFlowChart)实体类
  *
- * @author ruoyi
- * @date 2023-01-25
+ * @author makejava
+ * @since 2023-02-04 19:36:15
  */
+
 @Data
-@AllArgsConstructor
-@NoArgsConstructor
-@Builder
-@ApiModel("流程图对象")
-public class PmFlowChart extends BaseEntity
-{
-    private static final long serialVersionUID = 1L;
-
-    /** 主键 */
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("pm_flow_chart")
+@ApiModel(value = "流程图表", description = "")
+public class PmFlowChart implements Serializable {
+    private static final long serialVersionUID = 313515206301363060L;
+
+    @ApiModelProperty("主键")
+    @TableId(value = "FLOW_CHART_ID", type = IdType.AUTO)
     private Long flowChartId;
 
-    /** 模块名称 */
-    @Excel(name = "模块名称")
+
+    @ApiModelProperty("模块名称")
+    @TableField("MODULE_NAME")
     private String moduleName;
 
-    /** 部门角色 */
-    @Excel(name = "部门角色")
+
+    @ApiModelProperty("部门角色")
+    @TableField("DEPT_ROLE")
     private String deptRole;
 
-    /** 提示文案 */
-    @Excel(name = "提示文案")
+
+    @ApiModelProperty("提示文案")
+    @TableField("PROMPT_WORDS")
     private String promptWords;
 
 
+    @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;
+
+
 }

+ 1 - 1
purchase-system/src/main/java/com/ozs/pm/doman/PmReleaseAnnouncement.java

@@ -49,7 +49,7 @@ public class PmReleaseAnnouncement implements Serializable {
 
     @ApiModelProperty("发布时间")
     @TableField("RELEASE_TIME")
-    private String releaseTime;
+    private Date releaseTime;
 
 
     @ApiModelProperty("开标地点")

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

@@ -0,0 +1,60 @@
+package com.ozs.pm.doman.vo.requestVo;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ozs.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class PmBaseExpertExtractReqVo {
+
+    @ApiModelProperty("需求ID")
+    private Long demandId;
+
+    @ApiModelProperty("选取时间 yyy-MM-dd")
+    private String accessTime;
+
+    @ApiModelProperty("技术专家数量")
+    private Integer technicalExpertNumber;
+
+    @ApiModelProperty("经济专家数量")
+    private Integer economicExpertNumber;
+
+    @ApiModelProperty("法务专家数量")
+    private Integer legalAffairsExpertNumber;
+
+    @ApiModelProperty("备用专家数量")
+    private Integer spareExpertNumber;
+
+    @ApiModelProperty("专家专业,多个用逗号分隔")
+    private String professional;
+
+    @ApiModelProperty("所在区域")
+    private String localArea;
+
+    @ApiModelProperty("需要回避单位,多个用逗号分隔")
+    private String needAvoidUnit;
+
+
+    /** 创建者 */
+    @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;
+
+}

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

@@ -0,0 +1,43 @@
+package com.ozs.pm.doman.vo.requestVo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ozs.base.domain.BaseExpert;
+import com.ozs.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class PmBaseExpertFillReqVo {
+
+    @ApiModelProperty("需求ID")
+    private Long demandId;
+
+    @ApiModelProperty("专家信息列表")
+    private List<BaseExpert> baseExpertList;
+
+    @ApiModelProperty("选取时间 yyy-MM-dd")
+    private String accessTime;
+
+
+    /** 创建者 */
+    @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;
+
+}

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

@@ -0,0 +1,60 @@
+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;
+
+/**
+ * 流标基本情况表(PmBidFailure)实体类
+ *
+ * @author makejava
+ * @since 2023-02-02 00:47:21
+ */
+
+@Data
+public class PmBidFailureReqVo implements Serializable {
+    private static final long serialVersionUID = 491684278331772388L;
+
+    private Long id;
+
+
+    @ApiModelProperty("需求ID")
+    private Long demandId;
+
+
+    @ApiModelProperty("流标原因")
+    private String bidFailureReason;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("流标时间")
+    private Date bidFailureTime;
+
+
+    @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;
+}

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

@@ -0,0 +1,42 @@
+package com.ozs.pm.doman.vo.requestVo;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ozs.common.core.domain.BaseEntity;
+import com.ozs.pm.doman.PmBidOpening;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class PmBidOpeningFillReqVo {
+
+    @ApiModelProperty("需求ID")
+    private Long demandId;
+
+    @ApiModelProperty("开标信息列表")
+    private List<PmBidOpening> pmBidOpeningList;
+
+
+    /** 创建者 */
+    @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;
+
+
+}

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

@@ -0,0 +1,72 @@
+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;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 中标基本情况表(PmBidWinning)实体类
+ *
+ * @author makejava
+ * @since 2023-02-02 00:47:22
+ */
+
+@Data
+@ApiModel(value = "中标基本情况表", description = "")
+public class PmBidWinningReqVo implements Serializable {
+    private static final long serialVersionUID = -23785941414293726L;
+
+    private Long id;
+
+
+    @ApiModelProperty("需求ID")
+    private Long demandId;
+
+
+    @ApiModelProperty("中标金额(万元)")
+    private Double bidWinningAmount;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("中标公告时间")
+    private Date bidAnnouncementTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("中标公告截止时间")
+    private Date bidAnnouncementCloseTime;
+
+
+    @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;
+
+    /**
+     * 中标信息ID列表
+     */
+    @ApiModelProperty("中标信息ID列表")
+    private List<Long> pmBidOpeningIdList;
+
+    /**
+     * 上传附件
+     */
+    @ApiModelProperty("上传附件")
+    private List<SysFileRef> sysFileRefs;
+}

+ 43 - 23
purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/PmBookBuildingReqVo.java

@@ -2,50 +2,70 @@ 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.AllArgsConstructor;
-import lombok.Builder;
 import lombok.Data;
-import lombok.NoArgsConstructor;
+
+import java.util.Date;
+import java.util.List;
 
 
 /**
- * 采购需求对象 pm_demand
+ * 需求建档对象
  *
  * @author ruoyi
  * @date 2023-01-16
  */
 @Data
-@AllArgsConstructor
-@NoArgsConstructor
-@Builder
-@ApiModel("采购需求对象")
+@ApiModel("需求建档对象")
 public class PmBookBuildingReqVo
 {
-    /** 主键 */
+
+
     @ApiModelProperty("主键")
+    private Long id;
+
+
+    @ApiModelProperty("需求ID")
     private Long demandId;
 
-    /** 采购需求装备类对象 */
-    @ApiModelProperty("采购需求装备类对象")
-    private PmDemandEquipReqVo pmDemandEquipReqVo;
 
-    /** 采购需求物资类对象 */
-    @ApiModelProperty("采购需求物资类对象")
-    private PmDemandMaterialsReqVo pmDemandMaterialsReqVo;
+    @ApiModelProperty("预算金额(万元)")
+    private Double budgetAmount;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("需求提报时间")
+    private Date demandCommitTime;
+
+
+    @ApiModelProperty("备注")
+    private String remarks;
 
-    /** 采购需求服务类对象 */
-    @ApiModelProperty("采购需求服务类对象")
-    private PmDemandServeReqVo pmDemandServeReqVo;
 
-    /** 采购需求工程类对象 */
-    @ApiModelProperty("采购需求工程类对象")
-    private PmDemandEngineeringReqVo pmDemandEngineeringReqVo;
 
     /**
-     * 更改者
+     * 上传附件
      */
-    @ApiModelProperty("更改者")
+    @ApiModelProperty("上传附件")
+    private List<SysFileRef> sysFileRefs;
+
+
+    @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;
+
 }

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

@@ -0,0 +1,54 @@
+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;
+
+/**
+ * 流标基本情况表(PmBidFailure)实体类
+ *
+ * @author makejava
+ * @since 2023-02-02 00:47:21
+ */
+
+@Data
+public class PmCallQuestionReqVo implements Serializable {
+    private static final long serialVersionUID = 491684278331772388L;
+
+
+    @ApiModelProperty("需求ID")
+    private Long demandId;
+
+
+    @ApiModelProperty("是否有质疑,1是,0否")
+    private String callQuestion;
+
+
+    @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;
+}

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

@@ -0,0 +1,73 @@
+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("主键")
+    private Long id;
+
+    @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 contractStartDate;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("合同终止日期")
+    private Date contractTerminationDate;
+
+
+    @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;
+}

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

@@ -1,171 +0,0 @@
-package com.ozs.pm.doman.vo.requestVo;
-
-import com.ozs.common.annotation.Excel;
-import com.ozs.common.core.domain.BaseEntity;
-import com.ozs.system.domain.SysFileRef;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.math.BigDecimal;
-import java.util.List;
-
-/**
- * 采购需求工程类对象 pm_demand_engineering
- *
- * @author ruoyi
- * @date 2023-01-16
- */
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-@Builder
-@ApiModel("采购需求工程类对象")
-public class PmDemandEngineeringReqVo extends BaseEntity
-{
-    private static final long serialVersionUID = 1L;
-
-    /** 主键 */
-    private Long demandEngineeringId;
-
-    /** 需求ID */
-    @Excel(name = "需求ID")
-    @ApiModelProperty("需求ID")
-    private Long demandId;
-
-    /** 工程项目名称 */
-    @Excel(name = "工程项目名称")
-    @ApiModelProperty("工程项目名称")
-    private String engineeringName;
-
-    /** 建设地点 */
-    @Excel(name = "建设地点")
-    @ApiModelProperty("建设地点")
-    private String constructionLocation;
-
-    /** 设计任务书批复文号 */
-    @Excel(name = "设计任务书批复文号")
-    @ApiModelProperty("设计任务书批复文号")
-    private String designAssignmenApprovalNumber;
-
-    /** 工程建设计划文号 */
-    @Excel(name = "工程建设计划文号")
-    @ApiModelProperty("工程建设计划文号")
-    private BigDecimal projectConstructionPlanNumber;
-
-    /** 任务书批复规模(㎡)*/
-    @Excel(name = "任务书批复规模(㎡)")
-    @ApiModelProperty("任务书批复规模(㎡)")
-    private BigDecimal tassignmentApprovalScale;
-
-    /** 任务书批复投资 */
-    @Excel(name = "任务书批复投资")
-    @ApiModelProperty("任务书批复投资")
-    private String tassignmentApprovalInvestmen;
-
-    /** 规划许可文号 */
-    @Excel(name = "规划许可文号")
-    @ApiModelProperty("规划许可文号")
-    private String planningLicenseNumber;
-
-    /** 密级处理 */
-    @Excel(name = "密级处理")
-    @ApiModelProperty("密级处理")
-    private String classifiedTreatment;
-
-    /** 采购项目规模(㎡) */
-    @Excel(name = "采购项目规模(㎡)")
-    @ApiModelProperty("采购项目规模(㎡)")
-    private BigDecimal procurementProjectScale;
-
-    /** 采购项目投资(万元) */
-    @Excel(name = "采购项目投资(万元)")
-    @ApiModelProperty("采购项目投资(万元)")
-    private BigDecimal procurementProjectInvestment;
-
-    /** 联系人 */
-    @Excel(name = "联系人")
-    @ApiModelProperty("联系人")
-    private String linkman;
-
-    /** 电话 */
-    @Excel(name = "电话")
-    @ApiModelProperty("电话")
-    private String phone;
-
-    /** 项目类别(1勘察,2设计, 3施工,4监理,5咨询,6设备材料) */
-    @Excel(name = "项目类别(1勘察,2设计, 3施工,4监理,5咨询,6设备材料)")
-    @ApiModelProperty("项目类别(1勘察,2设计, 3施工,4监理,5咨询,6设备材料)")
-    private String projectCategory;
-
-    /** 项目类别名(1勘察,2设计, 3施工,4监理,5咨询,6设备材料) */
-    @Excel(name = "项目类别名(1勘察,2设计, 3施工,4监理,5咨询,6设备材料)")
-    @ApiModelProperty("项目类别名(1勘察,2设计, 3施工,4监理,5咨询,6设备材料)")
-    private String projectCategoryName;
-
-    /** 承包方式(1工程总承包,2施工总承包,3专业承包) */
-    @Excel(name = "承包方式(1工程总承包,2施工总承包,3专业承包)")
-    @ApiModelProperty("承包方式(1工程总承包,2施工总承包,3专业承包)")
-    private String contractingMode;
-
-
-    /** 承包方式名(1工程总承包,2施工总承包,3专业承包) */
-    @Excel(name = "承包方式名(1工程总承包,2施工总承包,3专业承包)")
-    @ApiModelProperty("承包方式名(1工程总承包,2施工总承包,3专业承包)")
-    private String contractingModeName;
-
-    /** 施工图是否完成(0未完成,1完成) */
-    @Excel(name = "施工图是否完成(0未完成,1完成)")
-    @ApiModelProperty("施工图是否完成(0未完成,1完成)")
-    private String constructionDrawing;
-
-    /** 施工图是否完成名(0未完成,1完成) */
-    @Excel(name = "施工图是否完成名(0未完成,1完成)")
-    @ApiModelProperty("施工图是否完成名(0未完成,1完成)")
-    private String constructionDrawingName;
-
-    /** 设计单位 */
-    @Excel(name = "设计单位")
-    @ApiModelProperty("设计单位")
-    private String designUnit;
-
-    /** 最高限价 */
-    @Excel(name = "最高限价")
-    @ApiModelProperty("最高限价")
-    private BigDecimal ceilingPrice;
-
-    /** 采购方式建议(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源) */
-    @Excel(name = "采购方式建议(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    @ApiModelProperty("采购方式建议(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    private String procurementMethodSuggest;
-
-    /** 采购方式建议名 */
-    @Excel(name = "采购方式建议名(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    @ApiModelProperty("采购方式建议名(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    private String procurementMethodSuggestName;
-
-    /** 投标(报价)人资质等级要求 */
-    @Excel(name = "投标(报价)人资质等级要求")
-    @ApiModelProperty("投标(报价)人资质等级要求")
-    private String qualificationLevelRequirement;
-
-    /** 供应商 */
-    @Excel(name = "供应商")
-    @ApiModelProperty("供应商")
-    private Long supplierId;
-
-    /** 备注 */
-    @Excel(name = "备注")
-    @ApiModelProperty("备注")
-    private String remarks;
-
-    /**
-     * 上传附件
-     */
-    @ApiModelProperty("上传附件")
-    private List<SysFileRef> sysFileRefs;
-
-}

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

@@ -1,102 +0,0 @@
-package com.ozs.pm.doman.vo.requestVo;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.ozs.common.annotation.Excel;
-import com.ozs.common.core.domain.BaseEntity;
-import com.ozs.system.domain.SysFileRef;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.math.BigDecimal;
-import java.util.Date;
-import java.util.List;
-
-/**
- * 采购需求装备类对象 pm_demand_equip
- *
- * @author ruoyi
- * @date 2023-01-16
- */
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-@Builder
-@ApiModel("采购需求装备类对象")
-public class PmDemandEquipReqVo extends BaseEntity
-{
-    private static final long serialVersionUID = 1L;
-
-    /** 主键 */
-    private Long demandEquipId;
-
-    /** 需求ID */
-    @Excel(name = "需求ID")
-    @ApiModelProperty("需求ID")
-    private Long demandId;
-
-    /** 物资类别及品种名称 */
-    @Excel(name = "物资类别及品种名称")
-    @ApiModelProperty("物资类别及品种名称")
-    private String typeAndName;
-
-    /** 规格型号长*宽*高 */
-    @Excel(name = "规格型号长*宽*高")
-    @ApiModelProperty("规格型号长*宽*高")
-    private String specification;
-
-    /** 质量技术标准(技术参数)*/
-    @Excel(name = "质量技术标准(技术参数)")
-    @ApiModelProperty("质量技术标准(技术参数)\"")
-    private String qualityTechnicalStandard;
-
-    /** 计量单位 */
-    @Excel(name = "计量单位")
-    @ApiModelProperty("计量单位")
-    private String measurementUnit;
-
-    /** 采购数量 */
-    @Excel(name = "采购数量")
-    @ApiModelProperty("采购数量")
-    private BigDecimal procurementQuantity;
-
-    /** 单价(元) */
-    @Excel(name = "单价(元)")
-    @ApiModelProperty("单价(元)")
-    private BigDecimal price;
-
-    /** 预算金额(万元) */
-    @Excel(name = "预算金额(万元)")
-    @ApiModelProperty("预算金额(万元)")
-    private BigDecimal budgetAmount;
-
-    /** 需求提报时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "需求提报时间", width = 30, dateFormat = "yyyy-MM-dd")
-    @ApiModelProperty("需求提报时间 yyyy-MM-dd")
-    private Date demandCommitTime;
-
-    /** 采购方式建议 */
-    @Excel(name = "采购方式建议(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    @ApiModelProperty("采购方式建议(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    private String procurementMethodSuggest;
-
-    /** 采购方式建议名 */
-    @Excel(name = "采购方式建议名(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    @ApiModelProperty("采购方式建议名(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    private String procurementMethodSuggestName;
-
-    /** 备注 */
-    @Excel(name = "备注")
-    @ApiModelProperty("备注")
-    private String remarks;
-
-    /**
-     * 上传附件
-     */
-    @ApiModelProperty("上传附件")
-    private List<SysFileRef> sysFileRefs;
-}

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

@@ -1,125 +0,0 @@
-package com.ozs.pm.doman.vo.requestVo;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.ozs.common.annotation.Excel;
-import com.ozs.common.core.domain.BaseEntity;
-import com.ozs.system.domain.SysFileRef;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.math.BigDecimal;
-import java.util.Date;
-import java.util.List;
-
-/**
- * 采购需求物资类对象 pm_demand_materials
- *
- * @author ruoyi
- * @date 2023-01-16
- */
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-@Builder
-@ApiModel("采购需求物资类对象")
-public class PmDemandMaterialsReqVo extends BaseEntity {
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 主键
-     */
-    private Long demandMaterialsId;
-
-    /**
-     * 需求ID
-     */
-    @Excel(name = "需求ID")
-    @ApiModelProperty("需求ID")
-    private Long demandId;
-
-    /**
-     * 物资类别及品种名称
-     */
-    @Excel(name = "物资类别及品种名称")
-    @ApiModelProperty("物资类别及品种名称")
-    private String typeAndName;
-
-    /**
-     * 规格型号长*宽*高
-     */
-    @Excel(name = "规格型号长*宽*高")
-    @ApiModelProperty("规格型号长*宽*高")
-    private String specification;
-
-    /**
-     * 质量技术标准(技术参数)
-     */
-    @Excel(name = "质量技术标准(技术参数)")
-    @ApiModelProperty("质量技术标准(技术参数)")
-    private String qualityTechnicalStandard;
-
-    /**
-     * 计量单位
-     */
-    @Excel(name = "计量单位")
-    @ApiModelProperty("计量单位")
-    private String measurementUnit;
-
-    /**
-     * 采购数量
-     */
-    @Excel(name = "采购数量")
-    @ApiModelProperty("采购数量")
-    private BigDecimal procurementQuantity;
-
-    /**
-     * 单价(元)
-     */
-    @Excel(name = "单价(元)")
-    @ApiModelProperty("单价(元)")
-    private BigDecimal price;
-
-    /**
-     * 预算金额(万元)
-     */
-    @Excel(name = "预算金额(万元)")
-    @ApiModelProperty("预算金额(万元)")
-    private BigDecimal budgetAmount;
-
-    /**
-     * 需求提报时间
-     */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "需求提报时间", width = 30, dateFormat = "yyyy-MM-dd")
-    @ApiModelProperty("需求提报时间")
-    private Date demandCommitTime;
-
-    /**
-     * 采购方式建议
-     */
-    @Excel(name = "采购方式建议(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    @ApiModelProperty("采购方式建议(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    private String procurementMethodSuggest;
-
-    /** 采购方式建议名 */
-    @Excel(name = "采购方式建议名(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    @ApiModelProperty("采购方式建议名(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    private String procurementMethodSuggestName;
-
-    /**
-     * 备注
-     */
-    @Excel(name = "备注")
-    @ApiModelProperty("备注")
-    private String remarks;
-
-    /**
-     * 上传附件
-     */
-    @ApiModelProperty("上传附件")
-    private List<SysFileRef> sysFileRefs;
-}

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

@@ -42,6 +42,10 @@ public class PmDemandReqVo extends PageVo
     @ApiModelProperty("项目状态(4:需求待填制,5:需求待提交,6:需求待审核,7:任务待下达,8:任务已下达,9:中标信息待填制,10:中标信息已填制,11:合同待填制,12:合同已填制,13:项目建设中,14:项目建设完成)")
     private Long projectStatus;
 
+    /** 预警状态(0:正常,1:需求提报预警,2:采购完成预警,3:计划交付预警 */
+    @ApiModelProperty("预警状态(0:正常,1:需求提报预警,2:采购完成预警,3:计划交付预警")
+    private String warnStatus;
+
     /** 是否为超限额计划(0:未超额,1:超额) */
     @ApiModelProperty("是否为超限额计划(0:未超额,1:超额)")
     private Integer isExcess;
@@ -76,4 +80,13 @@ public class PmDemandReqVo extends PageVo
     /** 查看详情的类型 */
     @ApiModelProperty("详情类型,1项目计划,2需求建档,3任务下达,4中标信息,5合同信息,6建设情况")
     private String detailType;
+
+    @ApiModelProperty("采购单位(登录账号的单位)")
+    private Integer purchaseDeptId;
+
+    @ApiModelProperty("统计时间类型 1:年度,2:季度,3:月份")
+    private String timeType;
+
+    @ApiModelProperty("项目类型列表")
+    private List<String> projectStatusList;
 }

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

@@ -1,105 +0,0 @@
-package com.ozs.pm.doman.vo.requestVo;
-
-import com.ozs.common.annotation.Excel;
-import com.ozs.common.core.domain.BaseEntity;
-import com.ozs.system.domain.SysFileRef;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.math.BigDecimal;
-import java.util.List;
-
-/**
- * 采购需求服务类对象 pm_demand_serve
- *
- * @author ruoyi
- * @date 2023-01-16
- */
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-@Builder
-@ApiModel("采购需求服务类对象")
-public class PmDemandServeReqVo extends BaseEntity
-{
-    private static final long serialVersionUID = 1L;
-
-    /** 主键 */
-    private Long demandServeId;
-
-    /** 需求ID */
-    @Excel(name = "需求ID")
-    @ApiModelProperty("需求ID")
-    private Long demandId;
-
-    /** 服务项目名称 */
-    @Excel(name = "服务项目名称")
-    @ApiModelProperty("服务项目名称")
-    private String serviceName;
-
-    /** 技术服务要求 */
-    @Excel(name = "技术服务要求")
-    @ApiModelProperty("技术服务要求")
-    private String technicalServiceRequirement;
-
-    /** 计量单位 */
-    @Excel(name = "计量单位")
-    @ApiModelProperty("计量单位")
-    private String measurementUnit;
-
-    /** 采购数量 */
-    @Excel(name = "采购数量")
-    @ApiModelProperty("采购数量")
-    private BigDecimal procurementQuantity;
-
-    /** 单价(元) */
-    @Excel(name = "单价(元)")
-    @ApiModelProperty("单价(元)")
-    private BigDecimal price;
-
-    /** 预算金额(万元) */
-    @Excel(name = "预算金额(万元)")
-    @ApiModelProperty("预算金额(万元)")
-    private BigDecimal budgetAmount;
-
-    /** 交货期限 */
-    @Excel(name = "交货期限")
-    @ApiModelProperty("交货期限")
-    private String deliveryTimeLimit;
-
-    /** 采购方式建议(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源) */
-    @Excel(name = "采购方式建议(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    @ApiModelProperty("采购方式建议(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    private String procurementMethodSuggest;
-
-    /** 采购方式建议名 */
-    @Excel(name = "采购方式建议名(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    @ApiModelProperty("采购方式建议名(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    private String procurementMethodSuggestName;
-
-    /** 供应商 */
-    @Excel(name = "供应商")
-    @ApiModelProperty("供应商")
-    private Long supplierId;
-
-    /** 供应商名 */
-    @Excel(name = "供应商名")
-    @ApiModelProperty("供应商名")
-    private String supplierName;
-
-
-    /** 备注 */
-    @Excel(name = "备注")
-    @ApiModelProperty("备注")
-    private String remarks;
-
-    /**
-     * 上传附件
-     */
-    @ApiModelProperty("上传附件")
-    private List<SysFileRef> sysFileRefs;
-}

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

@@ -0,0 +1,67 @@
+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("主键")
+    private Long id;
+
+    @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;
+}

+ 6 - 6
purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/PmReleaseAnnouncementReqVo.java

@@ -37,21 +37,21 @@ public class PmReleaseAnnouncementReqVo implements Serializable {
     @ApiModelProperty("发布公告平台,1:军队采购网,2:全军武器装备采购网")
     private String announcementPlatform;
 
-
+    @JsonFormat(pattern = "yyyy-MM-dd")
     @ApiModelProperty("发布时间 yyyy-MM-dd")
-    private String releaseTime;
+    private Date releaseTime;
 
 
     @ApiModelProperty("开标地点")
     private String bidOpenPlace;
 
-
+    @JsonFormat(pattern = "yyyy-MM-dd")
     @ApiModelProperty("报名截止时间 yyyy-MM-dd")
-    private String enrollCloseTime;
-
+    private Date enrollCloseTime;
 
+    @JsonFormat(pattern = "yyyy-MM-dd")
     @ApiModelProperty("开标时间 yyyy-MM-dd")
-    private String tenderOpenTime;
+    private Date tenderOpenTime;
 
     @ApiModelProperty("备注")
     private String remarks;

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

@@ -0,0 +1,20 @@
+package com.ozs.pm.doman.vo.responseVo;
+
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+@Data
+public class PmBaseExpertResVo{
+
+    @ApiModelProperty("需求ID")
+    private Long demandId;
+
+    @ApiModelProperty("专家数量")
+    private Integer expertCount;
+
+    @ApiModelProperty("选取时间 yyy-MM-dd")
+    private String accessTime;
+}

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

@@ -0,0 +1,60 @@
+package com.ozs.pm.doman.vo.responseVo;
+
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ozs.system.domain.SysFileInfo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 流标基本情况表(PmBidFailure)实体类
+ *
+ * @author makejava
+ * @since 2023-02-02 00:47:21
+ */
+
+@Data
+public class PmBidFailureResVo implements Serializable {
+    private static final long serialVersionUID = 491684278331772388L;
+
+    private Long id;
+
+
+    @ApiModelProperty("需求ID")
+    private Long demandId;
+
+
+    @ApiModelProperty("流标原因")
+    private String bidFailureReason;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("流标时间")
+    private Date bidFailureTime;
+
+
+    @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<SysFileInfo> fileInfos;
+}

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

@@ -0,0 +1,20 @@
+package com.ozs.pm.doman.vo.responseVo;
+
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+@Data
+public class PmBidOpeningResVo {
+
+    @ApiModelProperty("需求ID")
+    private Long demandId;
+
+    @ApiModelProperty("参与数量")
+    private Integer partakeCount;
+
+    @ApiModelProperty("开标时间 yyy-MM-dd")
+    private String openBidTime;
+}

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

@@ -0,0 +1,69 @@
+package com.ozs.pm.doman.vo.responseVo;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ozs.system.domain.SysFileInfo;
+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;
+
+/**
+ * 中标基本情况表(PmBidWinning)实体类
+ *
+ * @author makejava
+ * @since 2023-02-02 00:47:22
+ */
+
+@Data
+@ApiModel(value = "中标基本情况表", description = "")
+public class PmBidWinningResVo implements Serializable {
+    private static final long serialVersionUID = -23785941414293726L;
+
+    private Long id;
+
+
+    @ApiModelProperty("需求ID")
+    private Long demandId;
+
+
+    @ApiModelProperty("中标单位信息")
+    private String bidWinningName;
+
+    @ApiModelProperty("中标金额(万元)")
+    private Double bidWinningAmount;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("中标公告时间")
+    private Date bidAnnouncementTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("中标公告截止时间")
+    private Date bidAnnouncementCloseTime;
+
+
+    @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<SysFileInfo> fileInfos;
+}

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

@@ -0,0 +1,67 @@
+package com.ozs.pm.doman.vo.responseVo;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ozs.system.domain.SysFileInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * 需求建档对象
+ *
+ * @author ruoyi
+ * @date 2023-01-16
+ */
+@Data
+@ApiModel("需求建档对象")
+public class PmBookBuildingResVo
+{
+
+    @ApiModelProperty("主键")
+    private Long id;
+
+
+    @ApiModelProperty("需求ID")
+    private Long demandId;
+
+
+    @ApiModelProperty("预算金额(万元)")
+    private Double budgetAmount;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("需求提报时间")
+    private Date demandCommitTime;
+
+
+    @ApiModelProperty("备注")
+    private String remarks;
+
+
+    /**
+     * 已上传的关联附件信息
+     */
+    @ApiModelProperty("已上传的关联附件信息")
+    private List<SysFileInfo> fileInfos;
+
+
+    @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;
+
+}

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

@@ -0,0 +1,74 @@
+package com.ozs.pm.doman.vo.responseVo;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ozs.system.domain.SysFileInfo;
+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 PmContractInfoResVo implements Serializable {
+    private static final long serialVersionUID = -59348130033569267L;
+
+    /** 主键 */
+    @ApiModelProperty("主键")
+    private Long id;
+
+    @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 contractStartDate;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("合同终止日期")
+    private Date contractTerminationDate;
+
+    @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<SysFileInfo> fileInfos;
+}

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

@@ -1,170 +0,0 @@
-package com.ozs.pm.doman.vo.responseVo;
-
-import com.ozs.common.annotation.Excel;
-import com.ozs.common.core.domain.BaseEntity;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.math.BigDecimal;
-import java.util.HashMap;
-
-/**
- * 采购需求工程类对象 pm_demand_engineering
- *
- * @author ruoyi
- * @date 2023-01-16
- */
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-@Builder
-@ApiModel("采购需求工程类对象")
-public class PmDemandEngineeringResVo extends BaseEntity
-{
-    private static final long serialVersionUID = 1L;
-
-    /** 主键 */
-    private Long demandEngineeringId;
-
-    /** 需求ID */
-    @Excel(name = "需求ID")
-    @ApiModelProperty("需求ID")
-    private Long demandId;
-
-    /** 工程项目名称 */
-    @Excel(name = "工程项目名称")
-    @ApiModelProperty("工程项目名称")
-    private String engineeringName;
-
-    /** 建设地点 */
-    @Excel(name = "建设地点")
-    @ApiModelProperty("建设地点")
-    private String constructionLocation;
-
-    /** 设计任务书批复文号 */
-    @Excel(name = "设计任务书批复文号")
-    @ApiModelProperty("设计任务书批复文号")
-    private String designAssignmenApprovalNumber;
-
-    /** 工程建设计划文号 */
-    @Excel(name = "工程建设计划文号")
-    @ApiModelProperty("工程建设计划文号")
-    private BigDecimal projectConstructionPlanNumber;
-
-    /** 任务书批复规模(㎡)*/
-    @Excel(name = "任务书批复规模(㎡)")
-    @ApiModelProperty("任务书批复规模(㎡)")
-    private BigDecimal tassignmentApprovalScale;
-
-    /** 任务书批复投资 */
-    @Excel(name = "任务书批复投资")
-    @ApiModelProperty("任务书批复投资")
-    private String tassignmentApprovalInvestmen;
-
-    /** 规划许可文号 */
-    @Excel(name = "规划许可文号")
-    @ApiModelProperty("规划许可文号")
-    private String planningLicenseNumber;
-
-    /** 密级处理 */
-    @Excel(name = "密级处理")
-    @ApiModelProperty("密级处理")
-    private String classifiedTreatment;
-
-    /** 采购项目规模(㎡) */
-    @Excel(name = "采购项目规模(㎡)")
-    @ApiModelProperty("采购项目规模(㎡)")
-    private BigDecimal procurementProjectScale;
-
-    /** 采购项目投资(万元) */
-    @Excel(name = "采购项目投资(万元)")
-    @ApiModelProperty("采购项目投资(万元)")
-    private BigDecimal procurementProjectInvestment;
-
-    /** 联系人 */
-    @Excel(name = "联系人")
-    @ApiModelProperty("联系人")
-    private String linkman;
-
-    /** 电话 */
-    @Excel(name = "电话")
-    @ApiModelProperty("电话")
-    private String phone;
-
-    /** 项目类别(1勘察,2设计, 3施工,4监理,5咨询,6设备材料) */
-    @Excel(name = "项目类别(1勘察,2设计, 3施工,4监理,5咨询,6设备材料)")
-    @ApiModelProperty("项目类别(1勘察,2设计, 3施工,4监理,5咨询,6设备材料)")
-    private String projectCategory;
-
-    /** 项目类别名(1勘察,2设计, 3施工,4监理,5咨询,6设备材料) */
-    @Excel(name = "项目类别名(1勘察,2设计, 3施工,4监理,5咨询,6设备材料)")
-    @ApiModelProperty("项目类别名(1勘察,2设计, 3施工,4监理,5咨询,6设备材料)")
-    private String projectCategoryName;
-
-    /** 承包方式(1工程总承包,2施工总承包,3专业承包) */
-    @Excel(name = "承包方式(1工程总承包,2施工总承包,3专业承包)")
-    @ApiModelProperty("承包方式(1工程总承包,2施工总承包,3专业承包)")
-    private String contractingMode;
-
-
-    /** 承包方式名(1工程总承包,2施工总承包,3专业承包) */
-    @Excel(name = "承包方式名(1工程总承包,2施工总承包,3专业承包)")
-    @ApiModelProperty("承包方式名(1工程总承包,2施工总承包,3专业承包)")
-    private String contractingModeName;
-
-    /** 施工图是否完成(0未完成,1完成) */
-    @Excel(name = "施工图是否完成(0未完成,1完成)")
-    @ApiModelProperty("施工图是否完成(0未完成,1完成)")
-    private String constructionDrawing;
-
-    /** 施工图是否完成名(0未完成,1完成) */
-    @Excel(name = "施工图是否完成名(0未完成,1完成)")
-    @ApiModelProperty("施工图是否完成名(0未完成,1完成)")
-    private String constructionDrawingName;
-
-    /** 设计单位 */
-    @Excel(name = "设计单位")
-    @ApiModelProperty("设计单位")
-    private String designUnit;
-
-    /** 最高限价 */
-    @Excel(name = "最高限价")
-    @ApiModelProperty("最高限价")
-    private BigDecimal ceilingPrice;
-
-    /** 采购方式建议(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源) */
-    @Excel(name = "采购方式建议(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    @ApiModelProperty("采购方式建议(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    private String procurementMethodSuggest;
-
-    /** 采购方式建议名 */
-    @Excel(name = "采购方式建议名(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    @ApiModelProperty("采购方式建议名(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    private String procurementMethodSuggestName;
-
-    /** 投标(报价)人资质等级要求 */
-    @Excel(name = "投标(报价)人资质等级要求")
-    @ApiModelProperty("投标(报价)人资质等级要求")
-    private String qualificationLevelRequirement;
-
-    /** 供应商 */
-    @Excel(name = "供应商")
-    @ApiModelProperty("供应商")
-    private Long supplierId;
-
-    /** 备注 */
-    @Excel(name = "备注")
-    @ApiModelProperty("备注")
-    private String remarks;
-
-    /**
-     * 上传附件的URL
-     */
-    @ApiModelProperty("上传附件的URL")
-    HashMap<String, String> fileMap;
-
-}

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

@@ -1,101 +0,0 @@
-package com.ozs.pm.doman.vo.responseVo;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.ozs.common.annotation.Excel;
-import com.ozs.common.core.domain.BaseEntity;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.math.BigDecimal;
-import java.util.Date;
-import java.util.HashMap;
-
-/**
- * 采购需求装备类对象 pm_demand_equip
- *
- * @author ruoyi
- * @date 2023-01-16
- */
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-@Builder
-@ApiModel("采购需求装备类对象")
-public class PmDemandEquipResVo extends BaseEntity
-{
-    private static final long serialVersionUID = 1L;
-
-    /** 主键 */
-    private Long demandEquipId;
-
-    /** 需求ID */
-    @Excel(name = "需求ID")
-    @ApiModelProperty("需求ID")
-    private Long demandId;
-
-    /** 物资类别及品种名称 */
-    @Excel(name = "物资类别及品种名称")
-    @ApiModelProperty("物资类别及品种名称")
-    private String typeAndName;
-
-    /** 规格型号长*宽*高 */
-    @Excel(name = "规格型号长*宽*高")
-    @ApiModelProperty("规格型号长*宽*高")
-    private String specification;
-
-    /** 质量技术标准(技术参数)*/
-    @Excel(name = "质量技术标准(技术参数)")
-    @ApiModelProperty("质量技术标准(技术参数)\"")
-    private String qualityTechnicalStandard;
-
-    /** 计量单位 */
-    @Excel(name = "计量单位")
-    @ApiModelProperty("计量单位")
-    private String measurementUnit;
-
-    /** 采购数量 */
-    @Excel(name = "采购数量")
-    @ApiModelProperty("采购数量")
-    private BigDecimal procurementQuantity;
-
-    /** 单价(元) */
-    @Excel(name = "单价(元)")
-    @ApiModelProperty("单价(元)")
-    private BigDecimal price;
-
-    /** 预算金额(万元) */
-    @Excel(name = "预算金额(万元)")
-    @ApiModelProperty("预算金额(万元)")
-    private BigDecimal budgetAmount;
-
-    /** 需求提报时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "需求提报时间", width = 30, dateFormat = "yyyy-MM-dd")
-    @ApiModelProperty("需求提报时间 yyyy-MM-dd")
-    private Date demandCommitTime;
-
-    /** 采购方式建议 */
-    @Excel(name = "采购方式建议(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    @ApiModelProperty("采购方式建议(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    private String procurementMethodSuggest;
-
-    /** 采购方式建议名 */
-    @Excel(name = "采购方式建议名(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    @ApiModelProperty("采购方式建议名(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    private String procurementMethodSuggestName;
-
-    /** 备注 */
-    @Excel(name = "备注")
-    @ApiModelProperty("备注")
-    private String remarks;
-
-    /**
-     * 上传附件的URL
-     */
-    @ApiModelProperty("上传附件的URL")
-    HashMap<String, String> fileMap;
-}

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

@@ -1,124 +0,0 @@
-package com.ozs.pm.doman.vo.responseVo;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.ozs.common.annotation.Excel;
-import com.ozs.common.core.domain.BaseEntity;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.math.BigDecimal;
-import java.util.Date;
-import java.util.HashMap;
-
-/**
- * 采购需求物资类对象 pm_demand_materials
- *
- * @author ruoyi
- * @date 2023-01-16
- */
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-@Builder
-@ApiModel("采购需求物资类对象")
-public class PmDemandMaterialsResVo extends BaseEntity {
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 主键
-     */
-    private Long demandMaterialsId;
-
-    /**
-     * 需求ID
-     */
-    @Excel(name = "需求ID")
-    @ApiModelProperty("需求ID")
-    private Long demandId;
-
-    /**
-     * 物资类别及品种名称
-     */
-    @Excel(name = "物资类别及品种名称")
-    @ApiModelProperty("物资类别及品种名称")
-    private String typeAndName;
-
-    /**
-     * 规格型号长*宽*高
-     */
-    @Excel(name = "规格型号长*宽*高")
-    @ApiModelProperty("规格型号长*宽*高")
-    private String specification;
-
-    /**
-     * 质量技术标准(技术参数)
-     */
-    @Excel(name = "质量技术标准(技术参数)")
-    @ApiModelProperty("质量技术标准(技术参数)")
-    private String qualityTechnicalStandard;
-
-    /**
-     * 计量单位
-     */
-    @Excel(name = "计量单位")
-    @ApiModelProperty("计量单位")
-    private String measurementUnit;
-
-    /**
-     * 采购数量
-     */
-    @Excel(name = "采购数量")
-    @ApiModelProperty("采购数量")
-    private BigDecimal procurementQuantity;
-
-    /**
-     * 单价(元)
-     */
-    @Excel(name = "单价(元)")
-    @ApiModelProperty("单价(元)")
-    private BigDecimal price;
-
-    /**
-     * 预算金额(万元)
-     */
-    @Excel(name = "预算金额(万元)")
-    @ApiModelProperty("预算金额(万元)")
-    private BigDecimal budgetAmount;
-
-    /**
-     * 需求提报时间
-     */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "需求提报时间", width = 30, dateFormat = "yyyy-MM-dd")
-    @ApiModelProperty("需求提报时间")
-    private Date demandCommitTime;
-
-    /**
-     * 采购方式建议
-     */
-    @Excel(name = "采购方式建议(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    @ApiModelProperty("采购方式建议(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    private String procurementMethodSuggest;
-
-    /** 采购方式建议名 */
-    @Excel(name = "采购方式建议名(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    @ApiModelProperty("采购方式建议名(1公开招标,2邀请招标,3竞争性谈判,4询价,5单一来源)")
-    private String procurementMethodSuggestName;
-
-    /**
-     * 备注
-     */
-    @Excel(name = "备注")
-    @ApiModelProperty("备注")
-    private String remarks;
-
-    /**
-     * 上传附件的URL
-     */
-    @ApiModelProperty("上传附件的URL")
-    HashMap<String, String> fileMap;
-}

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


Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.