Browse Source

Merge branch 'log-dev' into log

# Conflicts:
#	purchase-common/src/main/java/com/ozs/common/config/PurchaseConfig.java
#	purchase-common/src/main/java/com/ozs/common/core/domain/entity/SysUser.java
#	purchase-framework/src/main/java/com/ozs/framework/aspectj/LogAspect.java
#	purchase-framework/src/main/java/com/ozs/framework/web/service/SysLoginService.java
#	purchase-system/src/main/java/com/ozs/system/service/impl/SysUserServiceImpl.java
hexiao 2 years ago
parent
commit
1289cf200d
100 changed files with 6815 additions and 488 deletions
  1. 1 1
      pom.xml
  2. 1 10
      purchase-admin/src/main/java/com/ozs/PurchaseApplication.java
  3. 280 0
      purchase-admin/src/main/java/com/ozs/web/controller/base/BaseAgencyController.java
  4. 238 0
      purchase-admin/src/main/java/com/ozs/web/controller/base/BaseExpertController.java
  5. 74 0
      purchase-admin/src/main/java/com/ozs/web/controller/base/BaseFileTemplateController.java
  6. 189 0
      purchase-admin/src/main/java/com/ozs/web/controller/base/BaseNoticeController.java
  7. 91 0
      purchase-admin/src/main/java/com/ozs/web/controller/base/BaseNoticeTypeController.java
  8. 169 0
      purchase-admin/src/main/java/com/ozs/web/controller/base/BasePolicyController.java
  9. 152 0
      purchase-admin/src/main/java/com/ozs/web/controller/base/BaseProfessionalController.java
  10. 106 8
      purchase-admin/src/main/java/com/ozs/web/controller/base/BaseSupplierController.java
  11. 68 69
      purchase-admin/src/main/java/com/ozs/web/controller/common/CommonController.java
  12. 131 0
      purchase-admin/src/main/java/com/ozs/web/controller/home/HomeNoticeController.java
  13. 76 0
      purchase-admin/src/main/java/com/ozs/web/controller/home/HomeNotificationMessageController.java
  14. 226 0
      purchase-admin/src/main/java/com/ozs/web/controller/home/SystemHomepageController.java
  15. 39 5
      purchase-admin/src/main/java/com/ozs/web/controller/monitor/SysOperlogController.java
  16. 162 0
      purchase-admin/src/main/java/com/ozs/web/controller/plan/MonthlyReconciliationController.java
  17. 35 0
      purchase-admin/src/main/java/com/ozs/web/controller/plan/PlanEnumsController.java
  18. 275 0
      purchase-admin/src/main/java/com/ozs/web/controller/plan/PlanQuarterController.java
  19. 412 0
      purchase-admin/src/main/java/com/ozs/web/controller/plan/PlanYearsController.java
  20. 258 0
      purchase-admin/src/main/java/com/ozs/web/controller/plan/ProvisionalPlanController.java
  21. 47 0
      purchase-admin/src/main/java/com/ozs/web/controller/pm/PmAuditDeptRefController.java
  22. 95 0
      purchase-admin/src/main/java/com/ozs/web/controller/pm/PmContractInfoController.java
  23. 202 0
      purchase-admin/src/main/java/com/ozs/web/controller/pm/PmDemandController.java
  24. 93 0
      purchase-admin/src/main/java/com/ozs/web/controller/pm/PmProjectConstructionController.java
  25. 586 0
      purchase-admin/src/main/java/com/ozs/web/controller/pm/PmPurchaseExecutionController.java
  26. 87 0
      purchase-admin/src/main/java/com/ozs/web/controller/pm/PmTaskReleaseController.java
  27. 290 0
      purchase-admin/src/main/java/com/ozs/web/controller/statisticalAnalysis/StatisticalAnalysisController.java
  28. 47 32
      purchase-admin/src/main/java/com/ozs/web/controller/system/SysDeptController.java
  29. 11 0
      purchase-admin/src/main/java/com/ozs/web/controller/system/SysDictDataController.java
  30. 12 0
      purchase-admin/src/main/java/com/ozs/web/controller/system/SysDictTypeController.java
  31. 4 0
      purchase-admin/src/main/java/com/ozs/web/controller/system/SysIndexController.java
  32. 37 1
      purchase-admin/src/main/java/com/ozs/web/controller/system/SysLoginController.java
  33. 12 1
      purchase-admin/src/main/java/com/ozs/web/controller/system/SysMenuController.java
  34. 9 0
      purchase-admin/src/main/java/com/ozs/web/controller/system/SysNoticeController.java
  35. 11 0
      purchase-admin/src/main/java/com/ozs/web/controller/system/SysPostController.java
  36. 23 0
      purchase-admin/src/main/java/com/ozs/web/controller/system/SysProcurementStandardController.java
  37. 7 0
      purchase-admin/src/main/java/com/ozs/web/controller/system/SysProfileController.java
  38. 94 0
      purchase-admin/src/main/java/com/ozs/web/controller/system/SysRegionController.java
  39. 4 0
      purchase-admin/src/main/java/com/ozs/web/controller/system/SysRegisterController.java
  40. 165 41
      purchase-admin/src/main/java/com/ozs/web/controller/system/SysRoleController.java
  41. 147 30
      purchase-admin/src/main/java/com/ozs/web/controller/system/SysUserController.java
  42. 90 0
      purchase-admin/src/main/java/com/ozs/web/controller/tool/PmTaskServer.java
  43. 16 0
      purchase-admin/src/main/java/com/ozs/web/controller/tool/TestTaskServer.java
  44. 25 0
      purchase-admin/src/main/java/com/ozs/web/filter/LogOutFilter.java
  45. 143 0
      purchase-admin/src/main/resources/application-dev.yml
  46. 1 1
      purchase-admin/src/main/resources/application-druid.yml
  47. 196 0
      purchase-admin/src/main/resources/application-prod.yml
  48. 140 0
      purchase-admin/src/main/resources/application-test.yml
  49. 3 134
      purchase-admin/src/main/resources/application.yml
  50. 45 41
      purchase-admin/src/main/resources/logback.xml
  51. 1 1
      purchase-admin/src/main/resources/mybatis/mybatis-config.xml
  52. BIN
      purchase-admin/src/main/resources/template/planQuarter.xlsx
  53. BIN
      purchase-admin/src/main/resources/template/planYears.xlsx
  54. BIN
      purchase-admin/src/main/resources/template/professional.xlsx
  55. BIN
      purchase-admin/src/main/resources/template/provisionalPlan.xlsx
  56. 14 1
      purchase-common/src/main/java/com/ozs/common/config/PurchaseConfig.java
  57. 30 5
      purchase-common/src/main/java/com/ozs/common/constant/Constants.java
  58. 44 0
      purchase-common/src/main/java/com/ozs/common/constant/ModularConstans.java
  59. 5 0
      purchase-common/src/main/java/com/ozs/common/core/domain/BaseEntity.java
  60. 100 6
      purchase-common/src/main/java/com/ozs/common/core/domain/entity/SysDept.java
  61. 3 3
      purchase-common/src/main/java/com/ozs/common/core/domain/entity/SysDictData.java
  62. 6 3
      purchase-common/src/main/java/com/ozs/common/core/domain/entity/SysMenu.java
  63. 11 7
      purchase-common/src/main/java/com/ozs/common/core/domain/entity/SysProcurementStandard.java
  64. 27 10
      purchase-common/src/main/java/com/ozs/common/core/domain/entity/SysRole.java
  65. 24 2
      purchase-common/src/main/java/com/ozs/common/core/domain/entity/SysUser.java
  66. 5 0
      purchase-common/src/main/java/com/ozs/common/core/domain/model/LoginUser.java
  67. 28 0
      purchase-common/src/main/java/com/ozs/common/enums/BidWinningStatus.java
  68. 5 0
      purchase-common/src/main/java/com/ozs/common/enums/BusinessType.java
  69. 27 0
      purchase-common/src/main/java/com/ozs/common/enums/ConstructionDrawing.java
  70. 27 0
      purchase-common/src/main/java/com/ozs/common/enums/DataIsDelete.java
  71. 28 0
      purchase-common/src/main/java/com/ozs/common/enums/EngineeringContractingMode.java
  72. 31 0
      purchase-common/src/main/java/com/ozs/common/enums/EngineeringProjectCategory.java
  73. 59 0
      purchase-common/src/main/java/com/ozs/common/enums/ExpertType.java
  74. 27 0
      purchase-common/src/main/java/com/ozs/common/enums/IsExcess.java
  75. 29 0
      purchase-common/src/main/java/com/ozs/common/enums/NameListType.java
  76. 30 0
      purchase-common/src/main/java/com/ozs/common/enums/PlanPurchaseMode.java
  77. 39 0
      purchase-common/src/main/java/com/ozs/common/enums/PmProjectStatus.java
  78. 30 0
      purchase-common/src/main/java/com/ozs/common/enums/ProcurementMethodSuggest.java
  79. 38 0
      purchase-common/src/main/java/com/ozs/common/enums/ProjectAttribute.java
  80. 29 0
      purchase-common/src/main/java/com/ozs/common/enums/ProjectStatus.java
  81. 29 0
      purchase-common/src/main/java/com/ozs/common/enums/ProjectTypes.java
  82. 59 0
      purchase-common/src/main/java/com/ozs/common/enums/PurchaseType.java
  83. 35 0
      purchase-common/src/main/java/com/ozs/common/enums/QuarterEnum.java
  84. 33 0
      purchase-common/src/main/java/com/ozs/common/enums/SysFileRefEnum.java
  85. 30 0
      purchase-common/src/main/java/com/ozs/common/enums/SysRoleKey.java
  86. 29 0
      purchase-common/src/main/java/com/ozs/common/enums/WarnStatus.java
  87. 48 6
      purchase-common/src/main/java/com/ozs/common/utils/PageUtils.java
  88. 29 0
      purchase-common/src/main/java/com/ozs/common/utils/RandomUtil.java
  89. 5 1
      purchase-common/src/main/java/com/ozs/common/utils/SecurityUtils.java
  90. 43 27
      purchase-common/src/main/java/com/ozs/common/utils/bean/BeanUtils.java
  91. 30 17
      purchase-common/src/main/java/com/ozs/common/utils/file/FileUtils.java
  92. 32 0
      purchase-common/src/main/java/com/ozs/common/vo/BaseDto.java
  93. 14 0
      purchase-common/src/main/java/com/ozs/common/vo/FileDownVo.java
  94. 21 0
      purchase-common/src/main/java/com/ozs/common/vo/PageVo.java
  95. 11 11
      purchase-framework/src/main/java/com/ozs/framework/aspectj/LogAspect.java
  96. 1 1
      purchase-framework/src/main/java/com/ozs/framework/config/CaptchaConfig.java
  97. 26 0
      purchase-framework/src/main/java/com/ozs/framework/config/MybatisPlusConfig.java
  98. 13 13
      purchase-framework/src/main/java/com/ozs/framework/web/service/SysLoginService.java
  99. 5 0
      purchase-system/pom.xml
  100. 0 0
      purchase-system/src/main/java/com/ozs/base/domain/BaseAgency.java

+ 1 - 1
pom.xml

@@ -30,7 +30,7 @@
         <poi.version>4.1.2</poi.version>
         <velocity.version>2.3</velocity.version>
         <jwt.version>0.9.1</jwt.version>
-        <mybatis-plus.version>3.4.3.4</mybatis-plus.version>
+        <mybatis-plus.version>3.5.1</mybatis-plus.version>
     </properties>
 
     <!-- 依赖声明 -->

+ 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("(♥◠‿◠)ノ゙  采购管理信息系统启动成功   ლ(´ڡ`ლ)゙");
     }
 }

+ 280 - 0
purchase-admin/src/main/java/com/ozs/web/controller/base/BaseAgencyController.java

@@ -0,0 +1,280 @@
+package com.ozs.web.controller.base;
+
+
+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.ozs.base.domain.BaseAgency;
+import com.ozs.base.domain.BasePolicy;
+import com.ozs.base.service.BaseAgencyService;
+import com.ozs.base.vo.BaseAgentPageReqVo;
+import com.ozs.base.vo.BasePolicyPageReqVo;
+import com.ozs.base.vo.BaseProjectInfo;
+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.SysDictData;
+import com.ozs.common.enums.BusinessType;
+import com.ozs.common.enums.PmProjectStatus;
+import com.ozs.common.enums.ProjectAttribute;
+import com.ozs.common.enums.ProjectStatus;
+import com.ozs.plan.doman.MonthlyReconciliation;
+import com.ozs.plan.service.MonthlyReconciliationService;
+import com.ozs.system.domain.vo.responseVo.SysDeptResponseVo;
+import com.ozs.system.service.ISysDeptService;
+import com.ozs.system.service.ISysDictTypeService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+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.*;
+
+import javax.validation.constraints.NotEmpty;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+
+@Api(tags = ModularConstans.agency)
+@RestController
+@RequestMapping("/base/agency")
+public class BaseAgencyController extends BaseController {
+
+    @Autowired
+    private BaseAgencyService baseAgencyService;
+
+    @Autowired
+    private MonthlyReconciliationService monthlyReconciliationService;
+
+    @Autowired
+    private ISysDeptService iSysDeptService;
+
+    @Autowired
+    private ISysDictTypeService dictTypeService;
+
+
+    @ApiOperation(value = "新增招标代理机构")
+    @PostMapping("/insertBaseAgency")
+    @PreAuthorize("@ss.hasPermi('base:agency:add')")
+    @Log(title = ModularConstans.agency, businessType = BusinessType.INSERT)
+    public AjaxResult insertBaseAgency(@NotEmpty(message = "数据为空")
+                                       @RequestBody BaseAgency baseAgency) {
+//        if (ObjectUtils.isEmpty(baseAgency)) {
+//            return error("数据为空");
+//        }
+        baseAgency.setStatus(0);
+        baseAgency.setCreated(getUserId().toString());
+        baseAgency.setCreateTime(new Date());
+        baseAgency.setUpdated(baseAgency.getCreated());
+        baseAgency.setUpdateTime(baseAgency.getCreateTime());
+        return toAjax(baseAgencyService.insert(baseAgency));
+    }
+
+
+    @ApiOperation(value = "查看招标代理机构")
+    @PostMapping("/getInfo")
+    @PreAuthorize("@ss.hasPermi('base:agency:query')")
+    @Log(title = ModularConstans.agency, businessType = BusinessType.QUERY)
+    public AjaxResult getInfo(@NotEmpty(message = "主键id不能为空")
+                              @RequestParam(value = "id", required = true)
+                                      Long id) {
+        return success(baseAgencyService.getInfo(id));
+    }
+
+
+    @ApiOperation(value = "修改招标代理机构信息")
+    @PostMapping("/updateInfo")
+    @PreAuthorize("@ss.hasPermi('base:agency:edit')")
+    @Log(title = ModularConstans.agency, businessType = BusinessType.UPDATE)
+    public AjaxResult updateInfo(@NotEmpty(message = "数据为空")
+                                 @RequestBody BaseAgency baseAgency) {
+        baseAgency.setUpdateTime(new Date());
+        baseAgency.setUpdated(getUserId().toString());
+        return toAjax(baseAgencyService.updateInfo(baseAgency));
+    }
+
+    @ApiOperation(value = "操作招标代理机构黑白名单")
+    @PostMapping("/operationBlacklist")
+    @PreAuthorize("@ss.hasPermi('base:agency:edit')")
+    @Log(title = ModularConstans.agency, businessType = BusinessType.UPDATE)
+    public AjaxResult operationBlacklist(@NotEmpty(message = "主键id不能为空")
+                                         @RequestParam(value = "id", required = true)
+                                                 Long id,
+                                         @NotEmpty(message = "状态不能为空")
+                                         @RequestParam(value = "status", required = true)
+                                                 Integer status) {
+
+        BaseAgency build = BaseAgency.builder().id(id).status(status).build();
+        build.setUpdated(getUserId().toString());
+        build.setUpdateTime(new Date());
+        return toAjax(baseAgencyService.operationBlacklist(build));
+    }
+
+    @ApiOperation(value = "删除招标代理机构信息")
+    @PostMapping("/remove")
+    @PreAuthorize("@ss.hasPermi('base:agency:remove')")
+    @Log(title = ModularConstans.agency, businessType = BusinessType.DELETE)
+    public AjaxResult remove(@NotEmpty(message = "主键id不能为空")
+                             @RequestParam(value = "id", required = true)
+                                     Long id) {
+        return toAjax(baseAgencyService.remove(id));
+    }
+
+    @ApiOperation(value = "分页查询招标代理机构信息")
+    @PostMapping("/page")
+    @PreAuthorize("@ss.hasPermi('base:agency:list')")
+    @Log(title = ModularConstans.agency, businessType = BusinessType.QUERY)
+    public AjaxResult page(@NotEmpty(message = "数据为空") @RequestBody BaseAgentPageReqVo vo) {
+        LambdaQueryWrapper<BaseAgency> lw = new LambdaQueryWrapper<BaseAgency>();
+        if (!StringUtils.isBlank(vo.getCompanyName())) {
+            lw.like(BaseAgency::getCompanyName, vo.getCompanyName());
+        }
+        if (!StringUtils.isBlank(vo.getCompanyNature())) {
+            lw.eq(BaseAgency::getCompanyNature, vo.getCompanyNature());
+        }
+        if (!ObjectUtils.isEmpty(vo.getStatus())) {
+            lw.eq(BaseAgency::getStatus, vo.getStatus());
+        }
+        if (!ObjectUtils.isEmpty(vo.getCompanyType())) {
+            lw.eq(BaseAgency::getCompanyType, vo.getCompanyType());
+        }
+        IPage<BaseAgency> page = baseAgencyService.page(new Page<BaseAgency>(vo.getPageNum(), vo.getPageSize()), lw);
+        if (!ObjectUtils.isEmpty(page) && !ObjectUtils.isEmpty(page.getRecords())) {
+
+            List<SysDictData> dictData = dictTypeService.selectDictDataByType(Constants.SYS_COMPANY_NATURE);
+            if (!ObjectUtils.isEmpty(dictData)) {
+                List<BaseAgency> collect = page.getRecords().stream().map(o -> {
+                    List<SysDictData> dl = dictData.stream()
+                            .filter(d -> d.getDictValue().equals(o.getCompanyNature())).collect(Collectors.toList());
+                    if (!ObjectUtils.isEmpty(dl)) {
+                        o.setCompanyNature(dl.get(0).getDictLabel());
+                    }
+                    return o;
+                }).collect(Collectors.toList());
+                page.setRecords(collect);
+            }
+
+        }
+        return success(page);
+    }
+
+    @ApiOperation(value = "抽取招标代理机构(分页查询项目代理信息)")
+    @PostMapping("/pageProjectInfo")
+    @PreAuthorize("@ss.hasPermi('base:agency:pageProjectInfo')")
+    @Log(title = ModularConstans.agency, businessType = BusinessType.QUERY)
+    public AjaxResult pageProjectInfo(@NotEmpty(message = "数据为空")
+                                      @RequestBody BasePolicyPageReqVo vo) {
+        LambdaQueryWrapper<MonthlyReconciliation> lw = new LambdaQueryWrapper<>();
+        lw.isNotNull(MonthlyReconciliation::getAgencyId);
+        if (!StringUtils.isBlank(vo.getName())) {
+            lw.like(MonthlyReconciliation::getProjectName, vo.getName());
+        }
+        if (!ObjectUtils.isEmpty(vo.getStartTime())) {
+            lw.ge(MonthlyReconciliation::getExtractAgencyTime, vo.getStartTime());
+        }
+        if (!ObjectUtils.isEmpty(vo.getStartTime())) {
+            lw.le(MonthlyReconciliation::getExtractAgencyTime, vo.getEntTime());
+        }
+
+        IPage<BaseProjectInfo> page = new Page<>();
+        IPage<MonthlyReconciliation> pageInfo = monthlyReconciliationService.page(new Page<>(vo.getPageNum(), vo.getPageSize()), lw);
+        if (!ObjectUtils.isEmpty(pageInfo)) {
+            List<BaseProjectInfo> collect = pageInfo.getRecords().stream().map(o -> {
+                BaseProjectInfo baseProjectInfo = new BaseProjectInfo();
+                BeanUtils.copyProperties(o, baseProjectInfo);
+                // 采购单位名称
+                Map<String, Object> stringObjectMap = iSysDeptService.selectDeptById(o.getPurchaseDeptId());
+                if (!ObjectUtils.isEmpty(stringObjectMap)) {
+                    SysDeptResponseVo sysDept = (SysDeptResponseVo) stringObjectMap.get("sysDept");
+                    baseProjectInfo.setPurchaseDeptName(sysDept.getDeptName());
+                }
+                // 项目属性
+                List<SysDictData> projectAttr = dictTypeService.selectDictDataByType(Constants.SYS_PROJECT_ATTR);
+                if (!ObjectUtils.isEmpty(projectAttr)
+                        && !ObjectUtils.isEmpty(o.getProjectAttr())) {
+                    List<SysDictData> slist = projectAttr.stream()
+                            .filter(d -> d.getDictValue().equals(o.getProjectAttr()))
+                            .collect(Collectors.toList());
+                    if (!ObjectUtils.isEmpty(slist)) {
+                        baseProjectInfo.setProjectAttrStr(slist.get(0).getDictLabel());
+                    }
+                }
+
+                // 项目类型
+                List<SysDictData> projectType = dictTypeService.selectDictDataByType(Constants.SYS_PROJECT_TYPE);
+                if (!ObjectUtils.isEmpty(projectType)
+                        && !ObjectUtils.isEmpty(o.getProjectType())) {
+                    List<SysDictData> slist = projectType.stream()
+                            .filter(d -> d.getDictValue().equals(o.getProjectType()))
+                            .collect(Collectors.toList());
+                    if (!ObjectUtils.isEmpty(slist)) {
+                        baseProjectInfo.setProjectTypeStr(slist.get(0).getDictLabel());
+                    }
+                }
+                // 招标代理机构
+                if (!ObjectUtils.isEmpty(o.getAgencyId())) {
+                    BaseAgency info = baseAgencyService.getInfo(o.getAgencyId());
+                    baseProjectInfo.setAgencyName(ObjectUtils.isEmpty(info) ? null : info.getCompanyName());
+                }
+                return baseProjectInfo;
+            }).collect(Collectors.toList());
+            page.setRecords(collect);
+            page.setTotal(pageInfo.getTotal());
+            page.setPages(pageInfo.getPages());
+            page.setTotal(pageInfo.getTotal());
+            page.setCurrent(pageInfo.getCurrent());
+        }
+        return success(page);
+    }
+
+    @ApiOperation(value = "根据项目名称模糊查询项目信息-代理抽取查询用")
+    @PostMapping("/listProjectInfoLikeName")
+    @PreAuthorize("@ss.hasPermi('base:agency:listProjectInfoLikeName')")
+    @Log(title = ModularConstans.agency, businessType = BusinessType.QUERY)
+    public AjaxResult listProjectInfoLikeName(@NotEmpty(message = "数据为空")
+                                              @RequestBody BasePolicyPageReqVo vo) {
+        LambdaQueryWrapper<MonthlyReconciliation> lw = new LambdaQueryWrapper<>();
+        lw.isNull(MonthlyReconciliation::getAgencyId);
+        lw.eq(MonthlyReconciliation::getProjectStatus, PmProjectStatus.WAIT_SELECT_AGENT.getCode());
+        if (!StringUtils.isBlank(vo.getName())) {
+            lw.like(MonthlyReconciliation::getProjectName, vo.getName());
+        }
+        return success(monthlyReconciliationService.list(lw));
+    }
+
+
+    @ApiOperation(value = "确认抽取")
+    @PostMapping("/extract")
+    @PreAuthorize("@ss.hasPermi('base:agency:extract')")
+    @Log(title = ModularConstans.agency, businessType = BusinessType.OTHER)
+    public AjaxResult extract(@NotEmpty(message = "主键id不能为空")
+                              @RequestParam(value = "demandId", required = true)
+                                      Long demandId) {
+        LambdaQueryWrapper<BaseAgency> lw = new LambdaQueryWrapper<>();
+        MonthlyReconciliation byId = monthlyReconciliationService.getById(demandId);
+        if (ObjectUtils.isEmpty(byId)) {
+            return error("参数错误");
+        }
+        byId.setExtractAgencyTime(new Date());
+        lw.eq(BaseAgency::getCompanyType, byId.getProjectType());
+        lw.eq(BaseAgency::getStatus, 0);
+        Optional<BaseAgency> any = baseAgencyService.list(lw).stream().findAny();
+        if (ObjectUtils.isEmpty(any)) {
+            return error("没有符合的招标代理机构,抽取失败!");
+        }
+        byId.setAgencyId(any.get().getId());
+        byId.setUpdateTime(byId.getExtractAgencyTime());
+        byId.setUpdateBy(getUserId().toString());
+
+
+        return success(monthlyReconciliationService.updateById(byId));
+    }
+
+}

+ 238 - 0
purchase-admin/src/main/java/com/ozs/web/controller/base/BaseExpertController.java

@@ -0,0 +1,238 @@
+package com.ozs.web.controller.base;
+
+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.ozs.base.domain.BaseExpert;
+import com.ozs.base.domain.BaseProfessional;
+import com.ozs.base.domain.vo.BaseExpertVo;
+import com.ozs.base.domain.vo.BaseProfessionalVo;
+import com.ozs.base.service.BaseExpertService;
+import com.ozs.base.service.BaseProfessionalService;
+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.domain.vo.SysRegionVO;
+import com.ozs.system.service.ISysDictDataService;
+import com.ozs.system.service.SysRegionService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.joda.time.DateTime;
+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.annotation.Resource;
+import javax.validation.constraints.NotEmpty;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 专家库管理
+ *
+ * @author sunhh
+ */
+@Api(tags = "专家库管理")
+@RestController
+@RequestMapping("/base/expert")
+public class BaseExpertController extends BaseController {
+
+    @Autowired
+    private BaseExpertService baseExpertService;
+    @Autowired
+    private SysRegionService sysRegionService;
+    @Autowired
+    private BaseProfessionalService baseProfessionalService;
+    @Autowired
+    private ISysDictDataService dictDataService;
+
+
+    @ApiOperation(value = "新增专家库" , notes = "必传 专家库名称")
+    @PostMapping("/insertExpert")
+    @PreAuthorize("@ss.hasPermi('base:expert:insertExpert')")
+    @Log(title = ModularConstans.expert, businessType = BusinessType.INSERT)
+    public AjaxResult insertExpert(@RequestBody BaseExpertVo baseExpertVo) {
+        if (StringUtils.isNull(baseExpertVo) || StringUtils.isNull(baseExpertVo.getExpertName())) {
+            return error("专家库名称不能为空");
+        }
+        baseExpertVo.setCreated(getUserId().toString());
+        baseExpertVo.setCreateTime(new Date());
+        baseExpertVo.setUpdated(baseExpertVo.getCreated());
+        baseExpertVo.setUpdateTime(baseExpertVo.getCreateTime());
+        if (ObjectUtils.isEmpty(baseExpertVo.getMajorType())) {
+            return error("专业类型为空");
+        }
+        LambdaQueryWrapper<BaseProfessional> lw = new LambdaQueryWrapper();
+        lw.eq(BaseProfessional::getProfessionalCode, baseExpertVo.getMajorType());
+        List<BaseProfessional> list = baseProfessionalService.list(lw);
+        if (ObjectUtils.isEmpty(list) || list.size() < 1) {
+            return error("专业类型传值错误");
+        }
+        LambdaQueryWrapper<BaseExpert> l = new LambdaQueryWrapper();
+        l.eq(BaseExpert::getIdNumber, baseExpertVo.getIdNumber());
+        List<BaseExpert> list1 = baseExpertService.list(l);
+        if (!ObjectUtils.isEmpty(list1) && list1.size() > 0) {
+            return error("身份证号已经存在");
+        }
+        SysRegionVO sysRegionVO = sysRegionService.selectInfoByCode(baseExpertVo.getLocalArea());
+        if (ObjectUtils.isEmpty(sysRegionVO)) {
+            return error("该区域在数据库中不存在");
+        }
+        return toAjax(baseExpertService.insertExpert(baseExpertVo));
+    }
+
+    @ApiOperation(value = "删除专家库", notes = "必传 id")
+    @PostMapping("/deleteExpert")
+    @PreAuthorize("@ss.hasPermi('base:expert:deleteExpert')")
+    @Log(title = ModularConstans.expert, businessType = BusinessType.DELETE)
+    public AjaxResult deleteExpert(@RequestBody BaseExpert baseExpert) {
+        if (StringUtils.isNull(baseExpert) || StringUtils.isNull(baseExpert.getId())) {
+            return error("专家库id不能为空");
+        }
+        return toAjax(baseExpertService.removeById(baseExpert.getId()));
+    }
+
+    @ApiOperation(value = "修改专家库", notes = "必传 id 及修改数据")
+    @PostMapping("/updateExpert")
+    @PreAuthorize("@ss.hasPermi('base:expert:updateExpert')")
+    @Log(title = ModularConstans.expert, businessType = BusinessType.UPDATE)
+    public AjaxResult updateProfessional(@RequestBody BaseExpert baseExpert) {
+        if (StringUtils.isNull(baseExpert) || StringUtils.isNull(baseExpert.getId())) {
+            return error("专家库id和修改数据不能为空");
+        }
+
+        baseExpert.setUpdated(getUserId().toString());
+        baseExpert.setUpdateTime(new Date());
+        if (ObjectUtils.isEmpty(baseExpert.getMajorType())) {
+            return error("专业类型为空");
+        }
+        LambdaQueryWrapper<BaseProfessional> lw = new LambdaQueryWrapper();
+        lw.eq(BaseProfessional::getProfessionalCode, baseExpert.getMajorType());
+        List<BaseProfessional> list = baseProfessionalService.list(lw);
+        if (ObjectUtils.isEmpty(list) || list.size() < 1) {
+            return error("专业类型传值错误");
+        }
+        LambdaQueryWrapper<BaseExpert> l = new LambdaQueryWrapper();
+        l.eq(BaseExpert::getIdNumber, baseExpert.getIdNumber());
+        List<BaseExpert> list1 = baseExpertService.list(l);
+        if (!ObjectUtils.isEmpty(list1) && list.size() > 0) {
+            if (!list1.get(0).getId().equals(baseExpert.getId())) {
+                return error("身份证号已经存在");
+            }
+        }
+        SysRegionVO sysRegionVO = sysRegionService.selectInfoByCode(baseExpert.getLocalArea());
+        if (ObjectUtils.isEmpty(sysRegionVO)) {
+            return error("该区域在数据库中不存在");
+        }
+        return toAjax(baseExpertService.updateById(baseExpert));
+    }
+
+    @ApiOperation(value = "查询专家库", notes = "非必传 查询条件:品目名称")
+    @PostMapping("/selectExpert")
+    @PreAuthorize("@ss.hasPermi('base:expert:selectExpert')")
+    @Log(title = ModularConstans.expert, businessType = BusinessType.QUERY)
+    public AjaxResult selectExpert(@RequestBody BaseExpertVo baseExpertVo) {
+        LambdaQueryWrapper<BaseExpert> lw = new LambdaQueryWrapper<BaseExpert>();
+        if (!StringUtils.isBlank(baseExpertVo.getExpertName())) {
+            lw.like(BaseExpert::getExpertName, baseExpertVo.getExpertName());
+        }
+        if (!StringUtils.isBlank(baseExpertVo.getMajorType())) {
+            lw.eq(BaseExpert::getMajorType, baseExpertVo.getMajorType());
+        }
+        if (!ObjectUtils.isEmpty(baseExpertVo.getMajorGrade())) {
+            lw.eq(BaseExpert::getMajorGrade, baseExpertVo.getMajorGrade());
+        }
+        if (!ObjectUtils.isEmpty(baseExpertVo.getVarietyPurchase())) {
+            lw.eq(BaseExpert::getVarietyPurchase, baseExpertVo.getVarietyPurchase());
+        }
+        lw.orderBy(true, false, BaseExpert::getCreateTime);
+        List<BaseExpert> list = baseExpertService.list(lw);
+        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);
+            }
+            // 专业类型
+            if (!org.apache.commons.lang3.StringUtils.isBlank(vo.getMajorType())) {
+                LambdaQueryWrapper<BaseProfessional> lwe = new LambdaQueryWrapper<>();
+                lwe.eq(BaseProfessional::getProfessionalCode, vo.getMajorType());
+                List<BaseProfessional> list1 = baseProfessionalService.list(lwe);
+                if (!ObjectUtils.isEmpty(list1)) {
+                    vo.setMajorTypeName(list1.get(0).getProfessionalName());
+                }
+            }
+            // 专家类型
+            if (StringUtils.isNotEmpty(vo.getExpertType())) {
+                String expertType = vo.getExpertType();
+                List<String> expertTypeList = Arrays.stream(expertType.split(",")).map(s -> s.trim()).collect(Collectors.toList());
+                for (String eT : expertTypeList) {
+                    String expertTypeName = dictDataService.selectDictLabel("expert_type", eT);
+                    if (StringUtils.isNotEmpty(expertTypeName)) {
+                        vo.setExpertTypeName(expertTypeName);
+                    }
+                }
+            }
+        }
+        Page pages = PageUtils.getPages(baseExpertVo.getPageNum().intValue(), baseExpertVo.getPageSize().intValue(), listVo);
+        return success(pages);
+    }
+
+    @ApiOperation(value = "黑白名单开关", notes = "必传id,status 其他字段不传; 黑名单传0,白名单传1")
+    @PostMapping("/updateSupplierType")
+    @PreAuthorize("@ss.hasPermi('base:expert:updateSupplierType')")
+    @Log(title = ModularConstans.expert, businessType = BusinessType.UPDATE)
+    public AjaxResult updateSupplierType(@RequestBody BaseExpert baseExpert) {
+        if (StringUtils.isNull(baseExpert) || StringUtils.isNull(baseExpert.getId())
+                || StringUtils.isNull(baseExpert.getStatus())) {
+            return error("状态及ID不能为空");
+        }
+//        LambdaQueryWrapper<BaseExpert> lw = new LambdaQueryWrapper<BaseExpert>();
+//        if (!StringUtils.isNull(baseExpert.getId())) {
+//            lw.eq(BaseExpert::getId, baseExpert.getId());
+//        }
+//        if (!StringUtils.isBlank(baseExpert.getStatus())) {
+//            lw.eq(BaseExpert::getStatus, baseExpert.getStatus());
+//        }
+        return toAjax(baseExpertService.updateSupplierType(baseExpert));
+    }
+
+    @ApiOperation(value = "评审项目", notes = "必传:分页,专家ID")
+    @PostMapping("/selectReviewProject")
+    @PreAuthorize("@ss.hasPermi('base:expert:selectReviewProject')")
+    @Log(title = ModularConstans.expert, businessType = BusinessType.OTHER)
+    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")
+    @PreAuthorize("@ss.hasPermi('base:expert:selectExtractionExpert')")
+    @Log(title = ModularConstans.expert, businessType = BusinessType.OTHER)
+    public AjaxResult selectExtractionExpert(@RequestBody BaseExpertVo baseExpertVo) {
+        if (StringUtils.isNull(baseExpertVo)
+                || StringUtils.isNull(baseExpertVo.getPageNum())
+                || StringUtils.isNull(baseExpertVo.getPageSize())) {
+            return error("分页 不能为空");
+        }
+        return baseExpertService.selectExtractionExpert(baseExpertVo);
+    }
+}

