Просмотр исходного кода

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

 Conflicts:
	purchase-system/src/main/java/com/ozs/plan/service/PlanYearsService.java
	purchase-system/src/main/java/com/ozs/plan/service/impl/PlanYearsServiceImpl.java
	purchase-system/src/main/java/com/ozs/pm/mapper/PmDemandMapper.java
gao.qiang 2 лет назад
Родитель
Сommit
3f42177137
49 измененных файлов с 2928 добавлено и 193 удалено
  1. 149 8
      purchase-admin/src/main/java/com/ozs/web/controller/base/BaseAgencyController.java
  2. 14 10
      purchase-admin/src/main/java/com/ozs/web/controller/base/BaseProfessionalController.java
  3. 2 1
      purchase-admin/src/main/java/com/ozs/web/controller/plan/MonthlyReconciliationController.java
  4. 156 0
      purchase-admin/src/main/java/com/ozs/web/controller/plan/PlanQuarterController.java
  5. 8 10
      purchase-admin/src/main/java/com/ozs/web/controller/plan/PlanYearsController.java
  6. 34 2
      purchase-admin/src/main/java/com/ozs/web/controller/plan/ProvisionalPlanController.java
  7. 43 0
      purchase-admin/src/main/java/com/ozs/web/controller/pm/PmContractInfoController.java
  8. 22 10
      purchase-admin/src/main/java/com/ozs/web/controller/pm/PmDemandController.java
  9. 43 0
      purchase-admin/src/main/java/com/ozs/web/controller/pm/PmProjectConstructionController.java
  10. 43 0
      purchase-admin/src/main/java/com/ozs/web/controller/pm/PmPurchaseExecutionController.java
  11. 64 0
      purchase-admin/src/main/java/com/ozs/web/controller/pm/PmTaskReleaseController.java
  12. 1 1
      purchase-admin/src/main/resources/application-test.yml
  13. 13 5
      purchase-common/src/main/java/com/ozs/common/constant/Constants.java
  14. 9 0
      purchase-common/src/main/java/com/ozs/common/enums/ProjectAttribute.java
  15. 2 1
      purchase-common/src/main/java/com/ozs/common/enums/SysFileRefEnum.java
  16. 6 0
      purchase-system/src/main/java/com/ozs/base/domain/BaseProfessional.java
  17. 44 6
      purchase-system/src/main/java/com/ozs/base/domain/vo/BaseProfessionalVo.java
  18. 3 3
      purchase-system/src/main/java/com/ozs/base/service/BaseProfessionalService.java
  19. 7 7
      purchase-system/src/main/java/com/ozs/base/service/impl/BaseProfessionalServiceImpl.java
  20. 73 0
      purchase-system/src/main/java/com/ozs/base/vo/BaseProjectInfo.java
  21. 185 0
      purchase-system/src/main/java/com/ozs/plan/doman/PlanQuarter.java
  22. 22 12
      purchase-system/src/main/java/com/ozs/plan/doman/PlanYears.java
  23. 33 3
      purchase-system/src/main/java/com/ozs/plan/doman/ProvisionalPlan.java
  24. 164 0
      purchase-system/src/main/java/com/ozs/plan/doman/vo/requestVo/PlanQuarterStandardVo.java
  25. 14 2
      purchase-system/src/main/java/com/ozs/plan/doman/vo/requestVo/PlanYearsStandardVo.java
  26. 10 0
      purchase-system/src/main/java/com/ozs/plan/doman/vo/requestVo/ProvisionalPlanVo.java
  27. 126 0
      purchase-system/src/main/java/com/ozs/plan/doman/vo/responseVo/PlanQuarterResponseVo.java
  28. 3 3
      purchase-system/src/main/java/com/ozs/plan/doman/vo/responseVo/PlanYearsResponseVo.java
  29. 90 0
      purchase-system/src/main/java/com/ozs/plan/mapper/PlanQuarterMapper.java
  30. 1 1
      purchase-system/src/main/java/com/ozs/plan/mapper/PlanYearsMapper.java
  31. 8 0
      purchase-system/src/main/java/com/ozs/plan/mapper/ProvisionalPlanMapper.java
  32. 153 0
      purchase-system/src/main/java/com/ozs/plan/service/PlanQuarterService.java
  33. 18 2
      purchase-system/src/main/java/com/ozs/plan/service/PlanYearsService.java
  34. 12 1
      purchase-system/src/main/java/com/ozs/plan/service/ProvisionalPlanService.java
  35. 564 0
      purchase-system/src/main/java/com/ozs/plan/service/impl/PlanQuarterServiceImpl.java
  36. 107 25
      purchase-system/src/main/java/com/ozs/plan/service/impl/PlanYearsServiceImpl.java
  37. 230 0
      purchase-system/src/main/java/com/ozs/plan/service/impl/ProvisionalPlanServiceImpl.java
  38. 6 0
      purchase-system/src/main/java/com/ozs/pm/doman/PmDemand.java
  39. 5 4
      purchase-system/src/main/java/com/ozs/pm/doman/vo/requestVo/PmDemandReqVo.java
  40. 6 0
      purchase-system/src/main/java/com/ozs/pm/doman/vo/responseVo/PmDemandResVo.java
  41. 1 0
      purchase-system/src/main/java/com/ozs/pm/mapper/PmDemandMapper.java
  42. 13 3
      purchase-system/src/main/java/com/ozs/pm/service/IPmDemandService.java
  43. 95 20
      purchase-system/src/main/java/com/ozs/pm/service/impl/PmDemandServiceImpl.java
  44. 13 12
      purchase-system/src/main/java/com/ozs/system/service/impl/SysDictTypeServiceImpl.java
  45. 187 0
      purchase-system/src/main/resources/mapper/plan/PlanQuarterMapper.xml
  46. 8 8
      purchase-system/src/main/resources/mapper/plan/PlanYearsMapper.xml
  47. 0 30
      purchase-system/src/main/resources/mapper/plan/ProvisionalPlan.xml
  48. 107 0
      purchase-system/src/main/resources/mapper/plan/ProvisionalPlanMapper.xml
  49. 11 3
      purchase-system/src/main/resources/mapper/pm/PmDemandMapper.xml

+ 149 - 8
purchase-admin/src/main/java/com/ozs/web/controller/base/BaseAgencyController.java

@@ -5,16 +5,30 @@ 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;
@@ -22,6 +36,10 @@ 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)
@@ -32,12 +50,22 @@ 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) {
+                                       @RequestBody BaseAgency baseAgency) {
 //        if (ObjectUtils.isEmpty(baseAgency)) {
 //            return error("数据为空");
 //        }
@@ -66,7 +94,7 @@ public class BaseAgencyController extends BaseController {
     @PreAuthorize("@ss.hasPermi('base:agency:edit')")
     @Log(title = ModularConstans.agency, businessType = BusinessType.UPDATE)
     public AjaxResult updateInfo(@NotEmpty(message = "数据为空")
-                                             @RequestBody BaseAgency baseAgency) {
+                                 @RequestBody BaseAgency baseAgency) {
         baseAgency.setUpdateTime(new Date());
         baseAgency.setUpdated(getUserId().toString());
         return toAjax(baseAgencyService.updateInfo(baseAgency));
@@ -105,16 +133,129 @@ public class BaseAgencyController extends BaseController {
     @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.getCompanyName())) {
+            lw.like(BaseAgency::getCompanyName, vo.getCompanyName());
         }
-        if(!StringUtils.isBlank(vo.getCompanyNature())){
-            lw.eq(BaseAgency::getCompanyNature,vo.getCompanyNature());
+        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.getStatus())) {
+            lw.eq(BaseAgency::getStatus, vo.getStatus());
         }
         IPage<BaseAgency> page = baseAgencyService.page(new Page<BaseAgency>(vo.getPageNum(), vo.getPageSize()), lw);
         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.BID_INFO_WAIT_FILL.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));
+    }
+
 }

+ 14 - 10
purchase-admin/src/main/java/com/ozs/web/controller/base/BaseProfessionalController.java

@@ -5,9 +5,12 @@ import com.ozs.base.domain.vo.BaseProfessionalVo;
 import com.ozs.base.service.BaseProfessionalService;
 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.exception.ServiceException;
 import com.ozs.common.utils.StringUtils;
 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 org.springframework.beans.factory.annotation.Autowired;
@@ -36,8 +39,9 @@ public class BaseProfessionalController extends BaseController {
         if (StringUtils.isNull(baseProfessional)
                 || StringUtils.isNull(baseProfessional.getProfessionalName())
                 || StringUtils.isNull(baseProfessional.getProfessionalCode())
-                || StringUtils.isNull(baseProfessional.getProfessionalGrade())) {
-            return error("专业库名称、编码、一级分类不能为空");
+                || StringUtils.isNull(baseProfessional.getProfessionalGrade())
+                || StringUtils.isNull(baseProfessional.getParentCode())) {
+            return error("专业库名称、编码、一级分类、父级ID 不能为空");
         }
         return toAjax(baseProfessionalService.save(baseProfessional));
     }
@@ -70,28 +74,28 @@ public class BaseProfessionalController extends BaseController {
     @ApiOperation(value = "查询专业库树结构", notes = "非必传 查询条件:品目名称")
     @PostMapping("/selectBaseProfessional")
     public AjaxResult selectBaseProfessional(@RequestBody BaseProfessionalVo baseProfessionalVo) {
-        List<BaseProfessionalVo> baseSupplierList = baseProfessionalService.selectBaseProfessional(baseProfessionalVo);
+        List<BaseProfessionalVo> baseSupplierList = baseProfessionalService.selectBaseProfessionalVo(baseProfessionalVo);
         return success(baseSupplierList);
     }
 
     @ApiOperation(value = "导入专业库", notes = "导入表格")
     @PostMapping("/importBaseProfessional")
-    public AjaxResult importBaseProfessional(@RequestBody MultipartFile file) throws Exception {
-        ExcelUtil<BaseProfessional> util = new ExcelUtil<BaseProfessional>(BaseProfessional.class);
+    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);
+        String message = baseProfessionalService.importBaseProfessional(baseProfessionalList, updateSupport);
         return success(message);
     }
 
     @ApiOperation("导出专业库")
     @PostMapping("/exportBaseProfessional")
-    public void exportBaseProfessional(HttpServletResponse response, BaseProfessional baseProfessional) {
-        List<BaseProfessional> list = baseProfessionalService.selectBaseProfessional(baseProfessional);
-        ExcelUtil<BaseProfessional> util = new ExcelUtil<BaseProfessional>(BaseProfessional.class);
-        util.exportExcel(response, list, "参数数据");
+    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, "专业库数据");
     }
 }

+ 2 - 1
purchase-admin/src/main/java/com/ozs/web/controller/plan/MonthlyReconciliationController.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ozs.base.domain.BaseNoticeType;
 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;
@@ -84,7 +85,7 @@ public class MonthlyReconciliationController extends BaseController {
                     dto.setPurchaseDeptName(sysDept.getDeptName());
                 }
                 // 采购服务站名称
-                List<SysDictData> data = dictTypeService.selectDictDataByType("purchase_services");
+                List<SysDictData> data = dictTypeService.selectDictDataByType(Constants.PURCHASE_SERVICES);
                 if (!ObjectUtils.isEmpty(data)) {
                     List<SysDictData> collect = data.stream()
                             .filter(d -> d.getDictValue().equals(dto.getPurchaseServices())).collect(Collectors.toList());

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

@@ -0,0 +1,156 @@
+package com.ozs.web.controller.plan;
+
+import com.github.pagehelper.PageInfo;
+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.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.requestVo.PlanYearsStandardVo;
+import com.ozs.plan.service.PlanQuarterService;
+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;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 季度计划信息控制层
+ *
+ * @author buzhanyi
+ */
+@RestController
+@RequestMapping("/plan/quarter")
+public class PlanQuarterController extends BaseController {
+    @Autowired
+    private PlanQuarterService quarterService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation(value = "查询季度计划")
+    @PostMapping("/list")
+    public AjaxResult list(@RequestBody PlanQuarterStandardVo quarterStandardVo) {
+        PageInfo<PlanQuarter> page = quarterService.selectPlanQuarterList(quarterStandardVo);
+        return AjaxResult.success(page);
+    }
+
+    @ApiOperation(value = "审核单位查询季度计划")
+    @PostMapping("/examineList")
+    public AjaxResult examineList(@RequestBody PlanQuarterStandardVo quarterStandardVo) {
+        PageInfo<PlanQuarter> page = quarterService.selectPlanQuarterExamineList(quarterStandardVo);
+        return AjaxResult.success(page);
+    }
+
+    @ApiOperation(value = "导出季度计划数据")
+    @PostMapping("/exportPlan")
+    public void exportPlan(HttpServletResponse response, @RequestBody PlanQuarterStandardVo quarterStandardVo) throws Exception {
+        List<PlanQuarter> list = quarterService.selectPlanQuarterListEXP(quarterStandardVo);
+        ExcelUtil<PlanQuarter> util = new ExcelUtil<>(PlanQuarter.class);
+        util.exportExcel(response, list, "季度计划数据");
+    }
+
+    @ApiOperation(value = "导出季度计划数据(审核单位)")
+    @PostMapping("/exportPlanExamine")
+    public void exportPlanExamine(HttpServletResponse response, @RequestBody PlanQuarterStandardVo quarterStandardVo) throws Exception {
+        List<PlanQuarter> list = quarterService.selectPlanQuarterExamineListEXP(quarterStandardVo);
+        ExcelUtil<PlanQuarter> util = new ExcelUtil<>(PlanQuarter.class);
+        util.exportExcel(response, list, "季度计划数据(审核单位)");
+    }
+
+    @ApiOperation(value = "创建季度计划")
+    @PostMapping("/add")
+    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")
+    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")
+    public AjaxResult commit(@RequestBody PlanQuarterStandardVo quarterStandardVo) {
+        return quarterService.commit(quarterStandardVo);
+    }
+
+    @ApiOperation(value = "删除季度计划")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody PlanQuarterStandardVo quarterStandardVo) {
+        return quarterService.deletePlanQuarterById(quarterStandardVo.getPlanPracticalId());
+    }
+
+    @ApiOperation(value = "根据id获取季度计划信息")
+    @PostMapping("/view")
+    public AjaxResult view(@RequestBody PlanQuarterStandardVo quarterStandardVo) {
+        return quarterService.view(quarterStandardVo);
+    }
+
+    @ApiOperation(value = "审核季度计划通过")
+    @PostMapping("/reviewTo")
+    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")
+    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")
+    public AjaxResult appUpdate(@RequestBody PlanQuarterStandardVo quarterStandardVo) {
+        return quarterService.appUpdate(quarterStandardVo);
+    }
+
+    @ApiOperation(value = "发函催告")
+    @PostMapping("/sendLetter")
+    public AjaxResult sendLetter(@RequestBody PlanQuarterStandardVo quarterStandardVo) {
+        return quarterService.sendLetter(quarterStandardVo);
+    }
+
+    @ApiOperation(value = "上传计划关联文件后保存文件信息")
+    @PostMapping("/upLoadPlanFile")
+    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")
+    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);
+    }
+
+
+}

+ 8 - 10
purchase-admin/src/main/java/com/ozs/web/controller/plan/PlanYearsController.java