+ 74 - 0
purchase-admin/src/main/java/com/ozs/web/controller/base/BaseFileTemplateController.java

@@ -0,0 +1,74 @@
+package com.ozs.web.controller.base;
+
+
+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.ozs.base.domain.BaseFileTemplate;
+import com.ozs.base.service.BaseFileTemplateService;
+import com.ozs.base.vo.BaseFileTemplatePageReqVo;
+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 io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.constraints.NotEmpty;
+import java.util.Date;
+import java.util.List;
+
+@Api(tags = ModularConstans.fileTemplate)
+@RestController
+@RequestMapping("/base/file")
+public class BaseFileTemplateController extends BaseController {
+
+    @Autowired
+    private BaseFileTemplateService baseFileTemplateService;
+
+
+    @ApiOperation(value = "分页查询文件模板信息")
+    @PostMapping("/page")
+    @PreAuthorize("@ss.hasPermi('base:file:list')")
+    @Log(title = ModularConstans.fileTemplate, businessType = BusinessType.QUERY)
+    public AjaxResult page(@NotEmpty(message = "数据为空") @RequestBody BaseFileTemplatePageReqVo vo) {
+        LambdaQueryWrapper<BaseFileTemplate> lw = new LambdaQueryWrapper<BaseFileTemplate>();
+        if(!StringUtils.isBlank(vo.getFileName())){
+            lw.like(BaseFileTemplate::getFileName,vo.getFileName());
+        }
+        if(!StringUtils.isBlank(vo.getFileType())){
+            lw.eq(BaseFileTemplate::getFileType,vo.getFileType());
+        }
+        IPage<BaseFileTemplate> page = baseFileTemplateService.page(new Page<BaseFileTemplate>(vo.getPageNum(), vo.getPageSize()), lw);
+        return success(page);
+    }
+
+    @ApiOperation(value = "新增文件模板信息")
+    @PostMapping("/insert")
+    @PreAuthorize("@ss.hasPermi('base:file:add')")
+    @Log(title = ModularConstans.fileTemplate, businessType = BusinessType.INSERT)
+    public AjaxResult insert(@NotEmpty(message = "数据为空")
+                                 @RequestBody BaseFileTemplate baseFileTemplate) {
+        baseFileTemplate.setCreated(getUserId().toString());
+        baseFileTemplate.setCreateTime(new Date());
+        baseFileTemplate.setUpdated(baseFileTemplate.getCreated());
+        baseFileTemplate.setUpdateTime(baseFileTemplate.getCreateTime());
+        return toAjax(baseFileTemplateService.save(baseFileTemplate));
+    }
+
+    @ApiOperation(value = "删除文件模板信息")
+    @PostMapping("/remove")
+    @PreAuthorize("@ss.hasPermi('base:file:remove')")
+    @Log(title = ModularConstans.fileTemplate, businessType = BusinessType.DELETE)
+    public AjaxResult remove(@NotEmpty(message = "主键id不能为空")
+                             @RequestBody  List<Long> ids) {
+        return toAjax(baseFileTemplateService.removeBatchByIds(ids));
+    }
+
+
+}

+ 189 - 0
purchase-admin/src/main/java/com/ozs/web/controller/base/BaseNoticeController.java

@@ -0,0 +1,189 @@
+package com.ozs.web.controller.base;
+
+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.ozs.base.domain.BaseNotice;
+import com.ozs.base.domain.BaseNoticeType;
+import com.ozs.base.service.BaseNoticeService;
+import com.ozs.base.service.BaseNoticeTypeService;
+import com.ozs.base.vo.BaseNoticePageReqVo;
+import com.ozs.base.vo.BaseNoticeVo;
+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.enums.BusinessType;
+import com.ozs.plan.doman.MonthlyReconciliation;
+import com.ozs.system.service.ISysDeptService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+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.*;
+
+import javax.validation.constraints.NotEmpty;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Api(tags = ModularConstans.notice)
+@RestController
+@RequestMapping("/base/notice")
+public class BaseNoticeController extends BaseController {
+
+
+    @Autowired
+    private BaseNoticeService baseNoticeService;
+    @Autowired
+    private BaseNoticeTypeService baseNoticeTypeService;
+
+    @Autowired
+    private ISysDeptService iSysDeptService;
+
+    @ApiOperation(value = "分页查询公告信息")
+    @PostMapping("/page")
+    @PreAuthorize("@ss.hasPermi('base:notice:list')")
+    @Log(title = ModularConstans.notice, businessType = BusinessType.QUERY)
+    public AjaxResult page(@NotEmpty(message = "数据为空")
+                               @RequestBody BaseNoticePageReqVo vo) {
+        LambdaQueryWrapper<BaseNotice> lw = new LambdaQueryWrapper<>();
+        if (!StringUtils.isBlank(vo.getTitle())) {
+            lw.like(BaseNotice::getTitle, vo.getTitle());
+        }
+        if (!ObjectUtils.isEmpty(vo.getStartTime())) {
+            lw.ge(BaseNotice::getReleaseTime, vo.getStartTime());
+        }
+        if (!ObjectUtils.isEmpty(vo.getStartTime())) {
+            lw.le(BaseNotice::getReleaseTime, vo.getEntTime());
+        }
+        if (!ObjectUtils.isEmpty(vo.getType())) {
+            lw.eq(BaseNotice::getType, vo.getType());
+        }
+        lw.orderByDesc(BaseNotice::getReleaseTime);
+        IPage<BaseNotice> page = baseNoticeService.page(new Page<>(vo.getPageNum(), vo.getPageSize()), lw);
+        IPage<BaseNoticeVo> pagev = new Page<>();
+        pagev.setTotal(page.getTotal());
+        pagev.setCurrent(page.getCurrent());
+        pagev.setPages(page.getPages());
+
+        if (!ObjectUtils.isEmpty(page) && page.getRecords().size() > 0) {
+            List<BaseNoticeType> list = baseNoticeTypeService.list();
+            List<Long> ids = list.stream().map(BaseNoticeType::getId).collect(Collectors.toList());
+            List<BaseNoticeVo> collect = page.getRecords().stream().map(o -> {
+                BaseNoticeVo baseNoticeVo = new BaseNoticeVo();
+                BeanUtils.copyProperties(o, baseNoticeVo);
+                if (ids.contains(o.getType())) {
+                    List<BaseNoticeType> collect1 = list.stream().filter(tdto -> tdto.getId().equals(o.getType())).collect(Collectors.toList());
+                    if(!ObjectUtils.isEmpty(collect1)){
+                        baseNoticeVo.setTypeName(collect1.get(0).getName());
+                    }
+
+                }
+                return baseNoticeVo;
+            }).collect(Collectors.toList());
+            pagev.setRecords(collect);
+        }else {
+            pagev.setRecords(null);
+        }
+        return success(pagev);
+
+    }
+
+
+
+    @ApiOperation(value = "新增公告信息")
+    @PostMapping("/insert")
+    @PreAuthorize("@ss.hasPermi('base:notice:add')")
+    @Log(title = ModularConstans.notice, businessType = BusinessType.INSERT)
+    public AjaxResult insert(@NotEmpty(message = "数据为空")
+                                 @RequestBody BaseNotice vo) {
+        vo.setCreated(getUserId().toString());
+        vo.setCreateTime(new Date());
+        vo.setUpdated(vo.getCreated());
+        vo.setUpdateTime(vo.getCreateTime());
+        return toAjax(baseNoticeService.save(vo));
+    }
+
+    @ApiOperation(value = "删除公告信息")
+    @PostMapping("/remove")
+    @PreAuthorize("@ss.hasPermi('base:notice:remove')")
+    @Log(title = ModularConstans.notice, businessType = BusinessType.DELETE)
+    public AjaxResult remove(@NotEmpty(message = "主键id不能为空")
+                             @RequestBody List<Long> ids) {
+        return toAjax(baseNoticeService.removeBatchByIds(ids));
+    }
+
+    @ApiOperation(value = "查看公告信息")
+    @PostMapping("/getInfo")
+    @PreAuthorize("@ss.hasPermi('base:notice:query')")
+    @Log(title = ModularConstans.notice, businessType = BusinessType.QUERY)
+    public AjaxResult getInfo(@NotEmpty(message = "主键id不能为空")
+                              @RequestParam(value = "id", required = true)
+                                      Long id) {
+        BaseNotice vo = baseNoticeService.getById(id);
+
+        BaseNoticeVo baseNoticeVo = new BaseNoticeVo();
+        if(!ObjectUtils.isEmpty(vo)){
+            BeanUtils.copyProperties(vo, baseNoticeVo);
+            List<BaseNoticeType> list = baseNoticeTypeService.list();
+            List<BaseNoticeType> collect1 = list.stream().filter(tdto -> tdto.getId().equals(vo.getType())).collect(Collectors.toList());
+            if(!ObjectUtils.isEmpty(collect1)){
+                baseNoticeVo.setTypeName(collect1.get(0).getName());
+            }
+        }
+
+        return success(baseNoticeVo);
+    }
+
+
+
+    @ApiOperation(value = "首页分页查询公告信息")
+    @PostMapping("/homePage")
+    @Log(title = ModularConstans.notice, businessType = BusinessType.QUERY)
+    public AjaxResult homePage(@NotEmpty(message = "数据为空")
+                           @RequestBody BaseNoticePageReqVo vo) {
+        vo.setUserId(getUserId());
+        vo.setDeptId(getDeptId());
+        vo.setRoleFlay(false);
+        // 添加数据权限
+        List<String> roleKeys = getLoginUser().getUser().getRoles().stream().map(SysRole::getRoleKey).collect(Collectors.toList());
+        if (roleKeys.contains(Constants.PURCHASING_MANAGEMENT)
+                || roleKeys.contains(Constants.PURCHASE_SERVICES)) {
+            vo.setRoleFlay(true);
+        }
+        IPage<BaseNotice> page = baseNoticeService.queryPage(vo);
+        IPage<BaseNoticeVo> pagev = new Page<>();
+        pagev.setTotal(page.getTotal());
+        pagev.setCurrent(page.getCurrent());
+        pagev.setPages(page.getPages());
+
+        if (!ObjectUtils.isEmpty(page) && page.getRecords().size() > 0) {
+            List<BaseNoticeType> list = baseNoticeTypeService.list();
+            List<Long> ids = list.stream().map(BaseNoticeType::getId).collect(Collectors.toList());
+            List<BaseNoticeVo> collect = page.getRecords().stream().map(o -> {
+                BaseNoticeVo baseNoticeVo = new BaseNoticeVo();
+                BeanUtils.copyProperties(o, baseNoticeVo);
+                if (ids.contains(o.getType())) {
+                    List<BaseNoticeType> collect1 = list.stream().filter(tdto -> tdto.getId().equals(o.getType())).collect(Collectors.toList());
+                    if(!ObjectUtils.isEmpty(collect1)){
+                        baseNoticeVo.setTypeName(collect1.get(0).getName());
+                    }
+
+                }
+                return baseNoticeVo;
+            }).collect(Collectors.toList());
+            pagev.setRecords(collect);
+        }else {
+            pagev.setRecords(null);
+        }
+        return success(pagev);
+
+    }
+}

+ 91 - 0
purchase-admin/src/main/java/com/ozs/web/controller/base/BaseNoticeTypeController.java

@@ -0,0 +1,91 @@
+package com.ozs.web.controller.base;
+
+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.ozs.base.domain.BaseNoticeType;
+import com.ozs.base.service.BaseNoticeTypeService;
+import com.ozs.base.vo.BaseNoticeTypePageReqVo;
+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 io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+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;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.constraints.NotEmpty;
+import java.util.Date;
+import java.util.List;
+
+@Api(tags = ModularConstans.noticeType)
+@RestController
+@RequestMapping("/base/notice/type")
+public class BaseNoticeTypeController extends BaseController {
+
+
+    @Autowired
+    private BaseNoticeTypeService baseNoticeTypeService;
+
+    @ApiOperation(value = "分页查询公告类型信息")
+    @PostMapping("/page")
+//    @PreAuthorize("@ss.hasPermi('base:noticeType:list')")   首页调用去掉权限
+    @Log(title = ModularConstans.noticeType, businessType = BusinessType.QUERY)
+    public AjaxResult page(@NotEmpty(message = "数据为空")
+                               @RequestBody BaseNoticeTypePageReqVo vo) {
+        LambdaQueryWrapper<BaseNoticeType> lw = new LambdaQueryWrapper<>();
+        if(!StringUtils.isBlank(vo.getName())){
+            lw.like(BaseNoticeType::getName,vo.getName());
+        }
+        IPage<BaseNoticeType> page = baseNoticeTypeService.page(new Page<>(vo.getPageNum(), vo.getPageSize()), lw);
+        return success(page);
+    }
+
+    @ApiOperation(value = "修改公告类型信息")
+    @PostMapping("/updateInfo")
+    @PreAuthorize("@ss.hasPermi('base:noticeType:edit')")
+    @Log(title = ModularConstans.noticeType, businessType = BusinessType.UPDATE)
+    public AjaxResult updateInfo(@NotEmpty(message = "数据为空")
+                                 @RequestBody BaseNoticeType vo) {
+        vo.setUpdateTime(new Date());
+        vo.setUpdated(getUserId().toString());
+        return toAjax(baseNoticeTypeService.updateById(vo));
+    }
+
+    @ApiOperation(value = "新增公告类型信息")
+    @PostMapping("/insert")
+    @PreAuthorize("@ss.hasPermi('base:noticeType:add')")
+    @Log(title = ModularConstans.noticeType, businessType = BusinessType.INSERT)
+    public AjaxResult insert(@NotEmpty(message = "数据为空")
+                                 @RequestBody BaseNoticeType vo) {
+        vo.setCreated(getUserId().toString());
+        vo.setCreateTime(new Date());
+        vo.setUpdated(vo.getCreated());
+        vo.setUpdateTime(vo.getCreateTime());
+        return toAjax(baseNoticeTypeService.save(vo));
+    }
+
+    @ApiOperation(value = "删除公告类型信息")
+    @PostMapping("/remove")
+    @PreAuthorize("@ss.hasPermi('base:noticeType:remove')")
+    @Log(title = ModularConstans.noticeType, businessType = BusinessType.DELETE)
+    public AjaxResult remove(@NotEmpty(message = "主键id不能为空")
+                             @RequestBody List<Long> ids) {
+        return toAjax(baseNoticeTypeService.removeBatchByIds(ids));
+    }
+
+
+    @ApiOperation(value = "查询公告类型信息-下拉")
+    @PostMapping("/list")
+    @Log(title = ModularConstans.noticeType, businessType = BusinessType.QUERY)
+    public AjaxResult list() {
+        return success(baseNoticeTypeService.list());
+    }
+}

+ 169 - 0
purchase-admin/src/main/java/com/ozs/web/controller/base/BasePolicyController.java

@@ -0,0 +1,169 @@
+package com.ozs.web.controller.base;
+
+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.ozs.base.domain.BaseNotice;
+import com.ozs.base.domain.BaseNoticeType;
+import com.ozs.base.domain.BasePolicy;
+import com.ozs.base.service.BaseNoticeService;
+import com.ozs.base.service.BaseNoticeTypeService;
+import com.ozs.base.service.BasePolicyService;
+import com.ozs.base.vo.BaseNoticePageReqVo;
+import com.ozs.base.vo.BaseNoticeVo;
+import com.ozs.base.vo.BasePolicyPageReqVo;
+import com.ozs.common.annotation.Log;
+import com.ozs.common.config.PurchaseConfig;
+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.file.FileUploadUtils;
+import com.ozs.common.utils.file.FileUtils;
+import com.ozs.common.utils.uuid.UUID;
+import com.ozs.common.vo.EsMessage;
+import com.ozs.framework.config.ServerConfig;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+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.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.validation.constraints.NotEmpty;
+import java.io.IOException;
+import java.net.UnknownHostException;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Api(tags = ModularConstans.policy)
+@RestController
+@RequestMapping("/base/policy")
+public class BasePolicyController extends BaseController {
+
+
+    @Autowired
+    private BasePolicyService basePolicyService;
+
+    @Autowired
+    private ServerConfig serverConfig;
+
+    @ApiOperation(value = "分页查询政策法规")
+    @PostMapping("/page")
+    @PreAuthorize("@ss.hasPermi('base:policy:list')")
+    @Log(title = ModularConstans.policy, businessType = BusinessType.QUERY)
+    public AjaxResult page(@NotEmpty(message = "数据为空")
+                           @RequestBody BasePolicyPageReqVo vo) {
+        LambdaQueryWrapper<BasePolicy> lw = new LambdaQueryWrapper<>();
+        if (!StringUtils.isBlank(vo.getName())) {
+            List<EsMessage> maps = null;
+            try {
+                maps = FileUtils.eSearch(vo.getName());
+            } catch (UnknownHostException e) {
+                e.printStackTrace();
+            }
+            List<String> ids = maps.stream().map(EsMessage::getId).collect(Collectors.toList());
+//            lw.like(BasePolicy::getName,vo.getName());
+            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.le(BasePolicy::getReleaseTime, vo.getEntTime());
+        }
+        IPage<BasePolicy> page = basePolicyService.page(new Page<>(vo.getPageNum(), vo.getPageSize()), lw);
+        return success(page);
+
+    }
+
+
+    @ApiOperation("PDF上传")
+    @ApiImplicitParam(name = "file", value = "文件", required = true, dataTypeClass = MultipartFile.class)
+    @PostMapping("/pdfUpload")
+    public AjaxResult pdfUpload(MultipartFile file) {
+        try {
+            // 上传到服务器,返回一个服务器硬盘地址
+            String esId = UUID.randomUUID().toString();
+            // 上传文件路径
+            String filePath = PurchaseConfig.getUploadPath();
+            // 上传并返回新文件名称
+            String upload = FileUploadUtils.upload(filePath, file);
+            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);
+            ajax.put("fileName", file.getOriginalFilename());
+            ajax.put("esId", esId);
+            return ajax;
+        } catch (IOException e) {
+            e.printStackTrace();
+            return AjaxResult.error(e.getMessage());
+        }
+
+    }
+
+    @ApiOperation(value = "新增政策法规")
+    @PostMapping("/insert")
+    @PreAuthorize("@ss.hasPermi('base:policy:add')")
+    @Log(title = ModularConstans.policy, businessType = BusinessType.INSERT)
+    public AjaxResult insert(@NotEmpty(message = "数据为空")
+                             @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')")
+    @Log(title = ModularConstans.policy, businessType = BusinessType.DELETE)
+    public AjaxResult remove(@NotEmpty(message = "主键id不能为空")
+                             @RequestBody List<Long> ids) {
+        return toAjax(basePolicyService.removeBatchByIds(ids));
+    }
+
+    @ApiOperation(value = "查看政策法规")
+    @PostMapping("/getInfo")
+    @PreAuthorize("@ss.hasPermi('base:policy:query')")
+    @Log(title = ModularConstans.policy, businessType = BusinessType.QUERY)
+    public AjaxResult getInfo(@NotEmpty(message = "主键id不能为空")
+                              @RequestParam(value = "id", required = true)
+                                      Long id) {
+        return success(basePolicyService.getById(id));
+    }
+
+
+}

+ 152 - 0
purchase-admin/src/main/java/com/ozs/web/controller/base/BaseProfessionalController.java

@@ -0,0 +1,152 @@
+package com.ozs.web.controller.base;
+
+import com.ozs.base.domain.BaseProfessional;
+import com.ozs.base.domain.vo.BaseProfessionalVo;
+import com.ozs.base.service.BaseProfessionalService;
+import com.ozs.common.annotation.Log;
+import com.ozs.common.config.PurchaseConfig;
+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.R;
+import com.ozs.common.core.domain.model.LoginUser;
+import com.ozs.common.enums.BusinessType;
+import com.ozs.common.exception.ServiceException;
+import com.ozs.common.utils.StringUtils;
+import com.ozs.common.utils.file.FileUtils;
+import com.ozs.common.utils.poi.ExcelUtil;
+import com.ozs.plan.doman.ProvisionalPlan;
+import com.ozs.plan.doman.vo.requestVo.ProvisionalPlanVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.util.List;
+
+/**
+ * 专业库管理
+ *
+ * @author sunhh
+ */
+@Api(tags = "专业库管理")
+@RestController
+@RequestMapping("/base/professional")
+@Slf4j
+public class BaseProfessionalController extends BaseController {
+
+    @Autowired
+    private BaseProfessionalService baseProfessionalService;
+
+    @ApiOperation(value = "新增专业库", notes = "必传 专业库名称、一级分类、编码、父级编码;没有父级编码传0")
+    @PostMapping("/insertProfessional")
+    @PreAuthorize("@ss.hasPermi('base:professional:insertProfessional')")
+    @Log(title = ModularConstans.professional, businessType = BusinessType.INSERT)
+    public AjaxResult insertProfessional(@RequestBody BaseProfessional baseProfessional) {
+        if (StringUtils.isNull(baseProfessional)
+                || StringUtils.isNull(baseProfessional.getProfessionalName())
+                || StringUtils.isNull(baseProfessional.getProfessionalCode())
+                || StringUtils.isNull(baseProfessional.getProfessionalGrade())
+                || StringUtils.isNull(baseProfessional.getParentCode())) {
+            return error("专业库名称、编码、一级分类、父级ID 不能为空");
+        }
+        return toAjax(baseProfessionalService.save(baseProfessional));
+    }
+
+    @ApiOperation(value = "删除专业库", notes = "必传 id")
+    @PostMapping("/deleteProfessional")
+    @PreAuthorize("@ss.hasPermi('base:professional:deleteProfessional')")
+    @Log(title = ModularConstans.professional, businessType = BusinessType.DELETE)
+    public AjaxResult deleteProfessional(@RequestBody BaseProfessional baseProfessional) {
+        if (StringUtils.isNull(baseProfessional) || StringUtils.isNull(baseProfessional.getId())) {
+            return error("专业库id不能为空");
+        }
+        return toAjax(baseProfessionalService.deleteId(baseProfessional.getId()));
+    }
+
+    @ApiOperation(value = "批量删除专业库", notes = "必传 idList")
+    @PostMapping("/deleteIds")
+    @PreAuthorize("@ss.hasPermi('base:professional:deleteIds')")
+    @Log(title = ModularConstans.professional, businessType = BusinessType.DELETE)
+    public AjaxResult deleteByIdLIst(@RequestBody BaseProfessionalVo baseProfessionalVo) {
+        baseProfessionalService.deleteIds(baseProfessionalVo.getDeleteIds());
+        return success();
+    }
+
+    @ApiOperation(value = "修改专业库", notes = "必传 id 及修改数据")
+    @PostMapping("/updateProfessional")
+    @PreAuthorize("@ss.hasPermi('base:professional:updateProfessional')")
+    @Log(title = ModularConstans.professional, businessType = BusinessType.UPDATE)
+    public AjaxResult updateProfessional(@RequestBody BaseProfessional baseProfessional) {
+        if (StringUtils.isNull(baseProfessional) || StringUtils.isNull(baseProfessional.getId())) {
+            return error("专业库id和修改数据不能为空");
+        }
+        return toAjax(baseProfessionalService.updateProfessional(baseProfessional));
+    }
+
+    @ApiOperation(value = "查询专业库树结构", notes = "非必传 查询条件:品目名称")
+    @PostMapping("/selectBaseProfessional")
+    @PreAuthorize("@ss.hasPermi('base:professional:selectBaseProfessional')")
+    @Log(title = ModularConstans.professional, businessType = BusinessType.QUERY)
+    public AjaxResult selectBaseProfessional(@RequestBody BaseProfessionalVo baseProfessionalVo) {
+        List<BaseProfessionalVo> baseSupplierList = baseProfessionalService.selectBaseProfessionalVo(baseProfessionalVo);
+        return success(baseSupplierList);
+    }
+
+    @ApiOperation(value = "导入专业库", notes = "导入表格")
+    @PostMapping("/importBaseProfessional")
+    @PreAuthorize("@ss.hasPermi('base:professional:importBaseProfessional')")
+    @Log(title = ModularConstans.professional, businessType = BusinessType.IMPORT)
+    public AjaxResult importBaseProfessional(MultipartFile file, boolean updateSupport) throws Exception {
+        ExcelUtil<BaseProfessional> util = new ExcelUtil<>(BaseProfessional.class);
+        List<BaseProfessional> baseProfessionalList = util.importExcel(file.getInputStream());
+        if (StringUtils.isNull(baseProfessionalList) || baseProfessionalList.size() == 0) {
+            throw new ServiceException("导入专业库数据不能为空!");
+        }
+        // String operName = getUsername();
+        String message = baseProfessionalService.importBaseProfessional(baseProfessionalList, updateSupport);
+        return success(message);
+    }
+
+    @ApiOperation("导出专业库")
+    @PostMapping("/exportBaseProfessional")
+    @PreAuthorize("@ss.hasPermi('base:professional:exportBaseProfessional')")
+    @Log(title = ModularConstans.professional, businessType = BusinessType.EXPORT)
+    public void exportBaseProfessional(HttpServletResponse response, @RequestBody BaseProfessionalVo baseProfessionalVo) {
+        List<BaseProfessional> list = baseProfessionalService.selectBaseProfessional(baseProfessionalVo);
+        ExcelUtil<BaseProfessional> util = new ExcelUtil<>(BaseProfessional.class);
+        util.exportExcel(response, list, "专业库数据");
+    }
+
+    @ApiOperation("文件下载")
+    @GetMapping("/downloaExcel")
+    @PreAuthorize("@ss.hasPermi('base:professional:downloaExcel')")
+    @Log(title = ModularConstans.professional, businessType = BusinessType.OTHER)
+    public void downloadZip(HttpServletRequest request, HttpServletResponse response) {
+        try {
+            // 文件路径
+//            String downloadPath = this.getClass().getResource("/template/professional.xlsx").getPath();
+            InputStream resourceAsStream = this.getClass().getResourceAsStream("/template/professional.xlsx");
+            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
+            FileUtils.setAttachmentResponseHeader(response, "专业库模板.xlsx");
+            FileUtils.writeBytesByInput(resourceAsStream, response.getOutputStream());
+
+        } catch (Exception e) {
+            log.error("下载文件失败" , e);
+        }
+    }
+
+
+}

+ 106 - 8
purchase-admin/src/main/java/com/ozs/web/controller/base/BaseSupplierController.java

@@ -1,40 +1,138 @@
 package com.ozs.web.controller.base;
 
+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.ozs.base.domain.BaseExpert;
+import com.ozs.base.domain.vo.BaseSupplierVo;
+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.core.page.TableDataInfo;
+import com.ozs.common.enums.BusinessType;
 import com.ozs.common.utils.StringUtils;
 import com.ozs.base.domain.BaseSupplier;
 import com.ozs.base.service.BaseSupplierService;
+import com.ozs.framework.web.service.TokenService;
 import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
 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 javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.List;
+
 /**
  * 供应商管理
  *
  * @author sunhh
  */
-@Api("供应商管理")
+@Api(tags = "供应商管理")
 @RestController
 @RequestMapping("/base/supplier")
 public class BaseSupplierController extends BaseController {
 
     @Autowired
     private BaseSupplierService baseSupplierService;
+    @Autowired
+    private TokenService tokenService;
 
-    @ApiOperation("新增供应商户")
-    @ApiImplicitParams({@ApiImplicitParam(paramType = "body", dataType = "BaseSupplier",
-            name = "req", value = "信息参数", required = true)})
-    @PostMapping("/save")
-    public AjaxResult save(BaseSupplier baseSupplier) {
+    @ApiOperation(value = "新增供应商户", notes = "")
+    @PostMapping("/insertBaseSupplier")
+    @PreAuthorize("@ss.hasPermi('base:supplier:insertBaseSupplier')")
+    @Log(title = ModularConstans.supplier, businessType = BusinessType.INSERT)
+    public AjaxResult insertBaseSupplier(@RequestBody BaseSupplier baseSupplier, HttpServletRequest request) {
         if (StringUtils.isNull(baseSupplier) || StringUtils.isNull(baseSupplier.getSupplierName())) {
             return error("供应商名称不能为空");
         }
+        //获取登录人
+        LoginUser loginUser = tokenService.getLoginUser(request);
+        baseSupplier.setCreated(String.valueOf(loginUser.getUserId()));
+        baseSupplier.setCreateTime(new Date());
+        // 默认白名单
+        if (StringUtils.isNull(baseSupplier.getSupplierState())) {
+            baseSupplier.setSupplierState("1");
+        }
         return toAjax(baseSupplierService.insertBaseSupplier(baseSupplier));
     }
+
+    @ApiOperation(value = "删除供应商户", notes = "必传ID")
+    @PostMapping("/deleteBaseSupplier")
+    @PreAuthorize("@ss.hasPermi('base:supplier:deleteBaseSupplier')")
+    @Log(title = ModularConstans.supplier, businessType = BusinessType.DELETE)
+    public AjaxResult deleteBaseSupplier(@RequestBody BaseSupplier baseSupplier) {
+        if (StringUtils.isNull(baseSupplier) || StringUtils.isNull(baseSupplier.getId())) {
+            return error("删除ID不能为空");
+        }
+        return toAjax(baseSupplierService.deleteBaseSupplier(baseSupplier.getId()));
+    }
+
+    @ApiOperation(value = "修改供应商户", notes = "必传ID及修改字段")
+    @PostMapping("/updateBaseSupplier")
+    @PreAuthorize("@ss.hasPermi('base:supplier:updateBaseSupplier')")
+    @Log(title = ModularConstans.supplier, businessType = BusinessType.UPDATE)
+    public AjaxResult updateBaseSupplier(@RequestBody BaseSupplier baseSupplier, HttpServletRequest request) {
+        if (StringUtils.isNull(baseSupplier) || StringUtils.isNull(baseSupplier.getId())) {
+            return error("修改数据及ID不能为空");
+        }
+        //获取登录人
+        LoginUser loginUser = tokenService.getLoginUser(request);
+        baseSupplier.setUpdated(String.valueOf(loginUser.getUserId()));
+        baseSupplier.setUpdateTime(new Date());
+        return toAjax(baseSupplierService.updateBaseSupplier(baseSupplier));
+    }
+
+    @ApiOperation(value = "预先采购开关", notes = "必传id,supplierAdvancePurchase 其他字段不传; 关闭传0,开启传1")
+    @PostMapping("/updateBaseSupplierAdvancePurchase")
+    public AjaxResult updateBaseSupplierAdvancePurchase(@RequestBody BaseSupplier baseSupplier) {
+        if (StringUtils.isNull(baseSupplier) || StringUtils.isNull(baseSupplier.getId())
+                || StringUtils.isNull(baseSupplier.getSupplierAdvancePurchase())) {
+            return error("预先采购及ID不能为空");
+        }
+        return toAjax(baseSupplierService.updateBaseSupplier(baseSupplier));
+    }
+
+    @ApiOperation(value = "黑白名单开关", notes = "必传id,supplierState 其他字段不传; 黑名单传0,白名单传1")
+    @PostMapping("/updateSupplierType")
+    @PreAuthorize("@ss.hasPermi('base:supplier:updateSupplierType')")
+    @Log(title = ModularConstans.supplier, businessType = BusinessType.UPDATE)
+    public AjaxResult updateSupplierType(@RequestBody BaseSupplier baseSupplier) {
+        if (StringUtils.isNull(baseSupplier) || StringUtils.isNull(baseSupplier.getId())
+                || StringUtils.isNull(baseSupplier.getSupplierState())) {
+            return error("状态及ID不能为空");
+        }
+        return toAjax(baseSupplierService.updateBaseSupplier(baseSupplier));
+    }
+
+    @ApiOperation(value = "查询供应商户", notes = "非必传 查询条件:供应商名称,供应商类型,供应商状态,预先采购状态")
+    @PostMapping("/selectBaseSupplier")
+    @PreAuthorize("@ss.hasPermi('base:supplier:selectBaseSupplier')")
+    @Log(title = ModularConstans.supplier, businessType = BusinessType.QUERY)
+    public AjaxResult selectBaseSupplier(@RequestBody BaseSupplierVo baseSupplierVo) {
+//        List<BaseSupplier> baseSupplierList = baseSupplierService.selectBaseSupplier(baseSupplier);
+//        return getDataTable(baseSupplierList);
+        LambdaQueryWrapper<BaseSupplier> lw = new LambdaQueryWrapper<BaseSupplier>();
+        if (!StringUtils.isBlank(baseSupplierVo.getSupplierName())) {
+            lw.like(BaseSupplier::getSupplierName, "%" + baseSupplierVo.getSupplierName() + "%");
+        }
+        if (!StringUtils.isBlank(baseSupplierVo.getSupplierState())) {
+            lw.eq(BaseSupplier::getSupplierState, baseSupplierVo.getSupplierState());
+        }
+        if (!StringUtils.isBlank(baseSupplierVo.getSupplierType())) {
+            lw.eq(BaseSupplier::getSupplierType, baseSupplierVo.getSupplierType());
+        }
+        if (!StringUtils.isBlank(baseSupplierVo.getSupplierAdvancePurchase())) {
+            lw.eq(BaseSupplier::getSupplierAdvancePurchase, baseSupplierVo.getSupplierAdvancePurchase());
+        }
+        IPage<BaseSupplier> page = baseSupplierService.page(new Page<BaseSupplier>(baseSupplierVo.getPageNum(), baseSupplierVo.getPageSize()), lw);
+        return success(page);
+    }
 }

+ 68 - 69
purchase-admin/src/main/java/com/ozs/web/controller/common/CommonController.java

@@ -1,17 +1,21 @@
 package com.ozs.web.controller.common;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+
+import com.ozs.common.vo.FileDownVo;
+import com.ozs.system.domain.SysFileInfo;
+import com.ozs.system.service.SysFileService;
+import io.swagger.annotations.Api;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import com.ozs.common.config.PurchaseConfig;
 import com.ozs.common.constant.Constants;
@@ -21,50 +25,50 @@ import com.ozs.common.utils.file.FileUploadUtils;
 import com.ozs.common.utils.file.FileUtils;
 import com.ozs.framework.config.ServerConfig;
 
+import static com.ozs.common.utils.SecurityUtils.getUserId;
+
 /**
  * 通用请求处理
  *
  * @author ruoyi
  */
+@Api(tags = "统用功能")
 @RestController
 @RequestMapping("/common")
-public class CommonController
-{
+public class CommonController {
     private static final Logger log = LoggerFactory.getLogger(CommonController.class);
 
     @Autowired
     private ServerConfig serverConfig;
 
+    @Autowired
+    private SysFileService sysFileService;
+
     private static final String FILE_DELIMETER = ",";
 
     /**
      * 通用下载请求
      *
-     * @param fileName 文件名称
-     * @param delete 是否删除
      */
-    @GetMapping("/download")
-    public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request)
-    {
-        try
-        {
-            if (!FileUtils.checkAllowDownload(fileName))
-            {
-                throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName));
+    @PostMapping("/download")
+    public void fileDownload(@RequestBody FileDownVo vo, HttpServletResponse response, HttpServletRequest request) {
+        try {
+            if(ObjectUtils.isEmpty(vo)){
+                throw new Exception("参数不能为空");
+            }
+            if (!FileUtils.checkAllowDownload(vo.getFileName())) {
+                throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", vo.getFileName()));
             }
-            String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);
-            String filePath = PurchaseConfig.getDownloadPath() + fileName;
+            String realFileName = System.currentTimeMillis() + vo.getFileName().substring(vo.getFileName().indexOf("_") + 1);
+            String filePath = PurchaseConfig.getDownloadPath() + vo.getFileName().substring("/profile/upload/".length(),vo.getFileName().length());
 
             response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
             FileUtils.setAttachmentResponseHeader(response, realFileName);
             FileUtils.writeBytes(filePath, response.getOutputStream());
-            if (delete)
-            {
+            if (vo.getDelete()) {
                 FileUtils.deleteFile(filePath);
             }
-        }
-        catch (Exception e)
-        {
+        } catch (Exception e) {
             log.error("下载文件失败", e);
         }
     }
@@ -73,61 +77,61 @@ public class CommonController
      * 通用上传请求(单个)
      */
     @PostMapping("/upload")
-    public AjaxResult uploadFile(MultipartFile file) throws Exception
-    {
-        try
-        {
+
+    public AjaxResult uploadFile(MultipartFile file) throws Exception {
+        try {
             // 上传文件路径
             String filePath = PurchaseConfig.getUploadPath();
             // 上传并返回新文件名称
             String fileName = FileUploadUtils.upload(filePath, file);
             String url = serverConfig.getUrl() + fileName;
-            AjaxResult ajax = AjaxResult.success();
-            ajax.put("url", url);
-            ajax.put("fileName", fileName);
-            ajax.put("newFileName", FileUtils.getName(fileName));
-            ajax.put("originalFilename", file.getOriginalFilename());
-            return ajax;
-        }
-        catch (Exception e)
-        {
+            SysFileInfo filedto = SysFileInfo.builder()
+                    .fileUrl(url)
+                    .fileName(file.getOriginalFilename())
+                    .fileMappingPath(fileName)
+                    .fileNewName(FileUtils.getName(fileName))
+                    .build();
+            filedto.setCreated(getUserId().toString());
+            filedto.setCreateTime(new Date());
+            filedto.setUpdated(filedto.getCreated());
+            filedto.setUpdateTime(filedto.getCreateTime());
+            boolean save = sysFileService.save(filedto);
+            return AjaxResult.success(filedto);
+        } catch (Exception e) {
             return AjaxResult.error(e.getMessage());
         }
     }
 
+
+
     /**
      * 通用上传请求(多个)
      */
     @PostMapping("/uploads")
-    public AjaxResult uploadFiles(List<MultipartFile> files) throws Exception
-    {
-        try
-        {
+    public AjaxResult uploadFiles(List<MultipartFile> files) throws Exception {
+        try {
             // 上传文件路径
             String filePath = PurchaseConfig.getUploadPath();
-            List<String> urls = new ArrayList<String>();
-            List<String> fileNames = new ArrayList<String>();
-            List<String> newFileNames = new ArrayList<String>();
-            List<String> originalFilenames = new ArrayList<String>();
-            for (MultipartFile file : files)
-            {
-                // 上传并返回新文件名称
+           List<SysFileInfo> list = new ArrayList<>();
+            for (MultipartFile file : files) {
+//                // 上传并返回新文件名称
                 String fileName = FileUploadUtils.upload(filePath, file);
                 String url = serverConfig.getUrl() + fileName;
-                urls.add(url);
-                fileNames.add(fileName);
-                newFileNames.add(FileUtils.getName(fileName));
-                originalFilenames.add(file.getOriginalFilename());
+                SysFileInfo filedto = SysFileInfo.builder()
+                        .fileUrl(url)
+                        .fileName(file.getOriginalFilename())
+                        .fileMappingPath(fileName)
+                        .fileNewName(FileUtils.getName(fileName))
+                        .build();
+                filedto.setCreated(getUserId().toString());
+                filedto.setCreateTime(new Date());
+                filedto.setUpdated(filedto.getCreated());
+                filedto.setUpdateTime(filedto.getCreateTime());
+                boolean save = sysFileService.save(filedto);
+                list.add(filedto);
             }
-            AjaxResult ajax = AjaxResult.success();
-            ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER));
-            ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER));
-            ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER));
-            ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER));
-            return ajax;
-        }
-        catch (Exception e)
-        {
+            return AjaxResult.success(list);
+        } catch (Exception e) {
             return AjaxResult.error(e.getMessage());
         }
     }
@@ -137,12 +141,9 @@ public class CommonController
      */
     @GetMapping("/download/resource")
     public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response)
-            throws Exception
-    {
-        try
-        {
-            if (!FileUtils.checkAllowDownload(resource))
-            {
+            throws Exception {
+        try {
+            if (!FileUtils.checkAllowDownload(resource)) {
                 throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource));
             }
             // 本地资源路径
@@ -154,9 +155,7 @@ public class CommonController
             response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
             FileUtils.setAttachmentResponseHeader(response, downloadName);
             FileUtils.writeBytes(downloadPath, response.getOutputStream());
-        }
-        catch (Exception e)
-        {
+        } catch (Exception e) {
             log.error("下载文件失败", e);
         }
     }

+ 131 - 0
purchase-admin/src/main/java/com/ozs/web/controller/home/HomeNoticeController.java

@@ -0,0 +1,131 @@
+package com.ozs.web.controller.home;
+
+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.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.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;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 首页公告控制层
+ *
+ * @author buzhanyi
+ */
+@RestController
+@RequestMapping("/home/homeNotice")
+public class HomeNoticeController extends BaseController {
+
+    @Resource
+    private HomeNoticeService homeNoticeService;
+    @Autowired
+    private PlanYearsService planYearsService;
+
+    @ApiOperation(value = "查询首页公告")
+    @PostMapping("/selectHomeNotice")
+//    @PreAuthorize("@ss.hasPermi('home:homeNotice:selecthomeNotice')")
+    @Log(title = ModularConstans.notice, businessType = BusinessType.QUERY)
+    public AjaxResult selectHomeNotice(@RequestBody HomeNoticeVo homeNoticeVo) {
+        LambdaQueryWrapper<HomeNotice> lw = new LambdaQueryWrapper<HomeNotice>();
+        if (!StringUtils.isBlank(homeNoticeVo.getNoticeName())) {
+            lw.like(HomeNotice::getNoticeName, "%" + homeNoticeVo.getNoticeName() + "%");
+        }
+        if (!StringUtils.isBlank(homeNoticeVo.getAnnouncementClassification())) {
+            lw.eq(HomeNotice::getAnnouncementClassification, homeNoticeVo.getAnnouncementClassification());
+        }
+        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.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);
+    }
+
+    /**
+     * 查询不同类型的公告
+     */
+    @PreAuthorize("@ss.hasPermi('home:homeNotice:getNoticesByType')")
+    @Log(title = "查询公告", businessType = BusinessType.QUERY)
+    @PostMapping("getNoticesByType")
+    @ApiOperation("查询不同类型的公告")
+    public AjaxResult getNoticesByType(@RequestBody HomeNoticeVo homeNoticeVo) {
+        LambdaQueryWrapper<HomeNotice> lw = new LambdaQueryWrapper<>();
+        if (!ObjectUtils.isEmpty(homeNoticeVo.getNoticeName())) {
+            lw.like(HomeNotice::getNoticeName, homeNoticeVo.getNoticeName());
+        }
+        if (!ObjectUtils.isEmpty(homeNoticeVo.getAnnouncementClassification())) {
+            lw.eq(HomeNotice::getAnnouncementClassification, homeNoticeVo.getAnnouncementClassification());
+        }
+        if (!ObjectUtils.isEmpty(homeNoticeVo.getBeginTime())) {
+            lw.ge(HomeNotice::getNoticeTime, homeNoticeVo.getBeginTime());
+        }
+        if (!ObjectUtils.isEmpty(homeNoticeVo.getEndTime())) {
+            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+            SimpleDateFormat dateFormatT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
+            Date parse = null;
+            try {
+                parse = dateFormatT.parse((dateFormat.format(homeNoticeVo.getEndTime()) + " 23:59:59:999"));
+            } catch (ParseException e) {
+                e.printStackTrace();
+            }
+            lw.le(HomeNotice::getNoticeTime, parse);
+        }
+
+        List<HomeNotice> noticeList = homeNoticeService.list(lw);
+        return AjaxResult.success(noticeList);
+    }
+
+
+}

+ 76 - 0
purchase-admin/src/main/java/com/ozs/web/controller/home/HomeNotificationMessageController.java

@@ -0,0 +1,76 @@
+package com.ozs.web.controller.home;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+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.home.domain.HomeNotificationMessage;
+import com.ozs.home.domain.vo.HomeNotificationMessageVo;
+import com.ozs.home.domain.vo.ReasonsForLagVo;
+import com.ozs.home.service.HomeNotificationMessageService;
+import com.ozs.pm.doman.PmDemand;
+import com.ozs.pm.mapper.PmDemandMapper;
+import io.swagger.annotations.ApiOperation;
+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.annotation.Resource;
+
+/**
+ * 首页通知消息
+ *
+ * @author Administrator
+ */
+@RestController
+@RequestMapping("/home/homeNotificationMessage")
+public class HomeNotificationMessageController extends BaseController {
+
+    @Resource
+    private HomeNotificationMessageService homeNotificationMessageService;
+    @Resource
+    private PmDemandMapper pmDemandMapper;
+
+    @ApiOperation(value = "查询首页通知消息")
+    @PostMapping("/selectHomeNotificationMessage")
+//    @PreAuthorize("@ss.hasPermi('home:homeNotificationMessage:selectHomeNotificationMessage')")
+    @Log(title = ModularConstans.notice, businessType = BusinessType.QUERY)
+    public AjaxResult selectHomeNotificationMessage(@RequestBody HomeNotificationMessageVo homeNotificationMessageVo) {
+        LambdaQueryWrapper<HomeNotificationMessage> lw = new LambdaQueryWrapper<HomeNotificationMessage>();
+        if (!StringUtils.isBlank(homeNotificationMessageVo.getHomepageClassification())) {
+            lw.eq(HomeNotificationMessage::getHomepageClassification, homeNotificationMessageVo.getHomepageClassification());
+        }
+        if (!StringUtils.isBlank(homeNotificationMessageVo.getMessageClassification())) {
+            lw.eq(HomeNotificationMessage::getMessageClassification, homeNotificationMessageVo.getMessageClassification());
+        }
+        IPage<HomeNotificationMessage> page = homeNotificationMessageService.page(new Page<HomeNotificationMessage>(homeNotificationMessageVo.getPageNum(), homeNotificationMessageVo.getPageSize()), lw);
+        return success(page);
+    }
+
+
+    @ApiOperation(value = "填写滞后原因")
+    @PostMapping("/saveReasonsForLag")
+//    @PreAuthorize("@ss.hasPermi('home:homeNotificationMessage:saveReasonsForLag')")
+    @Log(title = ModularConstans.notice, businessType = BusinessType.UPDATE)
+    public AjaxResult saveReasonsForLag(@RequestBody ReasonsForLagVo reasonsForLagVo) {
+
+        QueryWrapper<PmDemand> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("demand_id", reasonsForLagVo.getHomeNotificationMessageId());
+        PmDemand pmDemand = pmDemandMapper.selectOne(queryWrapper);
+        pmDemand.setDelayReason(reasonsForLagVo.getDelayReason());
+        pmDemand.setAdjustAdvice(reasonsForLagVo.getAdjustAdvice());
+        if (pmDemandMapper.updateById(pmDemand) > 0) {
+            return success();
+        } else {
+            return error();
+        }
+    }
+}

+ 226 - 0
purchase-admin/src/main/java/com/ozs/web/controller/home/SystemHomepageController.java

@@ -0,0 +1,226 @@
+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;
+
+
+/**
+ * 系统首页控制层
+ *
+ * @author buzhanyi
+ */
+@RestController
+@RequestMapping("/home/systemHomepage")
+public class SystemHomepageController extends BaseController {
+    @Resource
+    private PlanYearsService planYearsService;
+    @Resource
+    private IPmDemandService pmDemandService;
+
+    @ApiOperation(value = "需求单位首页计划管理总数")
+    @GetMapping("/demandUnit/planManagement/total")
+    public AjaxResult demandUnitPlanManagementTotal() {
+        return planYearsService.demandUnitPlanManagementTotal();
+    }
+
+    @ApiOperation(value = "需求单位首页需求管理总数")
+    @GetMapping("/demandUnit/demandManagement/total")
+    public AjaxResult demandUnitDemandManagementTotal() {
+        return planYearsService.demandUnitDemandManagementTotal();
+    }
+
+    @ApiOperation(value = "需求单位首页合同管理总数")
+    @GetMapping("/demandUnit/contractManagement/total")
+    public AjaxResult demandUnitContractManagementTotal() {
+        return planYearsService.demandUnitContractManagementTotal();
+    }
+
+    @ApiOperation(value = "需求单位首页建设管理总数")
+    @GetMapping("/demandUnit/constructionManagement/total")
+    public AjaxResult demandUnitConstructionManagementTotal() {
+        return planYearsService.demandUnitConstructionManagementTotal();
+    }
+
+    @ApiOperation(value = "采购管理部门首页计划管理总数")
+    @GetMapping("/purchasingManagement/planManagement/total")
+    public AjaxResult purchasingManagementPurchasingManagementTotal() {
+        return planYearsService.purchasingManagementPurchasingManagementTotal();
+    }
+
+    @ApiOperation(value = "采购管理部门首页需求管理总数")
+    @GetMapping("/purchasingManagement/demandManagement/total")
+    public AjaxResult purchasingManagementDemandManagementTotal() {
+        return planYearsService.purchasingManagementDemandManagementTotal();
+    }
+
+    @ApiOperation(value = "采购管理部门首页任务下达管理总数")
+    @GetMapping("/purchasingManagement/taskRelease/total")
+    public AjaxResult purchasingManagementTaskReleaseTotal() {
+        return planYearsService.purchasingManagementTaskReleaseTotal();
+    }
+
+    @ApiOperation(value = "采购办首页采购执行管理总数")
+    @GetMapping("/procurementOffice/procurementExecution/total")
+    public AjaxResult procurementOfficeProcurementExecutionTotal() {
+        return planYearsService.procurementOfficeProcurementExecutionTotal();
+    }
+
+    @ApiOperation(value = "采购办首已中标项目理总数")
+    @GetMapping("/procurementOffice/winningTheBid/total")
+    public AjaxResult procurementOfficeWinningTheBidTotal() {
+        return planYearsService.procurementOfficeWinningTheBidTotal();
+    }
+
+    @ApiOperation(value = "采购办首未中标项目理总数")
+    @GetMapping("/procurementOffice/failureToWinTheBid/total")
+    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);
+    }
+}

+ 39 - 5
purchase-admin/src/main/java/com/ozs/web/controller/monitor/SysOperlogController.java

@@ -1,13 +1,26 @@
 package com.ozs.web.controller.monitor;
 
+import java.net.UnknownHostException;
 import java.util.List;
+import java.util.stream.Collectors;
 import javax.servlet.http.HttpServletResponse;
+
+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.ozs.base.domain.BasePolicy;
+import com.ozs.common.utils.file.FileUtils;
+import com.ozs.common.vo.EsMessage;
+import com.ozs.system.domain.vo.requestVo.SysOperLogRequestVo;
+import org.apache.commons.lang3.StringUtils;
 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.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 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 com.ozs.common.annotation.Log;
@@ -31,13 +44,34 @@ public class SysOperlogController extends BaseController
     @Autowired
     private ISysOperLogService operLogService;
 
+//    @PreAuthorize("@ss.hasPermi('monitor:operlog:list')")
+//    @GetMapping("/list")
+//    public TableDataInfo list(SysOperLog operLog)
+//    {
+//        startPage();
+//        List<SysOperLog> list = operLogService.selectOperLogList(operLog);
+//        return getDataTable(list);
+//    }
+
     @PreAuthorize("@ss.hasPermi('monitor:operlog:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(SysOperLog operLog)
+    @PostMapping("/list")
+    public AjaxResult list(@RequestBody SysOperLogRequestVo vo)
     {
-        startPage();
-        List<SysOperLog> list = operLogService.selectOperLogList(operLog);
-        return getDataTable(list);
+        LambdaQueryWrapper<SysOperLog> lw = new LambdaQueryWrapper<>();
+        if(!ObjectUtils.isEmpty(vo.getStartTime())){
+            lw.ge(SysOperLog::getOperTime,vo.getStartTime());
+        }
+        if(!ObjectUtils.isEmpty(vo.getStartTime())){
+            lw.le(SysOperLog::getOperTime,vo.getEntTime());
+        }
+        if(!ObjectUtils.isEmpty(vo.getBusinessType())){
+            lw.ge(SysOperLog::getBusinessType,vo.getBusinessType());
+        }
+        if(!ObjectUtils.isEmpty(vo.getStatus())){
+            lw.ge(SysOperLog::getStatus,vo.getStatus());
+        }
+        IPage<SysOperLog> page = operLogService.page(new Page<>(vo.getPageNum(), vo.getPageSize()), lw);
+        return success(page);
     }
 
     @Log(title = "操作日志", businessType = BusinessType.EXPORT)

+ 162 - 0
purchase-admin/src/main/java/com/ozs/web/controller/plan/MonthlyReconciliationController.java

@@ -0,0 +1,162 @@
+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.ozs.base.domain.BaseNoticeType;
+import com.ozs.base.vo.BasePolicyPageReqVo;
+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.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;
+import com.ozs.plan.doman.vo.requestVo.MonthlyReconciliationPageReqVo;
+import com.ozs.plan.service.MonthlyReconciliationService;
+import com.ozs.system.domain.SysFileInfo;
+import com.ozs.system.domain.SysFileRef;
+import com.ozs.system.domain.vo.responseVo.SysDeptResponseVo;
+import com.ozs.system.service.ISysDeptService;
+import com.ozs.system.service.ISysDictTypeService;
+import com.ozs.system.service.SysFileRefService;
+import com.ozs.system.service.SysFileService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+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.*;
+
+import javax.validation.constraints.NotEmpty;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+
+@RestController
+@RequestMapping("/monthly/reconciliation")
+@Api(tags = ModularConstans.monthly)
+public class MonthlyReconciliationController extends BaseController {
+
+
+    @Autowired
+    private MonthlyReconciliationService monthlyReconciliationService;
+    @Autowired
+    private SysFileRefService sysFileRefService;
+    @Autowired
+    private SysFileService sysFileService;
+    @Autowired
+    private ISysDeptService iSysDeptService;
+    @Autowired
+    private ISysDictTypeService dictTypeService;
+
+    @ApiOperation(value = "分页查询月度对表")
+    @PostMapping("/page")
+    @PreAuthorize("@ss.hasPermi('base:monthly:list')")
+    @Log(title = ModularConstans.monthly, businessType = BusinessType.QUERY)
+    public AjaxResult page(@NotEmpty(message = "数据为空")
+                           @RequestBody MonthlyReconciliationPageReqVo vo) {
+        vo.setDeptId(getDeptId());
+        vo.setUserId(getUserId());
+        vo.setRoleFlay(false);
+        // 添加数据权限
+        List<String> roleKeys = getLoginUser().getUser().getRoles().stream().map(SysRole::getRoleKey).collect(Collectors.toList());
+        if (roleKeys.contains(Constants.PURCHASING_MANAGEMENT)
+                || roleKeys.contains(Constants.PURCHASE_SERVICES)) {
+            vo.setRoleFlay(true);
+        }
+        // 分页查询
+        IPage<MonthlyReconciliation> page = monthlyReconciliationService.queryPage(vo);
+        if (!ObjectUtils.isEmpty(page.getRecords()) && page.getRecords().size() > 0) {
+            page.setRecords(page.getRecords().stream().map(dto -> {
+                // 采购单位名称
+                Map<String, Object> stringObjectMap = iSysDeptService.selectDeptById(dto.getPurchaseDeptId());
+                if (!ObjectUtils.isEmpty(stringObjectMap)) {
+                    SysDeptResponseVo sysDept = (SysDeptResponseVo) stringObjectMap.get("sysDept");
+                    dto.setPurchaseDeptName(sysDept.getDeptName());
+                }
+                // 项目状态
+                List<SysDictData> projectStatus = dictTypeService.selectDictDataByType(Constants.SYS_PROJECT_STATUS);
+                if (!ObjectUtils.isEmpty(projectStatus)) {
+                    List<SysDictData> collect = projectStatus.stream()
+                            .filter(d -> d.getDictValue().equals(dto.getProjectStatus().toString())).collect(Collectors.toList());
+                    if (!ObjectUtils.isEmpty(collect)) {
+                        dto.setProjectStatusStr(collect.get(0).getDictLabel());
+                    }
+                }
+
+                // 报警状态
+                List<SysDictData> warnStatus = dictTypeService.selectDictDataByType(Constants.PROJECT_WARN_STATUS);
+                if (!ObjectUtils.isEmpty(warnStatus)) {
+                    List<SysDictData> collect = warnStatus.stream()
+                            .filter(d -> d.getDictValue().equals(dto.getWarnStatus())).collect(Collectors.toList());
+                    if (!ObjectUtils.isEmpty(collect)) {
+                        dto.setWarnStatusStr(collect.get(0).getDictLabel());
+                    }
+                }
+                return dto;
+            }).collect(Collectors.toList()));
+        }
+        return success(page);
+
+    }
+
+
+    @ApiOperation(value = "查看月度对表详情")
+    @PostMapping("/getInfo")
+    @PreAuthorize("@ss.hasPermi('base:monthly:query')")
+    @Log(title = ModularConstans.monthly, businessType = BusinessType.QUERY)
+    public AjaxResult getInfo(@NotEmpty(message = "主键id不能为空")
+                              @RequestParam(value = "id", required = true)
+                                      Long id) {
+        MonthlyReconciliation vo = monthlyReconciliationService.getById(id);
+
+        if (!ObjectUtils.isEmpty(vo)) {
+            LambdaQueryWrapper<SysFileRef> lw = new LambdaQueryWrapper();
+            lw.eq(SysFileRef::getType, SysFileRefEnum.PLAN_TEMPORARY.getType());
+            lw.eq(SysFileRef::getRedId, vo.getPlanId());
+            List<SysFileRef> list = sysFileRefService.list(lw);
+            if (!ObjectUtils.isEmpty(list)) {
+                LambdaQueryWrapper<SysFileInfo> l = new LambdaQueryWrapper();
+                l.in(SysFileInfo::getFileId, list.stream().map(SysFileRef::getFileId).collect(Collectors.toList()));
+                vo.setFileList(sysFileService.list(l));
+            }
+            Map<String, Object> stringObjectMap = iSysDeptService.selectDeptById(vo.getPurchaseDeptId());
+            if (!ObjectUtils.isEmpty(stringObjectMap)) {
+                SysDeptResponseVo sysDept = (SysDeptResponseVo) stringObjectMap.get("sysDept");
+                vo.setPurchaseDeptName(sysDept.getDeptName());
+            }
+
+            // 采购服务站名称
+            List<SysDictData> data = dictTypeService.selectDictDataByType("purchase_services");
+            if (!ObjectUtils.isEmpty(data)) {
+                List<SysDictData> collect = data.stream()
+                        .filter(d -> d.getDictValue().equals(vo.getPurchaseServices())).collect(Collectors.toList());
+                if (!ObjectUtils.isEmpty(collect)) {
+                    vo.setPurchaseServicesName(collect.get(0).getDictLabel());
+                }
+            }
+        }
+
+        return success(vo);
+    }
+
+    @ApiOperation(value = "根据项目名称模糊查询项目信息")
+    @PostMapping("/listProjectInfoLikeName")
+    @Log(title = ModularConstans.monthly, businessType = BusinessType.QUERY)
+    public AjaxResult listProjectInfoLikeName(@NotEmpty(message = "数据为空")
+                                              @RequestBody BasePolicyPageReqVo vo) {
+        LambdaQueryWrapper<MonthlyReconciliation> lw = new LambdaQueryWrapper<>();
+        if (!StringUtils.isBlank(vo.getName())) {
+            lw.like(MonthlyReconciliation::getProjectName, vo.getName());
+        }
+        return success(monthlyReconciliationService.list(lw));
+    }
+}

+ 35 - 0
purchase-admin/src/main/java/com/ozs/web/controller/plan/PlanEnumsController.java

@@ -0,0 +1,35 @@
+package com.ozs.web.controller.plan;
+
+import com.ozs.common.core.controller.BaseController;
+import com.ozs.common.core.domain.AjaxResult;
+import com.ozs.system.service.ISysDictTypeService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 年度计划信息中的枚举类信息
+ *
+ * @author buzhanyi
+ */
+@RestController
+@RequestMapping("/plan/about")
+public class PlanEnumsController extends BaseController {
+
+    @Autowired
+    private ISysDictTypeService dictTypeService;
+
+    /**
+     * 获取年度计划信息中的枚举类信息(下拉框数据)
+     *
+     * @return 年度计划信息中的枚举类信息(下拉框数据)
+     */
+    @ApiOperation(value = "年度计划信息中的枚举类信息(下拉框数据)")
+    @PostMapping("/getAboutEnums")
+    public AjaxResult getAboutEnums() {
+        return AjaxResult.success(dictTypeService.getAboutEnums());
+    }
+
+}

+ 275 - 0
purchase-admin/src/main/java/com/ozs/web/controller/plan/PlanQuarterController.java

@@ -0,0 +1,275 @@
+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.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.enums.DataIsDelete;
+import com.ozs.common.utils.PageUtils;
+import com.ozs.common.utils.file.FileUtils;
+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 lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+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;
+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.io.InputStream;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 季度计划信息控制层
+ *
+ * @author buzhanyi
+ */
+@Api(tags = "季度计划")
+@RestController
+@Slf4j
+@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")
+    @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 {
+            LoginUser loginUser = tokenService.getLoginUser(request);
+            LambdaQueryWrapper<PlanQuarter> lw = new LambdaQueryWrapper<>();
+            if (!loginUser.getUserId().equals(Long.valueOf("1"))) {
+                lw.eq(PlanQuarter::getPurchaseDeptId, loginUser.getDeptId());
+            }
+            lw.eq(PlanQuarter::getPlanType, "0");
+            lw.eq(PlanQuarter::getDelFlay, DataIsDelete.DataNOTDelete.getCode());
+            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.orderBy(true, false, PlanQuarter::getCreateTime);
+            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")
+    @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 {
+            LoginUser loginUser = tokenService.getLoginUser(request);
+            vo.setCreated(String.valueOf(loginUser.getUserId()));
+            vo.setPurchaseDeptId(String.valueOf(loginUser.getDeptId()));
+            List<PlanQuarter> planYears = quarterService.queryPage(vo);
+            if (!ObjectUtils.isEmpty(planYears) && !ObjectUtils.isEmpty(planYears.size())) {
+                planQuarterList = quarterServiceImpl.changeTo(planYears);
+            }
+        } 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, HttpServletRequest request) throws Exception {
+        LoginUser loginUser = tokenService.getLoginUser(request);
+        List<PlanQuarterResponseVo> list = quarterService.selectPlanQuarterListEXP(quarterStandardVo, loginUser);
+        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, HttpServletRequest request) throws Exception {
+        LoginUser loginUser = tokenService.getLoginUser(request);
+        List<PlanQuarterResponseVo> list = quarterService.selectPlanQuarterExamineListEXP(quarterStandardVo, loginUser);
+        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);
+        quarterStandardVo.setPurchaseDeptId(String.valueOf(loginUser.getDeptId()));
+        quarterStandardVo.setCreated(String.valueOf(loginUser.getUserId()));
+        return quarterService.insertPlanQuarter(quarterStandardVo);
+    }
+
+    @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()));
+        return quarterService.update(quarterStandardVo);
+    }
+
+    @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()));
+        return quarterService.reviewTo(quarterStandardVo);
+    }
+
+    @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()));
+        return quarterService.reviewReturn(quarterStandardVo);
+    }
+
+    @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);
+    }
+    //
+    //@ApiOperation(value = "下载计划关联文件")
+    //@PostMapping("/downLoadPlanFile")
+    //public AjaxResult downLoadPlanFile(@RequestBody PlanQuarterStandardVo quarterStandardVo) {
+    //    return quarterService.downLoadPlanFile(quarterStandardVo);
+    //}
+
+    @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());
+        //获取采购单位-
+        LoginUser loginUser = getLoginUser();
+        String message = quarterService.importPlanQuarter(quarter, updateSupport, loginUser);
+        return success(message);
+    }
+
+    @ApiOperation("模板下载")
+    @GetMapping("/downloaExcel")
+    public void downloadZip(HttpServletResponse response) {
+        try {
+            InputStream resourceAsStream = this.getClass().getResourceAsStream("/template/planQuarter.xlsx");
+            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
+            FileUtils.setAttachmentResponseHeader(response, "季度计划导入模板.xlsx");
+            FileUtils.writeBytesByInput(resourceAsStream, response.getOutputStream());
+        } catch (Exception e) {
+            log.error("下载文件失败", e);
+        }
+    }
+
+
+}