@@ -53,18 +53,16 @@ public class PlanYearsController extends BaseController {
     @ApiOperation(value = "导出年度计划数据")
     @PostMapping("/exportPlan")
     public void exportPlan(HttpServletResponse response, @RequestBody PlanYearsStandardVo yearsStandardVo) throws Exception {
-        PageInfo<PlanYears> page = planYearsService.selectPlanYearsList(yearsStandardVo);
-        List<PlanYears> list = page.getList();
-        ExcelUtil<PlanYears> util = new ExcelUtil<PlanYears>(PlanYears.class);
+        List<PlanYears> list = planYearsService.selectPlanYearsListEXP(yearsStandardVo);
+        ExcelUtil<PlanYears> util = new ExcelUtil<>(PlanYears.class);
         util.exportExcel(response, list, "年度计划数据");
     }
 
     @ApiOperation(value = "导出年度计划数据(审核单位)")
     @PostMapping("/exportPlanExamine")
     public void exportPlanExamine(HttpServletResponse response, @RequestBody PlanYearsStandardVo yearsStandardVo) throws Exception {
-        PageInfo<PlanYears> page = planYearsService.selectPlanYearsExamineList(yearsStandardVo);
-        List<PlanYears> list = page.getList();
-        ExcelUtil<PlanYears> util = new ExcelUtil<PlanYears>(PlanYears.class);
+        List<PlanYears> list = planYearsService.selectPlanYearsExamineListEXP(yearsStandardVo);
+        ExcelUtil<PlanYears> util = new ExcelUtil<>(PlanYears.class);
         util.exportExcel(response, list, "年度计划数据(审核单位)");
     }
 
@@ -73,7 +71,7 @@ public class PlanYearsController extends BaseController {
     public AjaxResult add(@RequestBody PlanYearsStandardVo yearsStandardVo, HttpServletRequest request) {
         //获取采购单位-
         LoginUser loginUser = tokenService.getLoginUser(request);
-        yearsStandardVo.setPurchaseDeptId(loginUser.getDeptId());
+        yearsStandardVo.setPurchaseDeptId(String.valueOf(loginUser.getDeptId()));
         yearsStandardVo.setCreated(String.valueOf(loginUser.getUserId()));
         return planYearsService.insertPlanYears(yearsStandardVo);
     }
@@ -123,7 +121,7 @@ public class PlanYearsController extends BaseController {
     @ApiOperation(value = "申请修改年度计划")
     @PostMapping("/appUpdate")
     public AjaxResult appUpdate(@RequestBody PlanYearsStandardVo yearsStandardVo) {
-        return planYearsService.reviewReturn(yearsStandardVo);
+        return planYearsService.appUpdate(yearsStandardVo);
     }
 
     @ApiOperation(value = "发函催告")
@@ -147,8 +145,8 @@ public class PlanYearsController extends BaseController {
     @ApiOperation(value = "导入年度计划数据")
     @PostMapping("/importData")
     public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception {
-        ExcelUtil<PlanYears> util = new ExcelUtil<>(PlanYears.class);
-        List<PlanYears> planYears = util.importExcel(file.getInputStream());
+        ExcelUtil<PlanYearsStandardVo> util = new ExcelUtil<>(PlanYearsStandardVo.class);
+        List<PlanYearsStandardVo> planYears = util.importExcel(file.getInputStream());
         //获取采购单位-
         LoginUser loginUser = getLoginUser();
         String message = planYearsService.importPlanYears(planYears, updateSupport, loginUser);

+ 34 - 2
purchase-admin/src/main/java/com/ozs/web/controller/plan/ProvisionalPlanController.java

@@ -9,9 +9,13 @@ 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.exception.ServiceException;
 import com.ozs.common.utils.StringUtils;
+import com.ozs.common.utils.poi.ExcelUtil;
 import com.ozs.framework.web.service.TokenService;
+import com.ozs.plan.doman.PlanYears;
 import com.ozs.plan.doman.ProvisionalPlan;
+import com.ozs.plan.doman.vo.requestVo.PlanYearsStandardVo;
 import com.ozs.plan.doman.vo.requestVo.ProvisionalPlanVo;
 import com.ozs.plan.service.ProvisionalPlanService;
 import io.swagger.annotations.Api;
@@ -23,9 +27,12 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.util.Date;
+import java.util.List;
 
 /**
  * 临时计划
@@ -64,7 +71,7 @@ public class ProvisionalPlanController extends BaseController {
         if (StringUtils.isNull(provisionalPlan) || StringUtils.isNull(provisionalPlan.getPlanYearId())) {
             return error("专家库id不能为空");
         }
-        return toAjax(provisionalPlanService.removeById(provisionalPlan.getPlanYearId()));
+        return toAjax(provisionalPlanService.deleteProvisionalPlanById(provisionalPlan.getPlanYearId()));
     }
 
     @ApiOperation(value = "修改临时计划", notes = "必传 plan_year_id 及修改数据")
@@ -73,7 +80,7 @@ public class ProvisionalPlanController extends BaseController {
         if (StringUtils.isNull(provisionalPlan) || StringUtils.isNull(provisionalPlan.getPlanYearId())) {
             return error("专家库id和修改数据不能为空");
         }
-        return toAjax(provisionalPlanService.updateById(provisionalPlan));
+        return toAjax(provisionalPlanService.updateProvisionalPlanById(provisionalPlan));
     }
 
     @ApiOperation(value = "查询临时计划")
@@ -91,7 +98,32 @@ public class ProvisionalPlanController extends BaseController {
         if (!ObjectUtils.isEmpty(provisionalPlanVo.getProjectStatus())) {
             lw.eq(ProvisionalPlan::getProjectStatus, provisionalPlanVo.getProjectStatus());
         }
+        if (!ObjectUtils.isEmpty(provisionalPlanVo.getStartTime()) || !ObjectUtils.isEmpty(provisionalPlanVo.getEndTime())) {
+            lw.between(ProvisionalPlan::getPlanDemandSubTime, provisionalPlanVo.getStartTime(), provisionalPlanVo.getEndTime());
+        }
         IPage<ProvisionalPlan> page = provisionalPlanService.page(new Page<ProvisionalPlan>(provisionalPlanVo.getPageNum(), provisionalPlanVo.getPageSize()), lw);
         return success(page);
     }
+
+    @ApiOperation(value = "导入年临时计划")
+    @PostMapping("/importProvisionalPlan")
+    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")
+    public void exportProvisionalPlan(HttpServletResponse response, @RequestBody ProvisionalPlanVo provisionalPlanVo) throws Exception {
+        List<ProvisionalPlan> list = provisionalPlanService.selectProvisionalPlanExport(provisionalPlanVo);
+        ExcelUtil<ProvisionalPlan> util = new ExcelUtil<>(ProvisionalPlan.class);
+        util.exportExcel(response, list, "临时计划数据");
+    }
 }

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

@@ -0,0 +1,43 @@
+package com.ozs.web.controller.pm;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.ozs.common.core.controller.BaseController;
+import com.ozs.common.core.domain.AjaxResult;
+import com.ozs.framework.web.service.TokenService;
+import com.ozs.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.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;
+
+/**
+ * 合同信息Controller
+ *
+ * @author ruoyi
+ * @date 2023-01-16
+ */
+@Api(tags = "合同信息")
+@RestController
+@RequestMapping("/pm/contractInfo")
+public class PmContractInfoController extends BaseController {
+    @Autowired
+    private IPmDemandService pmDemandService;
+    @Autowired
+    private TokenService tokenService;
+
+    /**
+     * 合同信息查询列表
+     */
+    @ApiOperation(value = "合同信息查询列表", notes = "参数非必传")
+    @PostMapping("/list")
+    public AjaxResult list(@RequestBody PmDemandReqVo pmDemandReqVo) {
+        IPage<PmDemandResVo> page  = pmDemandService.selectPmDemandList(pmDemandReqVo,4);
+        return success(page);
+    }
+}

+ 22 - 10
purchase-admin/src/main/java/com/ozs/web/controller/pm/PmDemandController.java

@@ -1,14 +1,14 @@
 package com.ozs.web.controller.pm;
 
-import java.util.List;
 
-import com.github.pagehelper.PageInfo;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.ozs.common.core.domain.model.LoginUser;
 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.web.bind.annotation.PostMapping;
@@ -26,6 +26,7 @@ import javax.servlet.http.HttpServletRequest;
  * @author ruoyi
  * @date 2023-01-16
  */
+@Api(tags = "采购需求")
 @RestController
 @RequestMapping("/pm/demand")
 public class PmDemandController extends BaseController {
@@ -40,9 +41,9 @@ public class PmDemandController extends BaseController {
     @ApiOperation(value = "查询采购需求列表", notes = "参数非必传")
     @PostMapping("/list")
     public AjaxResult list(@RequestBody PmDemandReqVo pmDemandReqVo) {
-        List<PmDemandResVo> list = pmDemandService.selectPmDemandList(pmDemandReqVo);
-        PageInfo<PmDemandResVo> page = new PageInfo<>(list);
+        IPage<PmDemandResVo> page  = pmDemandService.selectPmDemandList(pmDemandReqVo,0);
         return success(page);
+
     }
 
     /**
@@ -65,6 +66,14 @@ public class PmDemandController extends BaseController {
         return toAjax(pmDemandService.bookBuilding(pmBookBuildingReqVo));
     }
 
+    @ApiOperation(value = "提交采购需求", notes = "必传demandId,其他字段不传")
+    @PostMapping("/commit")
+    public AjaxResult commit(@RequestBody PmDemandReqVo pmDemandReqVo, HttpServletRequest request) {
+        LoginUser loginUser = tokenService.getLoginUser(request);
+        pmDemandReqVo.setUpdateBy(String.valueOf(loginUser.getUserId()));
+        return toAjax(pmDemandService.commit(pmDemandReqVo));
+    }
+
     /**
      * 查看流程图,获取当前阶段名字
      */
@@ -83,12 +92,15 @@ public class PmDemandController extends BaseController {
         return success(pmDemandService.getModuleInfo(pmRequestVo.getDemandId(),pmRequestVo.getModuleName()));
     }
 
-    @ApiOperation(value = "提交采购需求", notes = "必传demandId,其他字段不传")
-    @PostMapping("/commit")
-    public AjaxResult commit(@RequestBody PmDemandReqVo pmDemandReqVo, HttpServletRequest request) {
-        LoginUser loginUser = tokenService.getLoginUser(request);
-        pmDemandReqVo.setUpdateBy(String.valueOf(loginUser.getUserId()));
-        return toAjax(pmDemandService.commit(pmDemandReqVo));
+
+    /**
+     * 审核单位查询采购需求列表
+     */
+    @ApiOperation(value = "审核单位查询采购需求列表", notes = "参数非必传")
+    @PostMapping("/examineList")
+    public AjaxResult examineList(@RequestBody PmDemandReqVo pmDemandReqVo) {
+        IPage<PmDemandResVo> page  = pmDemandService.selectPmDemandList(pmDemandReqVo,1);
+        return success(page);
     }
 
     @ApiOperation(value = "审核采购需求通过", notes = "必传demandId和上传附件,其他字段不传")

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

@@ -0,0 +1,43 @@
+package com.ozs.web.controller.pm;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.ozs.common.core.controller.BaseController;
+import com.ozs.common.core.domain.AjaxResult;
+import com.ozs.framework.web.service.TokenService;
+import com.ozs.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.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;
+
+/**
+ * 项目建设Controller
+ *
+ * @author ruoyi
+ * @date 2023-01-16
+ */
+@Api(tags = "项目建设")
+@RestController
+@RequestMapping("/pm/projectConstruction")
+public class PmProjectConstructionController extends BaseController {
+    @Autowired
+    private IPmDemandService pmDemandService;
+    @Autowired
+    private TokenService tokenService;
+
+    /**
+     * 项目建设查询列表
+     */
+    @ApiOperation(value = "项目建设查询列表", notes = "参数非必传")
+    @PostMapping("/list")
+    public AjaxResult list(@RequestBody PmDemandReqVo pmDemandReqVo) {
+        IPage<PmDemandResVo> page  = pmDemandService.selectPmDemandList(pmDemandReqVo,5);
+        return success(page);
+    }
+}

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

@@ -0,0 +1,43 @@
+package com.ozs.web.controller.pm;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.ozs.common.core.controller.BaseController;
+import com.ozs.common.core.domain.AjaxResult;
+import com.ozs.framework.web.service.TokenService;
+import com.ozs.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.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;
+
+/**
+ * 采购执行Controller
+ *
+ * @author ruoyi
+ * @date 2023-01-16
+ */
+@Api(tags = "采购执行")
+@RestController
+@RequestMapping("/pm/purchaseExecution")
+public class PmPurchaseExecutionController extends BaseController {
+    @Autowired
+    private IPmDemandService pmDemandService;
+    @Autowired
+    private TokenService tokenService;
+
+    /**
+     * 采购执行查询列表
+     */
+    @ApiOperation(value = "采购执行查询列表", notes = "参数非必传")
+    @PostMapping("/list")
+    public AjaxResult list(@RequestBody PmDemandReqVo pmDemandReqVo) {
+        IPage<PmDemandResVo> page  = pmDemandService.selectPmDemandList(pmDemandReqVo,3);
+        return success(page);
+    }
+}

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

@@ -0,0 +1,64 @@
+package com.ozs.web.controller.pm;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.ozs.common.core.controller.BaseController;
+import com.ozs.common.core.domain.AjaxResult;
+import com.ozs.common.core.domain.model.LoginUser;
+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.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")
+    public AjaxResult list(@RequestBody PmDemandReqVo pmDemandReqVo) {
+        IPage<PmDemandResVo> page  = pmDemandService.selectPmDemandList(pmDemandReqVo,2);
+        return success(page);
+    }
+
+    @ApiOperation(value = "下达任务", notes = "必传demandId和上传附件,其他字段不传")
+    @PostMapping("/releaseTask")
+    public AjaxResult releaseTask(@RequestBody PmDemandReqVo pmDemandReqVo, HttpServletRequest request) {
+        LoginUser loginUser = tokenService.getLoginUser(request);
+        pmDemandReqVo.setUpdateBy(String.valueOf(loginUser.getUserId()));
+        return toAjax(pmDemandService.releaseTask(pmDemandReqVo));
+    }
+
+    /**
+     * 获取采购需求详细信息
+     */
+    @ApiOperation(value = "获取采购需求详细信息", notes = "必传demandId,其他字段不传")
+    @PostMapping("/view")
+    public AjaxResult view(@RequestBody PmDemandReqVo pmDemandReqVo) {
+        return success(pmDemandService.selectPmDemandByDemandId(pmDemandReqVo.getDemandId()));
+    }
+}

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

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

+ 13 - 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,20 @@ 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";
 }

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

@@ -26,4 +26,13 @@ public enum ProjectAttribute {
     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;
+    }
 }

+ 2 - 1
purchase-common/src/main/java/com/ozs/common/enums/SysFileRefEnum.java

@@ -17,7 +17,8 @@ public enum SysFileRefEnum {
     PM_DEMAND_MATERIALS(6, "采购需求物资类附件"),
     PM_DEMAND_SERVE(7, "采购需求服务类附件"),
     PM_DEMAND_ENGINEERING(8, "采购需求工程类附件"),
-    PM_DEMAND_EXAMINE(9, "采购需求审核文件")
+    PM_DEMAND_EXAMINE(9, "采购需求审核文件"),
+    PM_TAST_RELEASE(10, "任务下达文件")
     ;
 
     private Integer type;

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

@@ -2,6 +2,7 @@ package com.ozs.base.domain;
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.ozs.common.annotation.Excel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -19,6 +20,7 @@ public class BaseProfessional {
     /**
      * 品目名称
      */
+    @Excel(name = "品目名称")
     @ApiModelProperty(value = "品目名称")
     @TableField("professional_name")
     private String professionalName;
@@ -26,6 +28,7 @@ public class BaseProfessional {
     /**
      * 编码
      */
+    @Excel(name = "编码")
     @ApiModelProperty(value = "编码")
     @TableField("professional_code")
     private String professionalCode;
@@ -33,6 +36,7 @@ public class BaseProfessional {
     /**
      * 说明
      */
+    @Excel(name = "说明")
     @ApiModelProperty(value = "说明")
     @TableField("purchase_state")
     private String purchaseState;
@@ -40,6 +44,7 @@ public class BaseProfessional {
     /**
      * 一级分类
      */
+    @Excel(name = "一级分类")
     @ApiModelProperty(value = "一级分类")
     @TableField("professional_grade")
     private String professionalGrade;
@@ -47,6 +52,7 @@ public class BaseProfessional {
     /**
      * 父级编码
      */
+    @Excel(name = "父级编码")
     @ApiModelProperty(value = "父级编码")
     @TableField("parent_code")
     private String parentCode;

+ 44 - 6
purchase-system/src/main/java/com/ozs/base/domain/vo/BaseProfessionalVo.java

@@ -1,6 +1,9 @@
 package com.ozs.base.domain.vo;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.ozs.base.domain.BaseProfessional;
+import com.ozs.common.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -8,12 +11,47 @@ import java.util.List;
 
 @Data
 public class BaseProfessionalVo extends BaseProfessional {
-//    private Integer id;
-//    private String professionalName;
-//    private String professionalCode;
-//    private String purchaseState;
-//    private String professionalGrade;
-//    private String parentCode;
+    /**
+     * 主键ID
+     */
+    @ApiModelProperty(value = "id")
+    private Integer id;
+
+    /**
+     * 品目名称
+     */
+    @Excel(name = "品目名称")
+    @ApiModelProperty(value = "品目名称")
+    private String professionalName;
+
+    /**
+     * 编码
+     */
+    @Excel(name = "编码")
+    @ApiModelProperty(value = "编码")
+    private String professionalCode;
+
+    /**
+     * 说明
+     */
+    @Excel(name = "说明")
+    @ApiModelProperty(value = "说明")
+    private String purchaseState;
+
+    /**
+     * 一级分类
+     */
+    @Excel(name = "一级分类")
+    @ApiModelProperty(value = "一级分类")
+    private String professionalGrade;
+
+    /**
+     * 父级编码
+     */
+    @Excel(name = "父级编码")
+    @ApiModelProperty(value = "父级编码")
+    private String parentCode;
+
     private List<BaseProfessionalVo> baseProfessionalVoList;
     private List<Integer> deleteIds;
 }

+ 3 - 3
purchase-system/src/main/java/com/ozs/base/service/BaseProfessionalService.java

@@ -7,10 +7,10 @@ import com.ozs.base.domain.vo.BaseProfessionalVo;
 import java.util.List;
 
 public interface BaseProfessionalService extends IService<BaseProfessional> {
-    List<BaseProfessionalVo> selectBaseProfessional(BaseProfessionalVo baseProfessional);
-    List<BaseProfessional> selectBaseProfessional(BaseProfessional baseProfessional);
+    List<BaseProfessionalVo> selectBaseProfessionalVo(BaseProfessionalVo baseProfessional);
+    List<BaseProfessional> selectBaseProfessional(BaseProfessionalVo baseProfessionalVo);
 
     void deleteIds(List<Integer> deleteIds);
 
-    String importBaseProfessional(List<BaseProfessional> userList);
+    String importBaseProfessional(List<BaseProfessional> userList, boolean updateSupport);
 }

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

@@ -40,12 +40,12 @@ public class BaseProfessionalServiceImpl extends ServiceImpl<BaseProfessionalMap
     }
 
     @Override
-    public String importBaseProfessional(List<BaseProfessional> userList) {
+    public String importBaseProfessional(List<BaseProfessional> baseProfessionalList, boolean updateSupport) {
         int successNum = 0;
         int failureNum = 0;
         StringBuilder successMsg = new StringBuilder();
         StringBuilder failureMsg = new StringBuilder();
-        for (BaseProfessional baseProfessional : userList) {
+        for (BaseProfessional baseProfessional : baseProfessionalList) {
             try {
                 // 判断编码是否存在
                 List<BaseProfessional> professionalCode = baseProfessionalMapper.selectByProfessionalCode(baseProfessional);
@@ -59,7 +59,7 @@ public class BaseProfessionalServiceImpl extends ServiceImpl<BaseProfessionalMap
                     BeanValidators.validateWithException(validator, baseProfessional);
                     baseProfessionalMapper.insert(baseProfessional);
                     successNum++;
-                    successMsg.append("<br/>" + successNum + "、专业名称 " + baseProfessional.getProfessionalName() + " 导入成功");
+                    // successMsg.append("<br/>" + successNum + "、专业名称 " + baseProfessional.getProfessionalName() + " 导入成功");
                 }
             } catch (Exception e) {
                 failureNum++;
@@ -72,13 +72,13 @@ public class BaseProfessionalServiceImpl extends ServiceImpl<BaseProfessionalMap
             failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
             throw new ServiceException(failureMsg.toString());
         } else {
-            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条");
         }
         return successMsg.toString();
     }
 
     @Override
-    public List<BaseProfessionalVo> selectBaseProfessional(BaseProfessionalVo baseProfessionalVo) {
+    public List<BaseProfessionalVo> selectBaseProfessionalVo(BaseProfessionalVo baseProfessionalVo) {
         List<BaseProfessional> allList = baseProfessionalMapper.selectBaseProfessional(baseProfessionalVo);
         // 将实体类转换为Vo类
         List<BaseProfessionalVo> allListVo = BeanUtils.entityListToVOList(allList, BaseProfessionalVo.class);
@@ -87,8 +87,8 @@ public class BaseProfessionalServiceImpl extends ServiceImpl<BaseProfessionalMap
     }
 
     @Override
-    public List<BaseProfessional> selectBaseProfessional(BaseProfessional baseProfessional) {
-        List<BaseProfessional> allList = baseProfessionalMapper.selectBaseProfessional(baseProfessional);
+    public List<BaseProfessional> selectBaseProfessional(BaseProfessionalVo baseProfessionalVo) {
+        List<BaseProfessional> allList = baseProfessionalMapper.selectBaseProfessional(baseProfessionalVo);
         return allList;
     }
 

+ 73 - 0
purchase-system/src/main/java/com/ozs/base/vo/BaseProjectInfo.java

@@ -0,0 +1,73 @@
+package com.ozs.base.vo;
+
+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 com.ozs.common.annotation.Excel;
+import com.ozs.common.core.domain.BaseEntity;
+import com.ozs.system.domain.SysFileInfo;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("项目信息")
+public class BaseProjectInfo
+{
+    private static final long serialVersionUID = 1L;
+
+    /*实际完成采购时间是指采购执行管理中,点击填制中标信息,弹出框中,填写的中标时间
+    * 实际提报时间就是指采购需求管理中"提交"的时间*/
+
+    /** 主键 */
+    @TableId(type = IdType.AUTO)
+    private Long demandId;
+
+    /** 采购单位(登录账号的单位) */
+    @Excel(name = "采购单位", readConverterExp = "登=录账号的单位")
+    @TableField(exist = false)
+    private String purchaseDeptName;
+
+    /** 项目名称 */
+    @Excel(name = "项目名称")
+    private String projectName;
+
+    /** 项目类型(0:装备类;1:物资类;2:服务类;3:工程类) */
+    @Excel(name = "项目类型", readConverterExp = "0=:装备类;1:物资类;2:服务类;3:工程类")
+    private String projectTypeStr;
+
+
+    /** 概算金额(万元(保留小数点后两位) */
+    @Excel(name = "概算金额(万元", readConverterExp = "保=留小数点后两位")
+    private BigDecimal evaluation;
+
+
+    /** 项目属性(0:应急应战项目, 1:重大规划任务项目, 2:规划任务项目, 3:一般项目) */
+    @Excel(name = "项目属性", readConverterExp = "0=:应急应战项目,,1=:重大规划任务项目,,2=:规划任务项目,,3=:一般项目")
+    private String projectAttrStr;
+
+
+    /** 抽取招标代理机构id */
+    @Excel(name = "抽取招标代理机构")
+    private String agencyName;
+
+    /** 抽取招标代理机构时间 */
+    @Excel(name = "抽取招标代理机构时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date extractAgencyTime;
+
+
+
+}

+ 185 - 0
purchase-system/src/main/java/com/ozs/plan/doman/PlanQuarter.java

@@ -0,0 +1,185 @@
+package com.ozs.plan.doman;
+
+
+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 com.ozs.common.annotation.Excel;
+import lombok.Data;
+import nonapi.io.github.classgraph.json.Id;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 季度计划
+ *
+ * @author buzhanyi
+ */
+@Data
+@TableName("plan_practical")
+public class PlanQuarter {
+
+    /**
+     * 主键编号
+     */
+    @Id
+    @TableId(type = IdType.AUTO)
+    private Long planPracticalId;
+    /**
+     * 年度计划id(年度计划审批后同步到季度计划)
+     */
+    private Long planYearId;
+    /**
+     * 采购单位(登录账号的单位)
+     */
+    @NotNull(message = "采购单位不能为空")
+    private Long purchaseDeptId;
+
+    @Excel(name = "采购单位")
+    @TableField(exist = false)
+    private String purchaseDeptName;
+    /**
+     * 项目名称
+     */
+    @Excel(name = "项目名称")
+    @NotNull(message = "项目名称不能为空")
+    private String projectName;
+    /**
+     * 项目类型(0:装备类;1:物资类;2:服务类;3:工程类)
+     */
+    @NotNull(message = "项目类型不能为空")
+    private String projectType;
+    @Excel(name = "项目类型")
+    @TableField(exist = false)
+    private String projectTypeStr;
+    /**
+     * 需求概况
+     */
+    @Excel(name = "需求概况")
+    @NotNull(message = "需求概况不能为空")
+    private String demandOverview;
+    /**
+     * 概算金额(万元(保留小数点后两位)
+     */
+    @Excel(name = "概算金额(万元)")
+    @NotNull(message = "概算金额不能为空")
+    private BigDecimal evaluation;
+    /**
+     * 是否为超限额计划(0:未超额,1:超额)
+     */
+    @NotNull(message = "是否为超限额计划不能为空")
+    private String isExcess;
+    /**
+     * 采购服务站
+     */
+    @NotNull(message = "采购服务站不能为空")
+    private String purchaseServices;
+    @Excel(name = "采购服务站")
+    @TableField(exist = false)
+    private String purchaseServicesStr;
+    /**
+     * 采购方式 (0:公开招标, 1:单一来源,2:邀请招标,3:竞争式谈判,4:询价)
+     */
+    @NotNull(message = "采购方式不能为空")
+    private String purchaseMode;
+    @Excel(name = "采购方式")
+    @TableField(exist = false)
+    private String purchaseModeStr;
+    /**
+     * 计划提报需求时间--->需求单位成功提报采购需求的日期(具体到月)
+     */
+    @Excel(name = "提报需求时间", dateFormat = "yyyy-MM-dd")
+    @NotNull(message = "计划提报需求时间不能为空")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date planDemandSubTime;
+    /**
+     * 计划完成采购时间--->公示中标结果的日期,即填制中标信息的日期(具体到月)
+     */
+    @Excel(name = "完成采购时间", dateFormat = "yyyy-MM-dd")
+    @NotNull(message = "计划完成采购时间不能为空")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date planPurchaseFinishTime;
+    /**
+     * 计划交付时间--->供应商完成并交付后,使用单位收到标的日期,即填制建设文档的日期
+     */
+    @Excel(name = "交付(实施)时间", dateFormat = "yyyy-MM-dd")
+    @NotNull(message = "计划交付时间不能为空")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date planDeliverTime;
+    /**
+     * 项目属性--->应急应战项目、重大规划任务项目、规划任务项目或一般项目
+     */
+    @NotNull(message = "项目属性不能为空")
+    private String projectAttr;
+
+    @Excel(name = "项目属性")
+    @TableField(exist = false)
+    private String projectAttrStr;
+    /**
+     * 退回原因--->审核不通过就是退回
+     */
+    @Excel(name = "退回原因")
+    private String refuseReason;
+    /**
+     * 计划调整情况及理由--->如计划需要变更,在填写申请修改时需填写调整情况及理由,审核单位审核通过后显示
+     */
+    @Excel(name = "计划调整情况及理由")
+    @NotNull(message = "计划调整情况及理由不能为空")
+    private String adjustReason;
+    /**
+     * 备注
+     */
+    @Excel(name = "备注")
+    private String remarks;
+
+    /**
+     * 项目状态--->包括计划待提交、计划待审核、计划已退回、计划已审核
+     * (0:计划待提交,1:计划待审核,2:计划已退回,3:计划已审核)
+     */
+    private String projectStatus;
+    /**
+     * 发函状态(0:未发函或已处理,1:确认发函)
+     */
+    private String sendLetter;
+
+    /**
+     * 创建者
+     */
+    private String created;
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+    /**
+     * 更改者
+     */
+    private String updated;
+    /**
+     * 更改时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+    /**
+     * 逻辑删除字段--->(0:正常,1:已删除)
+     */
+    private Integer delFlay;
+    /**
+     * 计划类型(0:季度计划,1:临时计划)
+     */
+    private Integer planType;
+
+    /**
+     * 查询参数开始时间和结束时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @TableField(exist = false)
+    private Date beginTime;
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @TableField(exist = false)
+    private Date endTime;
+}

+ 22 - 12
purchase-system/src/main/java/com/ozs/plan/doman/PlanYears.java

@@ -2,6 +2,7 @@ package com.ozs.plan.doman;
 
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ozs.common.annotation.Excel;
@@ -9,7 +10,6 @@ import lombok.Data;
 import nonapi.io.github.classgraph.json.Id;
 
 import javax.validation.constraints.NotNull;
-import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
 
@@ -32,6 +32,7 @@ public class PlanYears {
     private Long purchaseDeptId;
 
     @Excel(name = "采购单位")
+    @TableField(exist = false)
     private String purchaseDeptName;
     /**
      * 项目名称
@@ -42,9 +43,10 @@ public class PlanYears {
     /**
      * 项目类型(0:装备类;1:物资类;2:服务类;3:工程类)
      */
-    @Excel(name = "项目类型")
     @NotNull(message = "项目类型不能为空")
     private String projectType;
+    @Excel(name = "项目类型")
+    @TableField(exist = false)
     private String projectTypeStr;
     /**
      * 需求概况
@@ -66,45 +68,54 @@ public class PlanYears {
     /**
      * 采购服务站
      */
-    @Excel(name = "采购服务站")
     @NotNull(message = "采购服务站不能为空")
     private String purchaseServices;
+    @Excel(name = "采购服务站")
+    @TableField(exist = false)
     private String purchaseServicesStr;
     /**
      * 采购方式 (0:公开招标, 1:单一来源,2:邀请招标,3:竞争式谈判,4:询价)
      */
-    @Excel(name = "采购方式")
     @NotNull(message = "采购方式不能为空")
     private String purchaseMode;
+    @Excel(name = "采购方式")
+    @TableField(exist = false)
     private String purchaseModeStr;
     /**
      * 计划提报需求时间--->需求单位成功提报采购需求的日期(具体到月)
      */
-    @Excel(name = "提报需求时间")
+    @Excel(name = "提报需求时间", dateFormat = "yyyy-MM-dd")
     @NotNull(message = "计划提报需求时间不能为空")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date planDemandSubTime;
     /**
      * 计划完成采购时间--->公示中标结果的日期,即填制中标信息的日期(具体到月)
      */
-    @Excel(name = "完成采购时间")
+    @Excel(name = "完成采购时间", dateFormat = "yyyy-MM-dd")
     @NotNull(message = "计划完成采购时间不能为空")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date planPurchaseFinishTime;
     /**
      * 计划交付时间--->供应商完成并交付后,使用单位收到标的日期,即填制建设文档的日期
      */
-    @Excel(name = "交付(实施)时间")
+    @Excel(name = "交付(实施)时间", dateFormat = "yyyy-MM-dd")
     @NotNull(message = "计划交付时间不能为空")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date planDeliverTime;
     /**
      * 项目属性--->应急应战项目、重大规划任务项目、规划任务项目或一般项目
      */
-    @Excel(name = "项目属性")
     @NotNull(message = "项目属性不能为空")
     private String projectAttr;
+
+    @Excel(name = "项目属性")
+    @TableField(exist = false)
     private String projectAttrStr;
+    /**
+     * 退回原因--->审核不通过就是退回
+     */
+    @Excel(name = "退回原因")
+    private String refuseReason;
     /**
      * 计划调整情况及理由--->如计划需要变更,在填写申请修改时需填写调整情况及理由,审核单位审核通过后显示
      */
@@ -126,10 +137,7 @@ public class PlanYears {
      * 发函状态(0:未发函或已处理,1:确认发函)
      */
     private String sendLetter;
-    /**
-     * 退回原因--->审核不通过就是退回
-     */
-    private String refuseReason;
+
 
     /**
      * 创建者
@@ -158,8 +166,10 @@ public class PlanYears {
      * 查询参数开始时间和结束时间
      */
     @JsonFormat(pattern = "yyyy-MM-dd")
+    @TableField(exist = false)
     private Date beginTime;
     @JsonFormat(pattern = "yyyy-MM-dd")
+    @TableField(exist = false)
     private Date endTime;
 
 }

+ 33 - 3
purchase-system/src/main/java/com/ozs/plan/doman/ProvisionalPlan.java

@@ -2,7 +2,8 @@ package com.ozs.plan.doman;
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.ozs.common.vo.PageVo;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ozs.common.annotation.Excel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -16,26 +17,36 @@ public class ProvisionalPlan {
 
     @ApiModelProperty(value = "主键ID")
     @TableField("plan_year_id")
-    private Long planYearId;
+    private Integer planYearId;
 
     @NotNull(message = "采购单位不能为空")
     @ApiModelProperty(value = "采购单位(登录账号的单位)")
     @TableField("purchase_dept_id")
     private Long purchaseDeptId;
 
+    @Excel(name = "采购单位")
+    @TableField(exist = false)
+    private String purchaseDeptName;
+
+    @Excel(name = "项目名称")
     @NotNull(message = "项目名称不能为空")
     @ApiModelProperty(value = "项目名称")
     @TableField("project_name")
     private String projectName;
 
+    @Excel(name = "项目类型")
     @ApiModelProperty(value = "项目类型(0:装备类;1:物资类;2:服务类;3:工程类)")
     @TableField("project_type")
     private String projectType;
+    @TableField(exist = false)
+    private String projectTypeStr;
 
+    @Excel(name = "需求概况")
     @ApiModelProperty(value = "需求概况")
     @TableField("demand_overview")
     private String demandOverview;
 
+    @Excel(name = "概算金额(万元)")
     @ApiModelProperty(value = "概算金额(万元(保留小数点后两位)")
     @TableField("evaluation")
     private BigDecimal evaluation;
@@ -46,20 +57,32 @@ public class ProvisionalPlan {
 
     @ApiModelProperty(value = "采购服务站")
     @TableField("purchase_services")
-    private String purchaseServices;
+    private String  purchaseServices;
+    @Excel(name = "采购服务站")
+    @TableField(exist = false)
+    private String purchaseServicesStr;
 
+    @Excel(name = "采购方式")
     @ApiModelProperty(value = "采购方式  (0:公开招标, 1:单一来源,2:邀请招标,3:竞争式谈判,4:询价)")
     @TableField("purchase_mode")
     private String purchaseMode;
+    @TableField(exist = false)
+    private String purchaseModeStr;
 
+    @Excel(name = "提报需求时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     @ApiModelProperty(value = "计划提报需求时间--->需求单位成功提报采购需求的日期(具体到月)")
     @TableField("plan_demand_sub_time")
     private Date planDemandSubTime;
 
+    @Excel(name = "完成采购时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     @ApiModelProperty(value = "计划完成采购时间--->公示中标结果的日期,即填制中标信息的日期(具体到月)")
     @TableField("plan_purchase_finish_time")
     private Date planPurchaseFinishTime;
 
+    @Excel(name = "交付(实施)时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     @ApiModelProperty(value = "计划交付时间--->供应商完成并交付后,使用单位收到标的日期,即填制建设文档的日期")
     @TableField("plan_deliver_time")
     private Date planDeliverTime;
@@ -67,11 +90,16 @@ public class ProvisionalPlan {
     @ApiModelProperty(value = "项目属性(0:应急应战项目, 1:重大规划任务项目, 2:规划任务项目, 3:一般项目)")
     @TableField("project_attr")
     private String projectAttr;
+    @Excel(name = "项目属性")
+    @TableField(exist = false)
+    private String projectAttrStr;
 
+    @Excel(name = "计划调整情况及理由")
     @ApiModelProperty(value = "计划调整情况及理由--->如计划需要变更,在填写申请修改时需填写调整情况及理由,审核单位审核通过后显示该信息")
     @TableField("adjust_reason")
     private String adjustReason;
 
+    @Excel(name = "备注")
     @ApiModelProperty(value = "备注")
     @TableField("remarks")
     private String remarks;
@@ -96,6 +124,7 @@ public class ProvisionalPlan {
     @TableField("created")
     private String created;
 
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "创建时间")
     @TableField("create_time")
     private Date createTime;
@@ -104,6 +133,7 @@ public class ProvisionalPlan {
     @TableField("updated")
     private String updated;
 
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "修改时间")
     @TableField("update_time")
     private String updateTime;

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

@@ -0,0 +1,164 @@
+package com.ozs.plan.doman.vo.requestVo;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ozs.common.annotation.Excel;
+import com.ozs.common.vo.PageVo;
+import com.ozs.system.domain.SysFileRef;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author buzhanyi
+ */
+@Data
+public class PlanQuarterStandardVo extends PageVo {
+
+    /**
+     * 主键编号
+     */
+    @ApiModelProperty(value = "主键编号")
+    private Long planPracticalId;
+    /**
+     * 年度计划id(年度计划审批后同步到季度计划)
+     */
+    private Long planYearId;
+
+    /**
+     * 采购单位(登录账号的单位)
+     */
+    @Excel(name = "采购单位")
+    @ApiModelProperty(value = "采购单位")
+    private String purchaseDeptId;
+
+    /**
+     * 项目名称
+     */
+    @Excel(name = "项目名称")
+    @ApiModelProperty(value = "项目名称")
+    private String projectName;
+
+    /**
+     * 项目类型(1:装备类;2:物资类;3:服务类;)
+     */
+    @Excel(name = "项目类型")
+    @ApiModelProperty(value = "项目类型不能为空(1:装备类;2:物资类;3:服务类;)")
+    private String projectType;
+
+    /**
+     * 需求概况
+     */
+    @Excel(name = "需求概况")
+    @ApiModelProperty(value = "需求概况")
+    private String demandOverview;
+
+    /**
+     * 概算金额(万元(保留小数点后两位)
+     */
+    @Excel(name = "概算金额(万元)")
+    @ApiModelProperty(value = "概算金额")
+    private BigDecimal evaluation;
+
+    /**
+     * 是否为超限额计划(0:未超额,1:超额)
+     */
+    @ApiModelProperty(value = "是否为超限额计划(0:未超额,1:超额)")
+    private String isExcess;
+
+    /**
+     * 采购服务站
+     */
+    @Excel(name = "采购服务站")
+    @ApiModelProperty(value = "采购服务站")
+    private String purchaseServices;
+
+    /**
+     * 采购方式 (0:公开招标, 1:单一来源,2:邀请招标,3:竞争式谈判,4:询价)
+     */
+    @Excel(name = "采购方式")
+    @ApiModelProperty(value = "采购方式 (0:公开招标, 1:单一来源,2:邀请招标,3:竞争式谈判,4:询价)")
+    private String purchaseMode;
+
+    /**
+     * 计划提报需求时间--->需求单位成功提报采购需求的日期(具体到月)
+     */
+    @Excel(name = "提报需求时间", dateFormat = "yyyy-MM-dd")
+    @ApiModelProperty(value = "计划提报需求时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date planDemandSubTime;
+
+    /**
+     * 计划完成采购时间--->公示中标结果的日期,即填制中标信息的日期(具体到月)
+     */
+    @Excel(name = "完成采购时间", dateFormat = "yyyy-MM-dd")
+    @ApiModelProperty(value = "计划完成采购时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date planPurchaseFinishTime;
+
+    /**
+     * 计划交付时间--->供应商完成并交付后,使用单位收到标的日期,即填制建设文档的日期
+     */
+    @Excel(name = "交付(实施)时间", dateFormat = "yyyy-MM-dd")
+    @ApiModelProperty(value = "计划交付时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date planDeliverTime;
+
+    /**
+     * 项目属性--->应急应战项目、重大规划任务项目、规划任务项目或一般项目
+     */
+    @Excel(name = "项目属性")
+    @ApiModelProperty(value = "项目属性")
+    private String projectAttr;
+
+    /**
+     * 项目状态--->包括计划待提交、计划待审核、计划已退回、计划已审核
+     */
+    @ApiModelProperty(value = "项目状态(0:计划待提交,1:计划待审核,2:计划已退回,3:计划已审核)")
+    private String projectStatus;
+
+    /**
+     * 退回原因--->审核不通过就是退回
+     */
+    private String refuseReason;
+
+    /**
+     * 备注
+     */
+    @Excel(name = "备注")
+    @ApiModelProperty(value = "备注")
+    private String remarks;
+
+    /**
+     * 退回原因--->审核不通过就是退回
+     */
+    @ApiModelProperty(value = "退回原因")
+    private String reasonOfReturn;
+
+    /**
+     * 创建者
+     */
+    private String created;
+
+    /**
+     * 更改者
+     */
+    private String updated;
+
+    /**
+     * 上传附件
+     */
+    List<SysFileRef> sysFileRefs;
+
+    /**
+     * 查询参数开始时间和结束时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date beginTime;
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date endTime;
+
+}

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

@@ -2,12 +2,12 @@ package com.ozs.plan.doman.vo.requestVo;
 
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ozs.common.annotation.Excel;
 import com.ozs.common.vo.PageVo;
 import com.ozs.system.domain.SysFileRef;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
-import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
@@ -27,30 +27,35 @@ public class PlanYearsStandardVo extends PageVo {
     /**
      * 采购单位(登录账号的单位)
      */
+    @Excel(name = "采购单位")
     @ApiModelProperty(value = "采购单位")
-    private Long purchaseDeptId;
+    private String purchaseDeptId;
 
     /**
      * 项目名称
      */
+    @Excel(name = "项目名称")
     @ApiModelProperty(value = "项目名称")
     private String projectName;
 
     /**
      * 项目类型(1:装备类;2:物资类;3:服务类;)
      */
+    @Excel(name = "项目类型")
     @ApiModelProperty(value = "项目类型不能为空(1:装备类;2:物资类;3:服务类;)")
     private String projectType;
 
     /**
      * 需求概况
      */
+    @Excel(name = "需求概况")
     @ApiModelProperty(value = "需求概况")
     private String demandOverview;
 
     /**
      * 概算金额(万元(保留小数点后两位)
      */
+    @Excel(name = "概算金额(万元)")
     @ApiModelProperty(value = "概算金额")
     private BigDecimal evaluation;
 
@@ -63,18 +68,21 @@ public class PlanYearsStandardVo extends PageVo {
     /**
      * 采购服务站
      */
+    @Excel(name = "采购服务站")
     @ApiModelProperty(value = "采购服务站")
     private String purchaseServices;
 
     /**
      * 采购方式 (0:公开招标, 1:单一来源,2:邀请招标,3:竞争式谈判,4:询价)
      */
+    @Excel(name = "采购方式")
     @ApiModelProperty(value = "采购方式 (0:公开招标, 1:单一来源,2:邀请招标,3:竞争式谈判,4:询价)")
     private String purchaseMode;
 
     /**
      * 计划提报需求时间--->需求单位成功提报采购需求的日期(具体到月)
      */
+    @Excel(name = "提报需求时间", dateFormat = "yyyy-MM-dd")
     @ApiModelProperty(value = "计划提报需求时间")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date planDemandSubTime;
@@ -82,6 +90,7 @@ public class PlanYearsStandardVo extends PageVo {
     /**
      * 计划完成采购时间--->公示中标结果的日期,即填制中标信息的日期(具体到月)
      */
+    @Excel(name = "完成采购时间", dateFormat = "yyyy-MM-dd")
     @ApiModelProperty(value = "计划完成采购时间")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date planPurchaseFinishTime;
@@ -89,6 +98,7 @@ public class PlanYearsStandardVo extends PageVo {
     /**
      * 计划交付时间--->供应商完成并交付后,使用单位收到标的日期,即填制建设文档的日期
      */
+    @Excel(name = "交付(实施)时间", dateFormat = "yyyy-MM-dd")
     @ApiModelProperty(value = "计划交付时间")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date planDeliverTime;
@@ -96,6 +106,7 @@ public class PlanYearsStandardVo extends PageVo {
     /**
      * 项目属性--->应急应战项目、重大规划任务项目、规划任务项目或一般项目
      */
+    @Excel(name = "项目属性")
     @ApiModelProperty(value = "项目属性")
     private String projectAttr;
 
@@ -113,6 +124,7 @@ public class PlanYearsStandardVo extends PageVo {
     /**
      * 备注
      */
+    @Excel(name = "备注")
     @ApiModelProperty(value = "备注")
     private String remarks;
 

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

@@ -1,6 +1,7 @@
 package com.ozs.plan.doman.vo.requestVo;
 
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ozs.common.vo.PageVo;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -11,6 +12,10 @@ import java.util.Date;
 
 @Data
 public class ProvisionalPlanVo extends PageVo {
+
+    private Date startTime;
+    private Date endTime;
+
     @ApiModelProperty(value = "主键ID")
     private Long planYearId;
 
@@ -40,12 +45,15 @@ public class ProvisionalPlanVo extends PageVo {
     @ApiModelProperty(value = "采购方式  (0:公开招标, 1:单一来源,2:邀请招标,3:竞争式谈判,4:询价)")
     private String purchaseMode;
 
+    @JsonFormat(pattern = "yyyy-MM-dd")
     @ApiModelProperty(value = "计划提报需求时间--->需求单位成功提报采购需求的日期(具体到月)")
     private Date planDemandSubTime;
 
+    @JsonFormat(pattern = "yyyy-MM-dd")
     @ApiModelProperty(value = "计划完成采购时间--->公示中标结果的日期,即填制中标信息的日期(具体到月)")
     private Date planPurchaseFinishTime;
 
+    @JsonFormat(pattern = "yyyy-MM-dd")
     @ApiModelProperty(value = "计划交付时间--->供应商完成并交付后,使用单位收到标的日期,即填制建设文档的日期")
     private Date planDeliverTime;
 
@@ -73,12 +81,14 @@ public class ProvisionalPlanVo extends PageVo {
     @ApiModelProperty(value = "创建者")
     private String created;
 
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "创建时间")
     private Date createTime;
 
     @ApiModelProperty(value = "修改者")
     private String updated;
 
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "修改时间")
     private String updateTime;
 }

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

@@ -0,0 +1,126 @@
+package com.ozs.plan.doman.vo.responseVo;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ozs.common.annotation.Excel;
+import com.ozs.system.domain.SysFileInfo;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author buzhanyi
+ */
+@Data
+public class PlanQuarterResponseVo implements Serializable {
+
+    /**
+     * 主键编号
+     */
+    private Long planPracticalId;
+    /**
+     * 年度计划id(年度计划审批后同步到季度计划)
+     */
+    private Long planYearId;
+    /**
+     * 采购单位(登录账号的单位)
+     */
+    @Excel(name = "采购单位")
+    private Long purchaseDeptId;
+    /**
+     * 项目名称
+     */
+    @Excel(name = "项目名称")
+    private String projectName;
+    /**
+     * 项目名称
+     */
+    @Excel(name = "项目类型")
+    private String projectType;
+    /**
+     * 需求概况
+     */
+    @Excel(name = "需求概况")
+    private String demandOverview;
+    /**
+     * 概算金额(万元(保留小数点后两位)
+     */
+    @Excel(name = "概算金额")
+    private BigDecimal evaluation;
+    /**
+     * 是否为超限额计划(0:未超额,1:超额)
+     */
+    @Excel(name = "是否为超限额计划")
+    private String isExcess;
+    /**
+     * 采购服务站
+     */
+    @Excel(name = "采购服务站")
+    private String purchaseServices;
+    /**
+     * 采购方式 (0:公开招标, 1:单一来源,2:邀请招标,3:竞争式谈判,4:询价)
+     */
+    @Excel(name = "采购方式")
+    private String purchaseMode;
+    /**
+     * 计划提报需求时间--->需求单位成功提报采购需求的日期(具体到月)
+     */
+    @Excel(name = "计划提报需求时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date planDemandSubTime;
+    /**
+     * 计划完成采购时间--->公示中标结果的日期,即填制中标信息的日期(具体到月)
+     */
+    @Excel(name = "计划完成采购时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date planPurchaseFinishTime;
+    /**
+     * 计划交付时间--->供应商完成并交付后,使用单位收到标的日期,即填制建设文档的日期
+     */
+    @Excel(name = "计划交付时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date planDeliverTime;
+    /**
+     * 项目属性--->应急应战项目、重大规划任务项目、规划任务项目或一般项目
+     */
+    @Excel(name = "项目属性")
+    private String projectAttr;
+    /**
+     * 计划调整情况及理由--->如计划需要变更,在填写申请修改时需填写调整情况及理由,审核单位审核通过后显示
+     */
+    @Excel(name = "计划调整情况及理由")
+    private String adjustReason;
+    /**
+     * 备注
+     */
+    @Excel(name = "备注")
+    private String remarks;
+    /**
+     * 项目状态--->包括计划待提交、计划待审核、计划已退回、计划已审核
+     * (0:计划待提交,1:计划待审核,2:计划已退回,3:计划已审核)
+     */
+    @Excel(name = "项目状态")
+    private String projectStatus;
+
+    /**
+     * 发函状态(0:未发函或已处理,1:确认发函)
+     */
+    private String sendLetter;
+    /**
+     * 计划类型(0:季度计划,1:临时计划)
+     */
+    private Integer planType;
+    /**
+     * 退回原因--->审核不通过就是退回
+     */
+    private String refuseReason;
+
+    /**
+     * 已上传的关联附件信息
+     */
+    List<SysFileInfo> fileInfos;
+
+}

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

@@ -3,7 +3,7 @@ package com.ozs.plan.doman.vo.responseVo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ozs.common.annotation.Excel;
-import com.ozs.system.domain.SysFileRef;
+import com.ozs.system.domain.SysFileInfo;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -113,8 +113,8 @@ public class PlanYearsResponseVo implements Serializable {
     private String refuseReason;
 
     /**
-     * 上传附件的URL
+     * 已上传的关联附件信息
      */
-    HashMap<String, String> fileMap;
+    List<SysFileInfo> fileInfos;
 
 }

+ 90 - 0
purchase-system/src/main/java/com/ozs/plan/mapper/PlanQuarterMapper.java

@@ -0,0 +1,90 @@
+package com.ozs.plan.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ozs.plan.doman.PlanQuarter;
+import com.ozs.plan.doman.PlanQuarter;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 用户与角色关联表 数据层
+ *
+ * @author bu
+ */
+@Mapper
+public interface PlanQuarterMapper extends BaseMapper<PlanQuarter> {
+
+    /**
+     * 查询季度计划记录集合
+     *
+     * @param PlanQuarter 季度计划请求对象
+     * @return 季度计划记录集合
+     */
+    public List<PlanQuarter> selectPlanQuarterList(PlanQuarter PlanQuarter);
+
+    /**
+     * 查询季度计划记录集合(审核单位)
+     *
+     * @param PlanQuarter 季度计划请求对象
+     * @return 季度计划记录集合
+     */
+    public List<PlanQuarter> selectPlanQuarterExamineList(PlanQuarter PlanQuarter);
+
+    /**
+     * 创建季度计划
+     *
+     * @param PlanQuarter 季度计划请求对象
+     */
+    public Integer insertPlanQuarter(PlanQuarter PlanQuarter);
+
+    /**
+     * 批量删除季度计划
+     *
+     * @param planIds 需要删除的季度计划ID
+     * @return 结果
+     */
+    public Integer deletePlanQuarterByIds(Long[] planIds);
+
+    /**
+     * 查询项目名称是否存在
+     *
+     * @param projectName 项目名称
+     * @return 结果
+     */
+    public Integer countProjectName(String projectName);
+
+    /**
+     * 查询季度计划
+     *
+     * @param planPracticalId 季度计划ID
+     * @return 结果
+     */
+    public PlanQuarter getById(Long planPracticalId);
+
+    /**
+     * 查询项目名称是否存在(除自己以外)
+     *
+     * @param projectName 项目名称
+     * @return 结果
+     */
+    public Integer countProjectNameOther(@Param("projectName") String projectName, @Param("planPracticalId") String planPracticalId);
+
+    /**
+     * 修改季度计划
+     *
+     * @param ofYears 季度计划
+     * @return 结果
+     */
+    public Integer updateInfoById(PlanQuarter ofYears);
+
+    public Integer deletePlanQuarterById(Long planPracticalId);
+
+    public Integer commit(Long planPracticalId);
+
+    public Integer review(PlanQuarter ofYears);
+
+    Integer sendLetter(Long planPracticalId);
+}

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

@@ -53,7 +53,7 @@ public interface PlanYearsMapper extends BaseMapper<PlanYears> {
      * @param projectName 项目名称
      * @return 结果
      */
-    public List<PlanYears> countProjectName(String projectName);
+    public Integer countProjectName(String projectName);
 
     /**
      * 查询年度计划

+ 8 - 0
purchase-system/src/main/java/com/ozs/plan/mapper/ProvisionalPlanMapper.java

@@ -4,7 +4,15 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ozs.base.domain.BaseExpert;
 import com.ozs.plan.doman.ProvisionalPlan;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 @Mapper
 public interface ProvisionalPlanMapper extends BaseMapper<ProvisionalPlan> {
+    int deleteProvisionalPlanById(@Param("planYearId") Integer planYearId);
+
+    int updateProvisionalPlanById(ProvisionalPlan provisionalPlan);
+
+    List<ProvisionalPlan> selectProjectName(String projectName);
 }

+ 153 - 0
purchase-system/src/main/java/com/ozs/plan/service/PlanQuarterService.java

@@ -0,0 +1,153 @@
+package com.ozs.plan.service;
+
+
+import com.github.pagehelper.PageInfo;
+import com.ozs.common.core.domain.AjaxResult;
+import com.ozs.common.core.domain.model.LoginUser;
+import com.ozs.plan.doman.PlanQuarter;
+import com.ozs.plan.doman.vo.requestVo.PlanQuarterStandardVo;
+import com.ozs.plan.doman.vo.requestVo.PlanYearsStandardVo;
+
+import java.util.List;
+
+/**
+ * 季度计划 服务层
+ *
+ * @author bu
+ */
+public interface PlanQuarterService {
+
+    /**
+     * 查询季度计划记录集合
+     *
+     * @param vo 季度计划请求对象
+     * @return 季度计划记录集合
+     */
+    public PageInfo<PlanQuarter> selectPlanQuarterList(PlanQuarterStandardVo vo);
+
+    /**
+     * 查询季度计划记录集合--导出
+     *
+     * @param vo 季度计划请求对象
+     * @return 季度计划记录集合
+     */
+    public List<PlanQuarter> selectPlanQuarterListEXP(PlanQuarterStandardVo vo);
+
+    /**
+     * 查询季度计划记录集合(审核单位)
+     *
+     * @param vo 季度计划请求对象
+     * @return 季度计划记录集合
+     */
+    public PageInfo<PlanQuarter> selectPlanQuarterExamineList(PlanQuarterStandardVo vo);
+
+    /**
+     * 查询季度计划记录集合(审核单位--导出)
+     *
+     * @param vo 季度计划请求对象
+     * @return 季度计划记录集合
+     */
+    public List<PlanQuarter> selectPlanQuarterExamineListEXP(PlanQuarterStandardVo vo);
+
+    /**
+     * 创建季度计划
+     *
+     * @param quarterStandardVo 季度计划请求对象
+     */
+    public AjaxResult insertPlanQuarter(PlanQuarterStandardVo quarterStandardVo);
+
+    /**
+     * 批量删除季度计划
+     *
+     * @param planIds 需要删除的季度计划ID
+     * @return 结果
+     */
+    public AjaxResult deletePlanQuarterByIds(Long[] planIds);
+
+    /**
+     * 批量删除季度计划
+     *
+     * @param planYearId 需要删除的季度计划ID
+     * @return 结果
+     */
+    public AjaxResult deletePlanQuarterById(Long planYearId);
+
+    /**
+     * 根据id获取季度计划信息
+     *
+     * @param quarterStandardVo 季度计划请求对象
+     * @return 结果
+     */
+    public AjaxResult view(PlanQuarterStandardVo quarterStandardVo);
+
+    /**
+     * 修改季度计划
+     *
+     * @param quarterStandardVo 修改季度计划请求对象
+     * @return 结果
+     */
+    public AjaxResult update(PlanQuarterStandardVo quarterStandardVo);
+
+    /**
+     * 导入季度计划数据
+     *
+     * @return 结果
+     */
+    public String importPlanQuarter(List<PlanQuarterStandardVo> planquarter, boolean isUpdateSupport, LoginUser loginUser);
+
+    /**
+     * 提交季度计划
+     *
+     * @param quarterStandardVo 提交季度计划请求对象
+     * @return 结果
+     */
+    public AjaxResult commit(PlanQuarterStandardVo quarterStandardVo);
+
+    /**
+     * 审核季度计划
+     *
+     * @param quarterStandardVo 需要审核的季度计划
+     * @return 结果
+     */
+    public AjaxResult reviewTo(PlanQuarterStandardVo quarterStandardVo);
+
+    /**
+     * 审核季度计划退回
+     *
+     * @param quarterStandardVo 需要审核的季度计划
+     * @return 结果
+     */
+    public AjaxResult reviewReturn(PlanQuarterStandardVo quarterStandardVo);
+
+    /**
+     * 申请修改季度计划
+     *
+     * @param quarterStandardVo 需要修改的季度计划
+     * @return 结果
+     */
+    public AjaxResult appUpdate(PlanQuarterStandardVo quarterStandardVo);
+
+    /**
+     * 发函催告
+     *
+     * @param quarterStandardVo 季度计划
+     * @return 结果
+     */
+    AjaxResult sendLetter(PlanQuarterStandardVo quarterStandardVo);
+
+    /**
+     * 上传计划关联文件后保存文件信息
+     *
+     * @param quarterStandardVo 季度计划
+     * @return 结果
+     */
+    AjaxResult upLoadPlanFile(PlanQuarterStandardVo quarterStandardVo);
+
+    /**
+     * 下载计划关联文件
+     *
+     * @param quarterStandardVo 季度计划
+     * @return 结果
+     */
+    AjaxResult downLoadPlanFile(PlanQuarterStandardVo quarterStandardVo);
+}

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

@@ -28,13 +28,29 @@ public interface PlanYearsService extends IService<PlanYears> {
     public PageInfo<PlanYears> selectPlanYearsList(PlanYearsStandardVo vo);
 
     /**
-     * 查询年度计划记录集合
+     * 查询年度计划记录集合--导出
+     *
+     * @param vo 年度计划请求对象
+     * @return 年度计划记录集合
+     */
+    public List<PlanYears> selectPlanYearsListEXP(PlanYearsStandardVo vo);
+
+    /**
+     * 查询年度计划记录集合(审核单位)
      *
      * @param vo 年度计划请求对象
      * @return 年度计划记录集合
      */
     public PageInfo<PlanYears> selectPlanYearsExamineList(PlanYearsStandardVo vo);
 
+    /**
+     * 查询年度计划记录集合(审核单位--导出)
+     *
+     * @param vo 年度计划请求对象
+     * @return 年度计划记录集合
+     */
+    public List<PlanYears> selectPlanYearsExamineListEXP(PlanYearsStandardVo vo);
+
     /**
      * 创建年度计划
      *
@@ -79,7 +95,7 @@ public interface PlanYearsService extends IService<PlanYears> {
      *
      * @return 结果
      */
-    public String importPlanYears(List<PlanYears> planYears, boolean isUpdateSupport, LoginUser loginUser);
+    public String importPlanYears(List<PlanYearsStandardVo> planYears, boolean isUpdateSupport, LoginUser loginUser);
 
     /**
      * 提交年度计划

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

@@ -1,8 +1,19 @@
 package com.ozs.plan.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.ozs.base.domain.BaseExpert;
+import com.ozs.common.core.domain.model.LoginUser;
+import com.ozs.plan.doman.PlanYears;
 import com.ozs.plan.doman.ProvisionalPlan;
+import com.ozs.plan.doman.vo.requestVo.ProvisionalPlanVo;
+
+import java.util.List;
 
 public interface ProvisionalPlanService extends IService<ProvisionalPlan> {
+    int deleteProvisionalPlanById(Integer planYearId);
+
+    int updateProvisionalPlanById(ProvisionalPlan provisionalPlan);
+
+    String importProvisionalPlan(List<ProvisionalPlan> provisionalPlans, boolean updateSupport, LoginUser loginUser);
+
+    List<ProvisionalPlan> selectProvisionalPlanExport(ProvisionalPlanVo provisionalPlanVo);
 }

+ 564 - 0
purchase-system/src/main/java/com/ozs/plan/service/impl/PlanQuarterServiceImpl.java

@@ -0,0 +1,564 @@
+package com.ozs.plan.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.ozs.common.core.domain.AjaxResult;
+import com.ozs.common.core.domain.entity.SysDept;
+import com.ozs.common.core.domain.entity.SysDictData;
+import com.ozs.common.core.domain.model.LoginUser;
+import com.ozs.common.enums.ProjectStatus;
+import com.ozs.common.enums.ProjectTypes;
+import com.ozs.common.enums.SysFileRefEnum;
+import com.ozs.common.exception.ServiceException;
+import com.ozs.common.utils.StringUtils;
+import com.ozs.common.utils.bean.BeanUtils;
+import com.ozs.plan.doman.PlanQuarter;
+import com.ozs.plan.doman.PlanYears;
+import com.ozs.plan.doman.vo.requestVo.PlanQuarterStandardVo;
+import com.ozs.plan.doman.vo.requestVo.PlanYearsStandardVo;
+import com.ozs.plan.doman.vo.responseVo.PlanQuarterResponseVo;
+import com.ozs.plan.mapper.PlanQuarterMapper;
+import com.ozs.plan.service.PlanQuarterService;
+import com.ozs.system.domain.SysFileInfo;
+import com.ozs.system.domain.SysFileRef;
+import com.ozs.system.domain.vo.responseVo.SysDeptResponseVo;
+import com.ozs.system.mapper.SysDeptMapper;
+import com.ozs.system.mapper.SysFileRefMapper;
+import com.ozs.system.service.ISysDeptService;
+import com.ozs.system.service.ISysDictTypeService;
+import com.ozs.system.service.SysFileService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.ObjectUtils;
+
+import javax.validation.Validator;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author buzhanyi
+ */
+@Service
+@Slf4j
+public class PlanQuarterServiceImpl implements PlanQuarterService {
+
+    @Autowired
+    PlanQuarterMapper planQuarterMapper;
+    @Autowired
+    protected Validator validator;
+    @Autowired
+    private ISysDictTypeService dictTypeService;
+    @Autowired
+    private ISysDeptService deptService;
+    @Autowired
+    SysFileRefMapper sysFileRefMapper;
+    @Autowired
+    private SysDeptMapper deptMapper;
+    @Autowired
+    private SysFileService fileService;
+
+    @Override
+    public PageInfo<PlanQuarter> selectPlanQuarterList(PlanQuarterStandardVo vo) {
+        PlanQuarter quarters = new PlanQuarter();
+        List<PlanQuarter> planQuarter;
+        List<PlanQuarter> planQuarterList = new ArrayList<>();
+        PageHelper.startPage(vo.getPageNum().intValue(), vo.getPageSize().intValue());
+        try {
+            BeanUtils.copyProperties(vo, quarters);
+            planQuarter = planQuarterMapper.selectPlanQuarterList(quarters);
+            planQuarterList = changeTo(planQuarter);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        PageInfo<PlanQuarter> pageInfo = new PageInfo<PlanQuarter>(planQuarterList);
+        return pageInfo;
+    }
+
+    @Override
+    public List<PlanQuarter> selectPlanQuarterListEXP(PlanQuarterStandardVo vo) {
+        List<PlanQuarter> list = new ArrayList<>();
+        List<PlanQuarter> planQuarterList = new ArrayList<>();
+        try {
+            int num = 1;
+            int size = 200;
+            while (size == 200) {
+                LambdaQueryWrapper<PlanQuarter> lw = new LambdaQueryWrapper<PlanQuarter>();
+                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())) {
+                    lw.le(PlanQuarter::getPlanDemandSubTime, vo.getEndTime());
+                }
+                Page<PlanQuarter> page = planQuarterMapper.selectPage(new Page<PlanQuarter>(num, size, false), lw);
+                list.addAll(page.getRecords());
+                size = page.getRecords().size();
+                num++;
+            }
+            planQuarterList = changeTo(list);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return planQuarterList;
+    }
+
+    @Override
+    public PageInfo<PlanQuarter> selectPlanQuarterExamineList(PlanQuarterStandardVo vo) {
+        PlanQuarter quarters = new PlanQuarter();
+        PageHelper.startPage(vo.getPageNum().intValue(), vo.getPageSize().intValue());
+        List<PlanQuarter> planQuarter;
+        List<PlanQuarter> planQuarterList = new ArrayList<>();
+        try {
+            BeanUtils.copyProperties(vo, quarters);
+            planQuarter = planQuarterMapper.selectPlanQuarterExamineList(quarters);
+            planQuarterList = changeTo(planQuarter);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        PageInfo<PlanQuarter> pageInfo = new PageInfo<PlanQuarter>(planQuarterList);
+        return pageInfo;
+    }
+
+    @Override
+    public List<PlanQuarter> selectPlanQuarterExamineListEXP(PlanQuarterStandardVo vo) {
+        List<PlanQuarter> list = new ArrayList<>();
+        List<PlanQuarter> planQuarterList = new ArrayList<>();
+        try {
+            int num = 1;
+            int size = 200;
+            while (size == 200) {
+                LambdaQueryWrapper<PlanQuarter> lw = new LambdaQueryWrapper<PlanQuarter>();
+                if (!ObjectUtils.isEmpty(vo.getProjectName())) {
+                    lw.like(PlanQuarter::getProjectName, vo.getProjectName());
+                }
+                if (!ObjectUtils.isEmpty(vo.getPurchaseServices())) {
+                    lw.eq(PlanQuarter::getPurchaseServices, vo.getPurchaseServices());
+                }
+                if (!ObjectUtils.isEmpty(vo.getIsExcess())) {
+                    lw.eq(PlanQuarter::getIsExcess, vo.getIsExcess());
+                }
+                if (!ObjectUtils.isEmpty(vo.getProjectStatus())) {
+                    lw.eq(PlanQuarter::getProjectStatus, vo.getProjectStatus());
+                } else {
+                    lw.in(PlanQuarter::getProjectStatus, "1,3");
+                }
+                if (!ObjectUtils.isEmpty(vo.getBeginTime())) {
+                    lw.ge(PlanQuarter::getPlanDemandSubTime, vo.getBeginTime());
+                }
+                if (!ObjectUtils.isEmpty(vo.getEndTime())) {
+                    lw.le(PlanQuarter::getPlanDemandSubTime, vo.getEndTime());
+                }
+                Page<PlanQuarter> page = planQuarterMapper.selectPage(new Page<PlanQuarter>(num, size, false), lw);
+                list.addAll(page.getRecords());
+                size = page.getRecords().size();
+                num++;
+            }
+            planQuarterList = changeTo(list);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return planQuarterList;
+    }
+
+    @Transactional
+    @Override
+    public AjaxResult insertPlanQuarter(PlanQuarterStandardVo quarterStandardVo) {
+        if (planQuarterMapper.countProjectName(quarterStandardVo.getProjectName()) > 0) {
+            return AjaxResult.error("该项目名称已经存在");
+        }
+        PlanQuarter quarters = new PlanQuarter();
+        try {
+            BeanUtils.copyProperties(quarterStandardVo, quarters);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        //判断是否为超额计划
+        quarters.setIsExcess(isExcessOrNo(quarters.getProjectType(), quarters.getEvaluation()));
+        quarters.setProjectStatus(ProjectStatus.PLANWAITCOMMIT.getCode());
+        quarters.setCreateTime(new Date());
+        planQuarterMapper.insertPlanQuarter(quarters);
+        log.info("id:{}", quarters.getPlanPracticalId());
+        List<SysFileRef> sysFileRefs = quarterStandardVo.getSysFileRefs();
+        if (!ObjectUtils.isEmpty(sysFileRefs)) {
+            for (SysFileRef ref : sysFileRefs) {
+                ref.setRedId(quarters.getPlanPracticalId());
+                ref.setType(SysFileRefEnum.PLAN_TEMPORARY.getType());
+                ref.setCreated(quarters.getCreated());
+                ref.setCreateTime(new Date());
+                ref.setUpdated(quarters.getCreated());
+                ref.setUpdateTime(new Date());
+                sysFileRefMapper.insert(ref);
+            }
+        }
+        return AjaxResult.success();
+    }
+
+    @Override
+    public AjaxResult deletePlanQuarterByIds(Long[] planIds) {
+        planQuarterMapper.deletePlanQuarterByIds(planIds);
+        return AjaxResult.success();
+    }
+
+    @Override
+    public AjaxResult deletePlanQuarterById(Long planId) {
+        planQuarterMapper.deletePlanQuarterById(planId);
+        return AjaxResult.success();
+    }
+
+    @Override
+    public AjaxResult view(PlanQuarterStandardVo quarterStandardVo) {
+
+        PlanQuarterResponseVo responseVo = new PlanQuarterResponseVo();
+        PlanQuarter byId = planQuarterMapper.getById(quarterStandardVo.getPlanPracticalId());
+        if (byId == null) {
+            return AjaxResult.error("数据查询失败");
+        }
+        SysDeptResponseVo sysDeptResponseVo = (SysDeptResponseVo) deptService.selectDeptById(byId.getPurchaseDeptId()).get("sysDept");
+        byId.setPurchaseDeptName(sysDeptResponseVo.getDeptName());
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("red_id", byId.getPlanPracticalId());
+        map.put("type", "1");
+        List<SysFileRef> fileRefs = sysFileRefMapper.selectByMap(map);
+        List<SysFileInfo> fileInfos = new ArrayList<>();
+        BeanUtils.copyProperties(byId, responseVo);
+        if (!ObjectUtils.isEmpty(fileRefs)) {
+            for (SysFileRef ref : fileRefs) {
+                SysFileInfo fileInfo = fileService.getById(ref.getFileId());
+                fileInfos.add(fileInfo);
+            }
+            responseVo.setFileInfos(fileInfos);
+        }
+        return AjaxResult.success(responseVo);
+    }
+
+    @Transactional
+    @Override
+    public AjaxResult update(PlanQuarterStandardVo quarterStandardVo) {
+        if (planQuarterMapper.countProjectNameOther(quarterStandardVo.getProjectName(), String.valueOf(quarterStandardVo.getPlanPracticalId())) > 0) {
+            return AjaxResult.error("该项目名称已经存在");
+        }
+        PlanQuarter quarters = new PlanQuarter();
+        try {
+            BeanUtils.copyProperties(quarterStandardVo, quarters);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        quarters.setIsExcess(isExcessOrNo(quarters.getProjectType(), quarters.getEvaluation()));
+        quarters.setUpdateTime(new Date());
+        planQuarterMapper.updateInfoById(quarters);
+        List<SysFileRef> sysFileRefs = quarterStandardVo.getSysFileRefs();
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("red_id", quarters.getPlanPracticalId());
+        map.put("type", "1");
+        sysFileRefMapper.deleteByMap(map);
+        if (!ObjectUtils.isEmpty(sysFileRefs)) {
+            for (SysFileRef ref : sysFileRefs) {
+                ref.setRedId(quarters.getPlanPracticalId());
+                ref.setType(SysFileRefEnum.PLAN_TEMPORARY.getType());
+                ref.setCreated(quarterStandardVo.getUpdated());
+                ref.setCreateTime(new Date());
+                ref.setUpdated(quarterStandardVo.getUpdated());
+                ref.setUpdateTime(new Date());
+                sysFileRefMapper.insert(ref);
+            }
+        }
+        return AjaxResult.success();
+    }
+
+    @Override
+    public String importPlanQuarter(List<PlanQuarterStandardVo> planQuarters, boolean isUpdateSupport, LoginUser loginUser) {
+        if (StringUtils.isNull(planQuarters) || planQuarters.size() == 0) {
+            throw new ServiceException("导入季度计划数据不能为空!");
+        }
+        List<PlanQuarter> list = new ArrayList<>();
+        for (PlanQuarterStandardVo standardVo : planQuarters) {
+            PlanQuarter quarter = new PlanQuarter();
+            BeanUtils.copyProperties(standardVo, quarter);
+            quarter.setPurchaseDeptName(standardVo.getPurchaseDeptId());
+            list.add(quarter);
+        }
+        HashMap<String, HashMap<String, String>> planEnums = dictTypeService.getAboutEnums();
+        HashMap<String, String> projectTypesMap = planEnums.get("projectTypes");
+        HashMap<String, String> planPurchaseModesMap = planEnums.get("planPurchaseModes");
+        HashMap<String, String> projectAttributes = planEnums.get("projectAttributes");
+        HashMap<String, String> purchaseServices = planEnums.get("purchaseServices");
+
+        int successNum = 0;
+        int failureNum = 0;
+        StringBuilder successMsg = new StringBuilder();
+        StringBuilder failureMsg = new StringBuilder();
+        //deptService
+        for (PlanQuarter ofYear : list) {
+            try {
+                //验证项目名称是否重复导入
+                //将录入信息中的值更改为要保存的数据
+                if (planQuarterMapper.countProjectName(ofYear.getProjectName()) == 0) {
+                    //采购单位
+                    SysDept info = deptMapper.checkDeptNameOnlyOne(ofYear.getPurchaseDeptName());
+                    if (StringUtils.isNotNull(info)) {
+                        ofYear.setPurchaseDeptId(info.getDeptId());
+                    }
+                    ofYear.setProjectType(projectTypesMap.get(ofYear.getProjectType()));
+                    ofYear.setProjectStatus(ProjectStatus.PLANWAITCOMMIT.getCode());
+                    ofYear.setPurchaseMode(planPurchaseModesMap.get(ofYear.getPurchaseMode()));
+                    //项目属性是多选字段
+                    StringBuilder builder = new StringBuilder();
+                    if (ofYear.getProjectAttr().contains(",")) {
+                        String[] split = ofYear.getProjectAttr().split(",");
+                        for (String s : split) {
+                            builder.append(projectAttributes.get(s) + ",");
+                        }
+                    } else {
+                        builder.append(projectAttributes.get(ofYear.getProjectAttr()));
+                    }
+                    ofYear.setProjectAttr(builder.toString());
+                    ofYear.setPurchaseServices(purchaseServices.get(ofYear.getPurchaseServices()));
+                    ofYear.setIsExcess(isExcessOrNo(ofYear.getProjectType(), ofYear.getEvaluation()));
+                    ofYear.setCreated(String.valueOf(loginUser.getUserId()));
+                    ofYear.setCreateTime(new Date());
+                    planQuarterMapper.insertPlanQuarter(ofYear);
+                    successNum++;
+                    successMsg.append("*" + successNum + "、项目 " + ofYear.getProjectName() + " 导入成功!");
+                    //} else if (isUpdateSupport) {
+                    //    PlanQuarter quarter = plan.get(0);
+                    //    BeanValidators.validateWithException(validator, ofYear);
+                    //    quarter.setCreateTime(new Date());
+                    //    quarter.setProjectStatus(ProjectStatus.PLANWAITCOMMIT.getCode());
+                    //    planQuarterMapper.updateById(quarter);
+                    //    successNum++;
+                    //    successMsg.append("<br/>" + successNum + "、项目 " + ofYear.getProjectName() + " 更新成功");
+                } else {
+                    failureNum++;
+                    failureMsg.append("*" + successNum + "、项目 " + ofYear.getProjectName() + " 已存在");
+                }
+            } catch (Exception exc) {
+                failureNum++;
+                String msg = "*" + successNum + "、项目 " + ofYear.getProjectName() + " 导入失败";
+                failureMsg.append(msg + exc.getMessage());
+                log.error(msg, exc);
+            }
+        }
+        if (failureNum > 0) {
+            failureMsg.insert(0, "导入失败!共 " + failureNum + " 条数据格式不正确:");
+            throw new ServiceException(failureMsg.toString());
+        } else {
+            successMsg.insert(0, "导入成功!共 " + successNum + " 条。");
+        }
+        return successMsg.toString();
+    }
+
+    @Override
+    public AjaxResult commit(PlanQuarterStandardVo quarterStandardVo) {
+        //PlanQuarter byId = PlanQuarterMapper.getById(quarterStandardVo.getPlanPracticalId());
+        //BigDecimal evaluation = byId.getEvaluation();
+        //BigDecimal threshold = new BigDecimal(0);
+        ////获取各个项目类型设定的概算金额阈值
+        //List<SysDictData> data = dictTypeService.selectDictDataByType("sys_over_limit_threshold");
+        //HashMap<String, String> thresholdMap = new LinkedHashMap<>();
+        ////各个类型的概算金额阈值
+        //for (SysDictData dictData : data) {
+        //    //    类型----阈值
+        //    thresholdMap.put(dictData.getDictLabel(), dictData.getDictValue());
+        //}
+        ////项目类型
+        //for (ProjectTypes value : ProjectTypes.values()) {
+        //    if (byId.getProjectType().equals(value.getCode())) {
+        //        threshold = BigDecimal.valueOf(Long.parseLong(thresholdMap.get(value.getInfo())));
+        //    }
+        //    break;
+        //}
+        //
+        //if (evaluation.compareTo(threshold) == 1) {
+        //    //是超额项目
+        //}
+
+        int commit = planQuarterMapper.commit(quarterStandardVo.getPlanPracticalId());
+        if (commit != 1) {
+            return AjaxResult.error("项目状态数据异常");
+        }
+        return AjaxResult.success();
+    }
+
+    @Override
+    @Transactional
+    public AjaxResult reviewTo(PlanQuarterStandardVo vo) {
+        PlanQuarter quarters = new PlanQuarter();
+        BeanUtils.copyProperties(vo, quarters);
+        quarters.setProjectStatus(ProjectStatus.PLANTOEXAMINE.getCode());
+        return review(vo, quarters);
+    }
+
+    @Override
+    @Transactional
+    public AjaxResult reviewReturn(PlanQuarterStandardVo vo) {
+        PlanQuarter quarters = new PlanQuarter();
+        BeanUtils.copyProperties(vo, quarters);
+        quarters.setProjectStatus(ProjectStatus.PLANTOBACK.getCode());
+        return review(vo, quarters);
+    }
+
+    private AjaxResult review(PlanQuarterStandardVo vo, PlanQuarter quarters) {
+        List<SysFileRef> sysFileRefs = vo.getSysFileRefs();
+        if (!ObjectUtils.isEmpty(sysFileRefs)) {
+            for (SysFileRef ref : sysFileRefs) {
+                ref.setRedId(vo.getPlanPracticalId());
+                ref.setType(SysFileRefEnum.PLAN_TEMPORARY.getType());
+                ref.setCreated(vo.getUpdated());
+                ref.setCreateTime(new Date());
+                ref.setUpdated(vo.getUpdated());
+                ref.setUpdateTime(new Date());
+                sysFileRefMapper.insert(ref);
+            }
+        }
+        int review = planQuarterMapper.review(quarters);
+        if (review != 1) {
+            return AjaxResult.error("项目状态数据异常");
+        }
+        return AjaxResult.success();
+    }
+
+    @Override
+    public AjaxResult appUpdate(PlanQuarterStandardVo vo) {
+        PlanQuarter quarters = new PlanQuarter();
+        BeanUtils.copyProperties(vo, quarters);
+        //申请后会成为未提交的状态,可以进行修改
+        quarters.setProjectStatus(ProjectStatus.PLANWAITCOMMIT.getCode());
+        int review = planQuarterMapper.review(quarters);
+        if (review != 1) {
+            return AjaxResult.error("项目状态数据异常");
+        }
+        return AjaxResult.success();
+    }
+
+    @Override
+    public AjaxResult sendLetter(PlanQuarterStandardVo quarterStandardVo) {
+        int review = planQuarterMapper.sendLetter(quarterStandardVo.getPlanPracticalId());
+        if (review != 1) {
+            return AjaxResult.error("项目状态数据异常");
+        }
+        return AjaxResult.success();
+    }
+
+    @Override
+    public AjaxResult upLoadPlanFile(PlanQuarterStandardVo quarterStandardVo) {
+        List<SysFileRef> sysFileRefs = quarterStandardVo.getSysFileRefs();
+        if (!ObjectUtils.isEmpty(sysFileRefs)) {
+            for (SysFileRef ref : sysFileRefs) {
+                ref.setRedId(quarterStandardVo.getPlanPracticalId());
+                ref.setType(SysFileRefEnum.PLAN_TEMPORARY.getType());
+                sysFileRefMapper.insert(ref);
+            }
+        }
+        return AjaxResult.success();
+    }
+
+    @Override
+    public AjaxResult downLoadPlanFile(PlanQuarterStandardVo quarterStandardVo) {
+
+        return AjaxResult.success();
+    }
+
+    //判断是否为超额计划
+    public String isExcessOrNo(String projectType, BigDecimal evaluation) {
+        BigDecimal threshold = new BigDecimal(0);
+        //获取各个项目类型设定的概算金额阈值
+        List<SysDictData> data = dictTypeService.selectDictDataByType("sys_over_limit_threshold");
+        HashMap<String, String> thresholdMap = new LinkedHashMap<>();
+        //各个类型的概算金额阈值
+        for (SysDictData dictData : data) {
+            //    类型----阈值
+            thresholdMap.put(dictData.getDictLabel(), dictData.getDictValue());
+        }
+        //项目类型
+        for (ProjectTypes value : ProjectTypes.values()) {
+            if (projectType.equals(value.getCode())) {
+                threshold = BigDecimal.valueOf(Long.parseLong(thresholdMap.get(value.getInfo())));
+            }
+            break;
+        }
+        if (evaluation.compareTo(threshold) == 1) {
+            //是超额计划
+            return ("1");
+        } else {
+            return ("0");
+        }
+    }
+
+    //字段赋值对应的名称
+    public List<PlanQuarter> changeTo(List<PlanQuarter> planQuarter) {
+
+        HashMap<String, HashMap<String, String>> planEnums = dictTypeService.getAboutEnums();
+        HashMap<String, String> projectTypesMap = planEnums.get("projectTypes");
+        HashMap<String, String> planPurchaseModesMap = planEnums.get("planPurchaseModes");
+        HashMap<String, String> projectAttributes = planEnums.get("projectAttributes");
+        HashMap<String, String> purchaseServices = planEnums.get("purchaseServices");
+        List<PlanQuarter> list = new ArrayList<PlanQuarter>();
+        for (PlanQuarter planYear : planQuarter) {
+            SysDeptResponseVo sysDeptResponseVo = (SysDeptResponseVo) deptService.selectDeptById(planYear.getPurchaseDeptId()).get("sysDept");
+            planYear.setPurchaseDeptName(sysDeptResponseVo.getDeptName());
+
+            for (Map.Entry<String, String> entry : projectTypesMap.entrySet()) {
+                if (planYear.getProjectType().equals(entry.getValue())) {
+                    planYear.setProjectTypeStr(entry.getKey());
+                    break;
+                }
+            }
+            for (Map.Entry<String, String> entry : planPurchaseModesMap.entrySet()) {
+                if (planYear.getPurchaseMode().equals(entry.getValue())) {
+                    planYear.setPurchaseModeStr(entry.getKey());
+                    break;
+                }
+            }
+            //项目属性是拼接的
+            if (planYear.getProjectAttr().length() > 1) {
+                StringBuilder builder = new StringBuilder();
+                String[] split = planYear.getProjectAttr().split(",");
+                for (String s : split) {
+                    for (Map.Entry<String, String> entry : projectAttributes.entrySet()) {
+                        if (s.equals(entry.getValue())) {
+                            builder.append(entry.getKey() + ",");
+                            break;
+                        }
+                    }
+                }
+                planYear.setProjectAttrStr(builder.toString());
+            } else {
+                for (Map.Entry<String, String> entry : projectAttributes.entrySet()) {
+                    if (planYear.getProjectAttr().equals(entry.getValue())) {
+                        planYear.setProjectAttrStr(entry.getKey());
+                        break;
+                    }
+                }
+            }
+            for (Map.Entry<String, String> entry : purchaseServices.entrySet()) {
+                if (planYear.getPurchaseServices().equals(entry.getValue())) {
+                    planYear.setPurchaseServicesStr(entry.getKey());
+                    break;
+                }
+            }
+
+            list.add(planYear);
+        }
+        return list;
+    }
+}

+ 107 - 25
purchase-system/src/main/java/com/ozs/plan/service/impl/PlanYearsServiceImpl.java

@@ -1,5 +1,7 @@
 package com.ozs.plan.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -99,16 +101,12 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
     @Override
     public PageInfo<PlanYears> selectPlanYearsList(PlanYearsStandardVo vo) {
         PlanYears ofYears = new PlanYears();
-        List<PlanYears> planYears = new ArrayList<>();
+        List<PlanYears> planYears;
         List<PlanYears> planYearsList = new ArrayList<>();
         PageHelper.startPage(vo.getPageNum().intValue(), vo.getPageSize().intValue());
         try {
             BeanUtils.copyProperties(vo, ofYears);
             planYears = planYearsMapper.selectPlanYearsList(ofYears);
-            for (PlanYears planYear : planYears) {
-                SysDeptResponseVo sysDeptResponseVo = (SysDeptResponseVo) deptService.selectDeptById(planYear.getPurchaseDeptId()).get("sysDept");
-                planYear.setPurchaseDeptName(sysDeptResponseVo.getDeptName());
-            }
             planYearsList = changeTo(planYears);
         } catch (Exception e) {
             e.printStackTrace();
@@ -117,29 +115,107 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
         return pageInfo;
     }
 
+    @Override
+    public List<PlanYears> selectPlanYearsListEXP(PlanYearsStandardVo vo) {
+        List<PlanYears> list = new ArrayList<>();
+        List<PlanYears> planYearsList = new ArrayList<>();
+        try {
+            int num = 1;
+            int size = 200;
+            while (size == 200) {
+                LambdaQueryWrapper<PlanYears> lw = new LambdaQueryWrapper<PlanYears>();
+                if (!ObjectUtils.isEmpty(vo.getProjectName())) {
+                    lw.like(PlanYears::getProjectName, vo.getProjectName());
+                }
+                if (!ObjectUtils.isEmpty(vo.getPurchaseServices())) {
+                    lw.eq(PlanYears::getPurchaseServices, vo.getPurchaseServices());
+                }
+                if (!ObjectUtils.isEmpty(vo.getIsExcess())) {
+                    lw.eq(PlanYears::getIsExcess, vo.getIsExcess());
+                }
+                if (!ObjectUtils.isEmpty(vo.getProjectStatus())) {
+                    lw.eq(PlanYears::getProjectStatus, vo.getProjectStatus());
+                }
+                if (!ObjectUtils.isEmpty(vo.getBeginTime())) {
+                    lw.ge(PlanYears::getPlanDemandSubTime, vo.getBeginTime());
+                }
+                if (!ObjectUtils.isEmpty(vo.getEndTime())) {
+                    lw.le(PlanYears::getPlanDemandSubTime, vo.getEndTime());
+                }
+                Page<PlanYears> page = planYearsMapper.selectPage(new Page<PlanYears>(num, size, false), lw);
+                list.addAll(page.getRecords());
+                size = page.getRecords().size();
+                num++;
+            }
+            planYearsList = changeTo(list);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return planYearsList;
+    }
+
     @Override
     public PageInfo<PlanYears> selectPlanYearsExamineList(PlanYearsStandardVo vo) {
         PlanYears ofYears = new PlanYears();
         PageHelper.startPage(vo.getPageNum().intValue(), vo.getPageSize().intValue());
-        List<PlanYears> planYears = new ArrayList<>();
+        List<PlanYears> planYears;
+        List<PlanYears> planYearsList = new ArrayList<>();
         try {
             BeanUtils.copyProperties(vo, ofYears);
             planYears = planYearsMapper.selectPlanYearsExamineList(ofYears);
-            for (PlanYears planYear : planYears) {
-                SysDeptResponseVo sysDeptResponseVo = (SysDeptResponseVo) deptService.selectDeptById(planYear.getPurchaseDeptId()).get("sysDept");
-                planYear.setPurchaseDeptName(sysDeptResponseVo.getDeptName());
-            }
+            planYearsList = changeTo(planYears);
         } catch (Exception e) {
             e.printStackTrace();
         }
-        PageInfo<PlanYears> pageInfo = new PageInfo<PlanYears>(planYears);
+        PageInfo<PlanYears> pageInfo = new PageInfo<PlanYears>(planYearsList);
         return pageInfo;
     }
 
+    @Override
+    public List<PlanYears> selectPlanYearsExamineListEXP(PlanYearsStandardVo vo) {
+        List<PlanYears> list = new ArrayList<>();
+        List<PlanYears> planYearsList = new ArrayList<>();
+        try {
+            int num = 1;
+            int size = 200;
+            while (size == 200) {
+                LambdaQueryWrapper<PlanYears> lw = new LambdaQueryWrapper<PlanYears>();
+                if (!ObjectUtils.isEmpty(vo.getProjectName())) {
+                    lw.like(PlanYears::getProjectName, vo.getProjectName());
+                }
+                if (!ObjectUtils.isEmpty(vo.getPurchaseServices())) {
+                    lw.eq(PlanYears::getPurchaseServices, vo.getPurchaseServices());
+                }
+                if (!ObjectUtils.isEmpty(vo.getIsExcess())) {
+                    lw.eq(PlanYears::getIsExcess, vo.getIsExcess());
+                }
+                if (!ObjectUtils.isEmpty(vo.getProjectStatus())) {
+                    lw.eq(PlanYears::getProjectStatus, vo.getProjectStatus());
+                } else {
+                    lw.in(PlanYears::getProjectStatus, "1,3");
+                }
+                if (!ObjectUtils.isEmpty(vo.getBeginTime())) {
+                    lw.ge(PlanYears::getPlanDemandSubTime, vo.getBeginTime());
+                }
+                if (!ObjectUtils.isEmpty(vo.getEndTime())) {
+                    lw.le(PlanYears::getPlanDemandSubTime, vo.getEndTime());
+                }
+                Page<PlanYears> page = planYearsMapper.selectPage(new Page<PlanYears>(num, size, false), lw);
+                list.addAll(page.getRecords());
+                size = page.getRecords().size();
+                num++;
+            }
+            planYearsList = changeTo(list);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return planYearsList;
+    }
+
     @Transactional
     @Override
     public AjaxResult insertPlanYears(PlanYearsStandardVo yearsStandardVo) {
-        if (planYearsMapper.countProjectName(yearsStandardVo.getProjectName()).size() > 0) {
+        if (planYearsMapper.countProjectName(yearsStandardVo.getProjectName()) > 0) {
             return AjaxResult.error("该项目名称已经存在");
         }
         PlanYears ofYears = new PlanYears();
@@ -151,7 +227,6 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
         //判断是否为超额计划
         ofYears.setIsExcess(isExcessOrNo(ofYears.getProjectType(), ofYears.getEvaluation()));
         ofYears.setProjectStatus(ProjectStatus.PLANWAITCOMMIT.getCode());
-        ofYears.setSendLetter("0");
         ofYears.setCreateTime(new Date());
         planYearsMapper.insertPlanYears(ofYears);
         log.info("id:{}", ofYears.getPlanYearId());
@@ -197,14 +272,14 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
         map.put("red_id", byId.getPlanYearId());
         map.put("type", "1");
         List<SysFileRef> fileRefs = sysFileRefMapper.selectByMap(map);
+        List<SysFileInfo> fileInfos = new ArrayList<>();
         BeanUtils.copyProperties(byId, responseVo);
         if (!ObjectUtils.isEmpty(fileRefs)) {
-            HashMap<String, String> fileMap = new HashMap<>();
             for (SysFileRef ref : fileRefs) {
                 SysFileInfo fileInfo = fileService.getById(ref.getFileId());
-                fileMap.put(fileInfo.getFileUrl(), fileInfo.getFileName());
+                fileInfos.add(fileInfo);
             }
-            responseVo.setFileMap(fileMap);
+            responseVo.setFileInfos(fileInfos);
         }
         return AjaxResult.success(responseVo);
     }
@@ -223,7 +298,6 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
         }
         ofYears.setIsExcess(isExcessOrNo(ofYears.getProjectType(), ofYears.getEvaluation()));
         ofYears.setUpdateTime(new Date());
-        ofYears.setSendLetter("0");
         planYearsMapper.updateInfoById(ofYears);
         List<SysFileRef> sysFileRefs = yearsStandardVo.getSysFileRefs();
         HashMap<String, Object> map = new HashMap<>();
@@ -245,10 +319,17 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
     }
 
     @Override
-    public String importPlanYears(List<PlanYears> planYears, boolean isUpdateSupport, LoginUser loginUser) {
+    public String importPlanYears(List<PlanYearsStandardVo> planYears, boolean isUpdateSupport, LoginUser loginUser) {
         if (StringUtils.isNull(planYears) || planYears.size() == 0) {
             throw new ServiceException("导入年度计划数据不能为空!");
         }
+        List<PlanYears> plans = new ArrayList<>();
+        for (PlanYearsStandardVo yearsStandardVo : planYears) {
+            PlanYears ofYears = new PlanYears();
+            BeanUtils.copyProperties(yearsStandardVo, ofYears);
+            ofYears.setPurchaseDeptName(yearsStandardVo.getPurchaseDeptId());
+            plans.add(ofYears);
+        }
         HashMap<String, HashMap<String, String>> planEnums = dictTypeService.getAboutEnums();
         HashMap<String, String> projectTypesMap = planEnums.get("projectTypes");
         HashMap<String, String> planPurchaseModesMap = planEnums.get("planPurchaseModes");
@@ -260,12 +341,11 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
         StringBuilder successMsg = new StringBuilder();
         StringBuilder failureMsg = new StringBuilder();
         //deptService
-        for (PlanYears ofYear : planYears) {
+        for (PlanYears ofYear : plans) {
             try {
                 //验证项目名称是否重复导入
-                List<PlanYears> plan = planYearsMapper.countProjectName(ofYear.getProjectName());
                 //将录入信息中的值更改为要保存的数据
-                if (plan.size() == 0) {
+                if (planYearsMapper.countProjectName(ofYear.getProjectName()) == 0) {
                     //采购单位
                     SysDept info = deptMapper.checkDeptNameOnlyOne(ofYear.getPurchaseDeptName());
                     if (StringUtils.isNotNull(info)) {
@@ -286,7 +366,6 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
                     }
                     ofYear.setProjectAttr(builder.toString());
                     ofYear.setPurchaseServices(purchaseServices.get(ofYear.getPurchaseServices()));
-                    ofYear.setSendLetter("0");
                     ofYear.setIsExcess(isExcessOrNo(ofYear.getProjectType(), ofYear.getEvaluation()));
                     ofYear.setCreated(String.valueOf(loginUser.getUserId()));
                     ofYear.setCreateTime(new Date());
@@ -316,7 +395,7 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
             failureMsg.insert(0, "导入失败!共 " + failureNum + " 条数据格式不正确:");
             throw new ServiceException(failureMsg.toString());
         } else {
-            successMsg.insert(0, "导入成功!共 " + successNum + " 条,数据如下:");
+            successMsg.insert(0, "导入成功!共 " + successNum + " 条");
         }
         return successMsg.toString();
     }
@@ -697,6 +776,9 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
         HashMap<String, String> purchaseServices = planEnums.get("purchaseServices");
         List<PlanYears> list = new ArrayList<PlanYears>();
         for (PlanYears planYear : planYears) {
+            SysDeptResponseVo sysDeptResponseVo = (SysDeptResponseVo) deptService.selectDeptById(planYear.getPurchaseDeptId()).get("sysDept");
+            planYear.setPurchaseDeptName(sysDeptResponseVo.getDeptName());
+
             for (Map.Entry<String, String> entry : projectTypesMap.entrySet()) {
                 if (planYear.getProjectType().equals(entry.getValue())) {
                     planYear.setProjectTypeStr(entry.getKey());
@@ -710,7 +792,7 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
                 }
             }
             //项目属性是拼接的
-            if (planYear.getProjectAttr().length() > 2) {
+            if (planYear.getProjectAttr().length() > 1) {
                 StringBuilder builder = new StringBuilder();
                 String[] split = planYear.getProjectAttr().split(",");
                 for (String s : split) {
@@ -721,7 +803,7 @@ public class PlanYearsServiceImpl extends ServiceImpl<PlanYearsMapper, PlanYears
                         }
                     }
                 }
-                planYear.setProjectAttr(builder.toString());
+                planYear.setProjectAttrStr(builder.toString());
             } else {
                 for (Map.Entry<String, String> entry : projectAttributes.entrySet()) {
                     if (planYear.getProjectAttr().equals(entry.getValue())) {

+ 230 - 0
purchase-system/src/main/java/com/ozs/plan/service/impl/ProvisionalPlanServiceImpl.java

@@ -1,11 +1,241 @@
 package com.ozs.plan.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ozs.common.core.domain.entity.SysDept;
+import com.ozs.common.core.domain.entity.SysDictData;
+import com.ozs.common.core.domain.model.LoginUser;
+import com.ozs.common.enums.ProjectStatus;
+import com.ozs.common.enums.ProjectTypes;
+import com.ozs.common.exception.ServiceException;
+import com.ozs.common.utils.StringUtils;
+import com.ozs.plan.doman.PlanYears;
 import com.ozs.plan.doman.ProvisionalPlan;
+import com.ozs.plan.doman.vo.requestVo.ProvisionalPlanVo;
+import com.ozs.plan.mapper.PlanYearsMapper;
 import com.ozs.plan.mapper.ProvisionalPlanMapper;
 import com.ozs.plan.service.ProvisionalPlanService;
+import com.ozs.system.domain.vo.responseVo.SysDeptResponseVo;
+import com.ozs.system.mapper.SysDeptMapper;
+import com.ozs.system.service.ISysDeptService;
+import com.ozs.system.service.ISysDictTypeService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+
+import java.math.BigDecimal;
+import java.util.*;
 
 @Service
 public class ProvisionalPlanServiceImpl extends ServiceImpl<ProvisionalPlanMapper, ProvisionalPlan> implements ProvisionalPlanService {
+
+    @Autowired
+    private ProvisionalPlanMapper provisionalPlanMapper;
+    @Autowired
+    private ISysDictTypeService dictTypeService;
+    @Autowired
+    private SysDeptMapper deptMapper;
+    @Autowired
+    private ISysDeptService deptService;
+
+    @Override
+    public int deleteProvisionalPlanById(Integer planYearId) {
+        return provisionalPlanMapper.deleteProvisionalPlanById(planYearId);
+    }
+
+    @Override
+    public int updateProvisionalPlanById(ProvisionalPlan provisionalPlan) {
+        return provisionalPlanMapper.updateProvisionalPlanById(provisionalPlan);
+    }
+
+    @Override
+    public String importProvisionalPlan(List<ProvisionalPlan> provisionalPlans, boolean updateSupport, LoginUser loginUser) {
+        // 字典项
+        HashMap<String, HashMap<String, String>> planEnums = dictTypeService.getAboutEnums();
+        HashMap<String, String> projectTypesMap = planEnums.get("projectTypes");
+        HashMap<String, String> planPurchaseModesMap = planEnums.get("planPurchaseModes");
+        HashMap<String, String> projectAttributes = planEnums.get("projectAttributes");
+        HashMap<String, String> purchaseServices = planEnums.get("purchaseServices");
+
+        int successNum = 0;
+        int failureNum = 0;
+        StringBuilder successMsg = new StringBuilder();
+        StringBuilder failureMsg = new StringBuilder();
+
+        for (ProvisionalPlan ofProvisionalPlan : provisionalPlans) {
+            try {
+                //验证项目名称是否重复导入
+                List<ProvisionalPlan> plan = provisionalPlanMapper.selectProjectName(ofProvisionalPlan.getProjectName());
+                //将录入信息中的值更改为要保存的数据
+                if (plan.size() == 0) {
+                    //采购单位
+                    SysDept info = deptMapper.checkDeptNameOnlyOne(ofProvisionalPlan.getPurchaseDeptName());
+                    if (StringUtils.isNotNull(info)) {
+                        ofProvisionalPlan.setPurchaseDeptId(info.getDeptId());
+                    }
+                    ofProvisionalPlan.setProjectType(projectTypesMap.get(ofProvisionalPlan.getProjectType()));
+                    ofProvisionalPlan.setProjectStatus(ProjectStatus.PLANWAITCOMMIT.getCode());
+                    ofProvisionalPlan.setPurchaseMode(planPurchaseModesMap.get(ofProvisionalPlan.getPurchaseMode()));
+                    //项目属性是多选字段
+                    StringBuilder builder = new StringBuilder();
+                    if (ofProvisionalPlan.getProjectAttr().contains(",")) {
+                        String[] split = ofProvisionalPlan.getProjectAttr().split(",");
+                        for (String s : split) {
+                            builder.append(projectAttributes.get(s) + ",");
+                        }
+                    } else {
+                        builder.append(projectAttributes.get(ofProvisionalPlan.getProjectAttr()));
+                    }
+                    ofProvisionalPlan.setProjectAttr(builder.toString());
+                    ofProvisionalPlan.setPurchaseServices(purchaseServices.get(ofProvisionalPlan.getPurchaseServices()));
+                    ofProvisionalPlan.setIsExcess(isExcessOrNo(ofProvisionalPlan.getProjectType(), ofProvisionalPlan.getEvaluation()));
+                    ofProvisionalPlan.setCreated(String.valueOf(loginUser.getUserId()));
+                    ofProvisionalPlan.setCreateTime(new Date());
+                    ofProvisionalPlan.setPlanType("1");
+                    provisionalPlanMapper.insert(ofProvisionalPlan);
+                    successNum++;
+                    successMsg.append("*" + successNum + "、项目 " + ofProvisionalPlan.getProjectName() + " 导入成功!");
+                } else {
+                    failureNum++;
+                    failureMsg.append("*" + successNum + "、项目 " + ofProvisionalPlan.getProjectName() + " 已存在");
+                }
+            } catch (Exception exc) {
+                failureNum++;
+                String msg = "*" + successNum + "、项目 " + ofProvisionalPlan.getProjectName() + " 导入失败";
+                failureMsg.append(msg + exc.getMessage());
+                log.error(msg, exc);
+            }
+        }
+        if (failureNum > 0) {
+            failureMsg.insert(0, "导入失败!共 " + failureNum + " 条数据格式不正确:");
+            throw new ServiceException(failureMsg.toString());
+        } else {
+            successMsg.insert(0, "导入成功!共 " + successNum + " 条。");
+        }
+        return successMsg.toString();
+    }
+
+    @Override
+    public List<ProvisionalPlan> selectProvisionalPlanExport(ProvisionalPlanVo vo) {
+        List<ProvisionalPlan> list = new ArrayList<>();
+        List<ProvisionalPlan> provisionalPlanList = new ArrayList<>();
+        try {
+            int num = 1;
+            int size = 200;
+            while (size == 200) {
+                LambdaQueryWrapper<ProvisionalPlan> lw = new LambdaQueryWrapper<ProvisionalPlan>();
+                if (!ObjectUtils.isEmpty(vo.getProjectName())) {
+                    lw.like(ProvisionalPlan::getProjectName, vo.getProjectName());
+                }
+                if (!ObjectUtils.isEmpty(vo.getPurchaseServices())) {
+                    lw.eq(ProvisionalPlan::getPurchaseServices, vo.getPurchaseServices());
+                }
+                if (!ObjectUtils.isEmpty(vo.getIsExcess())) {
+                    lw.eq(ProvisionalPlan::getIsExcess, vo.getIsExcess());
+                }
+                if (!ObjectUtils.isEmpty(vo.getProjectStatus())) {
+                    lw.eq(ProvisionalPlan::getProjectStatus, vo.getProjectStatus());
+                }
+                if (!ObjectUtils.isEmpty(vo.getStartTime())) {
+                    lw.ge(ProvisionalPlan::getPlanDemandSubTime, vo.getStartTime());
+                }
+                if (!ObjectUtils.isEmpty(vo.getEndTime())) {
+                    lw.le(ProvisionalPlan::getPlanDemandSubTime, vo.getEndTime());
+                }
+                Page<ProvisionalPlan> page = provisionalPlanMapper.selectPage(new Page<ProvisionalPlan>(num, size, false), lw);
+                list.addAll(page.getRecords());
+                size = page.getRecords().size();
+                num++;
+            }
+            provisionalPlanList = changeTo(list);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return provisionalPlanList;
+    }
+
+    //判断是否为超额计划
+    public String isExcessOrNo(String projectType, BigDecimal evaluation) {
+        BigDecimal threshold = new BigDecimal(0);
+        //获取各个项目类型设定的概算金额阈值
+        List<SysDictData> data = dictTypeService.selectDictDataByType("sys_over_limit_threshold");
+        HashMap<String, String> thresholdMap = new LinkedHashMap<>();
+        //各个类型的概算金额阈值
+        for (SysDictData dictData : data) {
+            //    类型----阈值
+            thresholdMap.put(dictData.getDictLabel(), dictData.getDictValue());
+        }
+        //项目类型
+        for (ProjectTypes value : ProjectTypes.values()) {
+            if (projectType.equals(value.getCode())) {
+                threshold = BigDecimal.valueOf(Long.parseLong(thresholdMap.get(value.getInfo())));
+            }
+            break;
+        }
+        if (evaluation.compareTo(threshold) == 1) {
+            //是超额计划
+            return ("1");
+        } else {
+            return ("0");
+        }
+    }
+
+    //字段赋值对应的名称
+    public List<ProvisionalPlan> changeTo(List<ProvisionalPlan> provisionalPlans) {
+        HashMap<String, HashMap<String, String>> planEnums = dictTypeService.getAboutEnums();
+        HashMap<String, String> projectTypesMap = planEnums.get("projectTypes");
+        HashMap<String, String> planPurchaseModesMap = planEnums.get("planPurchaseModes");
+        HashMap<String, String> projectAttributes = planEnums.get("projectAttributes");
+        HashMap<String, String> purchaseServices = planEnums.get("purchaseServices");
+        List<ProvisionalPlan> list = new ArrayList<ProvisionalPlan>();
+        for (ProvisionalPlan provisionalPlan : provisionalPlans) {
+            if (provisionalPlan.getPurchaseDeptId() != null) {
+                SysDeptResponseVo sysDeptResponseVo = (SysDeptResponseVo) deptService.selectDeptById(provisionalPlan.getPurchaseDeptId()).get("sysDept");
+                provisionalPlan.setPurchaseDeptName(sysDeptResponseVo.getDeptName());
+            }
+            for (Map.Entry<String, String> entry : projectTypesMap.entrySet()) {
+                if (provisionalPlan.getProjectType() != null && provisionalPlan.getProjectType().equals(entry.getValue())) {
+                    provisionalPlan.setProjectTypeStr(entry.getKey());
+                    break;
+                }
+            }
+            for (Map.Entry<String, String> entry : planPurchaseModesMap.entrySet()) {
+                if (provisionalPlan.getPurchaseMode() != null && provisionalPlan.getPurchaseMode().equals(entry.getValue())) {
+                    provisionalPlan.setPurchaseModeStr(entry.getKey());
+                    break;
+                }
+            }
+            //项目属性是拼接的
+            if (provisionalPlan.getProjectAttr().length() > 1) {
+                StringBuilder builder = new StringBuilder();
+                String[] split = provisionalPlan.getProjectAttr().split(",");
+                for (String s : split) {
+                    for (Map.Entry<String, String> entry : projectAttributes.entrySet()) {
+                        if (s.equals(entry.getValue())) {
+                            builder.append(entry.getKey() + ",");
+                            break;
+                        }
+                    }
+                }
+                provisionalPlan.setProjectAttrStr(builder.toString());
+            } else {
+                for (Map.Entry<String, String> entry : projectAttributes.entrySet()) {
+                    if (provisionalPlan.getProjectAttr() != null && provisionalPlan.getProjectAttr().equals(entry.getValue())) {
+                        provisionalPlan.setProjectAttrStr(entry.getKey());
+                        break;
+                    }
+                }
+            }
+            for (Map.Entry<String, String> entry : purchaseServices.entrySet()) {
+                if (provisionalPlan.getPurchaseServices() != null && provisionalPlan.getPurchaseServices().equals(entry.getValue())) {
+                    provisionalPlan.setPurchaseServicesStr(entry.getKey());
+                    break;
+                }
+            }
+
+            list.add(provisionalPlan);
+        }
+        return list;
+    }
 }

+ 6 - 0
purchase-system/src/main/java/com/ozs/pm/doman/PmDemand.java

@@ -127,5 +127,11 @@ public class PmDemand extends BaseEntity
     @Excel(name = "调整建议")
     private String adjustAdvice;
 
+    /** 抽取招标代理机构id */
+    @Excel(name = "抽取招标代理机构id")
+    private Long agencyId;
 
+    /** 抽取招标代理机构时间 */
+    @Excel(name = "抽取招标代理机构时间")
+    private Date extractAgencyTime;
 }

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

@@ -22,7 +22,7 @@ import java.util.List;
 @AllArgsConstructor
 @NoArgsConstructor
 @Builder
-@ApiModel("采购需求对象")
+@ApiModel("采购需求查询对象")
 public class PmDemandReqVo extends PageVo
 {
     /** 主键 */
@@ -35,7 +35,7 @@ public class PmDemandReqVo extends PageVo
 
     /** 采购服务站 */
     @ApiModelProperty("采购服务站")
-    private String purchaseServiceStation;
+    private String purchaseServices;
 
 
     /** 项目状态(4:需求待填制,5:需求待提交,6:需求待审核,7:任务待下达,8:任务已下达,9:中标信息待填制,10:中标信息已填制,11:合同待填制,12:合同已填制,13:项目建设中,14:项目建设完成) */
@@ -47,11 +47,11 @@ public class PmDemandReqVo extends PageVo
     private Integer isExcess;
 
     /** 开始日期 */
-    @ApiModelProperty("开始日期")
+    @ApiModelProperty("开始日期 yyyy-MM-dd")
     private String beginDate;
 
     /** 结束日期 */
-    @ApiModelProperty("结束日期")
+    @ApiModelProperty("结束日期 yyyy-MM-dd")
     private String endDate;
 
     /** 退回原因 */
@@ -72,4 +72,5 @@ public class PmDemandReqVo extends PageVo
     /** 模块名称 */
     @ApiModelProperty("模块名称")
     private String moduleName;
+
 }

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

@@ -227,4 +227,10 @@ public class PmDemandResVo extends BaseEntity
      */
     @ApiModelProperty("采购需求审核文件")
     HashMap<String, String> auditFileMap;
+
+    /**
+     * 任务下达文件
+     */
+    @ApiModelProperty("任务下达文件")
+    HashMap<String, String> taskReleaseFileMap;
 }

+ 1 - 0
purchase-system/src/main/java/com/ozs/pm/mapper/PmDemandMapper.java

@@ -2,6 +2,7 @@ package com.ozs.pm.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ozs.plan.doman.PlanYears;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ozs.pm.doman.PmDemand;
 
 import java.util.List;

+ 13 - 3
purchase-system/src/main/java/com/ozs/pm/service/IPmDemandService.java

@@ -1,13 +1,14 @@
 package com.ozs.pm.service;
 
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
 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.doman.vo.responseVo.PmFlowChartResVo;
 
-import java.util.List;
 
 
 /**
@@ -16,7 +17,7 @@ import java.util.List;
  * @author ruoyi
  * @date 2023-01-16
  */
-public interface IPmDemandService 
+public interface IPmDemandService extends IService<PmDemand>
 {
     /**
      * 查询采购需求
@@ -32,7 +33,8 @@ public interface IPmDemandService
      * @param pmDemandReqVo 采购需求
      * @return 采购需求集合
      */
-    public List<PmDemandResVo> selectPmDemandList(PmDemandReqVo pmDemandReqVo);
+    public IPage<PmDemandResVo> selectPmDemandList(PmDemandReqVo pmDemandReqVo,int reqType);
+
 
     /**
      * 新增采购需求
@@ -96,4 +98,12 @@ public interface IPmDemandService
      * @return 结果
      */
     public int reviewReturn(PmDemandReqVo pmDemandReqVo);
+
+    /**
+     * 下达任务
+     *
+     * @param pmDemandReqVo
+     * @return 结果
+     */
+    public int releaseTask(PmDemandReqVo pmDemandReqVo);
 }

+ 95 - 20
purchase-system/src/main/java/com/ozs/pm/service/impl/PmDemandServiceImpl.java

@@ -2,6 +2,10 @@ package com.ozs.pm.service.impl;
 
 import java.util.*;
 
+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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ozs.common.enums.*;
 import com.ozs.common.utils.DateUtils;
 import com.ozs.common.utils.StringUtils;
@@ -30,7 +34,7 @@ import org.springframework.util.ObjectUtils;
  * @date 2023-01-16
  */
 @Service
-public class PmDemandServiceImpl implements IPmDemandService
+public class PmDemandServiceImpl extends ServiceImpl<PmDemandMapper, PmDemand> implements IPmDemandService
 {
     @Autowired
     private PmDemandMapper pmDemandMapper;
@@ -78,16 +82,24 @@ public class PmDemandServiceImpl implements IPmDemandService
                 vo.setPurchaseServicesName(purchaseServicesName);
             }
 
+            //采购需求附件
             HashMap<String, String> demandFileMap = getFileMap(vo.getDemandId(),SysFileRefEnum.PM_DEMAND.getType());
             if(demandFileMap != null){
                 vo.setDemandFileMap(demandFileMap);
             }
 
+            //采购需求审核文件
             HashMap<String, String> auditFileMap = getFileMap(vo.getDemandId(),SysFileRefEnum.PM_DEMAND_EXAMINE.getType());
             if(auditFileMap != null){
                 vo.setAuditFileMap(auditFileMap);
             }
 
+            //任务下达文件
+            HashMap<String, String> taskReleaseFileMap = getFileMap(vo.getDemandId(),SysFileRefEnum.PM_TAST_RELEASE.getType());
+            if(taskReleaseFileMap != null){
+                vo.setTaskReleaseFileMap(taskReleaseFileMap);
+            }
+
             //项目类型
             for (ProjectTypes value : ProjectTypes.values()) {
                 if (vo.getProjectType() != null && vo.getProjectType().equals(value.getCode())) {
@@ -251,25 +263,55 @@ public class PmDemandServiceImpl implements IPmDemandService
      * @return 采购需求
      */
     @Override
-    public List<PmDemandResVo> selectPmDemandList(PmDemandReqVo pmDemandReqVo) {
-        PmDemand pmDemand = new PmDemand();
-        pmDemand.setProjectName(pmDemandReqVo.getProjectName());
-        pmDemand.setPurchaseServices(pmDemandReqVo.getPurchaseServiceStation());
-        pmDemand.setProjectStatus(pmDemandReqVo.getProjectStatus());
-        pmDemand.setIsExcess(pmDemandReqVo.getIsExcess());
-        Map<String,Object> params = new HashMap<>();
-        params.put("beginDate", pmDemandReqVo.getBeginDate());
-        params.put("endDate", pmDemandReqVo.getEndDate());
-        pmDemand.setParams(params);
-        List<PmDemand> pmDemandList = pmDemandMapper.selectPmDemandList(pmDemand);
-        List<PmDemandResVo> pmDemandResponseVoList = new ArrayList<>();
-        if(pmDemandList != null && !pmDemandList.isEmpty()){
-            for(PmDemand pmDemand1 : pmDemandList){
+    public IPage<PmDemandResVo> selectPmDemandList(PmDemandReqVo pmDemandReqVo, int reqType) {
+
+        LambdaQueryWrapper<PmDemand> lw = new LambdaQueryWrapper<>();
+        if (!StringUtils.isBlank(pmDemandReqVo.getProjectName())) {
+            lw.like(PmDemand::getProjectName, "%" + pmDemandReqVo.getProjectName() + "%");
+        }
+        if (!StringUtils.isBlank(pmDemandReqVo.getPurchaseServices())) {
+            lw.eq(PmDemand::getPurchaseServices, pmDemandReqVo.getPurchaseServices());
+        }
+        if (pmDemandReqVo.getProjectStatus() != null) {
+            lw.eq(PmDemand::getProjectStatus, pmDemandReqVo.getProjectStatus());
+        }
+        if (pmDemandReqVo.getIsExcess() != null) {
+            lw.eq(PmDemand::getIsExcess, pmDemandReqVo.getIsExcess());
+        }
+        if (!StringUtils.isBlank(pmDemandReqVo.getBeginDate())) {
+            lw.apply("(plan_demand_sub_time >= '" + pmDemandReqVo.getBeginDate() +"' or plan_purchase_finish_time >= '" + pmDemandReqVo.getBeginDate() + "' or plan_deliver_time >=  '" + pmDemandReqVo.getBeginDate() +"' )");
+        }
+        if (!StringUtils.isBlank(pmDemandReqVo.getEndDate())) {
+            lw.apply("(plan_demand_sub_time <= '" + pmDemandReqVo.getEndDate() +"' or plan_purchase_finish_time <= '" + pmDemandReqVo.getEndDate() + "' or plan_deliver_time <=  '" + pmDemandReqVo.getEndDate() +"' )");
+        }
+
+        if(reqType== 1) { //需求审核单位列表
+            lw.eq(PmDemand::getProjectStatus, PmProjectStatus.DEMAND_WAIT_AUDIT.getCode());
+        } else  if(reqType== 2) { //任务下达列表
+            lw.apply("(project_status = 8 or project_status = 9 )");
+        } else  if(reqType== 3) { //采购执行列表
+            lw.apply("(project_status = 9 or project_status = 10 )");
+        } else  if(reqType== 4) { //合同信息列表
+            lw.apply("(project_status = 10 or project_status = 11 )");
+        }  else  if(reqType== 5) { //项目建设列表
+            lw.apply("(project_status = 11 or project_status = 12 )");
+        }
+
+        IPage<PmDemand> pageRes = this.page(new Page<>(pmDemandReqVo.getPageNum(), pmDemandReqVo.getPageSize()), lw);
+        IPage<PmDemandResVo> results = new Page<>(pageRes.getCurrent(), pageRes.getSize(), pageRes.getTotal());
+        if(pageRes.getRecords() != null && pageRes.getRecords().size() > 0){
+            List<PmDemandResVo> pmDemandResponseVoList = new ArrayList<>();
+            for(PmDemand pmDemand1 : pageRes.getRecords()){
                 PmDemandResVo vo = new PmDemandResVo();
-                BeanUtils.copyBeanProp(pmDemand1,vo);
-                SysDeptResponseVo sysDeptResponseVo = (SysDeptResponseVo) deptService.selectDeptById(vo.getPurchaseDeptId()).get("sysDept");
-                if(sysDeptResponseVo != null){
-                    vo.setPurchaseDeptName(sysDeptResponseVo.getDeptName());
+                BeanUtils.copyProperties(pmDemand1,vo);
+                if(vo.getPurchaseDeptId() != null){
+                    Map<String, Object> deptMap =  deptService.selectDeptById(vo.getPurchaseDeptId());
+                    if(deptMap!= null){
+                        SysDeptResponseVo sysDeptResponseVo = (SysDeptResponseVo)deptMap.get("sysDept");
+                        if(sysDeptResponseVo != null){
+                            vo.setPurchaseDeptName(sysDeptResponseVo.getDeptName());
+                        }
+                    }
                 }
 
                 String purchaseServicesName = dictDataService.selectDictLabel("purchase_services",vo.getPurchaseServices());
@@ -323,10 +365,13 @@ public class PmDemandServiceImpl implements IPmDemandService
                 }
                 pmDemandResponseVoList.add(vo);
             }
+            results.setRecords(pmDemandResponseVoList);
         }
-        return pmDemandResponseVoList;
+
+        return results;
     }
 
+
     /**
      * 新增采购需求
      *
@@ -664,4 +709,34 @@ public class PmDemandServiceImpl implements IPmDemandService
         pmDemand.setAuditTime(DateUtils.getNowDate());
         return pmDemandMapper.updatePmDemand(pmDemand);
     }
+
+    /**
+     * 下达任务
+     *
+     * @param pmDemandReqVo
+     * @return 结果
+     */
+    @Override
+    public int releaseTask(PmDemandReqVo pmDemandReqVo) {
+        PmDemand pmDemand = new PmDemand();
+        pmDemand.setDemandId(pmDemandReqVo.getDemandId());
+        pmDemand.setProjectStatus(Long.parseLong(PmProjectStatus.BID_INFO_WAIT_FILL.getCode()));
+        List<SysFileRef> sysFileRefs = pmDemandReqVo.getSysFileRefs();
+        if (!ObjectUtils.isEmpty(sysFileRefs)) {
+            for (SysFileRef ref : sysFileRefs) {
+                ref.setRedId(pmDemandReqVo.getDemandId());
+                ref.setType(SysFileRefEnum.PM_TAST_RELEASE.getType());
+                ref.setCreated(pmDemandReqVo.getUpdateBy());
+                ref.setCreateTime(new Date());
+                ref.setUpdated(pmDemandReqVo.getUpdateBy());
+                ref.setUpdateTime(new Date());
+                sysFileRefService.save(ref);
+            }
+        }
+        pmDemand.setUpdateBy(pmDemandReqVo.getUpdateBy());
+        pmDemand.setUpdateTime(DateUtils.getNowDate());
+        pmDemand.setAuditTime(DateUtils.getNowDate());
+        return pmDemandMapper.updatePmDemand(pmDemand);
+    }
+
 }

+ 13 - 12
purchase-system/src/main/java/com/ozs/system/service/impl/SysDictTypeServiceImpl.java

@@ -8,11 +8,9 @@ import java.util.Map;
 import java.util.stream.Collectors;
 import javax.annotation.PostConstruct;
 
-import com.ozs.common.core.domain.AjaxResult;
+import com.ozs.common.constant.Constants;
 import com.ozs.common.enums.PlanPurchaseMode;
-import com.ozs.common.enums.ProjectAttribute;
 import com.ozs.common.enums.ProjectStatus;
-import com.ozs.common.enums.ProjectTypes;
 import com.ozs.system.service.ISysDictTypeService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -215,10 +213,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService {
         HashMap<String, String> planPurchaseModesMap = new LinkedHashMap<>();
         HashMap<String, String> projectAttributes = new LinkedHashMap<>();
         HashMap<String, String> purchaseServices = new LinkedHashMap<>();
-        //项目类型
-        for (ProjectTypes value : ProjectTypes.values()) {
-            projectTypesMap.put(value.getInfo(), value.getCode());
-        }
+
         //项目审核状态
         for (ProjectStatus value : ProjectStatus.values()) {
             projectStatusMap.put(value.getInfo(), value.getCode());
@@ -227,15 +222,21 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService {
         for (PlanPurchaseMode value : PlanPurchaseMode.values()) {
             planPurchaseModesMap.put(value.getInfo(), value.getCode());
         }
-        //项目属性
-        for (ProjectAttribute value : ProjectAttribute.values()) {
-            projectAttributes.put(value.getInfo(), value.getCode());
-        }
-        List<SysDictData> data = dictDataMapper.selectDictDataByType("purchase_services");
         //采购服务站
+        List<SysDictData> data = dictDataMapper.selectDictDataByType(Constants.PURCHASE_SERVICES);
         for (SysDictData dictData : data) {
             purchaseServices.put(dictData.getDictLabel(), dictData.getDictValue());
         }
+        //项目属性
+        List<SysDictData> data1 = dictDataMapper.selectDictDataByType(Constants.SYS_PROJECT_ATTR);
+        for (SysDictData dictData : data1) {
+            projectAttributes.put(dictData.getDictLabel(), dictData.getDictValue());
+        }
+        //项目类型
+        List<SysDictData> data2 = dictDataMapper.selectDictDataByType(Constants.SYS_PROJECT_TYPE);
+        for (SysDictData dictData : data2) {
+            projectTypesMap.put(dictData.getDictLabel(), dictData.getDictValue());
+        }
 
         hashMap.put("projectTypes", projectTypesMap);
         hashMap.put("projectStatus", projectStatusMap);

+ 187 - 0
purchase-system/src/main/resources/mapper/plan/PlanQuarterMapper.xml

@@ -0,0 +1,187 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+		PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+		"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ozs.plan.mapper.PlanQuarterMapper">
+
+	<resultMap type="com.ozs.plan.doman.PlanQuarter" id="PlanQuarterResult">
+		<id property="plan_practical_id" column="planPracticalId"/>
+		<result property="plan_year_id" column="planYearId"/>
+		<result property="purchase_dept_id" column="purchaseDeptId"/>
+		<result property="project_name" column="projectName"/>
+		<result property="project_type" column="projectType"/>
+		<result property="demand_overview" column="demandOverview"/>
+		<result property="evaluation" column="evaluation"/>
+		<result property="is_excess" column="isExcess"/>
+		<result property="purchase_services" column="purchaseServices"/>
+		<result property="purchase_mode" column="purchaseMode"/>
+		<result property="plan_demand_sub_time" column="planDemandSubTime"/>
+		<result property="plan_purchase_finish_time" column="planPurchaseFinishTime"/>
+		<result property="plan_deliver_time" column="planDeliverTime"/>
+		<result property="project_attr" column="projectAttr"/>
+		<result property="adjust_reason" column="adjustReason"/>
+		<result property="remarks" column="remarks"/>
+		<result property="project_status" column="projectStatus"/>
+		<result property="send_letter" column="sendLetter"/>
+		<result property="created" column="created"/>
+		<result property="create_time" column="createTime"/>
+		<result property="updated" column="updated"/>
+		<result property="update_time" column="updateTime"/>
+		<result property="refuse_reason" column="refuseReason"/>
+		<result property="del_flay" column="delFlay"/>
+		<result property="plan_type" column="planType"/>
+	</resultMap>
+
+	<update id="updateInfoById" parameterType="com.ozs.plan.doman.PlanQuarter">
+		update plan_practical
+		set project_name=#{projectName},
+			project_type=#{projectType},
+			demand_overview=#{demandOverview},
+			evaluation=#{evaluation},
+			is_excess=#{isExcess},
+			purchase_services=#{purchaseServices},
+			purchase_mode=#{purchaseMode},
+			plan_demand_sub_time=#{planDemandSubTime},
+			plan_purchase_finish_time=#{planPurchaseFinishTime},
+			plan_deliver_time=#{planDeliverTime},
+			project_attr=#{projectAttr},
+			adjust_reason=#{adjustReason},
+			remarks=#{remarks},
+			updated=#{updated},
+			update_time=#{updateTime}
+		where plan_practical_id = #{planPracticalId}
+	</update>
+
+	<select id="selectPlanQuarterList" parameterType="com.ozs.plan.doman.PlanQuarter" resultMap="PlanQuarterResult">
+		select * from plan_practical
+		<where>
+			<if test="projectName != null and projectName != ''">
+				AND project_name like concat('%', #{projectName}, '%')
+			</if>
+			<if test="purchaseServices != null and purchaseServices != ''">
+				AND purchase_services = #{purchaseServices}
+			</if>
+			<if test="isExcess != null and isExcess != ''">
+				AND is_excess = #{isExcess}
+			</if>
+			<if test="projectStatus != null and projectStatus != ''">
+				AND project_status = #{projectStatus}
+			</if>
+			<if test="beginTime != null  "><!-- 开始时间检索 -->
+				and date_format(plan_demand_sub_time,'%y%m%d') &gt;= date_format(#{beginTime},'%y%m%d')
+			</if>
+			<if test="endTime != null  "><!-- 结束时间检索 -->
+				and date_format(plan_demand_sub_time,'%y%m%d') &lt;= date_format(#{endTime},'%y%m%d')
+			</if>
+			and plan_type=0
+			and del_flay=0
+		</where>
+		order by create_time desc
+	</select>
+
+	<select id="selectPlanQuarterExamineList" parameterType="com.ozs.plan.doman.PlanQuarter"
+			resultMap="PlanQuarterResult">
+		select * from plan_practical
+		<where>
+			<if test="projectName != null and projectName != ''">
+				AND project_name like concat('%', #{projectName}, '%')
+			</if>
+			<if test="purchaseServices != null and purchaseServices != ''">
+				AND purchase_services = #{purchaseServices}
+			</if>
+			<if test="isExcess != null and isExcess != ''">
+				AND is_excess = #{isExcess}
+			</if>
+			<if test="projectStatus == null or projectStatus ==''">
+				AND project_status in (1,3)
+			</if>
+			<if test="projectStatus != null and projectStatus != ''">
+				AND project_status = #{projectStatus}
+			</if>
+			<if test="beginTime != null "><!-- 开始时间检索 -->
+				and date_format(plan_demand_sub_time,'%y%m%d') &gt;= date_format(#{beginTime},'%y%m%d')
+			</if>
+			<if test="endTime != null "><!-- 结束时间检索 -->
+				and date_format(plan_demand_sub_time,'%y%m%d') &lt;= date_format(#{endTime},'%y%m%d')
+			</if>
+			and plan_type=0
+			and del_flay=0
+		</where>
+		order by create_time desc
+	</select>
+
+	<select id="countProjectName" resultType="java.lang.Integer" parameterType="java.lang.String">
+		select count(plan_practical.plan_practical_id)
+		from plan_practical
+		where project_name = #{projectName}
+		  and plan_type = 0
+		  and del_flay = 0
+	</select>
+
+	<select id="getById" resultType="com.ozs.plan.doman.PlanQuarter" parameterType="java.lang.Long">
+		select *
+		from plan_practical
+		where plan_practical_id = #{planPracticalId}
+		  and del_flay = 0
+	</select>
+
+	<select id="countProjectNameOther" resultType="java.lang.Integer" parameterType="java.lang.String">
+		select count(plan_practical.plan_practical_id)
+		from plan_practical
+		where project_name = #{projectName}
+		  and plan_practical_id != #{planPracticalId}
+		  and plan_type = 0
+		  and del_flay = 0
+	</select>
+
+	<!--	创建计划信息-->
+	<insert id="insertPlanQuarter" parameterType="com.ozs.plan.doman.PlanQuarter" useGeneratedKeys="true"
+			keyProperty="planYearId">
+		insert into plan_practical (purchase_dept_id, project_name, project_type, demand_overview, evaluation,
+									is_excess,
+									purchase_services, purchase_mode, plan_demand_sub_time, plan_purchase_finish_time,
+									plan_deliver_time, project_attr, adjust_reason, remarks, project_status,
+									created, create_time, del_flay, plan_type, send_letter)
+		values (#{purchaseDeptId}, #{projectName}, #{projectType}, #{demandOverview}, #{evaluation}, #{isExcess},
+				#{purchaseServices}, #{purchaseMode}, #{planDemandSubTime}, #{planPurchaseFinishTime},
+				#{planDeliverTime},
+				#{projectAttr}, #{adjustReason}, #{remarks}, #{projectStatus}, #{created}, #{createTime}, 0, 0, 0)
+	</insert>
+
+	<!--	计划删除-->
+	<update id="deletePlanQuarterByIds" parameterType="java.lang.Long">
+		update plan_practical set del_flay=1 where plan_practical_id in
+		<foreach collection="array" item="item" open="(" separator="," close=")">
+			#{item}
+		</foreach>
+	</update>
+
+	<update id="deletePlanQuarterById" parameterType="java.lang.Long">
+		update plan_practical
+		set del_flay=1
+		where plan_practical_id = #{planPracticalId}
+	</update>
+
+	<!--	计划提交-->
+	<update id="commit" parameterType="java.lang.Long">
+		update plan_practical
+		set project_status=1
+		where plan_practical_id = #{planPracticalId}
+	</update>
+
+	<!--	计划审核-->
+	<update id="review" parameterType="com.ozs.plan.doman.PlanQuarter">
+		update plan_practical
+		set refuse_reason=#{refuseReason},
+			project_status=#{projectStatus}
+		where plan_practical_id = #{planPracticalId}
+	</update>
+
+	<update id="sendLetter" parameterType="java.lang.Long">
+		update plan_practical
+		set send_letter= 1
+		where plan_practical_id = #{planPracticalId}
+	</update>
+
+
+</mapper>

+ 8 - 8
purchase-system/src/main/resources/mapper/plan/PlanYearsMapper.xml

@@ -65,10 +65,10 @@
 			<if test="projectStatus != null and projectStatus != ''">
 				AND project_status = #{projectStatus}
 			</if>
-			<if test="beginTime != null and beginTime != ''"><!-- 开始时间检索 -->
+			<if test="beginTime != null  "><!-- 开始时间检索 -->
 				and date_format(plan_demand_sub_time,'%y%m%d') &gt;= date_format(#{beginTime},'%y%m%d')
 			</if>
-			<if test="endTime != null and endTime != ''"><!-- 结束时间检索 -->
+			<if test="endTime != null  "><!-- 结束时间检索 -->
 				and date_format(plan_demand_sub_time,'%y%m%d') &lt;= date_format(#{endTime},'%y%m%d')
 			</if>
 			and del_flay=0
@@ -94,10 +94,10 @@
 			<if test="projectStatus != null and projectStatus != ''">
 				AND project_status = #{projectStatus}
 			</if>
-			<if test="beginTime != null and beginTime != ''"><!-- 开始时间检索 -->
+			<if test="beginTime != null "><!-- 开始时间检索 -->
 				and date_format(plan_demand_sub_time,'%y%m%d') &gt;= date_format(#{beginTime},'%y%m%d')
 			</if>
-			<if test="endTime != null and endTime != ''"><!-- 结束时间检索 -->
+			<if test="endTime != null "><!-- 结束时间检索 -->
 				and date_format(plan_demand_sub_time,'%y%m%d') &lt;= date_format(#{endTime},'%y%m%d')
 			</if>
 			and del_flay=0
@@ -105,8 +105,8 @@
 		order by create_time desc
 	</select>
 
-	<select id="countProjectName" resultType="com.ozs.plan.doman.PlanYears" parameterType="java.lang.String">
-		select *
+	<select id="countProjectName" resultType="java.lang.Integer" parameterType="java.lang.String">
+		select count(plan_years.plan_year_id)
 		from plan_years
 		where project_name = #{projectName}
 		  and del_flay = 0
@@ -133,11 +133,11 @@
 		insert into plan_years (purchase_dept_id, project_name, project_type, demand_overview, evaluation, is_excess,
 								purchase_services, purchase_mode, plan_demand_sub_time, plan_purchase_finish_time,
 								plan_deliver_time, project_attr, adjust_reason, remarks, project_status,
-								created, create_time, del_flay)
+								created, create_time, del_flay, send_letter)
 		values (#{purchaseDeptId}, #{projectName}, #{projectType}, #{demandOverview}, #{evaluation}, #{isExcess},
 				#{purchaseServices}, #{purchaseMode}, #{planDemandSubTime}, #{planPurchaseFinishTime},
 				#{planDeliverTime},
-				#{projectAttr}, #{adjustReason}, #{remarks}, #{projectStatus}, #{created}, #{createTime}, 0)
+				#{projectAttr}, #{adjustReason}, #{remarks}, #{projectStatus}, #{created}, #{createTime}, 0, 0)
 	</insert>
 
 	<!--	计划删除-->

+ 0 - 30
purchase-system/src/main/resources/mapper/plan/ProvisionalPlan.xml

@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper
-		PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-		"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.ozs.plan.mapper.ProvisionalPlanMapper">
-	<resultMap type="com.ozs.plan.doman.PlanYears" id="PlanYearsResult">
-		<id property="plan_year_id" column="planYearId"/>
-		<result property="purchase_dept_id" column="purchaseDeptId"/>
-		<result property="project_name" column="projectName"/>
-		<result property="project_type" column="projectType"/>
-		<result property="demand_overview" column="demandOverview"/>
-		<result property="evaluation" column="evaluation"/>
-		<result property="is_excess" column="isExcess"/>
-		<result property="purchase_services" column="purchaseServices"/>
-		<result property="purchase_mode" column="purchaseMode"/>
-		<result property="plan_demand_sub_time" column="planDemandSubTime"/>
-		<result property="plan_purchase_finish_time" column="planPurchaseFinishTime"/>
-		<result property="plan_deliver_time" column="planDeliverTime"/>
-		<result property="project_attr" column="projectAtt"/>
-		<result property="adjust_reason" column="adjustReason"/>
-		<result property="remarks" column="remarks"/>
-		<result property="project_status" column="projectStatus"/>
-		<result property="created" column="created"/>
-		<result property="create_time" column="createTime"/>
-		<result property="updated" column="updated"/>
-		<result property="update_time" column="updateTime"/>
-		<result property="refuse_reason" column="refuseReason"/>
-		<result property="del_flay" column="delFlay"/>
-	</resultMap>
-</mapper>

+ 107 - 0
purchase-system/src/main/resources/mapper/plan/ProvisionalPlanMapper.xml

@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+		PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+		"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ozs.plan.mapper.ProvisionalPlanMapper">
+	<resultMap type="com.ozs.plan.doman.ProvisionalPlan" id="ProvisionalPlanResult">
+		<id property="plan_year_id" column="planYearId"/>
+		<result property="plan_year_id" column="planYearId"/>
+		<result property="purchase_dept_id" column="purchaseDeptId"/>
+		<result property="project_name" column="projectName"/>
+		<result property="project_type" column="projectType"/>
+		<result property="demand_overview" column="demandOverview"/>
+		<result property="evaluation" column="evaluation"/>
+		<result property="is_excess" column="isExcess"/>
+		<result property="purchase_services" column="purchaseServices"/>
+		<result property="purchase_mode" column="purchaseMode"/>
+		<result property="plan_demand_sub_time" column="planDemandSubTime"/>
+		<result property="plan_purchase_finish_time" column="planPurchaseFinishTime"/>
+		<result property="plan_deliver_time" column="planDeliverTime"/>
+		<result property="project_attr" column="projectAttr"/>
+		<result property="adjust_reason" column="adjustReason"/>
+		<result property="remarks" column="remarks"/>
+		<result property="project_status" column="projectStatus"/>
+		<result property="refuse_reason" column="refuseReason"/>
+		<result property="del_flay" column="delFlay"/>
+		<result property="plan_type" column="planType"/>
+		<result property="created" column="created"/>
+		<result property="create_time" column="createTime"/>
+		<result property="updated" column="updated"/>
+		<result property="update_time" column="updateTime"/>
+	</resultMap>
+
+	<delete id="deleteProvisionalPlanById" parameterType="java.lang.Integer">
+		delete from plan_practical where plan_year_id = #{planYearId}
+	</delete>
+
+	<update id="updateProvisionalPlanById" parameterType="com.ozs.plan.doman.ProvisionalPlan">
+		update plan_practical
+		<set>
+			<if test="purchaseDeptId != null and purchaseDeptId != ''">
+				purchase_dept_id = #{purchaseDeptId},
+			</if>
+			<if test="projectName != null and projectName != ''">
+				project_name = #{projectName},
+			</if>
+			<if test="projectType != null and projectType != ''">
+				project_type = #{projectType},
+			</if>
+			<if test="demandOverview != null and demandOverview != ''">
+				demand_overview = #{demandOverview},
+			</if>
+			<if test="evaluation != null and evaluation != ''">
+				evaluation = #{evaluation},
+			</if>
+			<if test="isExcess != null and isExcess != '' ">
+				is_excess = #{isExcess},
+			</if>
+			<if test="purchaseServices != null and purchaseServices != '' ">
+				purchase_services = #{purchaseServices},
+			</if>
+			<if test="purchaseMode != null and purchaseMode != '' ">
+				purchase_mode = #{purchaseMode},
+			</if>
+			<if test="planDemandSubTime != null and planDemandSubTime != '' ">
+				plan_demand_sub_time = #{planDemandSubTime},
+			</if>
+			<if test="planPurchaseFinishTime != null and planPurchaseFinishTime != '' ">
+				plan_purchase_finish_time = #{planPurchaseFinishTime},
+			</if>
+			<if test="planDeliverTime != null and planDeliverTime != '' ">
+				plan_deliver_time = #{planDeliverTime},
+			</if>
+			<if test="projectAttr != null and projectAttr != '' ">
+				project_attr = #{projectAttr},
+			</if>
+			<if test="adjustReason != null and adjustReason != '' ">
+				adjust_reason = #{adjustReason},
+			</if>
+			<if test="remarks != null and remarks != '' ">
+				remarks = #{remarks},
+			</if>
+			<if test="projectStatus != null and projectStatus != '' ">
+				project_status = #{projectStatus},
+			</if>
+			<if test="refuseReason != null and refuseReason != '' ">
+				refuse_reason = #{refuseReason},
+			</if>
+			<if test="delFlay != null and delFlay != '' ">
+				del_flay = #{delFlay},
+			</if>
+			<if test="planType != null and planType != '' ">
+				plan_type = #{planType},
+			</if>
+			<if test="updated != null and updated != '' ">
+				updated = #{updated},
+			</if>
+			<if test="updateTime != null and updateTime != '' ">
+				update_time = #{updateTime},
+			</if>
+		</set>
+		where plan_year_id = #{planYearId}
+	</update>
+
+	<select id="selectProjectName" resultType="com.ozs.plan.doman.ProvisionalPlan" parameterType="java.lang.String">
+		select * from plan_practical where project_name = #{projectName} and del_flay = 0 and plan_type = "1"
+	</select>
+</mapper>

Разница между файлами не показана из-за своего большого размера
+ 11 - 3
purchase-system/src/main/resources/mapper/pm/PmDemandMapper.xml