+ 412 - 0
purchase-admin/src/main/java/com/ozs/web/controller/plan/PlanYearsController.java

@@ -0,0 +1,412 @@
+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.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.model.LoginUser;
+import com.ozs.common.enums.BusinessType;
+import com.ozs.common.enums.DataIsDelete;
+import com.ozs.common.exception.ServiceException;
+import com.ozs.common.exception.base.BaseException;
+import com.ozs.common.core.domain.entity.SysProcurementStandard;
+import com.ozs.common.utils.PageUtils;
+import com.ozs.common.utils.StringUtils;
+import com.ozs.common.utils.file.FileUtils;
+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.pm.doman.PmAuditDeptRef;
+import com.ozs.system.service.ISysDeptService;
+import com.ozs.system.service.SysProcurementStandardService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 年度计划信息控制层
+ *
+ * @author buzhanyi
+ */
+@Api(tags = "年度计划")
+@Slf4j
+@RestController
+@RequestMapping("/plan/planYears")
+public class PlanYearsController extends BaseController {
+    @Autowired
+    private PlanYearsService planYearsService;
+    @Autowired
+    private TokenService tokenService;
+    @Autowired
+    private ISysDeptService iSysDeptService;
+    @Autowired
+    private SysProcurementStandardService sysProcurementStandardService;
+
+
+    @ApiOperation(value = "查询年度计划")
+    @PostMapping("/list")
+    @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>();
+            LoginUser loginUser = tokenService.getLoginUser(request);
+            if (!loginUser.getUserId().equals(Long.valueOf("1"))) {
+                lw.eq(PlanYears::getPurchaseDeptId, loginUser.getDeptId());
+            }
+            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());
+            lw.orderBy(true, false, PlanYears::getCreateTime);
+            List<PlanYears> planYears = planYearsService.list(lw);
+            planYearsList = planYearsService.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")
+    @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 {
+            LoginUser loginUser = tokenService.getLoginUser(request);
+            vo.setPurchaseDeptId(String.valueOf(loginUser.getDeptId()));
+            vo.setCreated(String.valueOf(loginUser.getUserId()));
+            List<PlanYears> planYears = planYearsService.queryPage(vo);
+            if (!ObjectUtils.isEmpty(planYears) && !ObjectUtils.isEmpty(planYears.size())) {
+                planYearsList = planYearsService.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, HttpServletRequest request) throws Exception {
+        LoginUser loginUser = tokenService.getLoginUser(request);
+        List<PlanYearsResponseVo> list = planYearsService.selectPlanYearsListEXP(yearsStandardVo, loginUser);
+        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, HttpServletRequest request) throws Exception {
+        LoginUser loginUser = tokenService.getLoginUser(request);
+        List<PlanYearsResponseVo> list = planYearsService.selectPlanYearsExamineListEXP(yearsStandardVo, loginUser);
+        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);
+        yearsStandardVo.setPurchaseDeptId(String.valueOf(loginUser.getDeptId()));
+        yearsStandardVo.setCreated(String.valueOf(loginUser.getUserId()));
+        return planYearsService.insertPlanYears(yearsStandardVo);
+    }
+
+    @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.setPurchaseDeptId(String.valueOf(loginUser.getDeptId()));
+        yearsStandardVo.setUpdated(String.valueOf(loginUser.getUserId()));
+        return planYearsService.update(yearsStandardVo);
+    }
+
+    @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()));
+        return planYearsService.reviewTo(yearsStandardVo);
+    }
+
+    @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()));
+        return planYearsService.reviewReturn(yearsStandardVo);
+    }
+
+    @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);
+    }
+    //
+    //@ApiOperation(value = "下载计划关联文件")
+    //@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());
+        //获取采购单位-
+        LoginUser loginUser = getLoginUser();
+        String message = planYearsService.importPlanYears(planYears, updateSupport, loginUser);
+        return success(message);
+    }
+
+    @ApiOperation(value = "系统首页计划管理")
+    @GetMapping("/planYearsTotal")
+    @PreAuthorize("@ss.hasPermi('plan:planYears:planYearsTotal')")
+    @Log(title = ModularConstans.planYear, businessType = BusinessType.QUERY)
+    public AjaxResult planYearsTotal() {
+        return success(planYearsService.count());
+    }
+
+    @ApiOperation("模板下载")
+    @GetMapping("/downloaExcel")
+    public void downloadZip(HttpServletResponse response) {
+        try {
+            InputStream resourceAsStream = this.getClass().getResourceAsStream("/template/planYears.xlsx");
+            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
+            FileUtils.setAttachmentResponseHeader(response, "年度计划导入模板.xlsx");
+            FileUtils.writeBytesByInput(resourceAsStream, response.getOutputStream());
+        } catch (Exception e) {
+            log.error("下载文件失败", e);
+        }
+    }
+
+    @ApiOperation(value = "获取采购服务站")
+    @GetMapping("/getProcurementService")
+    @Log(title = ModularConstans.planYear, businessType = BusinessType.QUERY)
+    public AjaxResult getProcurementService(@RequestParam("projectType") String projectType,
+                                            @RequestParam("evaluation") BigDecimal evaluation) {
+        //获取当前登录人的部门ID
+        LoginUser loginUser = getLoginUser();
+        List<String> list = new ArrayList<>();
+        list.add("网空采购站");
+        if (StringUtils.isNull(loginUser) || StringUtils.isNull(loginUser.getDeptId())) {
+            return error("当前登陆过期,请重新登录!");
+        }
+        Long deptId = loginUser.getDeptId();
+        // 获取当前登陆人的部门名称
+        SysDept sysDept = iSysDeptService.selectById(deptId);
+        if (StringUtils.isNull(sysDept) || StringUtils.isNull(sysDept.getDeptName())) {
+            return error("当前登陆人没有部门信息,请核对数据!");
+        }
+
+        String str = sysDept.getPurchaseServices();
+        if (!ObjectUtils.isEmpty(evaluation) && !ObjectUtils.isEmpty(projectType)) {
+            String[] ancestors = sysDept.getAncestors().split(",");
+            //当前用户的部门,是否允许提交(不在规定等级范围不可提交)
+            //查询当前用户的部门是否有上级,是否需要上级及祖级进行审核
+            Long cdeptId = null;
+            Long bdeptId = null;
+            String deptLevel = null;
+            if (ancestors.length == 2) { //C级
+                deptLevel = "C";
+            } else if (ancestors.length == 3) { //B级
+                deptLevel = "B";
+                cdeptId = Long.valueOf(ancestors[2]);
+            } else if (ancestors.length == 4) { //A级
+                deptLevel = "A";
+                cdeptId = Long.valueOf(ancestors[2]);
+                bdeptId = Long.valueOf(ancestors[3]);
+            }
+            if (!Arrays.asList("A", "B", "C").contains(deptLevel)) {
+                return success(list);
+            }
+
+            switch (deptLevel) {
+                case "A":
+                    LambdaQueryWrapper<SysProcurementStandard> queryWrapperA = new LambdaQueryWrapper<>();
+                    queryWrapperA.eq(SysProcurementStandard::getDeptId, deptId);
+                    queryWrapperA.eq(SysProcurementStandard::getCategory, projectType.equals("2") ? "1" : projectType.equals("1") ? "2" : projectType);
+                    List<SysProcurementStandard> sysProcurementStandardsListA = sysProcurementStandardService.list(queryWrapperA);
+                    if (ObjectUtils.isEmpty(sysProcurementStandardsListA)) {
+                        throw new ServiceException("部门id为" + deptId + "的部门采购标准未进行初始化!");
+                    }
+                    //A不限额就自己审核
+                    SysProcurementStandard sA = sysProcurementStandardsListA.get(0);
+                    if (sA.getState().equals(Integer.valueOf(0))) {
+                        //采用初始化数据
+                    } else {
+                        //A限额了判断是否超额,不超额就自己审。超额了追加上级
+                        BigDecimal maximum = sA.getMaximum();
+                        if (maximum.compareTo(evaluation) == 1) {
+                            //采用初始化数据
+                        } else {
+                            //A限额了,找B
+                            SysDept b = iSysDeptService.selectById(bdeptId);
+                            LambdaQueryWrapper<SysProcurementStandard> queryWrapperB = new LambdaQueryWrapper<>();
+                            queryWrapperB.eq(SysProcurementStandard::getDeptId, bdeptId);
+                            queryWrapperB.eq(SysProcurementStandard::getCategory, projectType.equals("2") ? "1" : projectType.equals("1") ? "2" : projectType);
+                            List<SysProcurementStandard> sysProcurementStandardsListB = sysProcurementStandardService.list(queryWrapperB);
+                            //B不限额,B审
+                            if (ObjectUtils.isEmpty(sysProcurementStandardsListB)) {
+                                throw new ServiceException("部门id为" + bdeptId + "的部门采购标准未进行初始化!");
+                            }
+                            SysProcurementStandard sB = sysProcurementStandardsListB.get(0);
+                            if (sB.getState().equals(Integer.valueOf(0))) {
+                                //refB采用初始化数据
+
+                                str = b.getPurchaseServices();
+                            } else {
+                                //B限额了判断是否超额,不超额就自己审。超额了追加C级
+                                str = b.getPurchaseServices();
+                                BigDecimal maximumB = sB.getMaximum();
+                                //B超额
+                                if (maximumB.compareTo(evaluation) == -1) {
+                                    SysDept c = iSysDeptService.selectById(cdeptId);
+                                    str = c.getPurchaseServices();
+                                }
+                            }
+                        }
+                    }
+                    break;
+                case "B":
+                    // B的判断  最少插入1条。最多插入2条
+                    SysDept b = iSysDeptService.selectById(deptId);
+                    LambdaQueryWrapper<SysProcurementStandard> queryWrapperB = new LambdaQueryWrapper<>();
+                    queryWrapperB.eq(SysProcurementStandard::getDeptId, deptId);
+                    queryWrapperB.eq(SysProcurementStandard::getCategory, projectType.equals("2") ? "1" : projectType.equals("1") ? "2" : projectType);
+                    List<SysProcurementStandard> sysProcurementStandardsListB = sysProcurementStandardService.list(queryWrapperB);
+                    //B不限额,B审
+                    if (ObjectUtils.isEmpty(sysProcurementStandardsListB)) {
+                        throw new ServiceException("部门id为" + deptId + "的部门采购标准未进行初始化!");
+                    }
+                    SysProcurementStandard sB = sysProcurementStandardsListB.get(0);
+                    if (sB.getState() == 0) {
+
+                        str = b.getPurchaseServices();
+                    } else {
+                        //B限额了判断是否超额,不超额就自己审。超额了追加C级
+                        BigDecimal maximumB = sB.getMaximum();
+                        //B不超额B审
+                        if (maximumB.compareTo(evaluation) == 1) {
+                            str = b.getPurchaseServices();
+                        } else {
+                            SysDept c = iSysDeptService.selectById(cdeptId);
+                            str = c.getPurchaseServices();
+                        }
+                    }
+
+                    break;
+                default:
+                    SysDept c = iSysDeptService.selectById(deptId);
+                    str = c.getPurchaseServices();
+
+            }
+        }
+
+        if (!org.apache.commons.lang3.StringUtils.isBlank(str)) {
+            list.add(str);
+        }
+        return success(list);
+    }
+}

+ 258 - 0
purchase-admin/src/main/java/com/ozs/web/controller/plan/ProvisionalPlanController.java

@@ -0,0 +1,258 @@
+package com.ozs.web.controller.plan;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+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.enums.SysFileRefEnum;
+import com.ozs.common.exception.ServiceException;
+import com.ozs.common.utils.PageUtils;
+import com.ozs.common.utils.StringUtils;
+import com.ozs.common.utils.file.FileUtils;
+import com.ozs.common.utils.poi.ExcelUtil;
+import com.ozs.framework.web.service.TokenService;
+import com.ozs.plan.doman.ProvisionalPlan;
+import com.ozs.plan.doman.vo.requestVo.ProvisionalPlanVo;
+import com.ozs.plan.service.ProvisionalPlanService;
+import com.ozs.plan.service.impl.ProvisionalPlanServiceImpl;
+import com.ozs.system.domain.SysFileRef;
+import com.ozs.system.service.SysFileRefService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+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;
+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.io.InputStream;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 临时计划
+ *
+ * @author sunhh
+ */
+@Api(tags = "临时计划")
+@Slf4j
+@RestController
+@RequestMapping("/plan/provisionalPlan")
+public class ProvisionalPlanController extends BaseController {
+
+    @Autowired
+    private ProvisionalPlanService provisionalPlanService;
+    @Autowired
+    private ProvisionalPlanServiceImpl provisionalPlanServiceImpl;
+    @Autowired
+    private TokenService tokenService;
+    @Autowired
+    private SysFileRefService sysFileRefService;
+
+    @ApiOperation(value = "新增临时计划")
+    @PostMapping("/insertProvisionalPlan")
+    @PreAuthorize("@ss.hasPermi('plan:provisionalPlan:insertProvisionalPlan')")
+    @Log(title = ModularConstans.provisionalPlan, businessType = BusinessType.INSERT)
+    public AjaxResult insertProvisionalPlan(@RequestBody ProvisionalPlan provisionalPlan, HttpServletRequest request) {
+        //获取采购单位
+        LoginUser loginUser = tokenService.getLoginUser(request);
+        provisionalPlan.setPurchaseDeptId(String.valueOf(loginUser.getDeptId()));
+        provisionalPlan.setCreated(String.valueOf(loginUser.getUserId()));
+        provisionalPlan.setCreateTime(new Date());
+        //默认未超额
+        if (ObjectUtils.isEmpty(provisionalPlan.getIsExcess())) {
+            provisionalPlan.setIsExcess("0");
+        }
+        // planType计划类型(0:季度计划,1:临时计划)
+        provisionalPlan.setPlanType("1");
+        // 项目状态(0:计划待提交,1:计划待审核,2:计划已退回,3:计划已审核)
+        provisionalPlan.setProjectStatus("0");
+        // 计算是否超限额计划 *** 改为前端录入
+        // provisionalPlan.setIsExcess(iSysDeptService.isExcessOrNo(provisionalPlan.getProjectType(), provisionalPlan.getEvaluation(), Long.valueOf(provisionalPlan.getPurchaseDeptId())));
+        boolean save = provisionalPlanService.save(provisionalPlan);
+        log.info("provisionalPlan的主键id:{}", provisionalPlan.getPlanPracticalId());
+        List<SysFileRef> sysFileRefs = provisionalPlan.getSysFileRefs();
+        if (!ObjectUtils.isEmpty(sysFileRefs)) {
+            if (save) {
+                for (SysFileRef ref : sysFileRefs) {
+                    ref.setRedId(provisionalPlan.getPlanPracticalId());
+                    ref.setType(SysFileRefEnum.PLAN_TEMPORARY.getType());
+                    ref.setCreated(provisionalPlan.getCreated());
+                    ref.setCreateTime(new Date());
+                    ref.setUpdated(provisionalPlan.getCreated());
+                    ref.setUpdateTime(new Date());
+                    sysFileRefService.save(ref);
+                }
+            }
+
+        }
+        return toAjax(save);
+    }
+
+    @ApiOperation(value = "删除临时计划", notes = "必传 plan_practical_id")
+    @PostMapping("/deleteProvisionalPlan")
+    @PreAuthorize("@ss.hasPermi('plan:provisionalPlan:deleteProvisionalPlan')")
+    @Log(title = ModularConstans.provisionalPlan, businessType = BusinessType.DELETE)
+    public AjaxResult deleteProvisionalPlan(@RequestBody ProvisionalPlan provisionalPlan) {
+        if (StringUtils.isNull(provisionalPlan) || StringUtils.isNull(provisionalPlan.getPlanPracticalId())) {
+            return error("临时计划id不能为空");
+        }
+        return toAjax(provisionalPlanService.deleteProvisionalPlanById(provisionalPlan.getPlanPracticalId()));
+    }
+
+    @ApiOperation(value = "修改临时计划", notes = "必传 plan_year_id 及修改数据")
+    @PostMapping("/updateProvisionalPlan")
+    @PreAuthorize("@ss.hasPermi('plan:provisionalPlan:updateProvisionalPlan')")
+    @Log(title = ModularConstans.provisionalPlan, businessType = BusinessType.UPDATE)
+    public AjaxResult updateProvisionalPlan(@RequestBody ProvisionalPlanVo provisionalPlan) {
+        if (StringUtils.isNull(provisionalPlan) || StringUtils.isNull(provisionalPlan.getPlanPracticalId())) {
+            return error("临时计划id和修改数据不能为空");
+        }
+        log.info(":{}", provisionalPlan);
+        // 计算是否超限额计划 *** 改为前端录入
+        // provisionalPlan.setIsExcess(iSysDeptService.isExcessOrNo(provisionalPlan.getProjectType(), provisionalPlan.getEvaluation(), getDeptId()));
+        return toAjax(provisionalPlanService.updateProvisionalPlanById(provisionalPlan));
+    }
+
+    @ApiOperation(value = "查询临时计划")
+    @PostMapping("/selectProvisionalPlan")
+    @PreAuthorize("@ss.hasPermi('plan:provisionalPlan:selectProvisionalPlan')")
+    @Log(title = ModularConstans.provisionalPlan, businessType = BusinessType.QUERY)
+    public AjaxResult selectProvisionalPlan(@RequestBody ProvisionalPlanVo vo, HttpServletRequest request) {
+        if (StringUtils.isNull(vo)
+                || StringUtils.isNull(vo.getPageNum())
+                || StringUtils.isNull(vo.getPageSize())) {
+            throw new ServiceException("分页参数不能为空!");
+        }
+        LoginUser loginUser = tokenService.getLoginUser(request);
+        return provisionalPlanService.selectProvisionalPlan(vo, request, loginUser);
+    }
+
+    @ApiOperation(value = "查询临时计划-审核单位")
+    @PostMapping("/selectProvisionalPlanAudit")
+    @PreAuthorize("@ss.hasPermi('plan:provisionalPlan:selectProvisionalPlanAudit')")
+    @Log(title = ModularConstans.provisionalPlan, businessType = BusinessType.QUERY)
+    public AjaxResult selectProvisionalPlanAudit(@RequestBody ProvisionalPlanVo vo, HttpServletRequest request) {
+        List<ProvisionalPlan> provisionalPlanList = new ArrayList<>();
+        if (StringUtils.isNull(vo)
+                || StringUtils.isNull(vo.getPageNum())
+                || StringUtils.isNull(vo.getPageSize())) {
+            throw new ServiceException("分页参数不能为空!");
+        }
+        try {
+            LoginUser loginUser = tokenService.getLoginUser(request);
+            vo.setCreated(String.valueOf(loginUser.getUserId()));
+            vo.setPurchaseDeptId(loginUser.getDeptId());
+            List<ProvisionalPlan> provisionalPlans = provisionalPlanService.queryPage(vo);
+            if (!ObjectUtils.isEmpty(provisionalPlans) && !ObjectUtils.isEmpty(provisionalPlans.size())) {
+                provisionalPlanList = provisionalPlanServiceImpl.changeTo(provisionalPlans);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        Page pages = PageUtils.getPages(vo.getPageNum().intValue(), vo.getPageSize().intValue(), provisionalPlanList);
+        return AjaxResult.success(pages);
+    }
+
+    @ApiOperation(value = "查询临时计划详情")
+    @PostMapping("/selectById")
+    @PreAuthorize("@ss.hasPermi('plan:provisionalPlan: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不能为空!");
+        }
+        return provisionalPlanService.seletById(provisionalPlanVo.getPlanPracticalId());
+    }
+
+    @ApiOperation(value = "导入临时计划")
+    @PostMapping("/importProvisionalPlan")
+    @PreAuthorize("@ss.hasPermi('plan:provisionalPlan:importProvisionalPlan')")
+    @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());
+        if (StringUtils.isNull(provisionalPlans) || provisionalPlans.size() == 0) {
+            throw new ServiceException("导入临时计划数据不能为空!");
+        }
+        //获取采购单位-
+        LoginUser loginUser = getLoginUser();
+        String message = provisionalPlanService.importProvisionalPlan(provisionalPlans, updateSupport, loginUser);
+        return success(message);
+    }
+
+    @ApiOperation(value = "导出临时计划")
+    @PostMapping("/exportProvisionalPlan")
+    @PreAuthorize("@ss.hasPermi('plan:provisionalPlan:exportProvisionalPlan')")
+    @Log(title = ModularConstans.provisionalPlan, businessType = BusinessType.EXPORT)
+    public void exportProvisionalPlan(HttpServletResponse response, @RequestBody ProvisionalPlanVo provisionalPlanVo, HttpServletRequest request) throws Exception {
+        LoginUser loginUser = tokenService.getLoginUser(request);
+        List<ProvisionalPlan> list = provisionalPlanService.selectProvisionalPlanExport(provisionalPlanVo, loginUser);
+        ExcelUtil<ProvisionalPlan> util = new ExcelUtil<>(ProvisionalPlan.class);
+        util.exportExcel(response, list, "临时计划数据");
+    }
+
+    @ApiOperation(value = "提交临时计划")
+    @PostMapping("/commitProvisionalPlan")
+    @PreAuthorize("@ss.hasPermi('plan:provisionalPlan:commitProvisionalPlan')")
+    @Log(title = ModularConstans.provisionalPlan, businessType = BusinessType.UPDATE)
+    public AjaxResult commitProvisionalPlan(@RequestBody ProvisionalPlanVo provisionalPlanVo) {
+        if (StringUtils.isNull(provisionalPlanVo) || StringUtils.isNull(provisionalPlanVo.getPlanPracticalId())) {
+            return error("提交的临时计划ID不能为空!");
+        }
+        return toAjax(provisionalPlanService.commitProvisionalPlan(provisionalPlanVo));
+    }
+
+    @ApiOperation(value = "审核通过")
+    @PostMapping("/auditPass")
+    @PreAuthorize("@ss.hasPermi('plan:provisionalPlan: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不能为空!");
+        }
+        LoginUser loginUser = tokenService.getLoginUser(request);
+        provisionalPlanVo.setUpdated(String.valueOf(loginUser.getUserId()));
+        return provisionalPlanService.auditPass(provisionalPlanVo);
+    }
+
+    @ApiOperation(value = "审核不通过")
+    @PostMapping("/auditNoPass")
+    @PreAuthorize("@ss.hasPermi('plan:provisionalPlan: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不能为空!");
+        }
+        LoginUser loginUser = tokenService.getLoginUser(request);
+        provisionalPlanVo.setUpdated(String.valueOf(loginUser.getUserId()));
+        return provisionalPlanService.auditNoPass(provisionalPlanVo);
+    }
+
+
+    @ApiOperation("模板下载")
+    @GetMapping("/downloaExcel")
+    public void downloadZip(HttpServletResponse response) {
+        try {
+            InputStream resourceAsStream = this.getClass().getResourceAsStream("/template/provisionalPlan.xlsx");
+            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
+            FileUtils.setAttachmentResponseHeader(response, "临时计划导入模板.xlsx");
+            FileUtils.writeBytesByInput(resourceAsStream, response.getOutputStream());
+        } catch (Exception e) {
+            log.error("下载文件失败", e);
+        }
+    }
+
+}

+ 47 - 0
purchase-admin/src/main/java/com/ozs/web/controller/pm/PmAuditDeptRefController.java

@@ -0,0 +1,47 @@
+package com.ozs.web.controller.pm;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+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.pm.doman.PmAuditDeptRef;
+import com.ozs.pm.service.PmAuditDeptRefService;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@Api(tags = "审核关联")
+@RestController
+@RequestMapping("/pm/audit")
+public class PmAuditDeptRefController extends BaseController {
+
+    @Autowired
+    private PmAuditDeptRefService pmAuditDeptRefService;
+    @Autowired
+    private com.ozs.system.service.ISysDeptService deptService;
+
+    @PostMapping("/list")
+    public AjaxResult list(@RequestBody PmAuditDeptRef vo) {
+        LambdaQueryWrapper<PmAuditDeptRef> lw = new LambdaQueryWrapper();
+        lw.eq(PmAuditDeptRef::getRefId, vo.getRefId());
+        lw.eq(PmAuditDeptRef::getRefType, vo.getRefType());
+        List<PmAuditDeptRef> list = pmAuditDeptRefService.list(lw);
+        if (!ObjectUtils.isEmpty(list)) {
+            for (PmAuditDeptRef pmAuditDeptRef : list) {
+                com.ozs.common.core.domain.entity.SysDept d = deptService.selectById(pmAuditDeptRef.getDeptId());
+                if (!ObjectUtils.isEmpty(d)) {
+                    pmAuditDeptRef.setDeptName(d.getDeptName());
+                }
+                pmAuditDeptRef.setStatusStr(pmAuditDeptRef.getStatus().equals(Integer.parseInt("0")) ? "待审核" : "已审核");
+            }
+        }
+        return success(list);
+    }
+}

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

@@ -0,0 +1,95 @@
+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
+ *
+ * @author ruoyi
+ * @date 2023-01-16
+ */
+@Api(tags = "合同信息")
+@RestController
+@RequestMapping("/pm/contractInfo")
+public class PmContractInfoController extends BaseController {
+    @Autowired
+    private IPmDemandService pmDemandService;
+
+
+    /**
+     * 合同信息查询列表
+     */
+    @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()));
+    }
+}

+ 202 - 0
purchase-admin/src/main/java/com/ozs/web/controller/pm/PmDemandController.java

@@ -0,0 +1,202 @@
+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.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 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
+ *
+ * @author ruoyi
+ * @date 2023-01-16
+ */
+@Api(tags = "采购需求")
+@RestController
+@RequestMapping("/pm/demand")
+public class PmDemandController extends BaseController {
+    @Autowired
+    private IPmDemandService pmDemandService;
+    @Autowired
+    private TokenService tokenService;
+
+    /**
+     * 查询采购需求列表
+     */
+    @ApiOperation(value = "查询采购需求列表", notes = "参数非必传")
+    @PostMapping("/list")
+    @PreAuthorize("@ss.hasPermi('pm:demand:list')")
+    @Log(title = ModularConstans.demand, businessType = BusinessType.QUERY)
+    public AjaxResult list(@RequestBody PmDemandReqVo pmDemandReqVo) {
+        pmDemandReqVo.setDeptId(getDeptId());
+        pmDemandReqVo.setUserId(getUserId());
+        IPage<PmDemandResVo> page = pmDemandService.selectPmDemandList(pmDemandReqVo, 0);
+        return success(page);
+
+    }
+
+    /**
+     * 查看详情
+     */
+    @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不能为空");
+        }
+        if(StringUtils.isEmpty(pmDemandReqVo.getDetailType())){
+            return AjaxResult.error("详情的类型不能为空");
+        }
+        return success(pmDemandService.selectPmDemandByDemandId(pmDemandReqVo.getDemandId(),pmDemandReqVo.getDetailType()));
+    }
+
+    /**
+     * 需求建档
+     */
+    @ApiOperation(value = "需求建档", notes = "必传demandId,根据项目类型必传pmDemandEngineeringResponseVo(3:工程类)、pmDemandEquipResponseVo(0:装备类)、pmDemandMaterialsResponseVo(1:物资类)、pmDemandServeResponseVo(2:服务类)其中之一")
+    @PostMapping("/bookBuilding")
+    @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());
+        }
+    }
+
+    @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));
+    }
+
+    /**
+     * 查看流程图,获取当前阶段名字
+     */
+    @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不能为空");
+        }
+        return success(pmDemandService.viewFlowChart(pmRequestVo.getDemandId()));
+    }
+
+    /**
+     * 查看流程图,鼠标移到对应模块后,显示悬浮框提示
+     */
+    @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不能为空");
+        }
+        if(pmRequestVo.getModuleName() == null){
+            return AjaxResult.error("模块名称不能为空");
+        }
+        return success(pmDemandService.getModuleInfo(pmRequestVo.getDemandId(),pmRequestVo.getModuleName()));
+    }
+
+
+    /**
+     * 审核单位查询采购需求列表
+     */
+    @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);
+    }
+
+    @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不能为空");
+        }
+        if(pmDemandReqVo.getSysFileRefs() == null || pmDemandReqVo.getSysFileRefs().size() == 0){
+            return AjaxResult.error("上传附件不能为空");
+        }
+        LoginUser loginUser = tokenService.getLoginUser(request);
+        pmDemandReqVo.setUpdateBy(String.valueOf(loginUser.getUserId()));
+        return toAjax(pmDemandService.reviewTo(pmDemandReqVo));
+    }
+
+    @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不能为空");
+        }
+        if(StringUtils.isEmpty(pmDemandReqVo.getRefuseReason())){
+            return AjaxResult.error("退回原因不能为空");
+        }
+        LoginUser loginUser = tokenService.getLoginUser(request);
+        pmDemandReqVo.setUpdateBy(String.valueOf(loginUser.getUserId()));
+        return toAjax(pmDemandService.reviewReturn(pmDemandReqVo));
+    }
+
+}

+ 93 - 0
purchase-admin/src/main/java/com/ozs/web/controller/pm/PmProjectConstructionController.java

@@ -0,0 +1,93 @@
+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.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
+ *
+ * @author ruoyi
+ * @date 2023-01-16
+ */
+@Api(tags = "项目建设")
+@RestController
+@RequestMapping("/pm/projectConstruction")
+public class PmProjectConstructionController extends BaseController {
+    @Autowired
+    private IPmDemandService pmDemandService;
+
+    /**
+     * 项目建设查询列表
+     */
+    @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()));
+    }
+}

+ 586 - 0
purchase-admin/src/main/java/com/ozs/web/controller/pm/PmPurchaseExecutionController.java

@@ -0,0 +1,586 @@
+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.BaseProfessional;
+import com.ozs.base.domain.BaseUnitInformation;
+import com.ozs.base.domain.vo.BaseExpertVo;
+import com.ozs.base.domain.vo.BaseProfessionalVo;
+import com.ozs.base.service.BaseAgencyService;
+import com.ozs.base.service.BaseExpertService;
+import com.ozs.base.service.BaseProfessionalService;
+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.*;
+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.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.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.*;
+
+/**
+ * 采购执行Controller
+ *
+ * @author ruoyi
+ * @date 2023-01-16
+ */
+@Api(tags = "采购执行")
+@RestController
+@RequestMapping("/pm/purchaseExecution")
+public class PmPurchaseExecutionController extends BaseController {
+    @Autowired
+    private IPmDemandService pmDemandService;
+    @Autowired
+    private BaseAgencyService baseAgencyService;
+    @Autowired
+    private BaseExpertService baseExpertService;
+    @Autowired
+    private PmDemandExpertRefService pmDemandExpertRefService;
+    @Autowired
+    private PmBidOpeningService pmBidOpeningService;
+    @Autowired
+    private BaseProfessionalService baseProfessionalService;
+
+
+    /**
+     * 采购执行查询列表
+     */
+    @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);
+    }
+
+    /**
+     * 查询代理机构列表
+     */
+    @ApiOperation(value = "查询代理机构列表", notes = "采购需求ID必传")
+    @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);
+        if(ObjectUtils.isEmpty(pmDemand)){
+            return error("参数错误");
+        }
+        LambdaQueryWrapper<BaseAgency> lw = new LambdaQueryWrapper<>();
+        lw.eq(BaseAgency::getCompanyType,pmDemand.getProjectType());
+        lw.eq(BaseAgency::getStatus,0);//白名单
+        List<BaseAgency> agencyList = baseAgencyService.list(lw);
+        return success(agencyList);
+    }
+
+    /**
+     * 选取代理-选择填写招标代理机构信息
+     */
+    @ApiOperation(value = "选取代理-选择填写招标代理机构信息",notes = "采购需求ID和代理机构ID必传")
+    @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不能为空")
+                                   @RequestParam(value = "agencyId", required = true) Long agencyId) {
+
+        PmDemand pmDemand = pmDemandService.getById(demandId);
+        if(ObjectUtils.isEmpty(pmDemand)){
+            return error("参数错误");
+        }
+        BaseAgency baseAgency = baseAgencyService.getById(agencyId);
+        if(ObjectUtils.isEmpty(baseAgency)){
+            return error("参数错误");
+        }
+        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());
+        pmDemandUpdate.setUpdateBy(getUserId().toString());
+        return success(pmDemandService.updateById(pmDemandUpdate));
+    }
+
+    /**
+     * 选取代理-抽取招标代理机构信息
+     */
+    @ApiOperation(value = "选取代理-抽取招标代理机构信息",notes = "采购需求ID必传")
+    @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) {
+
+        PmDemand pmDemand = pmDemandService.getById(demandId);
+        if(ObjectUtils.isEmpty(pmDemand)){
+            return error("参数错误");
+        }
+        LambdaQueryWrapper<BaseAgency> lw = new LambdaQueryWrapper<>();
+        lw.eq(BaseAgency::getCompanyType,pmDemand.getProjectType());
+        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.setProjectStatus(PmProjectStatus.WAIT_UPLOAD_BID_FILE.getCode());
+        pmDemandUpdate.setAgencyId(any.getId());
+        pmDemandUpdate.setExtractAgencyTime(new Date());
+        pmDemandUpdate.setUpdateTime(pmDemandUpdate.getExtractAgencyTime());
+        pmDemandUpdate.setUpdateBy(getUserId().toString());
+        return success(pmDemandService.updateById(pmDemandUpdate));
+    }
+
+    @ApiOperation(value = "上传招标文件",notes = "采购需求ID和上传附件必传")
+    @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("参数错误");
+        }
+
+        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_FILE.getType(),sysFileRefs,getUserId().toString())) {
+            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("保存上传附件失败");
+        }
+    }
+
+    @ApiOperation(value = "发布公告")
+    @PostMapping("/insertPmReleaseAnnouncement")
+    @PreAuthorize("@ss.hasPermi('pm:purchaseExecution:insertPmReleaseAnnouncement')")
+    @Log(title = ModularConstans.purchaseExecution, businessType = BusinessType.INSERT)
+    public AjaxResult insertPmReleaseAnnouncement(@NotEmpty(message = "数据为空")
+                                       @RequestBody PmReleaseAnnouncementReqVo 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 = "非必传 查询条件:品目名称")
+    @PostMapping("/selectBaseProfessional")
+    @PreAuthorize("@ss.hasPermi('pm:purchaseExecution:selectBaseProfessional')")
+    @Log(title = ModularConstans.professional, businessType = BusinessType.QUERY)
+    public AjaxResult selectBaseProfessional(@RequestBody BaseProfessionalVo baseProfessionalVo) {
+        List<BaseProfessionalVo> baseSupplierList = baseProfessionalService.selectBaseProfessionalVo(baseProfessionalVo);
+        return success(baseSupplierList);
+    }
+
+
+    @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<BaseUnitInformation> baseUnitInformationList = baseExpertService.getBaseUnitInformationList();
+        if(ObjectUtils.isEmpty(baseUnitInformationList)){
+            return error("专家单位列表是空的");
+        }
+        Set<String> set = new HashSet<>();
+        for(BaseUnitInformation baseUnitInformation : baseUnitInformationList) {
+            set.add(baseUnitInformation.getUnitName());
+        }
+        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(getMajorTypeName(baseExpertVo.getMajorType()));
+                    baseExpertVo.setExpertTypeName(ExpertType.getCodeToInfo(baseExpertVo.getExpertType()));
+                    baseExpertVo.setVarietyPurchaseName(PurchaseType.getCodeToInfo(baseExpertVo.getVarietyPurchase()));
+                    baseExpertVoList.add(baseExpertVo);
+                }
+            }
+        }
+
+        return success(baseExpertVoList);
+    }
+
+    private String getMajorTypeName(String majorType){
+        if(ObjectUtils.isEmpty(majorType)) {
+            return null;
+        }
+        LambdaQueryWrapper<BaseProfessional> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.in(BaseProfessional::getProfessionalCode,majorType.split(","));
+        List<BaseProfessional> list = this.baseProfessionalService.list(lambdaQueryWrapper);
+        if(ObjectUtils.isEmpty(list)){
+            return null;
+        }
+        StringBuilder sb = new StringBuilder();
+        for(BaseProfessional baseProfessional : list){
+            sb.append(baseProfessional.getProfessionalName()).append(",");
+        }
+        String majorTypeName = sb.toString();
+        if(majorTypeName.endsWith(",")){
+            majorTypeName = majorTypeName.substring(0, majorTypeName.length() - 1);
+        }
+        return majorTypeName;
+    }
+
+  /**
+     * 开标信息查看详情列表
+     */
+    @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);
+    }
+
+}

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

@@ -0,0 +1,87 @@
+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;
+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.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;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 任务下达Controller
+ *
+ * @author ruoyi
+ * @date 2023-01-16
+ */
+@Api(tags = "任务下达")
+@RestController
+@RequestMapping("/pm/taskRelease")
+public class PmTaskReleaseController extends BaseController {
+    @Autowired
+    private IPmDemandService pmDemandService;
+    @Autowired
+    private TokenService tokenService;
+
+    /**
+     * 任务下达查询列表
+     */
+    @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);
+    }
+
+    @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不能为空");
+        }
+        if(pmDemandReqVo.getSysFileRefs() == null || pmDemandReqVo.getSysFileRefs().size() == 0){
+            return AjaxResult.error("上传附件不能为空");
+        }
+        LoginUser loginUser = tokenService.getLoginUser(request);
+        pmDemandReqVo.setUpdateBy(String.valueOf(loginUser.getUserId()));
+        return toAjax(pmDemandService.releaseTask(pmDemandReqVo));
+    }
+
+    /**
+     * 查看详情
+     */
+    @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不能为空");
+        }
+        if(StringUtils.isEmpty(pmDemandReqVo.getDetailType())){
+            return AjaxResult.error("详情的类型不能为空");
+        }
+        return success(pmDemandService.selectPmDemandByDemandId(pmDemandReqVo.getDemandId(), pmDemandReqVo.getDetailType()));
+    }
+}

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

@@ -0,0 +1,290 @@
+package com.ozs.web.controller.statisticalAnalysis;
+
+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.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.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+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 IPmDemandService pmDemandService;
+
+
+    @ApiOperation(value = "项目属性分布")
+    @PostMapping("/countByProjectAttr")
+    //@PreAuthorize("@ss.hasPermi('statistical: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(pmDemandReqVo);
+        return AjaxResult.success(resVos);
+    }
+
+    @ApiOperation(value = "采购方式分布")
+    @PostMapping("/countByPurchaseMouth")
+    //@PreAuthorize("@ss.hasPermi('statistical:countByPurchaseMouth')")
+    @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
+    public AjaxResult countByPurchaseMouth(@RequestBody PmDemandReqVo pmDemandReqVo) {
+        //按照项目属性统计所有的项目
+        if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
+            return error("登录账号的单位 不能为空!");
+        }
+        List<StatisticalChartsResVo> resVos = pmDemandService.countByPurchaseMode(pmDemandReqVo);
+        return AjaxResult.success(resVos);
+    }
+
+    @ApiOperation(value = "项目金额分布")
+    @PostMapping("/countByEvaluation")
+    //@PreAuthorize("@ss.hasPermi('statistical: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")
+    //@PreAuthorize("@ss.hasPermi('statistical: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")
+    //@PreAuthorize("@ss.hasPermi('statistical: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")
+    //@PreAuthorize("@ss.hasPermi('statistical: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")
+    //@PreAuthorize("@ss.hasPermi('statistical: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")
+    //@PreAuthorize("@ss.hasPermi('statistical: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")
+    //@PreAuthorize("@ss.hasPermi('statistical: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("/countEveryStatusNum")
+    //@PreAuthorize("@ss.hasPermi('statistical: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("/purchaseProjectExecute")
+    //@PreAuthorize("@ss.hasPermi('statistical: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")
+    //@PreAuthorize("@ss.hasPermi('statistical: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("/purchaseTaskFinish")
+    //@PreAuthorize("@ss.hasPermi('statistical:purchaseTaskFinish')")
+    @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
+    public AjaxResult purchaseTaskFinish(@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.purchaseTaskFinish(pmDemandReqVo);
+        return success(map);
+    }
+
+    @ApiOperation(value = "各阶段项目数量分布")
+    @PostMapping("/purchaseProjectDistribution")
+    //@PreAuthorize("@ss.hasPermi('statistical: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")
+    //@PreAuthorize("@ss.hasPermi('statistical: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")
+    //@PreAuthorize("@ss.hasPermi('statistical: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("分析文档已生成");
+    }
+
+
+}

+ 47 - 32
purchase-admin/src/main/java/com/ozs/web/controller/system/SysDeptController.java

@@ -1,9 +1,14 @@
 package com.ozs.web.controller.system;
 
+import java.util.ArrayList;
 import java.util.List;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.ArrayUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.ObjectUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -27,10 +32,10 @@ import com.ozs.system.service.ISysDeptService;
  *
  * @author ruoyi
  */
+@Api(tags = "部门信息")
 @RestController
 @RequestMapping("/system/dept")
-public class SysDeptController extends BaseController
-{
+public class SysDeptController extends BaseController {
     @Autowired
     private ISysDeptService deptService;
 
@@ -39,19 +44,38 @@ public class SysDeptController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:dept:list')")
     @GetMapping("/list")
-    public AjaxResult list(SysDept dept)
-    {
+    @ApiOperation("获取部门列表")
+    public AjaxResult list(SysDept dept) {
         List<SysDept> depts = deptService.selectDeptList(dept);
         return success(depts);
     }
 
+    /**
+     * 获取部门列表
+     */
+    @GetMapping("/listByUser")
+    @ApiOperation("根据获取本级和子孙级部门列表")
+    public AjaxResult listByUser() {
+        Long deptId = getDeptId();
+        List<SysDept> list = new ArrayList<>();
+        SysDept s = deptService.selectById(deptId);
+        if (!ObjectUtils.isEmpty(s)) {
+            list.add(s);
+            List<SysDept> sl = deptService.selectChildrenDeptById(deptId);
+            if (!ObjectUtils.isEmpty(sl)) {
+                list.addAll(sl);
+            }
+        }
+        return success(list);
+    }
+
     /**
      * 查询部门列表(排除节点)
      */
     @PreAuthorize("@ss.hasPermi('system:dept:list')")
     @GetMapping("/list/exclude/{deptId}")
-    public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId)
-    {
+    @ApiOperation("查询部门列表(排除节点)")
+    public AjaxResult excludeChild(@PathVariable(value = "deptId" , required = false) Long deptId) {
         List<SysDept> depts = deptService.selectDeptList(new SysDept());
         depts.removeIf(d -> d.getDeptId().intValue() == deptId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + ""));
         return success(depts);
@@ -60,10 +84,9 @@ public class SysDeptController extends BaseController
     /**
      * 根据部门编号获取详细信息
      */
-    @PreAuthorize("@ss.hasPermi('system:dept:query')")
     @GetMapping(value = "/{deptId}")
-    public AjaxResult getInfo(@PathVariable Long deptId)
-    {
+    @ApiOperation("根据部门编号获取详细信息")
+    public AjaxResult getInfo(@PathVariable Long deptId) {
         deptService.checkDeptDataScope(deptId);
         return success(deptService.selectDeptById(deptId));
     }
@@ -72,12 +95,11 @@ public class SysDeptController extends BaseController
      * 新增部门
      */
     @PreAuthorize("@ss.hasPermi('system:dept:add')")
-    @Log(title = "部门管理", businessType = BusinessType.INSERT)
+    @Log(title = "部门管理" , businessType = BusinessType.INSERT)
     @PostMapping
-    public AjaxResult add(@Validated @RequestBody SysDept dept)
-    {
-        if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept)))
-        {
+    @ApiOperation("新增部门")
+    public AjaxResult add(@Validated @RequestBody SysDept dept) {
+        if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))) {
             return error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在");
         }
         dept.setCreateBy(getUsername());
@@ -88,22 +110,17 @@ public class SysDeptController extends BaseController
      * 修改部门
      */
     @PreAuthorize("@ss.hasPermi('system:dept:edit')")
-    @Log(title = "部门管理", businessType = BusinessType.UPDATE)
+    @Log(title = "部门管理" , businessType = BusinessType.UPDATE)
     @PutMapping
-    public AjaxResult edit(@Validated @RequestBody SysDept dept)
-    {
+    @ApiOperation("修改部门")
+    public AjaxResult edit(@Validated @RequestBody SysDept dept) {
         Long deptId = dept.getDeptId();
         deptService.checkDeptDataScope(deptId);
-        if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept)))
-        {
+        if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))) {
             return error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在");
-        }
-        else if (dept.getParentId().equals(deptId))
-        {
+        } else if (dept.getParentId().equals(deptId)) {
             return error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己");
-        }
-        else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) && deptService.selectNormalChildrenDeptById(deptId) > 0)
-        {
+        } else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) && deptService.selectNormalChildrenDeptById(deptId) > 0) {
             return error("该部门包含未停用的子部门!");
         }
         dept.setUpdateBy(getUsername());
@@ -114,16 +131,14 @@ public class SysDeptController extends BaseController
      * 删除部门
      */
     @PreAuthorize("@ss.hasPermi('system:dept:remove')")
-    @Log(title = "部门管理", businessType = BusinessType.DELETE)
+    @Log(title = "部门管理" , businessType = BusinessType.DELETE)
     @DeleteMapping("/{deptId}")
-    public AjaxResult remove(@PathVariable Long deptId)
-    {
-        if (deptService.hasChildByDeptId(deptId))
-        {
+    @ApiOperation("删除部门")
+    public AjaxResult remove(@PathVariable Long deptId) {
+        if (deptService.hasChildByDeptId(deptId)) {
             return warn("存在下级部门,不允许删除");
         }
-        if (deptService.checkDeptExistUser(deptId))
-        {
+        if (deptService.checkDeptExistUser(deptId)) {
             return warn("部门存在用户,不允许删除");
         }
         deptService.checkDeptDataScope(deptId);

+ 11 - 0
purchase-admin/src/main/java/com/ozs/web/controller/system/SysDictDataController.java

@@ -3,6 +3,9 @@ package com.ozs.web.controller.system;
 import java.util.ArrayList;
 import java.util.List;
 import javax.servlet.http.HttpServletResponse;
+
+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.validation.annotation.Validated;
@@ -32,6 +35,7 @@ import com.ozs.system.service.ISysDictTypeService;
  */
 @RestController
 @RequestMapping("/system/dict/data")
+@Api(tags="数据字典信息")
 public class SysDictDataController extends BaseController
 {
     @Autowired
@@ -42,6 +46,7 @@ public class SysDictDataController extends BaseController
 
     @PreAuthorize("@ss.hasPermi('system:dict:list')")
     @GetMapping("/list")
+    @ApiOperation("根据条件分页查询字典数据")
     public TableDataInfo list(SysDictData dictData)
     {
         startPage();
@@ -52,6 +57,7 @@ public class SysDictDataController extends BaseController
     @Log(title = "字典数据", businessType = BusinessType.EXPORT)
     @PreAuthorize("@ss.hasPermi('system:dict:export')")
     @PostMapping("/export")
+    @ApiOperation("字典数据")
     public void export(HttpServletResponse response, SysDictData dictData)
     {
         List<SysDictData> list = dictDataService.selectDictDataList(dictData);
@@ -64,6 +70,7 @@ public class SysDictDataController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:dict:query')")
     @GetMapping(value = "/{dictCode}")
+    @ApiOperation("查询字典数据详细")
     public AjaxResult getInfo(@PathVariable Long dictCode)
     {
         return success(dictDataService.selectDictDataById(dictCode));
@@ -73,6 +80,7 @@ public class SysDictDataController extends BaseController
      * 根据字典类型查询字典数据信息
      */
     @GetMapping(value = "/type/{dictType}")
+    @ApiOperation("根据字典类型查询字典数据信息")
     public AjaxResult dictType(@PathVariable String dictType)
     {
         List<SysDictData> data = dictTypeService.selectDictDataByType(dictType);
@@ -89,6 +97,7 @@ public class SysDictDataController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:dict:add')")
     @Log(title = "字典数据", businessType = BusinessType.INSERT)
     @PostMapping
+    @ApiOperation("新增字典类型")
     public AjaxResult add(@Validated @RequestBody SysDictData dict)
     {
         dict.setCreateBy(getUsername());
@@ -101,6 +110,7 @@ public class SysDictDataController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:dict:edit')")
     @Log(title = "字典数据", businessType = BusinessType.UPDATE)
     @PutMapping
+    @ApiOperation("修改保存字典类型")
     public AjaxResult edit(@Validated @RequestBody SysDictData dict)
     {
         dict.setUpdateBy(getUsername());
@@ -113,6 +123,7 @@ public class SysDictDataController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:dict:remove')")
     @Log(title = "字典类型", businessType = BusinessType.DELETE)
     @DeleteMapping("/{dictCodes}")
+    @ApiOperation("删除字典类型")
     public AjaxResult remove(@PathVariable Long[] dictCodes)
     {
         dictDataService.deleteDictDataByIds(dictCodes);

+ 12 - 0
purchase-admin/src/main/java/com/ozs/web/controller/system/SysDictTypeController.java

@@ -2,6 +2,9 @@ package com.ozs.web.controller.system;
 
 import java.util.List;
 import javax.servlet.http.HttpServletResponse;
+
+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.validation.annotation.Validated;
@@ -30,6 +33,7 @@ import com.ozs.system.service.ISysDictTypeService;
  */
 @RestController
 @RequestMapping("/system/dict/type")
+@Api(tags = "数据字典信息")
 public class SysDictTypeController extends BaseController
 {
     @Autowired
@@ -37,6 +41,7 @@ public class SysDictTypeController extends BaseController
 
     @PreAuthorize("@ss.hasPermi('system:dict:list')")
     @GetMapping("/list")
+    @ApiOperation("根据条件分页查询字典类型")
     public TableDataInfo list(SysDictType dictType)
     {
         startPage();
@@ -47,6 +52,7 @@ public class SysDictTypeController extends BaseController
     @Log(title = "字典类型", businessType = BusinessType.EXPORT)
     @PreAuthorize("@ss.hasPermi('system:dict:export')")
     @PostMapping("/export")
+    @ApiOperation("字典类型")
     public void export(HttpServletResponse response, SysDictType dictType)
     {
         List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
@@ -59,6 +65,7 @@ public class SysDictTypeController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:dict:query')")
     @GetMapping(value = "/{dictId}")
+    @ApiOperation("查询字典类型详细")
     public AjaxResult getInfo(@PathVariable Long dictId)
     {
         return success(dictTypeService.selectDictTypeById(dictId));
@@ -70,6 +77,7 @@ public class SysDictTypeController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:dict:add')")
     @Log(title = "字典类型", businessType = BusinessType.INSERT)
     @PostMapping
+    @ApiOperation("新增字典类型")
     public AjaxResult add(@Validated @RequestBody SysDictType dict)
     {
         if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict)))
@@ -86,6 +94,7 @@ public class SysDictTypeController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:dict:edit')")
     @Log(title = "字典类型", businessType = BusinessType.UPDATE)
     @PutMapping
+    @ApiOperation("修改字典类型")
     public AjaxResult edit(@Validated @RequestBody SysDictType dict)
     {
         if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict)))
@@ -102,6 +111,7 @@ public class SysDictTypeController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:dict:remove')")
     @Log(title = "字典类型", businessType = BusinessType.DELETE)
     @DeleteMapping("/{dictIds}")
+    @ApiOperation("删除字典类型")
     public AjaxResult remove(@PathVariable Long[] dictIds)
     {
         dictTypeService.deleteDictTypeByIds(dictIds);
@@ -114,6 +124,7 @@ public class SysDictTypeController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:dict:remove')")
     @Log(title = "字典类型", businessType = BusinessType.CLEAN)
     @DeleteMapping("/refreshCache")
+    @ApiOperation("刷新字典缓存")
     public AjaxResult refreshCache()
     {
         dictTypeService.resetDictCache();
@@ -124,6 +135,7 @@ public class SysDictTypeController extends BaseController
      * 获取字典选择框列表
      */
     @GetMapping("/optionselect")
+    @ApiOperation("获取字典选择框列表")
     public AjaxResult optionselect()
     {
         List<SysDictType> dictTypes = dictTypeService.selectDictTypeAll();

+ 4 - 0
purchase-admin/src/main/java/com/ozs/web/controller/system/SysIndexController.java

@@ -1,5 +1,7 @@
 package com.ozs.web.controller.system;
 
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -12,6 +14,7 @@ import com.ozs.common.utils.StringUtils;
  * @author ruoyi
  */
 @RestController
+@Api(tags = "首页")
 public class SysIndexController
 {
     /** 系统基础配置 */
@@ -22,6 +25,7 @@ public class SysIndexController
      * 访问首页,提示语
      */
     @RequestMapping("/")
+    @ApiOperation("访问首页,提示语")
     public String index()
     {
         return StringUtils.format("欢迎使用{}后台管理框架,当前版本:v{},请通过前端地址访问。", purchaseConfig.getName(), purchaseConfig.getVersion());

+ 37 - 1
purchase-admin/src/main/java/com/ozs/web/controller/system/SysLoginController.java

@@ -3,6 +3,12 @@ package com.ozs.web.controller.system;
 import java.util.List;
 import java.util.Set;
 
+import com.ozs.common.core.domain.model.LoginUser;
+import com.ozs.common.utils.StringUtils;
+import com.ozs.framework.manager.AsyncManager;
+import com.ozs.framework.manager.factory.AsyncFactory;
+import com.ozs.framework.web.service.TokenService;
+import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -19,12 +25,15 @@ import com.ozs.framework.web.service.SysLoginService;
 import com.ozs.framework.web.service.SysPermissionService;
 import com.ozs.system.service.ISysMenuService;
 
+import javax.servlet.http.HttpServletRequest;
+
 /**
  * 登录验证
  *
  * @author ruoyi
  */
 @RestController
+@Api(tags = "登录验证")
 public class SysLoginController
 {
     @Autowired
@@ -36,13 +45,16 @@ public class SysLoginController
     @Autowired
     private SysPermissionService permissionService;
 
+    @Autowired
+    private TokenService tokenService;
+
     /**
      * 登录方法
      *
      * @param loginBody 登录信息
      * @return 结果
      */
-    @ApiOperation("新增用户")
+    @ApiOperation("登录方法")
     @PostMapping("/login")
     public AjaxResult login(@RequestBody LoginBody loginBody)
     {
@@ -60,6 +72,7 @@ public class SysLoginController
      * @return 用户信息
      */
     @GetMapping("getInfo")
+    @ApiOperation("获取用户信息")
     public AjaxResult getInfo()
     {
         SysUser user = SecurityUtils.getLoginUser().getUser();
@@ -80,10 +93,33 @@ public class SysLoginController
      * @return 路由信息
      */
     @GetMapping("getRouters")
+    @ApiOperation("获取路由信息")
     public AjaxResult getRouters()
     {
         Long userId = SecurityUtils.getUserId();
         List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);
         return AjaxResult.success(menuService.buildMenus(menus));
     }
+
+    /**
+     * 登录方法
+     *
+     * @return 结果
+     */
+    @ApiOperation("退出方法")
+    @PostMapping("/logout")
+    public AjaxResult logout(HttpServletRequest request)
+    {
+        AjaxResult ajax = AjaxResult.success();
+        LoginUser loginUser = tokenService.getLoginUser(request);
+        if (StringUtils.isNotNull(loginUser))
+        {
+            String userName = loginUser.getUsername();
+            // 删除用户缓存记录
+            tokenService.delLoginUser(loginUser.getToken());
+            // 记录用户退出日志
+            AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, "退出成功"));
+        }
+        return ajax;
+    }
 }

+ 12 - 1
purchase-admin/src/main/java/com/ozs/web/controller/system/SysMenuController.java

@@ -1,6 +1,9 @@
 package com.ozs.web.controller.system;
 
 import java.util.List;
+
+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.validation.annotation.Validated;
@@ -28,6 +31,7 @@ import com.ozs.system.service.ISysMenuService;
  */
 @RestController
 @RequestMapping("/system/menu")
+@Api(tags = "菜单信息")
 public class SysMenuController extends BaseController
 {
     @Autowired
@@ -36,8 +40,8 @@ public class SysMenuController extends BaseController
     /**
      * 获取菜单列表
      */
-    @PreAuthorize("@ss.hasPermi('system:menu:list')")
     @GetMapping("/list")
+    @ApiOperation("获取菜单列表")
     public AjaxResult list(SysMenu menu)
     {
         List<SysMenu> menus = menuService.selectMenuList(menu, getUserId());
@@ -49,6 +53,7 @@ public class SysMenuController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:menu:query')")
     @GetMapping(value = "/{menuId}")
+    @ApiOperation("根据菜单编号获取详细信息")
     public AjaxResult getInfo(@PathVariable Long menuId)
     {
         return success(menuService.selectMenuById(menuId));
@@ -57,7 +62,9 @@ public class SysMenuController extends BaseController
     /**
      * 获取菜单下拉树列表
      */
+    @PreAuthorize("@ss.hasPermi('system:menu:tree')")
     @GetMapping("/treeselect")
+    @ApiOperation("获取菜单下拉树列表")
     public AjaxResult treeselect(SysMenu menu)
     {
         List<SysMenu> menus = menuService.selectMenuList(menu, getUserId());
@@ -68,6 +75,7 @@ public class SysMenuController extends BaseController
      * 加载对应角色菜单列表树
      */
     @GetMapping(value = "/roleMenuTreeselect/{roleId}")
+    @ApiOperation("加载对应角色菜单列表树")
     public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId)
     {
         List<SysMenu> menus = menuService.selectMenuList(getUserId());
@@ -83,6 +91,7 @@ public class SysMenuController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:menu:add')")
     @Log(title = "菜单管理", businessType = BusinessType.INSERT)
     @PostMapping
+    @ApiOperation("新增菜单")
     public AjaxResult add(@Validated @RequestBody SysMenu menu)
     {
         if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu)))
@@ -103,6 +112,7 @@ public class SysMenuController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:menu:edit')")
     @Log(title = "菜单管理", businessType = BusinessType.UPDATE)
     @PutMapping
+    @ApiOperation("修改菜单")
     public AjaxResult edit(@Validated @RequestBody SysMenu menu)
     {
         if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu)))
@@ -127,6 +137,7 @@ public class SysMenuController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:menu:remove')")
     @Log(title = "菜单管理", businessType = BusinessType.DELETE)
     @DeleteMapping("/{menuId}")
+    @ApiOperation("删除菜单")
     public AjaxResult remove(@PathVariable("menuId") Long menuId)
     {
         if (menuService.hasChildByMenuId(menuId))

+ 9 - 0
purchase-admin/src/main/java/com/ozs/web/controller/system/SysNoticeController.java

@@ -1,6 +1,9 @@
 package com.ozs.web.controller.system;
 
 import java.util.List;
+
+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.validation.annotation.Validated;
@@ -27,6 +30,7 @@ import com.ozs.system.service.ISysNoticeService;
  */
 @RestController
 @RequestMapping("/system/notice")
+@Api(tags = "公告信息操作处理")
 public class SysNoticeController extends BaseController
 {
     @Autowired
@@ -37,6 +41,7 @@ public class SysNoticeController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:notice:list')")
     @GetMapping("/list")
+    @ApiOperation("获取通知公告列表")
     public TableDataInfo list(SysNotice notice)
     {
         startPage();
@@ -49,6 +54,7 @@ public class SysNoticeController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:notice:query')")
     @GetMapping(value = "/{noticeId}")
+    @ApiOperation("根据通知公告编号获取详细信息")
     public AjaxResult getInfo(@PathVariable Long noticeId)
     {
         return success(noticeService.selectNoticeById(noticeId));
@@ -60,6 +66,7 @@ public class SysNoticeController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:notice:add')")
     @Log(title = "通知公告", businessType = BusinessType.INSERT)
     @PostMapping
+    @ApiOperation("新增通知公告")
     public AjaxResult add(@Validated @RequestBody SysNotice notice)
     {
         notice.setCreateBy(getUsername());
@@ -72,6 +79,7 @@ public class SysNoticeController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:notice:edit')")
     @Log(title = "通知公告", businessType = BusinessType.UPDATE)
     @PutMapping
+    @ApiOperation("修改通知公告")
     public AjaxResult edit(@Validated @RequestBody SysNotice notice)
     {
         notice.setUpdateBy(getUsername());
@@ -84,6 +92,7 @@ public class SysNoticeController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:notice:remove')")
     @Log(title = "通知公告", businessType = BusinessType.DELETE)
     @DeleteMapping("/{noticeIds}")
+    @ApiOperation("删除通知公告")
     public AjaxResult remove(@PathVariable Long[] noticeIds)
     {
         return toAjax(noticeService.deleteNoticeByIds(noticeIds));

+ 11 - 0
purchase-admin/src/main/java/com/ozs/web/controller/system/SysPostController.java

@@ -2,6 +2,9 @@ package com.ozs.web.controller.system;
 
 import java.util.List;
 import javax.servlet.http.HttpServletResponse;
+
+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.validation.annotation.Validated;
@@ -30,6 +33,7 @@ import com.ozs.system.service.ISysPostService;
  */
 @RestController
 @RequestMapping("/system/post")
+@Api(tags="岗位信息操作处理")
 public class SysPostController extends BaseController
 {
     @Autowired
@@ -40,6 +44,7 @@ public class SysPostController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:post:list')")
     @GetMapping("/list")
+    @ApiOperation("获取岗位列表")
     public TableDataInfo list(SysPost post)
     {
         startPage();
@@ -50,6 +55,7 @@ public class SysPostController extends BaseController
     @Log(title = "岗位管理", businessType = BusinessType.EXPORT)
     @PreAuthorize("@ss.hasPermi('system:post:export')")
     @PostMapping("/export")
+    @ApiOperation("岗位数据")
     public void export(HttpServletResponse response, SysPost post)
     {
         List<SysPost> list = postService.selectPostList(post);
@@ -62,6 +68,7 @@ public class SysPostController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:post:query')")
     @GetMapping(value = "/{postId}")
+    @ApiOperation("根据岗位编号获取详细信息")
     public AjaxResult getInfo(@PathVariable Long postId)
     {
         return success(postService.selectPostById(postId));
@@ -73,6 +80,7 @@ public class SysPostController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:post:add')")
     @Log(title = "岗位管理", businessType = BusinessType.INSERT)
     @PostMapping
+    @ApiOperation("新增岗位")
     public AjaxResult add(@Validated @RequestBody SysPost post)
     {
         if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post)))
@@ -93,6 +101,7 @@ public class SysPostController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:post:edit')")
     @Log(title = "岗位管理", businessType = BusinessType.UPDATE)
     @PutMapping
+    @ApiOperation("修改岗位")
     public AjaxResult edit(@Validated @RequestBody SysPost post)
     {
         if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post)))
@@ -113,6 +122,7 @@ public class SysPostController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:post:remove')")
     @Log(title = "岗位管理", businessType = BusinessType.DELETE)
     @DeleteMapping("/{postIds}")
+    @ApiOperation("删除岗位")
     public AjaxResult remove(@PathVariable Long[] postIds)
     {
         return toAjax(postService.deletePostByIds(postIds));
@@ -122,6 +132,7 @@ public class SysPostController extends BaseController
      * 获取岗位选择框列表
      */
     @GetMapping("/optionselect")
+    @ApiOperation("获取岗位选择框列表")
     public AjaxResult optionselect()
     {
         List<SysPost> posts = postService.selectPostAll();

+ 23 - 0
purchase-admin/src/main/java/com/ozs/web/controller/system/SysProcurementStandardController.java

@@ -1,13 +1,19 @@
 package com.ozs.web.controller.system;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.ozs.common.core.domain.R;
 import com.ozs.common.core.domain.entity.SysProcurementStandard;
+import com.ozs.common.core.domain.entity.SysRole;
+import com.ozs.plan.doman.MonthlyReconciliation;
 import com.ozs.system.domain.vo.requestVo.SysProcurementStandardVo;
 import com.ozs.system.service.SysProcurementStandardService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -34,6 +40,7 @@ public class SysProcurementStandardController {
     @Resource
     private SysProcurementStandardService sysProcurementStandardService;
 
+    @PreAuthorize("@ss.hasPermi('system:dept:addSysProcurementStandar')")
     @ApiOperation("添加采购单位管理中标准信息")
     @PostMapping("save")
     public R<String> save(@RequestBody List<SysProcurementStandardVo> sysProcurementStandardVoList) {
@@ -48,5 +55,21 @@ public class SysProcurementStandardController {
         }
         return R.ok();
     }
+
+    @PreAuthorize("@ss.hasPermi('system:dept:updateSysProcurementStandar')")
+    @ApiOperation("修改采购单位管理中标准信息")
+    @PostMapping("update")
+    public R<String> update(@RequestBody List<SysProcurementStandardVo> sysProcurementStandardVoList) {
+        boolean isSuccess = false;
+        SysProcurementStandard sysProcurementStandard = new SysProcurementStandard();
+        for (SysProcurementStandardVo sysProcurementStandardVo : sysProcurementStandardVoList) {
+            BeanUtils.copyProperties(sysProcurementStandardVo, sysProcurementStandard);
+            isSuccess = sysProcurementStandardService.updateById(sysProcurementStandard);
+            if (!isSuccess) {
+                return R.fail();
+            }
+        }
+        return R.ok();
+    }
 }
 

+ 7 - 0
purchase-admin/src/main/java/com/ozs/web/controller/system/SysProfileController.java

@@ -1,5 +1,7 @@
 package com.ozs.web.controller.system;
 
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -31,6 +33,7 @@ import com.ozs.system.service.ISysUserService;
  */
 @RestController
 @RequestMapping("/system/user/profile")
+@Api(tags = "个人信息业务处理")
 public class SysProfileController extends BaseController
 {
     @Autowired
@@ -43,6 +46,7 @@ public class SysProfileController extends BaseController
      * 个人信息
      */
     @GetMapping
+    @ApiOperation("个人信息")
     public AjaxResult profile()
     {
         LoginUser loginUser = getLoginUser();
@@ -58,6 +62,7 @@ public class SysProfileController extends BaseController
      */
     @Log(title = "个人信息", businessType = BusinessType.UPDATE)
     @PutMapping
+    @ApiOperation("修改用户")
     public AjaxResult updateProfile(@RequestBody SysUser user)
     {
         LoginUser loginUser = getLoginUser();
@@ -95,6 +100,7 @@ public class SysProfileController extends BaseController
      */
     @Log(title = "个人信息", businessType = BusinessType.UPDATE)
     @PutMapping("/updatePwd")
+    @ApiOperation("重置密码")
     public AjaxResult updatePwd(String oldPassword, String newPassword)
     {
         LoginUser loginUser = getLoginUser();
@@ -123,6 +129,7 @@ public class SysProfileController extends BaseController
      */
     @Log(title = "用户头像", businessType = BusinessType.UPDATE)
     @PostMapping("/avatar")
+    @ApiOperation("头像上传")
     public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws Exception
     {
         if (!file.isEmpty())

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

+ 4 - 0
purchase-admin/src/main/java/com/ozs/web/controller/system/SysRegisterController.java

@@ -1,5 +1,7 @@
 package com.ozs.web.controller.system;
 
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -17,6 +19,7 @@ import com.ozs.system.service.ISysConfigService;
  * @author ruoyi
  */
 @RestController
+@Api(tags = "注册验证")
 public class SysRegisterController extends BaseController
 {
     @Autowired
@@ -26,6 +29,7 @@ public class SysRegisterController extends BaseController
     private ISysConfigService configService;
 
     @PostMapping("/register")
+    @ApiOperation("注册")
     public AjaxResult register(@RequestBody RegisterBody user)
     {
         if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser"))))

+ 165 - 41
purchase-admin/src/main/java/com/ozs/web/controller/system/SysRoleController.java

@@ -2,8 +2,17 @@ package com.ozs.web.controller.system;
 
 import java.util.List;
 import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.NotEmpty;
 
+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.ozs.system.domain.vo.requestVo.SysMenuIdsRequestVo;
+import com.ozs.system.domain.vo.requestVo.SysRoleRequestVo;
+import com.ozs.system.domain.vo.requestVo.SysStatusRequestVo;
+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.validation.annotation.Validated;
@@ -41,7 +50,7 @@ import com.ozs.system.service.ISysUserService;
  */
 @RestController
 @RequestMapping("/system/role")
-@ApiOperation("角色信息")
+@Api(tags = "角色信息")
 public class SysRoleController extends BaseController
 {
     @Autowired
@@ -59,18 +68,41 @@ public class SysRoleController extends BaseController
     @Autowired
     private ISysDeptService deptService;
 
+//    @PreAuthorize("@ss.hasPermi('system:role:list')")
+//    @GetMapping("/list")
+//    @ApiOperation("根据条件分页查询角色数据")
+//    public TableDataInfo list(SysRole role)
+//    {
+//        startPage();
+//        List<SysRole> list = roleService.selectRoleList(role);
+//        return getDataTable(list);
+//    }
+
     @PreAuthorize("@ss.hasPermi('system:role:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(SysRole role)
-    {
-        startPage();
-        List<SysRole> list = roleService.selectRoleList(role);
-        return getDataTable(list);
+    @PostMapping("/list")
+    @ApiOperation("根据条件分页查询角色数据")
+    public AjaxResult page(@NotEmpty(message = "数据为空")
+                           @RequestBody SysRoleRequestVo vo) {
+        LambdaQueryWrapper<SysRole> lw = new LambdaQueryWrapper<SysRole>();
+        lw.eq(SysRole::getDelFlag,0);
+        if (!StringUtils.isBlank(vo.getRoleName())) {
+            lw.like(SysRole::getRoleName, "%" +vo.getRoleName() + "%");
+        }
+        if (!StringUtils.isBlank(vo.getRoleKey())) {
+            lw.like(SysRole::getRoleKey, "%" +vo.getRoleKey() + "%");
+        }
+        if (!StringUtils.isBlank(vo.getStatus())) {
+            lw.eq(SysRole::getStatus, vo.getStatus());
+        }
+        IPage<SysRole> page = roleService.page(new Page<>(vo.getPageNum(), vo.getPageSize()), lw);
+        return success(page);
+
     }
 
     @Log(title = "角色管理", businessType = BusinessType.EXPORT)
     @PreAuthorize("@ss.hasPermi('system:role:export')")
     @PostMapping("/export")
+    @ApiOperation("角色管理")
     public void export(HttpServletResponse response, SysRole role)
     {
         List<SysRole> list = roleService.selectRoleList(role);
@@ -81,7 +113,6 @@ public class SysRoleController extends BaseController
     /**
      * 根据角色编号获取详细信息
      */
-    @PreAuthorize("@ss.hasPermi('system:role:query')")
     @GetMapping(value = "/{roleId}")
     @ApiOperation("根据角色编号获取详细信息")
     public AjaxResult getInfo(@PathVariable Long roleId)
@@ -93,57 +124,109 @@ public class SysRoleController extends BaseController
     /**
      * 新增角色
      */
+//    @PreAuthorize("@ss.hasPermi('system:role:add')")
+//    @Log(title = "角色管理", businessType = BusinessType.INSERT)
+//    @PostMapping
+//    @ApiOperation("新增角色")
+//    public AjaxResult add(@Validated @RequestBody SysRole role)
+//    {
+//        if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role)))
+//        {
+//            return error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在");
+//        }
+//        else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role)))
+//        {
+//            return error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
+//        }
+//        role.setCreateBy(getUsername());
+//        return toAjax(roleService.insertRole(role));
+//
+//    }
+
     @PreAuthorize("@ss.hasPermi('system:role:add')")
     @Log(title = "角色管理", businessType = BusinessType.INSERT)
     @PostMapping
-    public AjaxResult add(@Validated @RequestBody SysRole role)
+    @ApiOperation("新增角色")
+    public AjaxResult add(@Validated @RequestBody SysRoleRequestVo sysRoleRequestVo)
     {
-        if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role)))
+        SysRole sysRole = new SysRole();
+        BeanUtils.copyProperties(sysRoleRequestVo,sysRole);
+        if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(sysRole)))
         {
-            return error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在");
+            return error("新增角色'" + sysRole.getRoleName() + "'失败,角色名称已存在");
         }
-        else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role)))
-        {
-            return error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
+        if(org.apache.commons.lang3.StringUtils.isBlank(sysRole.getRoleKey())){
+            sysRole.setRoleKey("common");
         }
-        role.setCreateBy(getUsername());
-        return toAjax(roleService.insertRole(role));
+        sysRole.setCreateBy(getUsername());
+        return toAjax(roleService.addRole(sysRole));
+    }
 
+    @PreAuthorize("@ss.hasPermi('system:role:addDistribution')")
+    @PostMapping("/saveDistributionModule")
+    @ApiOperation("新增分配模块")
+    public AjaxResult saveDistributionModule(@RequestBody SysMenuIdsRequestVo sysMenuIdsRequestVo)
+    {
+        return toAjax(roleService.distributionModule(sysMenuIdsRequestVo));
     }
 
+//    /**
+//     * 修改保存角色
+//     */
+//    @PreAuthorize("@ss.hasPermi('system:role:edit')")
+//    @Log(title = "角色管理", businessType = BusinessType.UPDATE)
+//    @PutMapping
+//    @ApiOperation("修改保存角色")
+//    public AjaxResult edit(@Validated @RequestBody SysRole role)
+//    {
+//        roleService.checkRoleAllowed(role);
+//        roleService.checkRoleDataScope(role.getRoleId());
+//        if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role)))
+//        {
+//            return error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在");
+//        }
+//        else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role)))
+//        {
+//            return error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
+//        }
+//        role.setUpdateBy(getUsername());
+//
+//        if (roleService.updateRole(role) > 0)
+//        {
+//            // 更新缓存用户权限
+//            LoginUser loginUser = getLoginUser();
+//            if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin())
+//            {
+//                loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser()));
+//                loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName()));
+//                tokenService.setLoginUser(loginUser);
+//            }
+//            return success();
+//        }
+//        return error("修改角色'" + role.getRoleName() + "'失败,请联系管理员");
+//    }
+
     /**
      * 修改保存角色
      */
     @PreAuthorize("@ss.hasPermi('system:role:edit')")
     @Log(title = "角色管理", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult edit(@Validated @RequestBody SysRole role)
+    @PutMapping("/edit")
+    @ApiOperation("修改保存角色")
+    public AjaxResult edit(@Validated @RequestBody SysRoleRequestVo sysRoleRequestVo)
     {
+        SysRole role = new SysRole();
+        BeanUtils.copyProperties(sysRoleRequestVo,role);
         roleService.checkRoleAllowed(role);
         roleService.checkRoleDataScope(role.getRoleId());
         if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role)))
         {
             return error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在");
         }
-        else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role)))
-        {
-            return error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
-        }
         role.setUpdateBy(getUsername());
 
-        if (roleService.updateRole(role) > 0)
-        {
-            // 更新缓存用户权限
-            LoginUser loginUser = getLoginUser();
-            if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin())
-            {
-                loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser()));
-                loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName()));
-                tokenService.setLoginUser(loginUser);
-            }
-            return success();
-        }
-        return error("修改角色'" + role.getRoleName() + "'失败,请联系管理员");
+        return toAjax(roleService.updateRoles(role));
+
     }
 
     /**
@@ -152,6 +235,7 @@ public class SysRoleController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:role:edit')")
     @Log(title = "角色管理", businessType = BusinessType.UPDATE)
     @PutMapping("/dataScope")
+    @ApiOperation("修改保存数据权限")
     public AjaxResult dataScope(@RequestBody SysRole role)
     {
         roleService.checkRoleAllowed(role);
@@ -159,18 +243,51 @@ public class SysRoleController extends BaseController
         return toAjax(roleService.authDataScope(role));
     }
 
+    @PreAuthorize("@ss.hasPermi('system:role:editDistribution')")
+    @PostMapping("/updateDistributionModule")
+    @ApiOperation("修改分配模块")
+    public AjaxResult updateDistributionModule(@RequestBody SysMenuIdsRequestVo sysMenuIdsRequestVo)
+    {
+        if (roleService.updateDistributionModule(sysMenuIdsRequestVo) > 0)
+        {
+            // 更新缓存用户权限
+            LoginUser loginUser = getLoginUser();
+            if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin())
+            {
+                loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser()));
+                loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName()));
+                tokenService.setLoginUser(loginUser);
+            }
+            return success();
+        }
+        return error("修改失败,请联系管理员");
+    }
+
+//    /**
+//     * 状态修改
+//     */
+//    @PreAuthorize("@ss.hasPermi('system:role:edit')")
+//    @Log(title = "角色管理", businessType = BusinessType.UPDATE)
+//    @PutMapping("/changeStatus")
+//    @ApiOperation("状态修改")
+//    public AjaxResult changeStatus(@RequestBody SysRole role)
+//    {
+//        roleService.checkRoleAllowed(role);
+//        roleService.checkRoleDataScope(role.getRoleId());
+//        role.setUpdateBy(getUsername());
+//        return toAjax(roleService.updateRoleStatus(role));
+//    }
+
     /**
      * 状态修改
      */
     @PreAuthorize("@ss.hasPermi('system:role:edit')")
     @Log(title = "角色管理", businessType = BusinessType.UPDATE)
     @PutMapping("/changeStatus")
-    public AjaxResult changeStatus(@RequestBody SysRole role)
+    @ApiOperation("批量状态修改")
+    public AjaxResult changeStatus(@RequestBody List<SysStatusRequestVo> sysStatusRequestVoList)
     {
-        roleService.checkRoleAllowed(role);
-        roleService.checkRoleDataScope(role.getRoleId());
-        role.setUpdateBy(getUsername());
-        return toAjax(roleService.updateRoleStatus(role));
+      return   toAjax(roleService.changeStatus(sysStatusRequestVoList));
     }
 
     /**
@@ -179,6 +296,7 @@ public class SysRoleController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:role:remove')")
     @Log(title = "角色管理", businessType = BusinessType.DELETE)
     @DeleteMapping("/{roleIds}")
+    @ApiOperation("删除角色")
     public AjaxResult remove(@PathVariable Long[] roleIds)
     {
         return toAjax(roleService.deleteRoleByIds(roleIds));
@@ -187,8 +305,8 @@ public class SysRoleController extends BaseController
     /**
      * 获取角色选择框列表
      */
-    @PreAuthorize("@ss.hasPermi('system:role:query')")
     @GetMapping("/optionselect")
+    @ApiOperation("获取角色选择框列表")
     public AjaxResult optionselect()
     {
         return success(roleService.selectRoleAll());
@@ -199,6 +317,7 @@ public class SysRoleController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:role:list')")
     @GetMapping("/authUser/allocatedList")
+    @ApiOperation("查询已分配用户角色列表")
     public TableDataInfo allocatedList(SysUser user)
     {
         startPage();
@@ -211,6 +330,7 @@ public class SysRoleController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:role:list')")
     @GetMapping("/authUser/unallocatedList")
+    @ApiOperation("查询未分配用户角色列表")
     public TableDataInfo unallocatedList(SysUser user)
     {
         startPage();
@@ -224,6 +344,7 @@ public class SysRoleController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:role:edit')")
     @Log(title = "角色管理", businessType = BusinessType.GRANT)
     @PutMapping("/authUser/cancel")
+    @ApiOperation("取消授权用户")
     public AjaxResult cancelAuthUser(@RequestBody SysUserRole userRole)
     {
         return toAjax(roleService.deleteAuthUser(userRole));
@@ -235,6 +356,7 @@ public class SysRoleController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:role:edit')")
     @Log(title = "角色管理", businessType = BusinessType.GRANT)
     @PutMapping("/authUser/cancelAll")
+    @ApiOperation("批量取消授权用户")
     public AjaxResult cancelAuthUserAll(Long roleId, Long[] userIds)
     {
         return toAjax(roleService.deleteAuthUsers(roleId, userIds));
@@ -246,6 +368,7 @@ public class SysRoleController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:role:edit')")
     @Log(title = "角色管理", businessType = BusinessType.GRANT)
     @PutMapping("/authUser/selectAll")
+    @ApiOperation("批量选择用户授权")
     public AjaxResult selectAuthUserAll(Long roleId, Long[] userIds)
     {
         roleService.checkRoleDataScope(roleId);
@@ -257,6 +380,7 @@ public class SysRoleController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:role:query')")
     @GetMapping(value = "/deptTree/{roleId}")
+    @ApiOperation("获取对应角色部门树列表")
     public AjaxResult deptTree(@PathVariable("roleId") Long roleId)
     {
         AjaxResult ajax = AjaxResult.success();

+ 147 - 30
purchase-admin/src/main/java/com/ozs/web/controller/system/SysUserController.java

@@ -1,13 +1,26 @@
 package com.ozs.web.controller.system;
 
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 import javax.servlet.http.HttpServletResponse;
 
+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.ozs.common.constant.Constants;
+import com.ozs.common.core.domain.entity.SysDictData;
+import com.ozs.home.domain.HomeNotice;
+import com.ozs.system.domain.vo.requestVo.SysUserPageRequestVo;
+import com.ozs.system.domain.vo.requestVo.SysUserRequestVo;
+import com.ozs.system.domain.vo.responseVo.SysDeptResponseVo;
+import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.ArrayUtils;
+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.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -42,7 +55,7 @@ import com.ozs.system.service.ISysUserService;
  */
 @RestController
 @RequestMapping("/system/user")
-@ApiOperation("用户信息")
+@Api(tags = "用户信息")
 public class SysUserController extends BaseController
 {
     @Autowired
@@ -56,18 +69,66 @@ public class SysUserController extends BaseController
 
     @Autowired
     private ISysPostService postService;
+    @Autowired
+    private ISysDeptService iSysDeptService;
+
+//    /**
+//     * 获取用户列表
+//     */
+//    @PreAuthorize("@ss.hasPermi('system:user:list')")
+//    @GetMapping("/list")
+//    @ApiOperation("获取用户列表")
+//    public TableDataInfo list(SysUser user)
+//    {
+//        startPage();
+//        List<SysUser> list = userService.selectUserList(user);
+//        return getDataTable(list);
+//    }
 
     /**
      * 获取用户列表
      */
     @PreAuthorize("@ss.hasPermi('system:user:list')")
-    @GetMapping("/list")
+    @PostMapping("/list")
     @ApiOperation("获取用户列表")
-    public TableDataInfo list(SysUser user)
+    public AjaxResult list(@RequestBody SysUserPageRequestVo sysUserPageRequestVo)
     {
-        startPage();
-        List<SysUser> list = userService.selectUserList(user);
-        return getDataTable(list);
+        LambdaQueryWrapper<SysUser> lw = new LambdaQueryWrapper<SysUser>();
+        lw.eq(SysUser::getDelFlag,0);
+        if (!StringUtils.isBlank(sysUserPageRequestVo.getNickName())) {
+            lw.like(SysUser::getNickName, "%" + sysUserPageRequestVo.getNickName() + "%");
+        }
+        if (!StringUtils.isBlank(sysUserPageRequestVo.getDeptId())) {
+            lw.eq(SysUser::getDeptId, sysUserPageRequestVo.getDeptId());
+        }
+        IPage<SysUser> page = userService.page(new Page<>(sysUserPageRequestVo.getPageNum(), sysUserPageRequestVo.getPageSize()), lw);
+        if (!ObjectUtils.isEmpty(page.getRecords())) {
+            page.setRecords(page.getRecords().stream().map(dto -> {
+                // 采购单位名称
+                Map<String, Object> stringObjectMap = iSysDeptService.selectDeptById(dto.getDeptId());
+                if (!ObjectUtils.isEmpty(stringObjectMap)) {
+                    SysDeptResponseVo sysDeptResponseVo = (SysDeptResponseVo) stringObjectMap.get("sysDept");
+                    SysDept sysDept = new SysDept();
+                    sysDept.setDeptName(sysDeptResponseVo.getDeptName());
+                    dto.setDept(sysDept);
+                }
+                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);
     }
 
     @Log(title = "用户管理", businessType = BusinessType.EXPORT)
@@ -95,6 +156,7 @@ public class SysUserController extends BaseController
     }
 
     @PostMapping("/importTemplate")
+    @ApiOperation("用户数据")
     public void importTemplate(HttpServletResponse response)
     {
         ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
@@ -104,8 +166,8 @@ public class SysUserController extends BaseController
     /**
      * 根据用户编号获取详细信息
      */
-    @PreAuthorize("@ss.hasPermi('system:user:query')")
     @GetMapping(value = { "/", "/{userId}" })
+    @ApiOperation("根据用户编号获取详细信息")
     public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId)
     {
         userService.checkUserDataScope(userId);
@@ -123,14 +185,47 @@ public class SysUserController extends BaseController
         return ajax;
     }
 
+//    /**
+//     * 新增用户
+//     */
+//    @PreAuthorize("@ss.hasPermi('system:user:add')")
+//    @Log(title = "用户管理", businessType = BusinessType.INSERT)
+//    @PostMapping
+//    @ApiOperation("新增用户")
+//    public AjaxResult add(@Validated @RequestBody SysUser user)
+//    {
+//        if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user)))
+//        {
+//            return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
+//        }
+//        else if (StringUtils.isNotEmpty(user.getPhonenumber())
+//                && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
+//        {
+//            return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
+//        }
+//        else if (StringUtils.isNotEmpty(user.getEmail())
+//                && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
+//        {
+//            return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
+//        }
+//        user.setCreateBy(getUsername());
+//        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
+//        return toAjax(userService.insertUser(user));
+//    }
+
+
+
     /**
      * 新增用户
      */
     @PreAuthorize("@ss.hasPermi('system:user:add')")
     @Log(title = "用户管理", businessType = BusinessType.INSERT)
     @PostMapping
-    public AjaxResult add(@Validated @RequestBody SysUser user)
+    @ApiOperation("新增用户")
+    public AjaxResult add(@Validated @RequestBody SysUserRequestVo sysUserRequestVo)
     {
+        SysUser user = new SysUser();
+        BeanUtils.copyProperties(sysUserRequestVo,user);
         if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user)))
         {
             return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
@@ -140,42 +235,60 @@ public class SysUserController extends BaseController
         {
             return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
         }
-        else if (StringUtils.isNotEmpty(user.getEmail())
-                && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
-        {
-            return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
-        }
         user.setCreateBy(getUsername());
         user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
-        return toAjax(userService.insertUser(user));
+        return toAjax(userService.saveUser(user));
     }
 
+//    /**
+//     * 修改用户
+//     */
+//    @PreAuthorize("@ss.hasPermi('system:user:edit')")
+//    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
+//    @PutMapping
+//    @ApiOperation("修改用户")
+//    public AjaxResult edit(@Validated @RequestBody SysUser user)
+//    {
+//        userService.checkUserAllowed(user);
+//        userService.checkUserDataScope(user.getUserId());
+//        if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user)))
+//        {
+//            return error("修改用户'" + user.getUserName() + "'失败,登录账号已存在");
+//        }
+//        else if (StringUtils.isNotEmpty(user.getPhonenumber())
+//                && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
+//        {
+//            return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
+//        }
+//        else if (StringUtils.isNotEmpty(user.getEmail())
+//                && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
+//        {
+//            return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
+//        }
+//        user.setUpdateBy(getUsername());
+//        return toAjax(userService.updateUser(user));
+//    }
+
     /**
      * 修改用户
      */
     @PreAuthorize("@ss.hasPermi('system:user:edit')")
     @Log(title = "用户管理", businessType = BusinessType.UPDATE)
     @PutMapping
-    public AjaxResult edit(@Validated @RequestBody SysUser user)
-    {
+    @ApiOperation("修改用户")
+    public AjaxResult edit(@Validated @RequestBody SysUserRequestVo sysUserRequestVo) {
+        SysUser user = new SysUser();
+        BeanUtils.copyProperties(sysUserRequestVo,user);
         userService.checkUserAllowed(user);
         userService.checkUserDataScope(user.getUserId());
-        if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user)))
-        {
+        if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user))) {
             return error("修改用户'" + user.getUserName() + "'失败,登录账号已存在");
-        }
-        else if (StringUtils.isNotEmpty(user.getPhonenumber())
-                && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
-        {
+        } else if (StringUtils.isNotEmpty(user.getPhonenumber())
+                && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) {
             return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
         }
-        else if (StringUtils.isNotEmpty(user.getEmail())
-                && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
-        {
-            return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
-        }
         user.setUpdateBy(getUsername());
-        return toAjax(userService.updateUser(user));
+        return toAjax(userService.updateUsers(user));
     }
 
     /**
@@ -184,6 +297,7 @@ public class SysUserController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:user:remove')")
     @Log(title = "用户管理", businessType = BusinessType.DELETE)
     @DeleteMapping("/{userIds}")
+    @ApiOperation("删除用户")
     public AjaxResult remove(@PathVariable Long[] userIds)
     {
         if (ArrayUtils.contains(userIds, getUserId()))
@@ -199,6 +313,7 @@ public class SysUserController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:user:resetPwd')")
     @Log(title = "用户管理", businessType = BusinessType.UPDATE)
     @PutMapping("/resetPwd")
+    @ApiOperation("重置密码")
     public AjaxResult resetPwd(@RequestBody SysUser user)
     {
         userService.checkUserAllowed(user);
@@ -214,6 +329,7 @@ public class SysUserController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:user:edit')")
     @Log(title = "用户管理", businessType = BusinessType.UPDATE)
     @PutMapping("/changeStatus")
+    @ApiOperation("状态修改")
     public AjaxResult changeStatus(@RequestBody SysUser user)
     {
         userService.checkUserAllowed(user);
@@ -225,8 +341,8 @@ public class SysUserController extends BaseController
     /**
      * 根据用户编号获取授权角色
      */
-    @PreAuthorize("@ss.hasPermi('system:user:query')")
     @GetMapping("/authRole/{userId}")
+    @ApiOperation("根据用户编号获取授权角色")
     public AjaxResult authRole(@PathVariable("userId") Long userId)
     {
         AjaxResult ajax = AjaxResult.success();
@@ -243,6 +359,7 @@ public class SysUserController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:user:edit')")
     @Log(title = "用户管理", businessType = BusinessType.GRANT)
     @PutMapping("/authRole")
+    @ApiOperation("用户授权角色")
     public AjaxResult insertAuthRole(Long userId, Long[] roleIds)
     {
         userService.checkUserDataScope(userId);
@@ -253,8 +370,8 @@ public class SysUserController extends BaseController
     /**
      * 获取部门树列表
      */
-    @PreAuthorize("@ss.hasPermi('system:user:list')")
     @GetMapping("/deptTree")
+    @ApiOperation("获取部门树列表")
     public AjaxResult deptTree(SysDept dept)
     {
         return success(deptService.selectDeptTreeList(dept));

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

@@ -0,0 +1,90 @@
+package com.ozs.web.controller.tool;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ozs.common.core.domain.entity.SysDictData;
+import com.ozs.common.enums.PmProjectStatus;
+import com.ozs.common.enums.WarnStatus;
+import com.ozs.common.utils.DateUtils;
+import com.ozs.pm.doman.PmDemand;
+import com.ozs.pm.service.IPmDemandService;
+import com.ozs.system.service.ISysDictTypeService;
+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;
+import java.util.stream.Collectors;
+
+/**
+ * 项目管理任务调度
+ */
+@Component
+@Slf4j
+public class PmTaskServer {
+    @Autowired
+    private IPmDemandService pmDemandService;
+    @Autowired
+    private ISysDictTypeService iSysDictTypeService;
+
+    /**
+     * 更新预警状态
+     */
+    public void updateDemandWarnStatus(){
+        log.info("******** 项目更新预警状态任务  开始");
+        LambdaQueryWrapper<PmDemand> lw = new LambdaQueryWrapper<>();
+        lw.ne(PmDemand::getProjectStatus, PmProjectStatus.COMPLETION_CONSTRUCTION.getCode());
+        List<PmDemand> list = this.pmDemandService.list(lw);
+        if(ObjectUtils.isEmpty(list)){
+            return;
+        }
+        Date now = DateUtils.parseDate(DateUtils.getDate());
+        List<PmDemand> updateList = new ArrayList<>();
+        List<SysDictData> data = iSysDictTypeService.selectDictDataByType("alert_time_setting");
+        int setting1 = Integer.parseInt(data.stream().filter(item -> item.getDictLabel().equals("计划提报时间")).collect(Collectors.toList()).get(0).getDictValue());
+        log.info("******** setting1 == " + setting1);
+        int setting2 = Integer.parseInt(data.stream().filter(item -> item.getDictLabel().equals("计划完成时间")).collect(Collectors.toList()).get(0).getDictValue());
+        log.info("******** setting2 == " + setting2);
+        int setting3 = Integer.parseInt(data.stream().filter(item -> item.getDictLabel().equals("计划交付(实施)时间")).collect(Collectors.toList()).get(0).getDictValue());
+        log.info("******** setting3 == " + setting3);
+        list.forEach(item-> {
+            //需求提报时间:根据数据阈值中设置的提报时间进行判断,进行预警
+            int diff1 = DateUtils.differentDaysByMillisecond(item.getPlanDemandSubTime(), now);
+            if (ObjectUtils.isEmpty(item.getRealDemandCommitTime()) && diff1 >= setting1) {
+                log.info("******** 需求提报预警: " + item.getProjectName());
+                PmDemand pmDemand = new PmDemand();
+                pmDemand.setDemandId(item.getDemandId());
+                pmDemand.setWarnStatus(WarnStatus.DEMAND_COMMT_WARNING.getCode());
+                updateList.add(pmDemand);
+            } else {
+                //采购完成时间:根据数据阈值中设置的采购完成时间进行判断,进行预警
+                int diff2 = DateUtils.differentDaysByMillisecond(item.getPlanPurchaseFinishTime(), now);
+                if ( ObjectUtils.isEmpty(item.getRealDemandCommitTime()) && diff2 >= setting2) {
+                    log.info("******** 采购完成预警: " + item.getProjectName());
+                    PmDemand pmDemand = new PmDemand();
+                    pmDemand.setDemandId(item.getDemandId());
+                    pmDemand.setWarnStatus(WarnStatus.PURCHASE_FINISH_WARNING.getCode());
+                    updateList.add(pmDemand);
+                } else {
+                    //计划交付时间:根据数据阈值中设置的交付时间进行判断,进行预警
+                    int diff3 = DateUtils.differentDaysByMillisecond(item.getPlanDeliverTime(), now);
+                    if (ObjectUtils.isEmpty(item.getRealDemandCommitTime()) && diff3 >= setting3) {
+                        log.info("******** 计划交付预警: " + item.getProjectName());
+                        PmDemand pmDemand = new PmDemand();
+                        pmDemand.setDemandId(item.getDemandId());
+                        pmDemand.setWarnStatus(WarnStatus.PLAN_DELIVER_WARNING.getCode());
+                        updateList.add(pmDemand);
+                    }
+                }
+            }
+        });
+
+        if(!ObjectUtils.isEmpty(updateList)){
+            this.pmDemandService.updateBatchById(updateList);
+        }
+        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("******** 测试定时任务  结束");
+    }
+
+}

+ 25 - 0
purchase-admin/src/main/java/com/ozs/web/filter/LogOutFilter.java

@@ -0,0 +1,25 @@
+package com.ozs.web.filter;
+
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.filter.Filter;
+import ch.qos.logback.core.spi.FilterReply;
+import com.ozs.common.constant.Constants;
+import com.ozs.common.utils.SecurityUtils;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class LogOutFilter extends Filter<ILoggingEvent> {
+
+
+    @Override
+    public FilterReply decide(ILoggingEvent event) {
+        if (Constants.FLAY) {
+            Long userId = SecurityUtils.getUserId();
+            if (userId.equals(Long.parseLong("1"))) {
+                return FilterReply.DENY;
+            }
+        }
+        return FilterReply.ACCEPT;
+    }
+
+}

+ 143 - 0
purchase-admin/src/main/resources/application-dev.yml

@@ -0,0 +1,143 @@
+# 项目相关配置
+purchase:
+  # 名称
+  name: purchase
+  # 版本
+  version: 1.0.0
+  # 版权年份
+  copyrightYear: 2023
+  # 实例演示开关
+  demoEnabled: true
+  # 文件路径 示例( Windows配置D:/purchase/uploadPath,Linux配置 /home/purchase/uploadPath)
+  profile: D:/purchase/uploadPath
+  #  profile: /Users/sunhuanhuan/Documents/project/106/文档/purchase/uploadPath
+  # 获取ip地址开关
+  addressEnabled: false
+  # 验证码类型 math 数组计算 char 字符验证
+  captchaType: math
+  # 全部用户是否开启接口权限校验,排除admin用户
+  permissionsEnable: false
+
+
+# 开发环境配置
+server:
+  tomcat:
+    # tomcat的URI编码
+    uri-encoding: UTF-8
+    # 连接数满后的排队数,默认为100
+    accept-count: 1000
+    threads:
+      # tomcat最大线程数,默认为200
+      max: 800
+      # Tomcat启动初始化的线程数,默认值10
+      min-spare: 100
+
+# 日志配置
+logging:
+  level:
+    com.ozs: debug
+    org.springframework: warn
+
+
+# 用户配置
+user:
+  password:
+    # 密码最大错误次数
+    maxRetryCount: 5
+    # 密码锁定时间(默认10分钟)
+    lockTime: 10
+
+# Spring配置
+spring:
+  # 资源信息
+  messages:
+    # 国际化资源文件路径
+    basename: i18n/messages
+  # 文件上传
+  servlet:
+     multipart:
+       # 单个文件大小
+       max-file-size:  10MB
+       # 设置总上传的文件大小
+       max-request-size:  20MB
+  # 服务模块
+  devtools:
+    restart:
+      # 热部署开关
+      enabled: true
+  # redis 配置
+  redis:
+    # 地址
+    host: 124.70.58.209
+    # 端口,默认为6379
+    port: 7001
+    # 数据库索引
+    database: 0
+    # 密码
+    password: 106@qwe123
+    # 连接超时时间
+    timeout: 100s
+    lettuce:
+      pool:
+        # 连接池中的最小空闲连接
+        min-idle: 0
+        # 连接池中的最大空闲连接
+        max-idle: 8
+        # 连接池的最大数据库连接数
+        max-active: 8
+        # #连接池最大阻塞等待时间(使用负值表示没有限制)
+        max-wait: -1ms
+
+# token配置
+token:
+    # 令牌自定义标识
+    header: Authorization
+    # 令牌密钥
+    secret: abcdefghijklmnopqrstuvwxyz
+    # 令牌有效期(默认30分钟)
+    expireTime: 3000
+
+# MyBatis配置
+mybatis:
+    # 搜索指定包别名
+    typeAliasesPackage: com.ozs.**.domain
+    # 配置mapper的扫描,找到所有的mapper.xml映射文件
+    mapperLocations: classpath*:mapper/**/*Mapper.xml
+    # 加载全局的配置文件
+    configLocation: classpath:mybatis/mybatis-config.xml
+
+# MyBatis-plus配置
+mybatis-plus:
+  config-location: classpath:mybatis/mybatis-config.xml
+  typeAliasesPackage: com.ozs.**.domain
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+
+# PageHelper分页插件
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger配置
+swagger:
+  # 是否开启swagger
+  enabled: true
+  # 请求前缀
+#  pathMapping: /dev-api
+  pathMapping: /
+
+# 防止XSS攻击
+xss:
+  # 过滤开关
+  enabled: true
+  # 排除链接(多个用逗号分隔)
+  excludes: /system/notice
+  # 匹配链接
+  urlPatterns: /system/*,/monitor/*,/tool/*
+
+
+elasticsearch:
+  host: 124.70.58.209
+  port: 9121
+#  host: 127.0.0.1
+#  port: 9200

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

@@ -43,7 +43,7 @@ spring:
                 allow:
                 url-pattern: /druid/*
                 # 控制台管理用户名和密码
-                login-username: ruoyi
+                login-username: purchase
                 login-password: 123456
             filter:
                 stat:

+ 196 - 0
purchase-admin/src/main/resources/application-prod.yml

@@ -0,0 +1,196 @@
+# 项目相关配置
+purchase:
+  # 名称
+  name: purchase
+  # 版本
+  version: 1.0.0
+  # 版权年份
+  copyrightYear: 2023
+  # 实例演示开关
+  demoEnabled: true
+  # 文件路径 示例( Windows配置D:/purchase/uploadPath,Linux配置 /home/purchase/uploadPath)
+  profile: /home/purchase/uploadPath
+  # 获取ip地址开关
+  addressEnabled: false
+  # 验证码类型 math 数组计算 char 字符验证
+  captchaType: math
+  # 全部用户是否开启接口权限校验,排除admin用户
+  permissionsEnable: true
+
+# 开发环境配置
+server:
+  tomcat:
+    # tomcat的URI编码
+    uri-encoding: UTF-8
+    # 连接数满后的排队数,默认为100
+    accept-count: 100
+    threads:
+      # tomcat最大线程数,默认为200
+      max: 800
+      # Tomcat启动初始化的线程数,默认值10
+      min-spare: 100
+
+# 日志配置
+logging:
+  level:
+    com.ozs: debug
+    org.springframework: warn
+
+# 用户配置
+user:
+  password:
+    # 密码最大错误次数
+    maxRetryCount: 5
+    # 密码锁定时间(默认10分钟)
+    lockTime: 10
+
+# Spring配置
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 主库数据源
+      master:
+        url: jdbc:mysql://127.0.0.1:3306/purchase?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: 123.asd
+      # 从库数据源
+      slave:
+        # 从数据源开关/默认关闭
+        enabled: false
+        url:
+        username:
+        password:
+      # 初始连接数
+      initialSize: 5
+      # 最小连接池数量
+      minIdle: 10
+      # 最大连接池数量
+      maxActive: 20
+      # 配置获取连接等待超时的时间
+      maxWait: 60000
+      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+      timeBetweenEvictionRunsMillis: 60000
+      # 配置一个连接在池中最小生存的时间,单位是毫秒
+      minEvictableIdleTimeMillis: 300000
+      # 配置一个连接在池中最大生存的时间,单位是毫秒
+      maxEvictableIdleTimeMillis: 900000
+      # 配置检测连接是否有效
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 设置白名单,不填则允许所有访问
+        allow:
+        url-pattern: /druid/*
+        # 控制台管理用户名和密码
+        login-username: purchase
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 慢SQL记录
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+
+  # 资源信息
+  messages:
+    # 国际化资源文件路径
+    basename: i18n/messages
+  # 文件上传
+  servlet:
+    multipart:
+      # 单个文件大小
+      max-file-size:  10MB
+      # 设置总上传的文件大小
+      max-request-size:  20MB
+  # 服务模块
+  devtools:
+    restart:
+      # 热部署开关
+      enabled: true
+  # redis 配置
+  redis:
+    # 地址
+    host: 127.0.0.1
+    # 端口,默认为6379
+    port: 6379
+    # 数据库索引
+    database: 0
+    # 密码
+    password: tysfrz123
+    # 连接超时时间
+    timeout: 100s
+    lettuce:
+      pool:
+        # 连接池中的最小空闲连接
+        min-idle: 0
+        # 连接池中的最大空闲连接
+        max-idle: 8
+        # 连接池的最大数据库连接数
+        max-active: 8
+        # #连接池最大阻塞等待时间(使用负值表示没有限制)
+        max-wait: -1ms
+
+# token配置
+token:
+  # 令牌自定义标识
+  header: Authorization
+  # 令牌密钥
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 令牌有效期(默认30分钟)
+  expireTime: 30
+
+# MyBatis配置
+mybatis:
+  # 搜索指定包别名
+  typeAliasesPackage: com.ozs.**.domain
+  # 配置mapper的扫描,找到所有的mapper.xml映射文件
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 加载全局的配置文件
+  configLocation: classpath:mybatis/mybatis-config.xml
+
+# MyBatis-plus配置
+mybatis-plus:
+  config-location: classpath:mybatis/mybatis-config.xml
+  typeAliasesPackage: com.ozs.**.domain
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+
+# PageHelper分页插件
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger配置
+swagger:
+  # 是否开启swagger
+  enabled: true
+  # 请求前缀
+  #  pathMapping: /dev-api
+  pathMapping: /
+
+# 防止XSS攻击
+xss:
+  # 过滤开关
+  enabled: true
+  # 排除链接(多个用逗号分隔)
+  excludes: /system/notice
+  # 匹配链接
+  urlPatterns: /system/*,/monitor/*,/tool/*
+
+
+elasticsearch:
+  host: 127.0.0.1
+  port: 9121
+#  host: 127.0.0.1
+#  port: 9200

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

@@ -0,0 +1,140 @@
+# 项目相关配置
+purchase:
+  # 名称
+  name: purchase
+  # 版本
+  version: 1.0.0
+  # 版权年份
+  copyrightYear: 2023
+  # 实例演示开关
+  demoEnabled: true
+  # 文件路径 示例( Windows配置D:/purchase/uploadPath,Linux配置 /home/purchase/uploadPath)
+  profile: /home/purchase/uploadPath
+  # 获取ip地址开关
+  addressEnabled: false
+  # 验证码类型 math 数组计算 char 字符验证
+  captchaType: math
+  # 全部用户是否开启接口权限校验,排除admin用户
+  permissionsEnable: true
+
+# 开发环境配置
+server:
+  tomcat:
+    # tomcat的URI编码
+    uri-encoding: UTF-8
+    # 连接数满后的排队数,默认为100
+    accept-count: 1000
+    threads:
+      # tomcat最大线程数,默认为200
+      max: 800
+      # Tomcat启动初始化的线程数,默认值10
+      min-spare: 100
+
+# 日志配置
+logging:
+  level:
+    com.ozs: debug
+    org.springframework: warn
+
+# 用户配置
+user:
+  password:
+    # 密码最大错误次数
+    maxRetryCount: 5
+    # 密码锁定时间(默认10分钟)
+    lockTime: 10
+
+# Spring配置
+spring:
+  # 资源信息
+  messages:
+    # 国际化资源文件路径
+    basename: i18n/messages
+  # 文件上传
+  servlet:
+     multipart:
+       # 单个文件大小
+       max-file-size:  10MB
+       # 设置总上传的文件大小
+       max-request-size:  20MB
+  # 服务模块
+  devtools:
+    restart:
+      # 热部署开关
+      enabled: true
+  # redis 配置
+  redis:
+    # 地址
+    host: 124.70.58.209
+    # 端口,默认为6379
+    port: 7001
+    # 数据库索引
+    database: 0
+    # 密码
+    password: 106@qwe123
+    # 连接超时时间
+    timeout: 1000s
+    lettuce:
+      pool:
+        # 连接池中的最小空闲连接
+        min-idle: 0
+        # 连接池中的最大空闲连接
+        max-idle: 8
+        # 连接池的最大数据库连接数
+        max-active: 8
+        # #连接池最大阻塞等待时间(使用负值表示没有限制)
+        max-wait: -1ms
+
+# token配置
+token:
+    # 令牌自定义标识
+    header: Authorization
+    # 令牌密钥
+    secret: abcdefghijklmnopqrstuvwxyz
+    # 令牌有效期(默认30分钟)
+    expireTime: 30
+
+# MyBatis配置
+mybatis:
+    # 搜索指定包别名
+    typeAliasesPackage: com.ozs.**.domain
+    # 配置mapper的扫描,找到所有的mapper.xml映射文件
+    mapperLocations: classpath*:mapper/**/*Mapper.xml
+    # 加载全局的配置文件
+    configLocation: classpath:mybatis/mybatis-config.xml
+
+# MyBatis-plus配置
+mybatis-plus:
+  config-location: classpath:mybatis/mybatis-config.xml
+  typeAliasesPackage: com.ozs.**.domain
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+
+# PageHelper分页插件
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger配置
+swagger:
+  # 是否开启swagger
+  enabled: true
+  # 请求前缀
+#  pathMapping: /dev-api
+  pathMapping: /
+
+# 防止XSS攻击
+xss:
+  # 过滤开关
+  enabled: true
+  # 排除链接(多个用逗号分隔)
+  excludes: /system/notice
+  # 匹配链接
+  urlPatterns: /system/*,/monitor/*,/tool/*
+
+
+elasticsearch:
+  host: 124.70.58.209
+  port: 9121
+#  host: 127.0.0.1
+#  port: 9200

+ 3 - 134
purchase-admin/src/main/resources/application.yml

@@ -1,145 +1,14 @@
-# 项目相关配置
-purchase:
-  # 名称
-  name: purchase
-  # 版本
-  version: 1.0.0
-  # 版权年份
-  copyrightYear: 2023
-  # 实例演示开关
-  demoEnabled: true
-  # 文件路径 示例( Windows配置D:/purchase/uploadPath,Linux配置 /home/purchase/uploadPath)
-  profile: C:/purchase/uploadPath
-#  profile: /Users/sunhuanhuan/Documents/project/106/文档/purchase/uploadPath
-  # 获取ip地址开关
-  addressEnabled: false
-  # 验证码类型 math 数组计算 char 字符验证
-  captchaType: math
 
 # 开发环境配置
 server:
   # 服务器的HTTP端口,默认为8080
-  port: 8080
+  port: 9125
   servlet:
     # 应用的访问路径
     context-path: /
-  tomcat:
-    # tomcat的URI编码
-    uri-encoding: UTF-8
-    # 连接数满后的排队数,默认为100
-    accept-count: 1000
-    threads:
-      # tomcat最大线程数,默认为200
-      max: 800
-      # Tomcat启动初始化的线程数,默认值10
-      min-spare: 100
-
-# 日志配置
-logging:
-  level:
-    com.ozs: debug
-    org.springframework: warn
-
-# 用户配置
-user:
-  password:
-    # 密码最大错误次数
-    maxRetryCount: 5
-    # 密码锁定时间(默认10分钟)
-    lockTime: 10
 
 # Spring配置
 spring:
-  # 资源信息
-  messages:
-    # 国际化资源文件路径
-    basename: i18n/messages
   profiles:
-    active: druid
-  # 文件上传
-  servlet:
-     multipart:
-       # 单个文件大小
-       max-file-size:  10MB
-       # 设置总上传的文件大小
-       max-request-size:  20MB
-  # 服务模块
-  devtools:
-    restart:
-      # 热部署开关
-      enabled: true
-  # redis 配置
-  redis:
-    # 地址
-    host: 124.70.58.209
-    # 端口,默认为6379
-    port: 7001
-    # 数据库索引
-    database: 0
-    # 密码
-    password: 106@qwe123
-    # 连接超时时间    timeout: 100s
-    lettuce:
-      pool:
-        # 连接池中的最小空闲连接
-        min-idle: 0
-        # 连接池中的最大空闲连接
-        max-idle: 8
-        # 连接池的最大数据库连接数
-        max-active: 8
-        # #连接池最大阻塞等待时间(使用负值表示没有限制)
-        max-wait: -1ms
-
-# token配置
-token:
-    # 令牌自定义标识
-    header: Authorization
-    # 令牌密钥
-    secret: abcdefghijklmnopqrstuvwxyz
-    # 令牌有效期(默认30分钟)
-    expireTime: 30
-
-# MyBatis配置
-mybatis:
-    # 搜索指定包别名
-    typeAliasesPackage: com.ozs.**.domain
-    # 配置mapper的扫描,找到所有的mapper.xml映射文件
-    mapperLocations: classpath*:mapper/**/*Mapper.xml
-    # 加载全局的配置文件
-    configLocation: classpath:mybatis/mybatis-config.xml
-
-# MyBatis-plus配置
-mybatis-plus:
-  config-location: classpath:mybatis/mybatis-config.xml
-  typeAliasesPackage: com.ozs.**.domain
-  mapperLocations: classpath*:mapper/**/*Mapper.xml
-
-# PageHelper分页插件
-pagehelper:
-  helperDialect: mysql
-  supportMethodsArguments: true
-  params: count=countSql
-
-# Swagger配置
-swagger:
-  # 是否开启swagger
-  enabled: true
-  # 请求前缀
-#  pathMapping: /dev-api
-  pathMapping: /
-
-# 防止XSS攻击
-xss:
-  # 过滤开关
-  enabled: true
-  # 排除链接(多个用逗号分隔)
-  excludes: /system/notice
-  # 匹配链接
-  urlPatterns: /system/*,/monitor/*,/tool/*
-
-
-elasticsearch:
-  host: 124.70.58.209
-  port: 9121
-#  host: 127.0.0.1
-#  port: 9200
+    active: druid,test
+#    active: prod

+ 45 - 41
purchase-admin/src/main/resources/logback.xml

@@ -1,32 +1,33 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration>
     <!-- 日志存放路径 -->
-<!--	<property name="log.path" value="/home/ruoyi/logs" />-->
-    <property name="log.path" value="C:/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" />
+    <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
 
-	<!-- 控制台输出 -->
-	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
-		<encoder>
-			<pattern>${log.pattern}</pattern>
-		</encoder>
-	</appender>
+    <!-- 控制台输出 -->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <filter class="com.ozs.web.filter.LogOutFilter"/>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+    </appender>
 
-	<!-- 系统日志输出 -->
-	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
-	    <file>${log.path}/sys-info.log</file>
+    <!-- 系统日志输出 -->
+    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/sys-info.log</file>
         <!-- 循环政策:基于时间创建日志文件 -->
-		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
-			<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
-			<!-- 日志最大的历史 60天 -->
-			<maxHistory>60</maxHistory>
-		</rollingPolicy>
-		<encoder>
-			<pattern>${log.pattern}</pattern>
-		</encoder>
-		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 日志最大的历史 60天 -->
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <!-- 过滤的级别 -->
             <level>INFO</level>
             <!-- 匹配时的操作:接收(记录) -->
@@ -34,16 +35,16 @@
             <!-- 不匹配时的操作:拒绝(不记录) -->
             <onMismatch>DENY</onMismatch>
         </filter>
-	</appender>
+    </appender>
 
-	<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
-	    <file>${log.path}/sys-error.log</file>
+    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/sys-error.log</file>
         <!-- 循环政策:基于时间创建日志文件 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
             <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
-			<!-- 日志最大的历史 60天 -->
-			<maxHistory>60</maxHistory>
+            <!-- 日志最大的历史 60天 -->
+            <maxHistory>60</maxHistory>
         </rollingPolicy>
         <encoder>
             <pattern>${log.pattern}</pattern>
@@ -51,16 +52,16 @@
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <!-- 过滤的级别 -->
             <level>ERROR</level>
-			<!-- 匹配时的操作:接收(记录) -->
+            <!-- 匹配时的操作:接收(记录) -->
             <onMatch>ACCEPT</onMatch>
-			<!-- 不匹配时的操作:拒绝(不记录) -->
+            <!-- 不匹配时的操作:拒绝(不记录) -->
             <onMismatch>DENY</onMismatch>
         </filter>
     </appender>
 
-	<!-- 用户访问日志输出  -->
+    <!-- 用户访问日志输出  -->
     <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
-		<file>${log.path}/sys-user.log</file>
+        <file>${log.path}/sys-user.log</file>
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 按天回滚 daily -->
             <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
@@ -72,23 +73,26 @@
         </encoder>
     </appender>
 
-	<!-- 系统模块日志级别控制  -->
-	<logger name="com.ozs" level="info" />
-	<!-- Spring日志级别控制  -->
-	<logger name="org.springframework" level="warn" />
 
-	<root level="info">
-		<appender-ref ref="console" />
-	</root>
+    <!-- 系统模块日志级别控制  -->
+    <logger name="com.ozs" level="info"/>
+    <!-- Spring日志级别控制  -->
+    <logger name="org.springframework" level="warn"/>
 
-	<!--系统操作日志-->
     <root level="info">
-        <appender-ref ref="file_info" />
-        <appender-ref ref="file_error" />
+        <appender-ref ref="console"/>
     </root>
 
-	<!--系统用户操作日志-->
+    <!--系统操作日志-->
+    <root level="info">
+        <appender-ref ref="file_info"/>
+        <appender-ref ref="file_error"/>
+    </root>
+
+    <!--系统用户操作日志-->
     <logger name="sys-user" level="info">
         <appender-ref ref="sys-user"/>
     </logger>
 </configuration>
+
+

+ 1 - 1
purchase-admin/src/main/resources/mybatis/mybatis-config.xml

@@ -15,7 +15,7 @@ PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 		<!-- 指定 MyBatis 所用日志的具体实现 -->
         <setting name="logImpl"                  value="SLF4J"  />
         <!-- 使用驼峰命名法转换字段 -->
-		<!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
+		 <setting name="mapUnderscoreToCamelCase" value="true"/>
 	</settings>
 
     <plugins>

BIN
purchase-admin/src/main/resources/template/planQuarter.xlsx


BIN
purchase-admin/src/main/resources/template/planYears.xlsx


BIN
purchase-admin/src/main/resources/template/professional.xlsx


BIN
purchase-admin/src/main/resources/template/provisionalPlan.xlsx


+ 14 - 1
purchase-common/src/main/java/com/ozs/common/config/PurchaseConfig.java

@@ -33,6 +33,9 @@ public class PurchaseConfig
     /** 验证码类型 */
     private static String captchaType;
 
+    /** 获取权限开关 */
+    private static boolean permissionsEnable;
+
     public String getName()
     {
         return name;
@@ -102,6 +105,16 @@ public class PurchaseConfig
         PurchaseConfig.captchaType = captchaType;
     }
 
+    public static boolean isPermissionsEnable()
+    {
+        return permissionsEnable;
+    }
+
+    public void setPermissionsEnable(boolean permissionsEnable)
+    {
+        PurchaseConfig.permissionsEnable = permissionsEnable;
+    }
+
     /**
      * 获取导入上传路径
      */
@@ -123,7 +136,7 @@ public class PurchaseConfig
      */
     public static String getDownloadPath()
     {
-        return getProfile() + "/download/";
+        return getProfile() + "/upload/";
     }
 
     /**

+ 30 - 5
purchase-common/src/main/java/com/ozs/common/constant/Constants.java

@@ -7,8 +7,7 @@ import io.jsonwebtoken.Claims;
  *
  * @author ruoyi
  */
-public class Constants
-{
+public class Constants {
     /**
      * UTF-8 字符集
      */
@@ -132,11 +131,37 @@ public class Constants
     /**
      * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加)
      */
-    public static final String[] JOB_WHITELIST_STR = { "com.ozs" };
+    public static final String[] JOB_WHITELIST_STR = {"com.ozs"};
 
     /**
      * 定时任务违规的字符
      */
-    public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
-            "org.springframework", "org.apache", "com.ozs.common.utils.file", "com.ozs.common.config" };
+    public static final String[] JOB_ERROR_STR = {"java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
+            "org.springframework", "org.apache", "com.ozs.common.utils.file", "com.ozs.common.config"};
+
+    // 項目屬性
+    public static final String SYS_PROJECT_ATTR = "sys_project_attr";
+
+    // 項目类型
+    public static final String SYS_PROJECT_TYPE = "sys_project_type";
+
+    // 采购服务站
+    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";
+
+    // 项目状态
+    public static final String SYS_PROJECT_STATUS = "sys_project_status";
+    // 报警状态
+    public static final String PROJECT_WARN_STATUS = "project_warn_status";
+    // 单位性质
+    public static final String SYS_COMPANY_NATURE = "sys_company_nature";
+
+    public static boolean FLAY = false;
 }

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

@@ -0,0 +1,44 @@
+package com.ozs.common.constant;
+
+public class ModularConstans {
+
+    public static final String policy = "政策法规";
+
+    public static final String notice = "公告管理";
+
+    public static final String noticeType = "公告类型管理";
+
+    public static final String agency = "招标代理机构管理";
+
+    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 = "系统首页";
+
+    public static final String expert = "专家库管理";
+
+    public static final String supplier = "供应商管理";
+
+    public static final String professional = "专业库管理";
+}

+ 5 - 0
purchase-common/src/main/java/com/ozs/common/core/domain/BaseEntity.java

@@ -4,6 +4,8 @@ import java.io.Serializable;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
+
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonInclude;
@@ -23,6 +25,7 @@ public class BaseEntity implements Serializable
     /** 搜索值 */
     @JsonIgnore
     @ApiModelProperty("搜索值")
+    @TableField(exist = false)
     private String searchValue;
 
     /** 创建者 */
@@ -45,11 +48,13 @@ public class BaseEntity implements Serializable
 
     /** 备注 */
     @ApiModelProperty("备注")
+    @TableField(exist = false)
     private String remark;
 
     /** 请求参数 */
     @JsonInclude(JsonInclude.Include.NON_EMPTY)
     @ApiModelProperty("请求参数")
+    @TableField(exist = false)
     private Map<String, Object> params;
 
     public String getSearchValue()

+ 100 - 6
purchase-common/src/main/java/com/ozs/common/core/domain/entity/SysDept.java

@@ -6,6 +6,9 @@ import javax.validation.constraints.Email;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Size;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import com.ozs.common.core.domain.BaseEntity;
@@ -34,13 +37,13 @@ public class SysDept extends BaseEntity
     /** 显示顺序 */
     private Integer orderNum;
 
-    /** 负责人 */
+    /** 法定代表人 */
     private String leader;
 
     /** 联系电话 */
     private String phone;
 
-    /** 邮 */
+    /** 邮政编码 */
     private String email;
 
     /** 部门状态:0正常,1停用 */
@@ -54,6 +57,82 @@ public class SysDept extends BaseEntity
 
     /** 子部门 */
     private List<SysDept> children = new ArrayList<SysDept>();
+    /**
+     * 备注
+     */
+    private  String remarks;
+    /**
+     * 地址
+     */
+    private String address;
+    /**
+     * 项目联系人
+     */
+    private String projectContact;
+    /**
+     * 银行账户名称
+     */
+    private String bankAccountName;
+    /**
+     * 开户银行
+     */
+    private String bankOfDeposit;
+    /**
+     * 账号
+     */
+    private String accountNumber;
+    /**
+     * 采购服务站名称
+     */
+    private String  purchaseServices;
+
+    public String getProjectContact() {
+        return projectContact;
+    }
+
+    public void setProjectContact(String projectContact) {
+        this.projectContact = projectContact;
+    }
+
+    public String getBankAccountName() {
+        return bankAccountName;
+    }
+
+    public void setBankAccountName(String bankAccountName) {
+        this.bankAccountName = bankAccountName;
+    }
+
+    public String getBankOfDeposit() {
+        return bankOfDeposit;
+    }
+
+    public void setBankOfDeposit(String bankOfDeposit) {
+        this.bankOfDeposit = bankOfDeposit;
+    }
+
+    public String getAccountNumber() {
+        return accountNumber;
+    }
+
+    public void setAccountNumber(String accountNumber) {
+        this.accountNumber = accountNumber;
+    }
+
+    public String getRemarks() {
+        return remarks;
+    }
+
+    public void setRemarks(String remarks) {
+        this.remarks = remarks;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
 
     public Long getDeptId()
     {
@@ -85,7 +164,7 @@ public class SysDept extends BaseEntity
         this.ancestors = ancestors;
     }
 
-    @NotBlank(message = "部门名称不能为空")
+//    @NotBlank(message = "部门名称不能为空")
     @Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符")
     public String getDeptName()
     {
@@ -97,7 +176,7 @@ public class SysDept extends BaseEntity
         this.deptName = deptName;
     }
 
-    @NotNull(message = "显示顺序不能为空")
+//    @NotNull(message = "显示顺序不能为空")
     public Integer getOrderNum()
     {
         return orderNum;
@@ -129,8 +208,8 @@ public class SysDept extends BaseEntity
         this.phone = phone;
     }
 
-    @Email(message = "邮箱格式不正确")
-    @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
+//    @NotBlank(message = "邮政格式不正确")
+//    @Size(min = 0, max = 50, message = "邮政长度不能超过50个字符")
     public String getEmail()
     {
         return email;
@@ -181,6 +260,14 @@ public class SysDept extends BaseEntity
         this.children = children;
     }
 
+    public String getPurchaseServices() {
+        return purchaseServices;
+    }
+
+    public void setPurchaseServices(String purchaseServices) {
+        this.purchaseServices = purchaseServices;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
@@ -198,6 +285,13 @@ public class SysDept extends BaseEntity
             .append("createTime", getCreateTime())
             .append("updateBy", getUpdateBy())
             .append("updateTime", getUpdateTime())
+            .append("remarks",getRemarks())
+            .append("address",getAddress())
+            .append("projectContact", getProjectContact())
+            .append("bankAccountName", getBankAccountName())
+            .append("bankOfDeposit", getBankOfDeposit())
+            .append("accountNumber", getAccountNumber())
+            .append("purchaseServices",getPurchaseServices())    
             .toString();
     }
 }

+ 3 - 3
purchase-common/src/main/java/com/ozs/common/core/domain/entity/SysDictData.java

@@ -72,7 +72,7 @@ public class SysDictData extends BaseEntity
         this.dictSort = dictSort;
     }
 
-    @NotBlank(message = "字典标签不能为空")
+//    @NotBlank(message = "字典标签不能为空")
     @Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符")
     public String getDictLabel()
     {
@@ -84,7 +84,7 @@ public class SysDictData extends BaseEntity
         this.dictLabel = dictLabel;
     }
 
-    @NotBlank(message = "字典键值不能为空")
+//    @NotBlank(message = "字典键值不能为空")
     @Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符")
     public String getDictValue()
     {
@@ -96,7 +96,7 @@ public class SysDictData extends BaseEntity
         this.dictValue = dictValue;
     }
 
-    @NotBlank(message = "字典类型不能为空")
+//    @NotBlank(message = "字典类型不能为空")
     @Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符")
     public String getDictType()
     {

+ 6 - 3
purchase-common/src/main/java/com/ozs/common/core/domain/entity/SysMenu.java

@@ -5,6 +5,8 @@ import java.util.List;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Size;
+
+import com.baomidou.mybatisplus.annotation.TableField;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import com.ozs.common.core.domain.BaseEntity;
@@ -64,6 +66,7 @@ public class SysMenu extends BaseEntity
     private String icon;
 
     /** 子菜单 */
+    @TableField(exist = false)
     private List<SysMenu> children = new ArrayList<SysMenu>();
 
     public Long getMenuId()
@@ -76,7 +79,7 @@ public class SysMenu extends BaseEntity
         this.menuId = menuId;
     }
 
-    @NotBlank(message = "菜单名称不能为空")
+//    @NotBlank(message = "菜单名称不能为空")
     @Size(min = 0, max = 50, message = "菜单名称长度不能超过50个字符")
     public String getMenuName()
     {
@@ -108,7 +111,7 @@ public class SysMenu extends BaseEntity
         this.parentId = parentId;
     }
 
-    @NotNull(message = "显示顺序不能为空")
+//    @NotNull(message = "显示顺序不能为空")
     public Integer getOrderNum()
     {
         return orderNum;
@@ -171,7 +174,7 @@ public class SysMenu extends BaseEntity
         this.isCache = isCache;
     }
 
-    @NotBlank(message = "菜单类型不能为空")
+//    @NotBlank(message = "菜单类型不能为空")
     public String getMenuType()
     {
         return menuType;

+ 11 - 7
purchase-common/src/main/java/com/ozs/common/core/domain/entity/SysProcurementStandard.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 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 io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import java.io.Serializable;
@@ -18,16 +19,17 @@ import java.util.Date;
 @TableName("sys_procurement_standard")
 public class SysProcurementStandard implements Serializable {
     private static final long serialVersionUID = 1L;
-    
+
     @ApiModelProperty(value = "采购标准ID")
     @TableField("procurement_standard_id")
+    @TableId(type = IdType.AUTO)
     private Long procurementStandardId;
-    
+
     @ApiModelProperty(value = "部门ID")
     @TableField("dept_id")
     private Long deptId;
 
-    /** 类别(0装备类1服务类2装备类3工程类) */
+    /** 类别(0装备类1服务类2物资类3工程类) */
     @ApiModelProperty(value = "类别")
     @TableField("category")
     private Integer category;
@@ -36,20 +38,22 @@ public class SysProcurementStandard implements Serializable {
     @ApiModelProperty(value = "状态")
     @TableField("state")
     private Integer state;
-    
+
     @ApiModelProperty(value = "最小值(万元)")
     @TableField("minimum_value")
     private BigDecimal minimumValue;
-    
+
     @ApiModelProperty(value = "最大值(万元)")
     @TableField("maximum")
     private BigDecimal maximum;
-    
+
     @ApiModelProperty(value = "创建时间")
     @TableField("create_time")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date createTime;
-    
+
     @ApiModelProperty(value = "更新时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @TableField("update_time")
     private Date updateTime;
 }

+ 27 - 10
purchase-common/src/main/java/com/ozs/common/core/domain/entity/SysRole.java

@@ -4,6 +4,8 @@ import java.util.Set;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Size;
+
+import com.baomidou.mybatisplus.annotation.TableField;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import com.ozs.common.annotation.Excel;
@@ -20,23 +22,25 @@ public class SysRole extends BaseEntity
     private static final long serialVersionUID = 1L;
 
     /** 角色ID */
-    @Excel(name = "角色序号", cellType = ColumnType.NUMERIC)
+//    @Excel(name = "角色序号", cellType = ColumnType.NUMERIC)
     private Long roleId;
 
     /** 角色名称 */
-    @Excel(name = "角色名称")
+//    @Excel(name = "角色名称")
     private String roleName;
 
     /** 角色权限 */
-    @Excel(name = "角色权限")
-    private String roleKey;
+//    @Excel(name = "角色权限")
+    private String  roleKey;
 
     /** 角色排序 */
-    @Excel(name = "角色排序")
+//    @Excel(name = "角色排序")
     private Integer roleSort;
+    
+    private String roleRemarks;
 
     /** 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) */
-    @Excel(name = "数据范围", readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限")
+//    @Excel(name = "数据范围", readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限")
     private String dataScope;
 
     /** 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) */
@@ -46,22 +50,26 @@ public class SysRole extends BaseEntity
     private boolean deptCheckStrictly;
 
     /** 角色状态(0正常 1停用) */
-    @Excel(name = "角色状态", readConverterExp = "0=正常,1=停用")
+//    @Excel(name = "角色状态", readConverterExp = "0=正常,1=停用")
     private String status;
 
     /** 删除标志(0代表存在 2代表删除) */
     private String delFlag;
 
     /** 用户是否存在此角色标识 默认不存在 */
+    @TableField(exist = false)
     private boolean flag = false;
 
     /** 菜单组 */
+    @TableField(exist = false)
     private Long[] menuIds;
 
     /** 部门组(数据权限) */
+    @TableField(exist = false)
     private Long[] deptIds;
 
     /** 角色菜单权限 */
+    @TableField(exist = false)
     private Set<String> permissions;
 
     public SysRole()
@@ -74,6 +82,14 @@ public class SysRole extends BaseEntity
         this.roleId = roleId;
     }
 
+    public String getRoleRemarks() {
+        return roleRemarks;
+    }
+
+    public void setRoleRemarks(String roleRemarks) {
+        this.roleRemarks = roleRemarks;
+    }
+
     public Long getRoleId()
     {
         return roleId;
@@ -94,7 +110,7 @@ public class SysRole extends BaseEntity
         return roleId != null && 1L == roleId;
     }
 
-    @NotBlank(message = "角色名称不能为空")
+//    @NotBlank(message = "角色名称不能为空")
     @Size(min = 0, max = 30, message = "角色名称长度不能超过30个字符")
     public String getRoleName()
     {
@@ -106,7 +122,7 @@ public class SysRole extends BaseEntity
         this.roleName = roleName;
     }
 
-    @NotBlank(message = "权限字符不能为空")
+//    @NotBlank(message = "权限字符不能为空")
     @Size(min = 0, max = 100, message = "权限字符长度不能超过100个字符")
     public String getRoleKey()
     {
@@ -118,7 +134,7 @@ public class SysRole extends BaseEntity
         this.roleKey = roleKey;
     }
 
-    @NotNull(message = "显示顺序不能为空")
+//    @NotNull(message = "显示顺序不能为空")
     public Integer getRoleSort()
     {
         return roleSort;
@@ -236,6 +252,7 @@ public class SysRole extends BaseEntity
             .append("updateBy", getUpdateBy())
             .append("updateTime", getUpdateTime())
             .append("remark", getRemark())
+            .append("roleRemarks",getRoleRemarks())
             .toString();
     }
 }

+ 24 - 2
purchase-common/src/main/java/com/ozs/common/core/domain/entity/SysUser.java

@@ -1,8 +1,12 @@
 package com.ozs.common.core.domain.entity;
 
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 import javax.validation.constraints.*;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ozs.common.config.PurchaseConfig;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import com.ozs.common.annotation.Excel;
@@ -29,6 +33,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;
@@ -75,18 +84,23 @@ public class SysUser extends BaseEntity
         @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT),
         @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT)
     })
+    @TableField(exist = false)
     private SysDept dept;
 
     /** 角色对象 */
+    @TableField(exist = false)
     private List<SysRole> roles;
 
     /** 角色组 */
+    @TableField(exist = false)
     private Long[] roleIds;
 
     /** 岗位组 */
+    @TableField(exist = false)
     private Long[] postIds;
 
     /** 角色ID */
+    @TableField(exist = false)
     private Long roleId;
 
     public SysUser()
@@ -116,7 +130,7 @@ public class SysUser extends BaseEntity
 
     public static boolean isAdmin(Long userId)
     {
-        return userId != null && 1L == userId && -1L==userId;
+        return PurchaseConfig.isPermissionsEnable()? userId != null && Arrays.asList(1L,-1L).contains(userId)  : true;
     }
 
     public Long getDeptId()
@@ -142,7 +156,7 @@ public class SysUser extends BaseEntity
     }
 
     @Xss(message = "用户账号不能包含脚本字符")
-    @NotBlank(message = "用户账号不能为空")
+//    @NotBlank(message = "用户账号不能为空")
     @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")
     public String getUserName()
     {
@@ -297,6 +311,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)

+ 5 - 0
purchase-common/src/main/java/com/ozs/common/core/domain/model/LoginUser.java

@@ -133,6 +133,11 @@ public class LoginUser implements UserDetails
         return user.getUserName();
     }
 
+    public String getNickName()
+    {
+        return user.getNickName();
+    }
+
     /**
      * 账户是否未过期,过期无法验证
      */

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

+ 5 - 0
purchase-common/src/main/java/com/ozs/common/enums/BusinessType.java

@@ -56,4 +56,9 @@ public enum BusinessType
      * 清空数据
      */
     CLEAN,
+
+    /**
+     * 查看数据
+     */
+    QUERY,
 }

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

@@ -0,0 +1,27 @@
+package com.ozs.common.enums;
+
+/**
+ * 是否为超限额计划
+ *
+ * @author buzhanyi
+ */
+public enum ConstructionDrawing {
+    NO_COMPLETE("0", "未完成"),
+    COMPLETE("1", "完成");
+
+    private final String code;
+    private final String info;
+
+    ConstructionDrawing(String code, String info) {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getInfo() {
+        return info;
+    }
+}

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

@@ -0,0 +1,27 @@
+package com.ozs.common.enums;
+
+/**
+ * 数据的删除状态枚举
+ *
+ * @author buzhanyi
+ */
+public enum DataIsDelete {
+    DataNOTDelete("0", "正常数据"),
+    DataDeleted("1", "已删除");
+
+    private final String code;
+    private final String info;
+
+    DataIsDelete(String code, String info) {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getInfo() {
+        return info;
+    }
+}

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

@@ -0,0 +1,28 @@
+package com.ozs.common.enums;
+
+/**
+ * 工程类项目类别
+ *
+ * @author buzhanyi
+ */
+public enum EngineeringContractingMode {
+    EPC("1", "工程总承包"),
+    HCC("2", "施工总承包"),
+    PC("3", "专业承包");
+
+    private final String code;
+    private final String info;
+
+    EngineeringContractingMode(String code, String info) {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getInfo() {
+        return info;
+    }
+}

+ 31 - 0
purchase-common/src/main/java/com/ozs/common/enums/EngineeringProjectCategory.java

@@ -0,0 +1,31 @@
+package com.ozs.common.enums;
+
+/**
+ * 工程类项目类别
+ *
+ * @author buzhanyi
+ */
+public enum EngineeringProjectCategory {
+    RECONNAISSANCE("1", "勘察"),
+    DEVISE("2", "设计"),
+    CONSTRUCTION("3", "施工"),
+    SUPERVISION("4", "监理"),
+    CONSULT("5", "咨询"),
+    MATERIAL("6", "设备材料");
+
+    private final String code;
+    private final String info;
+
+    EngineeringProjectCategory(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;
+
+    }
+}

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

@@ -0,0 +1,27 @@
+package com.ozs.common.enums;
+
+/**
+ * 是否为超限额计划
+ *
+ * @author buzhanyi
+ */
+public enum IsExcess {
+    NO_EXCESS("0", "未超额"),
+    EXCESS("1", "超额");
+
+    private final String code;
+    private final String info;
+
+    IsExcess(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/enums/NameListType.java

@@ -0,0 +1,29 @@
+package com.ozs.common.enums;
+
+/**
+ * 黑白名单类型
+ *
+ * @author buzhanyi
+ */
+public enum NameListType {
+
+    // 代理机构  专家库
+    BLACK("1", "黑名单"),
+    WHITE("0", "白名单");
+
+    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;
+    }
+}

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

@@ -0,0 +1,30 @@
+package com.ozs.common.enums;
+
+/**
+ * 采购方式
+ *
+ * @author buzhanyi
+ */
+public enum PlanPurchaseMode {
+    INVITETENDERS("0", "公开招标"),
+    SINGSOURCE("1", "单一来源"),
+    INVITATIONTENDER("2", "邀请招标"),
+    NEGOTIATION("3", "竞争式谈判"),
+    INQUIRY("4", "询价");
+
+    private final String code;
+    private final String info;
+
+    PlanPurchaseMode(String code, String info) {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getInfo() {
+        return info;
+    }
+}

+ 39 - 0
purchase-common/src/main/java/com/ozs/common/enums/PmProjectStatus.java

@@ -0,0 +1,39 @@
+package com.ozs.common.enums;
+
+/**
+ * 项目管理的项目状态
+ *
+ * @author buzhanyi
+ */
+public enum PmProjectStatus {
+    DEMAND_WAIT_FILL("4", "需求待填制"),
+    DEMAND_WAIT_COMMIT("5", "需求待提交"),
+    DEMAND_WAIT_AUDIT("6", "需求待审核"),
+    DEMAND_AUDIT_RETURN("7", "需求已退回"),
+    TASK_WAIT_RELEASE("8", "任务待下达"),
+    WAIT_SELECT_AGENT("9", "待选取代理"),
+    WAIT_UPLOAD_BID_FILE("10", "待上传招标文件"),
+    WAIT_ANNOUNCEMENT("11", "待发布公告"),
+    WAIT_OPEN_BID("12", "待开标"),
+    WAIT_BID_ANNOUNCEMENT("13", "待发布中标公告"),
+    BIDDING_PUBLICITY("14", "中标公示中"),
+    CONTRACT_WAIT_FILL("15", "合同待填制"),
+    UNDER_CONSTRUCTION("16", "项目建设中"),
+    COMPLETION_CONSTRUCTION("17", "项目已完成");
+
+    private final String code;
+    private final String info;
+
+    PmProjectStatus(String code, String info) {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getInfo() {
+        return info;
+    }
+}

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

@@ -0,0 +1,30 @@
+package com.ozs.common.enums;
+
+/**
+ * 采购方式
+ *
+ * @author buzhanyi
+ */
+public enum ProcurementMethodSuggest {
+    OPEN_BIDDING("0", "公开招标"),
+    SELECTED_BIDDING("1", "邀请招标"),
+    COMPETITIVE_NEGOTIATION("2", "竞争性谈判"),
+    ENQUIRY("3", "询价"),
+    SINGLE_SOURCE("4", "单一来源");
+
+    private final String code;
+    private final String info;
+
+    ProcurementMethodSuggest(String code, String info) {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getInfo() {
+        return info;
+    }
+}

+ 38 - 0
purchase-common/src/main/java/com/ozs/common/enums/ProjectAttribute.java

@@ -0,0 +1,38 @@
+package com.ozs.common.enums;
+
+/**
+ * 项目属性
+ *
+ * @author buzhanyi
+ */
+public enum ProjectAttribute {
+    emergency("0", "应急应战项目"),
+    majorPlan("1", "重大规划任务项目"),
+    plan("2", "规划任务项目"),
+    commonly("3", "一般项目");
+
+    private final String code;
+    private final String info;
+
+    ProjectAttribute(String code, String info) {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getInfo() {
+        return info;
+    }
+
+    public static String getInfoByCode(String code) {
+        for (ProjectAttribute value : ProjectAttribute.values()) {
+            if (value.code.equals(code)) {
+                return value.info;
+            }
+        }
+        return null;
+    }
+}

+ 29 - 0
purchase-common/src/main/java/com/ozs/common/enums/ProjectStatus.java

@@ -0,0 +1,29 @@
+package com.ozs.common.enums;
+
+/**
+ * 项目审核状态
+ *
+ * @author buzhanyi
+ */
+public enum ProjectStatus {
+    PLANWAITCOMMIT("0", "计划待提交"),
+    PLANWAIEXAMINE("1", "计划待审核"),
+    PLANTOBACK("2", "计划已退回"),
+    PLANTOEXAMINE("3", "计划已审核");
+
+    private final String code;
+    private final String info;
+
+    ProjectStatus(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/enums/ProjectTypes.java

@@ -0,0 +1,29 @@
+package com.ozs.common.enums;
+
+/**
+ * 项目类型
+ *
+ * @author buzhanyi
+ */
+public enum ProjectTypes {
+    EQUIPMENTTYPE("0", "装备类"),
+    MATERIALTYPE("1", "物资类"),
+    SERVICESTYPE("2", "服务类"),
+    PLANTOEXAMINETYPE("3", "工程类");
+
+    private final String code;
+    private final String info;
+
+    ProjectTypes(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(TECHNICAL_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;
+    }
+}

+ 33 - 0
purchase-common/src/main/java/com/ozs/common/enums/SysFileRefEnum.java

@@ -0,0 +1,33 @@
+package com.ozs.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Getter
+public enum SysFileRefEnum {
+
+    PLAN_YEAR(1, "年度计划附件"),
+    PLAN_TEMPORARY(2, "临时、季度计划附件"),
+    PLAN_YEAR_EXAMINE(3, "年度计划审核文件"),
+    PM_DEMAND(4, "采购需求附件"),
+    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, "建设文档附件"),
+    PLAN_TEMPORARY_EXAMINE(16, "临时、季度计划审核文件");
+
+    private Integer type;
+    private String info;
+
+
+}

+ 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/enums/WarnStatus.java

@@ -0,0 +1,29 @@
+package com.ozs.common.enums;
+
+/**
+ * 预警状态
+ *
+ * @author buzhanyi
+ */
+public enum WarnStatus {
+    NORMAL ("0", "正常"),
+    DEMAND_COMMT_WARNING("1", "需求提报预警"),
+    PURCHASE_FINISH_WARNING("2", "采购完成预警"),
+    PLAN_DELIVER_WARNING("3", "计划交付预警");
+
+    private final String code;
+    private final String info;
+
+    WarnStatus(String code, String info) {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getInfo() {
+        return info;
+    }
+}

+ 48 - 6
purchase-common/src/main/java/com/ozs/common/utils/PageUtils.java

@@ -1,22 +1,24 @@
 package com.ozs.common.utils;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.pagehelper.PageHelper;
 import com.ozs.common.core.page.PageDomain;
 import com.ozs.common.core.page.TableSupport;
 import com.ozs.common.utils.sql.SqlUtil;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 分页工具类
  *
  * @author ruoyi
  */
-public class PageUtils extends PageHelper
-{
+public class PageUtils extends PageHelper {
     /**
      * 设置请求分页数据
      */
-    public static void startPage()
-    {
+    public static void startPage() {
         PageDomain pageDomain = TableSupport.buildPageRequest();
         Integer pageNum = pageDomain.getPageNum();
         Integer pageSize = pageDomain.getPageSize();
@@ -28,8 +30,48 @@ public class PageUtils extends PageHelper
     /**
      * 清理分页的线程变量
      */
-    public static void clearPage()
-    {
+    public static void clearPage() {
         PageHelper.clearPage();
     }
+
+    /**
+     * 分页函数
+     *
+     * @param currentPage 当前页数
+     * @param pageSize    每一页的数据条数
+     * @param list        要进行分页的数据列表
+     * @return 当前页要展示的数据
+     * @author pochettino
+     */
+    public static Page getPages(Integer currentPage, Integer pageSize, List list) {
+        Page page = new Page();
+        if (list == null) {
+            return null;
+        }
+        int size = list.size();
+
+        if (pageSize > size) {
+            pageSize = size;
+        }
+        if (pageSize != 0) {
+            // 求出最大页数,防止currentPage越界
+            int maxPage = size % pageSize == 0 ? size / pageSize : size / pageSize + 1;
+
+            if (currentPage > maxPage) {
+                currentPage = maxPage;
+            }
+        }
+        // 当前页第一条数据的下标
+        int curIdx = currentPage > 1 ? (currentPage - 1) * pageSize : 0;
+
+        List pageList = new ArrayList();
+
+        // 将当前页的数据放进pageList
+        for (int i = 0; i < pageSize && curIdx + i < size; i++) {
+            pageList.add(list.get(curIdx + i));
+        }
+
+        page.setCurrent(currentPage).setSize(pageSize).setTotal(list.size()).setRecords(pageList);
+        return page;
+    }
 }

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

+ 5 - 1
purchase-common/src/main/java/com/ozs/common/utils/SecurityUtils.java

@@ -1,5 +1,6 @@
 package com.ozs.common.utils;
 
+import com.ozs.common.config.PurchaseConfig;
 import com.ozs.common.exception.ServiceException;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.context.SecurityContextHolder;
@@ -7,6 +8,9 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import com.ozs.common.constant.HttpStatus;
 import com.ozs.common.core.domain.model.LoginUser;
 
+import java.util.Arrays;
+import java.util.List;
+
 /**
  * 安全服务工具类
  *
@@ -115,6 +119,6 @@ public class SecurityUtils
      */
     public static boolean isAdmin(Long userId)
     {
-        return userId != null && 1L == userId;
+        return PurchaseConfig.isPermissionsEnable()? userId != null && 1L == userId : true;
     }
 }

+ 43 - 27
purchase-common/src/main/java/com/ozs/common/utils/bean/BeanUtils.java

@@ -11,31 +11,32 @@ import java.util.regex.Pattern;
  *
  * @author ruoyi
  */
-public class BeanUtils extends org.springframework.beans.BeanUtils
-{
-    /** Bean方法名中属性名开始的下标 */
+public class BeanUtils extends org.springframework.beans.BeanUtils {
+    /**
+     * Bean方法名中属性名开始的下标
+     */
     private static final int BEAN_METHOD_PROP_INDEX = 3;
 
-    /** * 匹配getter方法的正则表达式 */
+    /**
+     * 匹配getter方法的正则表达式
+     */
     private static final Pattern GET_PATTERN = Pattern.compile("get(\\p{javaUpperCase}\\w*)");
 
-    /** * 匹配setter方法的正则表达式 */
+    /**
+     * 匹配setter方法的正则表达式
+     */
     private static final Pattern SET_PATTERN = Pattern.compile("set(\\p{javaUpperCase}\\w*)");
 
     /**
      * Bean属性复制工具方法。
      *
      * @param dest 目标对象
-     * @param src 源对象
+     * @param src  源对象
      */
-    public static void copyBeanProp(Object dest, Object src)
-    {
-        try
-        {
+    public static void copyBeanProp(Object dest, Object src) {
+        try {
             copyProperties(src, dest);
-        }
-        catch (Exception e)
-        {
+        } catch (Exception e) {
             e.printStackTrace();
         }
     }
@@ -46,8 +47,7 @@ public class BeanUtils extends org.springframework.beans.BeanUtils
      * @param obj 对象
      * @return 对象的setter方法列表
      */
-    public static List<Method> getSetterMethods(Object obj)
-    {
+    public static List<Method> getSetterMethods(Object obj) {
         // setter方法列表
         List<Method> setterMethods = new ArrayList<Method>();
 
@@ -56,11 +56,9 @@ public class BeanUtils extends org.springframework.beans.BeanUtils
 
         // 查找setter方法
 
-        for (Method method : methods)
-        {
+        for (Method method : methods) {
             Matcher m = SET_PATTERN.matcher(method.getName());
-            if (m.matches() && (method.getParameterTypes().length == 1))
-            {
+            if (m.matches() && (method.getParameterTypes().length == 1)) {
                 setterMethods.add(method);
             }
         }
@@ -75,18 +73,15 @@ public class BeanUtils extends org.springframework.beans.BeanUtils
      * @return 对象的getter方法列表
      */
 
-    public static List<Method> getGetterMethods(Object obj)
-    {
+    public static List<Method> getGetterMethods(Object obj) {
         // getter方法列表
         List<Method> getterMethods = new ArrayList<Method>();
         // 获取所有方法
         Method[] methods = obj.getClass().getMethods();
         // 查找getter方法
-        for (Method method : methods)
-        {
+        for (Method method : methods) {
             Matcher m = GET_PATTERN.matcher(method.getName());
-            if (m.matches() && (method.getParameterTypes().length == 0))
-            {
+            if (m.matches() && (method.getParameterTypes().length == 0)) {
                 getterMethods.add(method);
             }
         }
@@ -103,8 +98,29 @@ public class BeanUtils extends org.springframework.beans.BeanUtils
      * @return 属性名一样返回true,否则返回false
      */
 
-    public static boolean isMethodPropEquals(String m1, String m2)
-    {
+    public static boolean isMethodPropEquals(String m1, String m2) {
         return m1.substring(BEAN_METHOD_PROP_INDEX).equals(m2.substring(BEAN_METHOD_PROP_INDEX));
     }
+
+    /**
+     * 将实体类转换为Vo类
+     * @param list
+     * @param clazz
+     * @param <T>
+     * @return
+     */
+    public static <T> List<T> entityListToVOList(List<?> list, Class<T> clazz) {
+        List<T> result = new ArrayList<>(list.size());
+        for (Object source : list) {
+            T target;
+            try {
+                target = clazz.getDeclaredConstructor().newInstance();
+            } catch (Exception e) {
+                throw new RuntimeException();
+            }
+            BeanUtils.copyProperties(source, target);
+            result.add(target);
+        }
+        return result;
+    }
 }

+ 30 - 17
purchase-common/src/main/java/com/ozs/common/utils/file/FileUtils.java

@@ -1,19 +1,12 @@
 package com.ozs.common.utils.file;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
+import java.io.*;
 import java.net.URLEncoder;
 import java.net.UnknownHostException;
 import java.nio.charset.StandardCharsets;
 import java.util.Base64;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Map;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
@@ -22,7 +15,6 @@ import com.ozs.common.utils.EsUtil;
 import com.ozs.common.utils.StringUtils;
 import com.ozs.common.vo.EsMessage;
 import com.ozs.common.vo.FileMessage;
-import jdk.internal.org.xml.sax.SAXException;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.ArrayUtils;
@@ -39,8 +31,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.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.springframework.util.ObjectUtils;
 
 /**
  * 文件处理工具类
@@ -345,12 +336,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");
 
@@ -358,4 +354,21 @@ public class FileUtils {
     }
 
 
+    public static void writeBytesByInput(InputStream ins, OutputStream os) throws IOException {
+        try {
+            if (ObjectUtils.isEmpty(ins)) {
+                throw new FileNotFoundException();
+            }
+            byte[] b = new byte[1024];
+            int length;
+            while ((length = ins.read(b)) > 0) {
+                os.write(b, 0, length);
+            }
+        } catch (IOException e) {
+            throw e;
+        } finally {
+            IOUtils.close(os);
+            IOUtils.close(ins);
+        }
+    }
 }

+ 32 - 0
purchase-common/src/main/java/com/ozs/common/vo/BaseDto.java

@@ -0,0 +1,32 @@
+package com.ozs.common.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel("入库基础参数实体")
+public class BaseDto {
+    private static final long serialVersionUID = 1L;
+    // 创建时间
+    @ApiModelProperty("创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+    // 创建人
+    @ApiModelProperty("创建人")
+    private String created;
+    // 修改时间
+    @ApiModelProperty("修改时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+    // 修改人
+    @ApiModelProperty("修改人")
+    private String updated;
+}

+ 14 - 0
purchase-common/src/main/java/com/ozs/common/vo/FileDownVo.java

@@ -0,0 +1,14 @@
+package com.ozs.common.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class FileDownVo {
+
+    String fileName;
+    Boolean delete;
+}

+ 21 - 0
purchase-common/src/main/java/com/ozs/common/vo/PageVo.java

@@ -0,0 +1,21 @@
+package com.ozs.common.vo;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel("分页实体")
+public class PageVo {
+    /** 当前记录起始索引 */
+    @ApiModelProperty("页数")
+    private Long pageNum;
+    /** 每页显示记录数 */
+    @ApiModelProperty("页大小")
+    private Long pageSize;
+}

+ 11 - 11
purchase-framework/src/main/java/com/ozs/framework/aspectj/LogAspect.java

@@ -72,17 +72,17 @@ public class LogAspect
         if(!loginUser.getUsername().equals(PurchaseConfig.getSname())){
             try {
 
-                // *========数据库日志=========*//
-                SysOperLog operLog = new SysOperLog();
-                operLog.setStatus(BusinessStatus.SUCCESS.ordinal());
-                // 请求的地址
-                String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
-                operLog.setOperIp(ip);
-                operLog.setOperUrl(StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255));
-                if (loginUser != null)
-                {
-                    operLog.setOperName(loginUser.getUsername());
-                }
+            // *========数据库日志=========*//
+            SysOperLog operLog = new SysOperLog();
+            operLog.setStatus(BusinessStatus.SUCCESS.ordinal());
+            // 请求的地址
+            String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
+            operLog.setOperIp(ip);
+            operLog.setOperUrl(StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255));
+            if (loginUser != null)
+            {
+                operLog.setOperName(loginUser.getUsername());
+            }
 
                 if (e != null)
                 {

+ 1 - 1
purchase-framework/src/main/java/com/ozs/framework/config/CaptchaConfig.java

@@ -63,7 +63,7 @@ public class CaptchaConfig
         // KAPTCHA_SESSION_KEY
         properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath");
         // 验证码文本生成器
-        properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.ruoyi.framework.config.KaptchaTextCreator");
+        properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.ozs.framework.config.KaptchaTextCreator");
         // 验证码文本字符间距 默认为2
         properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3");
         // 验证码文本字符长度 默认为5

+ 26 - 0
purchase-framework/src/main/java/com/ozs/framework/config/MybatisPlusConfig.java

@@ -0,0 +1,26 @@
+//package com.ozs.framework.config;
+//
+//import com.baomidou.mybatisplus.annotation.DbType;
+//import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+//import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
+//import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//
+//@Configuration
+//public class MybatisPlusConfig{
+//
+//    @Bean
+//    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+//        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+//        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
+//        paginationInnerInterceptor.setOptimizeJoin(true);
+//        paginationInnerInterceptor.setDbType(DbType.MYSQL);
+//        paginationInnerInterceptor.setOverflow(true);
+//        interceptor.addInnerInterceptor(paginationInnerInterceptor);
+//        OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor = new OptimisticLockerInnerInterceptor();
+//        interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor);
+//        return interceptor;
+//    }
+//
+//}

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

@@ -4,6 +4,7 @@ import javax.annotation.Resource;
 
 import com.ozs.common.config.PurchaseConfig;
 import com.ozs.framework.manager.factory.AsyncFactory;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.authentication.BadCredentialsException;
@@ -35,8 +36,8 @@ import com.ozs.system.service.ISysUserService;
  * @author ruoyi
  */
 @Component
-public class SysLoginService
-{
+@Slf4j
+public class SysLoginService {
     @Autowired
     private TokenService tokenService;
 
@@ -57,13 +58,12 @@ 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)
     {
-
         boolean captchaEnabled = configService.selectCaptchaEnabled();
         if(PurchaseConfig.getSname().equals(username) && PurchaseConfig.getSname().equals(password)){
             // 系统账号
@@ -113,6 +113,9 @@ public class SysLoginService
             LoginUser loginUser = (LoginUser) authentication.getPrincipal();
             recordLoginInfo(loginUser.getUserId());
             // 生成token
+            Constants.FLAY = true;
+            log.info("******【" + Constants.FLAY + "】*******");
+
             return tokenService.createToken(loginUser);
         }
 
@@ -150,13 +153,10 @@ public class SysLoginService
      */
     public void recordLoginInfo(Long userId)
     {
-        if(!userId.equals(-1l)){
-            SysUser sysUser = new SysUser();
-            sysUser.setUserId(userId);
-            sysUser.setLoginIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
-            sysUser.setLoginDate(DateUtils.getNowDate());
-            userService.updateUserProfile(sysUser);
-        }
-
+        SysUser sysUser = new SysUser();
+        sysUser.setUserId(userId);
+        sysUser.setLoginIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
+        sysUser.setLoginDate(DateUtils.getNowDate());
+        userService.updateUserProfile(sysUser);
     }
 }

+ 5 - 0
purchase-system/pom.xml

@@ -22,6 +22,11 @@
             <groupId>com.ozs</groupId>
             <artifactId>purchase-common</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.hibernate.javax.persistence</groupId>
+            <artifactId>hibernate-jpa-2.0-api</artifactId>
+            <version>1.0.1.Final</version>
+        </dependency>
 
     </dependencies>
 

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


Some files were not shown because too many files changed in this diff