Browse Source

modify:

1. 区县项目库开发;
tags/24090101
WendyYang 2 weeks ago
parent
commit
08349da97f
41 changed files with 1555 additions and 18 deletions
  1. +5
    -3
      hz-pm-api/src/main/java/com/hz/pm/api/common/helper/impl/UserInfoHelperImpl.java
  2. +72
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/controller/QxProjectController.java
  3. +72
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/entity/QxProject.java
  4. +103
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/entity/QxProjectSystemReplaceInfos.java
  5. +104
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/entity/QxPurchase.java
  6. +2
    -2
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/MhSystemReplaceManage.java
  7. +209
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/QxProjectManage.java
  8. +16
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxProjectMapper.java
  9. +5
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxProjectMapper.xml
  10. +16
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxProjectSystemReplaceInfosMapper.java
  11. +5
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxProjectSystemReplaceInfosMapper.xml
  12. +16
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxPurchaseMapper.java
  13. +5
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxPurchaseMapper.xml
  14. +2
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/dto/MhSystemReplaceInfoVO.java
  15. +82
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/dto/QxProjectSystemReplaceInfosDTO.java
  16. +7
    -9
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/enumeration/GovSystemReplaceTypeEnum.java
  17. +52
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/enumeration/MhSystemReplaceType.java
  18. +37
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/enumeration/QxProjectStatus.java
  19. +38
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/QxAcceptRecordReq.java
  20. +33
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/QxProjectLibReq.java
  21. +55
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/QxProjectRecordReq.java
  22. +77
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/QxPurchaseRecordReq.java
  23. +32
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/QxUpgradeRecordReq.java
  24. +28
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/QxProjectDetailVO.java
  25. +80
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/QxProjectSystemReplaceInfosVO.java
  26. +56
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/QxProjectVO.java
  27. +84
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/QxPurchaseVO.java
  28. +16
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/IQxProjectService.java
  29. +24
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/IQxProjectSystemReplaceInfosService.java
  30. +23
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/IQxPurchaseService.java
  31. +20
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/impl/QxProjectServiceImpl.java
  32. +20
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/impl/QxProjectSystemReplaceInfosServiceImpl.java
  33. +20
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/impl/QxPurchaseServiceImpl.java
  34. +1
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/user/convert/UserInfoConvertor.java
  35. +3
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/user/model/vo/ResUserDetailVO.java
  36. +2
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/user/security/model/UserFullInfoDTO.java
  37. +3
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/user/security/model/UserInfoDetails.java
  38. +11
    -3
      hz-pm-api/src/main/java/com/hz/pm/api/workbench/controller/WorkbenchController.java
  39. +81
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/workbench/manage/QxWorkbenchManage.java
  40. +37
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/workbench/model/vo/QxProjectStatisticsVO.java
  41. +1
    -1
      hz-pm-gen/src/main/java/com/hz/pm/gen/config/CodeGen.java

+ 5
- 3
hz-pm-api/src/main/java/com/hz/pm/api/common/helper/impl/UserInfoHelperImpl.java View File

@@ -83,18 +83,20 @@ public class UserInfoHelperImpl implements UserInfoHelper {
// 是否市属国有企业下用户
List<Long> citySoeUnitIds = mhUnitCache.getViewChildIdsRecursion(MhUnitConst.CITY_SOE_UNIT_ID);
userFullInfo.setIsCitySoeUser(citySoeUnitIds.contains(userInfo.getMhUnitId()));
if (!userFullInfo.getIsCitySoeUser()) {
if (Boolean.FALSE.equals(userFullInfo.getIsCitySoeUser())) {
// 是否关键行业部门下用户
List<Long> keyIndustryUnitIds = mhUnitCache.getViewChildIdsRecursion(MhUnitConst.KEY_INDUSTRY_UNIT_ID);
userFullInfo.setIsKeyIndustryUser(keyIndustryUnitIds.contains(userInfo.getMhUnitId()));
if (!userFullInfo.getIsKeyIndustryUser()) {
if (Boolean.FALSE.equals(userFullInfo.getIsKeyIndustryUser())) {
// 是否区县部门下用户
List<Long> countyUnitIds = mhUnitCache.getViewChildIdsRecursion(MhUnitConst.COUNTY_PARENT_UNIT_ID);
userFullInfo.setIsCountyUser(countyUnitIds.contains(userInfo.getMhUnitId()));
if (!userFullInfo.getIsCountyUser()) {
if (Boolean.FALSE.equals(userFullInfo.getIsCountyUser())) {
// 是否市本级用户
List<Long> cityDistrictUnitIds = mhUnitCache.getViewChildIdsRecursion(MhUnitConst.CITY_DISTRICT_UNIT_ID);
userFullInfo.setIsCityDistrictUser(cityDistrictUnitIds.contains(userInfo.getMhUnitId()));
} else {
userFullInfo.setIsCountyXcbUser(unit.getName().contains(MhUnitConst.UNIT_XCB));
}
}
}


+ 72
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/controller/QxProjectController.java View File

@@ -0,0 +1,72 @@
package com.hz.pm.api.projectlib.controller;

import com.hz.pm.api.projectlib.manage.QxProjectManage;
import com.hz.pm.api.projectlib.model.req.*;
import com.hz.pm.api.projectlib.model.vo.QxProjectDetailVO;
import com.hz.pm.api.projectlib.model.vo.QxProjectVO;
import com.ningdatech.basic.model.PageVo;
import com.ningdatech.log.annotation.WebLog;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

/**
* <p>
* 前端控制器
* </p>
*
* @author WendyYang
* @since 2024-08-31
*/
@Api(tags = "区县项目库控制器")
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/qx/projectLib")
public class QxProjectController {

private final QxProjectManage qxProjectManage;

@PostMapping("/submitProjectRecord")
@ApiOperation("项目备案")
@WebLog("项目备案")
public void submitProjectRecord(@Valid @RequestBody QxProjectRecordReq req) {
qxProjectManage.submitProjectRecord(req);
}

@PostMapping("/submitPurchaseRecord")
@ApiOperation("采购备案")
@WebLog("采购备案")
public void submitPurchaseRecord(@Valid @RequestBody QxPurchaseRecordReq req) {
qxProjectManage.submitPurchaseRecord(req);
}

@PostMapping("/submitAcceptRecord")
@ApiOperation("验收备案")
@WebLog("验收备案")
public void submitAcceptRecord(@Valid @RequestBody QxAcceptRecordReq req) {
qxProjectManage.submitAcceptRecord(req);
}

@PostMapping("/submitUpgradeRecord")
@ApiOperation("改造提升&综合集成备案")
@WebLog("改造提升&综合集成备案")
public void submitUpgradeRecord(@Valid @RequestBody QxUpgradeRecordReq req) {
qxProjectManage.submitUpgradeRecord(req);
}

@GetMapping("/detail/{id}")
@ApiOperation("项目详情")
public QxProjectDetailVO detail(@PathVariable Long id) {
return qxProjectManage.getProjectDetail(id);
}

@GetMapping("/page")
@ApiOperation("项目列表")
public PageVo<QxProjectVO> page(QxProjectLibReq req) {
return qxProjectManage.page(req);
}

}

+ 72
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/entity/QxProject.java View File

@@ -0,0 +1,72 @@
package com.hz.pm.api.projectlib.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.hz.pm.api.projectlib.model.enumeration.QxProjectStatus;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.time.LocalDateTime;

/**
* <p>
* 区县项目信息实体
* </p>
*
* @author WendyYang
* @since 2024-08-31
*/
@Data
@TableName("QX_PROJECT")
@ApiModel(value = "QxProject对象")
public class QxProject {

@TableId(value = "ID", type = IdType.AUTO)
private Long id;

@ApiModelProperty("状态")
private Integer status;

@ApiModelProperty("项目名称")
private String projectName;

@ApiModelProperty("项目年份")
private Integer projectYear;

@ApiModelProperty("建设单位代码")
private Long buildOrgCode;

@ApiModelProperty("建设单位")
private String buildOrgName;

@ApiModelProperty("联系人")
private String contactName;

@ApiModelProperty("联系方式")
private String contactPhone;

@ApiModelProperty("领域")
private Integer unitStrip;

@ApiModelProperty("建设方案")
private String constructionPlanFile;

@ApiModelProperty("立项批复文件")
private String approvedFile;

@ApiModelProperty("创建时间")
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createOn;

@ApiModelProperty("更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateOn;

@ApiModelProperty("创建人")
@TableField(fill = FieldFill.INSERT)
private Long createBy;

@ApiModelProperty("更新人")
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateBy;
}

+ 103
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/entity/QxProjectSystemReplaceInfos.java View File

@@ -0,0 +1,103 @@
package com.hz.pm.api.projectlib.entity;

import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;

/**
* <p>
* 区县系统改造情况
* </p>
*
* @author WendyYang
* @since 2024-08-31
*/
@Data
@TableName("QX_PROJECT_SYSTEM_REPLACE_INFOS")
@ApiModel(value = "QxProjectSystemReplaceInfos对象")
public class QxProjectSystemReplaceInfos implements Serializable {

private static final long serialVersionUID = 1L;

@TableId(value = "ID", type = IdType.AUTO)
private Long id;

@ApiModelProperty("源系统ID")
private String sourceSystemIds;

@ApiModelProperty("源系统名称")
private String sourceSystemNames;

@ApiModelProperty("替代后系统名称")
private String targetSystemName;

@ApiModelProperty("替换类型")
private String replaceType;

@ApiModelProperty("项目ID")
private Long projectId;

@ApiModelProperty("是否等保评估")
private Boolean hasSecurityEval;

@ApiModelProperty("等保评估时间")
private LocalDate securityEvalDate;

@ApiModelProperty("等保评估文件")
private String securityEvalFile;

@ApiModelProperty("是否XCFHX评估")
private Boolean hasXcfhxEval;

@ApiModelProperty("XCFHX评估时间")
private LocalDate xcfhxEvalDate;

@ApiModelProperty("XCFHX评估文件")
private String xcfhxEvalFile;

@ApiModelProperty("服务范围")
private Integer serviceScope;

@ApiModelProperty("系统简介")
private String systemIntroduction;

@ApiModelProperty("是否IRS登记")
private Boolean hasIrsRegist;

@ApiModelProperty("IRS编码")
private String irsAppCode;

@ApiModelProperty("联系人")
private String contact;

@ApiModelProperty("联系方式")
private String contactPhone;

@ApiModelProperty("是否保密")
private Boolean isSecret;

@ApiModelProperty("ECS数量")
private Integer ecsNum;

@ApiModelProperty("创建人")
@TableField(fill = FieldFill.INSERT)
private Long createBy;

@ApiModelProperty("创建时间")
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createOn;

@ApiModelProperty("更新人")
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateBy;

@ApiModelProperty("更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateOn;

}

+ 104
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/entity/QxPurchase.java View File

@@ -0,0 +1,104 @@
package com.hz.pm.api.projectlib.entity;

import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;

/**
* <p>
* 区县项目采购信息实体
* </p>
*
* @author WendyYang
* @since 2024-08-31
*/
@Data
@TableName("QX_PURCHASE")
@ApiModel(value = "QxPurchase对象")
public class QxPurchase {

@TableId(type = IdType.AUTO)
private Long id;

@ApiModelProperty("项目ID")
private Long projectId;

@ApiModelProperty("采购预算")
private BigDecimal purchaseBudget;

@ApiModelProperty("采购方式")
private String purchaseMethod;

@ApiModelProperty("采购单位ID")
private Long purchaseUnitId;

@ApiModelProperty("采购单位名称")
private String purchaseUnitName;

@ApiModelProperty("采购内容")
private String buildContent;

@ApiModelProperty("合同签订时间")
private LocalDate contractSignDate;

@ApiModelProperty("合同金额")
private BigDecimal contractAmount;

@ApiModelProperty("供应商")
private String supplier;

@ApiModelProperty("供应商联系人")
private String supplierContact;

@ApiModelProperty("供应商联系方式")
private String supplierContactInfo;

@ApiModelProperty("采购方案文件")
private String purchasePlanFile;

@ApiModelProperty("招标文件")
private String inviteTenderFile;

@ApiModelProperty("投标文件")
private String biddingFile;

@ApiModelProperty("采购合同文件")
private String purchaseContractFile;

@ApiModelProperty("其他文件")
private String otherFile;

@ApiModelProperty("初验时间")
private LocalDate firstAcceptDate;

@ApiModelProperty("初验文件")
private String firstAcceptFile;

@ApiModelProperty("终验时间")
private LocalDate finalAcceptDate;

@ApiModelProperty("终验文件")
private String finalAcceptFile;

@ApiModelProperty("创建时间")
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createOn;

@ApiModelProperty("更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateOn;

@ApiModelProperty("创建人")
@TableField(fill = FieldFill.INSERT)
private Long createBy;

@ApiModelProperty("更新人")
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateBy;

}

+ 2
- 2
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/MhSystemReplaceManage.java View File

@@ -6,6 +6,7 @@ import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hz.pm.api.common.model.constant.MhUnitConst;
import com.hz.pm.api.external.MhApiClient;
import com.hz.pm.api.projectlib.entity.MhSystemReplaceInfo;
import com.hz.pm.api.projectlib.model.dto.MhSystemReplaceInfoDTO;
@@ -38,7 +39,6 @@ public class MhSystemReplaceManage {
private final MhUnitCache mhUnitCache;
private final MhApiClient mhApiClient;


@Transactional(rollbackFor = Exception.class)
public synchronized void syncMhSystemReplaceInfo() {
List<MhSystemReplaceInfoDTO> systemReplaceInfos = mhApiClient.querySystemReplaceInfos();
@@ -90,7 +90,7 @@ public class MhSystemReplaceManage {
} else {
query.orderByDesc(MhSystemReplaceInfo::getPlanFinishDate);
}
if (req.getBuildOrgCode() != null) {
if (req.getBuildOrgCode() != null && req.getBuildOrgCode() != MhUnitConst.ROOT_UNIT_ID) {
query.in(MhSystemReplaceInfo::getBuildOrgCode, mhUnitCache.getViewChildIdsRecursion(req.getBuildOrgCode()));
}
Page<MhSystemReplaceInfo> page = mhSystemReplaceInfoService.page(req.page(), query);


+ 209
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/QxProjectManage.java View File

@@ -0,0 +1,209 @@
package com.hz.pm.api.projectlib.manage;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hz.pm.api.common.model.constant.MhUnitConst;
import com.hz.pm.api.projectlib.entity.MhSystemReplaceInfo;
import com.hz.pm.api.projectlib.entity.QxProject;
import com.hz.pm.api.projectlib.entity.QxProjectSystemReplaceInfos;
import com.hz.pm.api.projectlib.entity.QxPurchase;
import com.hz.pm.api.projectlib.model.dto.QxProjectSystemReplaceInfosDTO;
import com.hz.pm.api.projectlib.model.enumeration.MhSystemReplaceType;
import com.hz.pm.api.projectlib.model.enumeration.QxProjectStatus;
import com.hz.pm.api.projectlib.model.req.*;
import com.hz.pm.api.projectlib.model.vo.QxProjectDetailVO;
import com.hz.pm.api.projectlib.model.vo.QxProjectSystemReplaceInfosVO;
import com.hz.pm.api.projectlib.model.vo.QxProjectVO;
import com.hz.pm.api.projectlib.model.vo.QxPurchaseVO;
import com.hz.pm.api.projectlib.service.IMhSystemReplaceInfoService;
import com.hz.pm.api.projectlib.service.IQxProjectService;
import com.hz.pm.api.projectlib.service.IQxProjectSystemReplaceInfosService;
import com.hz.pm.api.projectlib.service.IQxPurchaseService;
import com.hz.pm.api.user.helper.MhUnitCache;
import com.hz.pm.api.user.security.model.UserInfoDetails;
import com.hz.pm.api.user.util.LoginUserUtil;
import com.ningdatech.basic.exception.BizException;
import com.ningdatech.basic.model.PageVo;
import com.ningdatech.basic.util.CollUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
* <p>
* QxProjectManage
* </p>
*
* @author WendyYang
* @since 10:42 2024/8/31
*/
@Component
@RequiredArgsConstructor
public class QxProjectManage {

private final MhUnitCache mhUnitCache;
private final IQxProjectService qxProjectService;
private final IMhSystemReplaceInfoService mhSystemReplaceInfoService;
private final IQxProjectSystemReplaceInfosService qxProjectSystemReplaceInfosService;
private final IQxPurchaseService qxPurchaseService;

private void checkExistProject(String projectName, Long buildOrgCode) {
LambdaQueryWrapper<QxProject> query = Wrappers.lambdaQuery(QxProject.class)
.eq(QxProject::getProjectName, projectName)
.eq(QxProject::getBuildOrgCode, buildOrgCode);
if (qxProjectService.count(query) > 0) {
throw BizException.wrap("项目已存在");
}
}

@Transactional(rollbackFor = Exception.class)
public synchronized void submitProjectRecord(QxProjectRecordReq req) {
checkExistProject(req.getProjectName(), req.getBuildOrgCode());
QxProject project = new QxProject();
project.setStatus(QxProjectStatus.DECLARED.getCode());
BeanUtil.copyProperties(req, project);
qxProjectService.save(project);
if (CollUtil.isNotEmpty(req.getSourceSystemIds())) {
List<String> sourceSystemIds = req.getSourceSystemIds();
List<MhSystemReplaceInfo> systemReplaceInfos = mhSystemReplaceInfoService.listByIds(sourceSystemIds);
Map<Boolean, List<MhSystemReplaceInfo>> replaceInfosMap = CollUtils.group(systemReplaceInfos,
w -> MhSystemReplaceType.IT.eq(w.getReplaceType()));
List<QxProjectSystemReplaceInfos> projectSystemReplaceInfos = new ArrayList<>();
List<MhSystemReplaceInfo> itReplaceInfos = replaceInfosMap.get(true);
if (CollUtil.isNotEmpty(itReplaceInfos)) {
Map<String, List<MhSystemReplaceInfo>> group = CollUtils.group(itReplaceInfos, MhSystemReplaceInfo::getTargetName);
for (Map.Entry<String, List<MhSystemReplaceInfo>> entry : group.entrySet()) {
List<MhSystemReplaceInfo> value = entry.getValue();
QxProjectSystemReplaceInfos item = new QxProjectSystemReplaceInfos();
item.setProjectId(project.getId());
item.setReplaceType(value.get(0).getReplaceType());
item.setTargetSystemName(value.get(0).getTargetName());
item.setSourceSystemNames(CollUtils.joinByComma(value, MhSystemReplaceInfo::getSourceName));
item.setSourceSystemIds(CollUtils.joinByComma(value, MhSystemReplaceInfo::getId));
projectSystemReplaceInfos.add(item);
}
}
List<MhSystemReplaceInfo> otherReplaceInfos = replaceInfosMap.get(false);
if (CollUtil.isNotEmpty(otherReplaceInfos)) {
for (MhSystemReplaceInfo mhSystemReplaceInfo : otherReplaceInfos) {
QxProjectSystemReplaceInfos item = new QxProjectSystemReplaceInfos();
item.setProjectId(project.getId());
item.setReplaceType(mhSystemReplaceInfo.getReplaceType());
item.setTargetSystemName(mhSystemReplaceInfo.getTargetName());
item.setSourceSystemNames(mhSystemReplaceInfo.getSourceName());
item.setSourceSystemIds(mhSystemReplaceInfo.getId());
projectSystemReplaceInfos.add(item);
}
}
if (CollUtil.isNotEmpty(projectSystemReplaceInfos)) {
qxProjectSystemReplaceInfosService.saveBatch(projectSystemReplaceInfos);
}
}
}

public synchronized void submitPurchaseRecord(QxPurchaseRecordReq req) {
QxProject project = qxProjectService.getById(req.getProjectId());
if (!QxProjectStatus.DECLARED.eq(project.getStatus())) {
throw BizException.wrap("当前状态不允许采购备案");
}
QxPurchase purchase = qxPurchaseService.getByProjectId(req.getProjectId());
if (purchase == null) {
purchase = new QxPurchase();
}
BeanUtil.copyProperties(req, purchase);
qxPurchaseService.saveOrUpdate(purchase);
}

public void submitAcceptRecord(QxAcceptRecordReq req) {
QxProject project = qxProjectService.getById(req.getProjectId());
if (!QxProjectStatus.UPGRADED.eq(project.getStatus())) {
throw BizException.wrap("当前状态不允许验收备案");
}
Wrapper<QxPurchase> update = Wrappers.lambdaUpdate(QxPurchase.class)
.eq(QxPurchase::getProjectId, req.getProjectId())
.set(QxPurchase::getFinalAcceptDate, req.getFinalAcceptDate())
.set(QxPurchase::getFinalAcceptFile, req.getFinalAcceptFile())
.set(QxPurchase::getFirstAcceptDate, req.getFirstAcceptDate())
.set(QxPurchase::getFirstAcceptFile, req.getFirstAcceptFile())
.set(QxPurchase::getUpdateOn, LocalDateTime.now())
.set(QxPurchase::getUpdateBy, LoginUserUtil.getUserId());
qxPurchaseService.update(update);
}

public void submitUpgradeRecord(QxUpgradeRecordReq req) {
QxProject project = qxProjectService.getById(req.getProjectId());
if (!QxProjectStatus.PURCHASED.eq(project.getStatus())) {
throw BizException.wrap("当前状态不允许改造提升备案");
}
List<QxProjectSystemReplaceInfosDTO> replaceInfos = req.getSystemReplaceInfos();
List<QxProjectSystemReplaceInfos> projectSystemReplaceInfos = new ArrayList<>();
for (QxProjectSystemReplaceInfosDTO replaceInfo : replaceInfos) {
QxProjectSystemReplaceInfos qxReplaceInfo = new QxProjectSystemReplaceInfos();
BeanUtil.copyProperties(replaceInfo, qxReplaceInfo);
projectSystemReplaceInfos.add(qxReplaceInfo);
}
qxProjectSystemReplaceInfosService.updateBatchById(projectSystemReplaceInfos);
}

public QxProjectDetailVO getProjectDetail(Long projectId) {
QxProject project = qxProjectService.getById(projectId);
if (project == null) {
return null;
}
QxProjectDetailVO projectDetail = new QxProjectDetailVO();
QxProjectVO retProject = BeanUtil.copyProperties(project, QxProjectVO.class);
projectDetail.setProject(retProject);
QxPurchase purchase = qxPurchaseService.getByProjectId(projectId);
if (purchase != null) {
QxPurchaseVO retPurchase = BeanUtil.copyProperties(purchase, QxPurchaseVO.class);
projectDetail.setPurchase(retPurchase);
}
List<QxProjectSystemReplaceInfos> systemReplaceInfos = qxProjectSystemReplaceInfosService.listByProjectId(projectId);
if (CollUtil.isNotEmpty(systemReplaceInfos)) {
List<QxProjectSystemReplaceInfosVO> retSystemReplaceInfos = BeanUtil.copyToList(systemReplaceInfos, QxProjectSystemReplaceInfosVO.class);
projectDetail.setSystemReplaceInfos(retSystemReplaceInfos);
}
return projectDetail;
}

public PageVo<QxProjectVO> page(QxProjectLibReq req) {
LambdaQueryWrapper<QxProject> query = Wrappers.lambdaQuery(QxProject.class)
.eq(req.getProjectYear() != null, QxProject::getProjectYear, req.getProjectYear())
.eq(req.getUnitStrip() != null, QxProject::getUnitStrip, req.getUnitStrip())
.eq(req.getStatus() != null, QxProject::getStatus, req.getStatus())
.like(StrUtil.isNotBlank(req.getProjectName()), QxProject::getProjectName, req.getProjectName())
.like(StrUtil.isNotBlank(req.getBuildOrgName()), QxProject::getBuildOrgName, req.getBuildOrgName())
.exists(StrUtil.isNotBlank(req.getReplaceType()),
"select 1 from qx_project_system_replace_infos " +
"where qx_project_system_replace_infos.project_id = qx_project.id " +
"and replace_type = {0}", req.getReplaceType());
UserInfoDetails userDetail = LoginUserUtil.loginUserDetail();
if (req.getBuildOrgCode() != null) {
if (!userDetail.hasSuperAdmin()) {
List<Long> viewUnitIds = mhUnitCache.getViewChildIdsRecursion(userDetail.getMhUnitId());
if (!viewUnitIds.contains(req.getBuildOrgCode())) {
return PageVo.empty();
}
}
query.in(QxProject::getBuildOrgCode, mhUnitCache.getViewChildIdsRecursion(req.getBuildOrgCode()));
} else {
if (!LoginUserUtil.loginUserDetail().hasSuperAdmin()
&& MhUnitConst.ROOT_UNIT_ID != userDetail.getMhUnitId()) {
query.in(QxProject::getBuildOrgCode, mhUnitCache.getViewChildIdsRecursion(userDetail.getMhUnitId()));
}
}
Page<QxProject> page = qxProjectService.page(req.page(), query);
return PageVo.of(BeanUtil.copyToList(page.getRecords(), QxProjectVO.class), page.getTotal());
}

}

+ 16
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxProjectMapper.java View File

@@ -0,0 +1,16 @@
package com.hz.pm.api.projectlib.mapper;

import com.hz.pm.api.projectlib.entity.QxProject;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

/**
* <p>
* Mapper 接口
* </p>
*
* @author WendyYang
* @since 2024-08-31
*/
public interface QxProjectMapper extends BaseMapper<QxProject> {

}

+ 5
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxProjectMapper.xml View File

@@ -0,0 +1,5 @@
<?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.hz.pm.api.projectlib.mapper.QxProjectMapper">

</mapper>

+ 16
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxProjectSystemReplaceInfosMapper.java View File

@@ -0,0 +1,16 @@
package com.hz.pm.api.projectlib.mapper;

import com.hz.pm.api.projectlib.entity.QxProjectSystemReplaceInfos;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

/**
* <p>
* Mapper 接口
* </p>
*
* @author WendyYang
* @since 2024-08-31
*/
public interface QxProjectSystemReplaceInfosMapper extends BaseMapper<QxProjectSystemReplaceInfos> {

}

+ 5
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxProjectSystemReplaceInfosMapper.xml View File

@@ -0,0 +1,5 @@
<?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.hz.pm.api.projectlib.mapper.QxProjectSystemReplaceInfosMapper">

</mapper>

+ 16
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxPurchaseMapper.java View File

@@ -0,0 +1,16 @@
package com.hz.pm.api.projectlib.mapper;

import com.hz.pm.api.projectlib.entity.QxPurchase;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

/**
* <p>
* Mapper 接口
* </p>
*
* @author WendyYang
* @since 2024-08-31
*/
public interface QxPurchaseMapper extends BaseMapper<QxPurchase> {

}

+ 5
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxPurchaseMapper.xml View File

@@ -0,0 +1,5 @@
<?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.hz.pm.api.projectlib.mapper.QxPurchaseMapper">

</mapper>

+ 2
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/dto/MhSystemReplaceInfoVO.java View File

@@ -17,6 +17,8 @@ import java.time.LocalDateTime;
@Data
public class MhSystemReplaceInfoVO {

private String id;

@ApiModelProperty("替代前系统名称")
private String sourceName;



+ 82
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/dto/QxProjectSystemReplaceInfosDTO.java View File

@@ -0,0 +1,82 @@
package com.hz.pm.api.projectlib.model.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotNull;
import java.time.LocalDate;

/**
* <p>
* 区县系统改造情况
* </p>
*
* @author WendyYang
* @since 2024-08-31
*/
@Data
@ApiModel(value = "QxProjectSystemReplaceInfos对象")
public class QxProjectSystemReplaceInfosDTO {

@NotNull(message = "ID不能为空")
private Long id;

@ApiModelProperty("源系统ID")
private String sourceSystemIds;

@ApiModelProperty("源系统名称")
private String sourceSystemNames;

@ApiModelProperty("替代后系统名称")
private String targetSystemName;

@ApiModelProperty("替换类型")
private String replaceType;

@ApiModelProperty("项目ID")
private Long projectId;

@ApiModelProperty("是否等保评估")
private Boolean hasSecurityEval;

@ApiModelProperty("等保评估时间")
private LocalDate securityEvalDate;

@ApiModelProperty("等保评估文件")
private String securityEvalFile;

@ApiModelProperty("是否XCFHX评估")
private Boolean hasXcfhxEval;

@ApiModelProperty("XCFHX评估时间")
private LocalDate xcfhxEvalDate;

@ApiModelProperty("XCFHX评估文件")
private String xcfhxEvalFile;

@ApiModelProperty("服务范围")
private Integer serviceScope;

@ApiModelProperty("系统简介")
private String systemIntroduction;

@ApiModelProperty("是否IRS登记")
private Boolean hasIrsRegist;

@ApiModelProperty("IRS编码")
private String irsAppCode;

@ApiModelProperty("联系人")
private String contact;

@ApiModelProperty("联系方式")
private String contactPhone;

@ApiModelProperty("是否保密")
private Boolean isSecret;

@ApiModelProperty("ECS数量")
private Integer ecsNum;

}

+ 7
- 9
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/enumeration/GovSystemReplaceTypeEnum.java View File

@@ -1,9 +1,7 @@
package com.hz.pm.api.projectlib.model.enumeration;

import com.hz.pm.api.common.util.StrUtils;
import io.swagger.models.auth.In;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;

import java.util.Arrays;
@@ -23,16 +21,16 @@ public enum GovSystemReplaceTypeEnum {

// 综合集成、改造提升、基础设施、统建应用、新建、暂缓

COMPREHENSIVE_INTEGRATION("综合集成", 1),
RECONSTRUCTION("改造提升", 2),
INFRASTRUCTURE("基础设施", 3),
UNIFIED_CONSTRUCTION_APPLICATION("统建应用", 4),
NEW_BUILT("新建", 5),
SUSPEND("暂缓", 6);
COMPREHENSIVE_INTEGRATION("综合集成", 1, MhSystemReplaceType.IT),
RECONSTRUCTION("改造提升", 2, MhSystemReplaceType.IM),
INFRASTRUCTURE("基础设施", 3, null),
UNIFIED_CONSTRUCTION_APPLICATION("统建应用", 4, null),
NEW_BUILT("新建", 5, null),
SUSPEND("暂缓", 6, null);

private final String val;

private final Integer code;
private final MhSystemReplaceType mhReplaceType;


public static Optional<GovSystemReplaceTypeEnum> get(Integer code) {


+ 52
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/enumeration/MhSystemReplaceType.java View File

@@ -0,0 +1,52 @@
package com.hz.pm.api.projectlib.model.enumeration;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Optional;

/**
* <p>
* MhSystemReplaceType
* </p>
*
* @author WendyYang
* @since 11:18 2024/8/31
*/
@Getter
@AllArgsConstructor
public enum MhSystemReplaceType {

// IM:改造提升 IT:综合集成 NE:自然淘汰

IM("IM", "改造提升"),
IT("IT", "综合集成"),
NE("NE", "自然淘汰");

private final String code;
private final String desc;


public boolean eq(String code) {
return this.code.equals(code);
}

public static String getDesc(String code) {
for (MhSystemReplaceType value : MhSystemReplaceType.values()) {
if (value.getCode().equals(code)) {
return value.getDesc();
}
}
return null;
}

public static Optional<MhSystemReplaceType> getByCode(String code) {
for (MhSystemReplaceType value : MhSystemReplaceType.values()) {
if (value.getCode().equals(code)) {
return Optional.of(value);
}
}
return Optional.empty();
}

}

+ 37
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/enumeration/QxProjectStatus.java View File

@@ -0,0 +1,37 @@
package com.hz.pm.api.projectlib.model.enumeration;

import com.hz.pm.api.projectlib.model.enumeration.status.IStatus;
import com.ningdatech.basic.exception.BizException;
import lombok.AllArgsConstructor;
import lombok.Getter;

/**
* <p>
* QxProjectStatus
* </p>
*
* @author WendyYang
* @since 14:37 2024/8/31
*/
@Getter
@AllArgsConstructor
public enum QxProjectStatus implements IStatus<Integer, String> {

DECLARED(100, "已立项"),
PURCHASED(200, "已采购"),
UPGRADED(300, "已改造"),
ACCEPTED(400, "已验收");

private final Integer code;
private final String desc;

public static QxProjectStatus getNoNull(Integer code) {
for (QxProjectStatus status : values()) {
if (status.getCode().equals(code)) {
return status;
}
}
throw BizException.wrap("项目状态无效:%s", code);
}

}

+ 38
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/QxAcceptRecordReq.java View File

@@ -0,0 +1,38 @@
package com.hz.pm.api.projectlib.model.req;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotNull;
import java.time.LocalDate;

/**
* <p>
* QxAcceptRecordReq
* </p>
*
* @author WendyYang
* @since 11:39 2024/8/31
*/
@Data
public class QxAcceptRecordReq {

@ApiModelProperty("项目ID")
@NotNull(message = "项目ID不能为空")
private Long projectId;

@ApiModelProperty("初验时间")
@NotNull(message = "初验时间不能为空")
private LocalDate firstAcceptDate;

@ApiModelProperty("初验文件")
private String firstAcceptFile;

@ApiModelProperty("终验时间")
@NotNull(message = "终验时间不能为空")
private LocalDate finalAcceptDate;

@ApiModelProperty("终验文件")
private String finalAcceptFile;

}

+ 33
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/QxProjectLibReq.java View File

@@ -0,0 +1,33 @@
package com.hz.pm.api.projectlib.model.req;

import com.ningdatech.basic.model.PagePo;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
* <p>
* QxProjectLibReq
* </p>
*
* @author WendyYang
* @since 14:54 2024/8/31
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class QxProjectLibReq extends PagePo {

private Integer unitStrip;

private Integer status;

private Integer projectYear;

private String projectName;

private String replaceType;

private String buildOrgName;

private Long buildOrgCode;

}

+ 55
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/QxProjectRecordReq.java View File

@@ -0,0 +1,55 @@
package com.hz.pm.api.projectlib.model.req;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
* <p>
* QxProjectRecordReq
* </p>
*
* @author WendyYang
* @since 10:45 2024/8/31
*/
@Data
public class QxProjectRecordReq {

@ApiModelProperty("项目名称")
@NotBlank(message = "项目名称不能为空")
private String projectName;

@ApiModelProperty("项目年份")
@NotNull(message = "项目年份不能为空")
private Integer projectYear;

@ApiModelProperty("建设单位代码")
@NotNull(message = "建设单位代码不能为空")
private Long buildOrgCode;

@ApiModelProperty("建设单位")
@NotBlank(message = "建设单位不能为空")
private String buildOrgName;

@ApiModelProperty("联系人")
private String contactName;

@ApiModelProperty("联系方式")
private String contactPhone;

@ApiModelProperty("领域")
private Integer unitStrip;

@ApiModelProperty("建设方案")
private String constructionPlanFile;

@ApiModelProperty("立项批复文件")
private String approvedFile;

@ApiModelProperty("源系统ID")
private List<String> sourceSystemIds;

}

+ 77
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/QxPurchaseRecordReq.java View File

@@ -0,0 +1,77 @@
package com.hz.pm.api.projectlib.model.req;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.time.LocalDate;

/**
* <p>
* 区县项目采购信息实体
* </p>
*
* @author WendyYang
* @since 2024-08-31
*/
@Data
@ApiModel(value = "QxPurchase对象")
public class QxPurchaseRecordReq {

@ApiModelProperty("项目ID")
@NotNull(message = "项目ID不能为空")
private Long projectId;

@ApiModelProperty("采购预算")
@NotNull(message = "采购预算不能为空")
private BigDecimal purchaseBudget;

@ApiModelProperty("采购方式")
@NotBlank(message = "采购方式不能为空")
private String purchaseMethod;

@ApiModelProperty("采购单位ID")
@NotNull(message = "采购单位ID不能为空")
private Long purchaseUnitId;

@ApiModelProperty("采购单位名称")
@NotBlank(message = "采购单位名称不能为空")
private String purchaseUnitName;

@ApiModelProperty("采购内容")
private String buildContent;

@ApiModelProperty("合同签订时间")
private LocalDate contractSignDate;

@ApiModelProperty("合同金额")
private BigDecimal contractAmount;

@ApiModelProperty("供应商")
private String supplier;

@ApiModelProperty("供应商联系人")
private String supplierContact;

@ApiModelProperty("供应商联系方式")
private String supplierContactInfo;

@ApiModelProperty("采购方案文件")
private String purchasePlanFile;

@ApiModelProperty("招标文件")
private String inviteTenderFile;

@ApiModelProperty("投标文件")
private String biddingFile;

@ApiModelProperty("采购合同文件")
private String purchaseContractFile;

@ApiModelProperty("其他文件")
private String otherFile;

}

+ 32
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/QxUpgradeRecordReq.java View File

@@ -0,0 +1,32 @@
package com.hz.pm.api.projectlib.model.req;

import com.hz.pm.api.projectlib.model.dto.QxProjectSystemReplaceInfosDTO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
* <p>
* QxUpgradeRecordReq
* </p>
*
* @author WendyYang
* @since 11:44 2024/8/31
*/
@Data
public class QxUpgradeRecordReq {

@ApiModelProperty("项目ID")
@NotNull(message = "项目ID不能为空")
private Long projectId;

@Valid
@ApiModelProperty("综合集成改造提升信息")
@NotEmpty(message = "综合集成改造提升信息不能为空")
private List<QxProjectSystemReplaceInfosDTO> systemReplaceInfos;

}

+ 28
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/QxProjectDetailVO.java View File

@@ -0,0 +1,28 @@
package com.hz.pm.api.projectlib.model.vo;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.List;

/**
* <p>
* QxProjectDetailVO
* </p>
*
* @author WendyYang
* @since 11:58 2024/8/31
*/
@Data
public class QxProjectDetailVO {

@ApiModelProperty("项目详情")
private QxProjectVO project;

@ApiModelProperty("采购详情")
private QxPurchaseVO purchase;

@ApiModelProperty("改造提升&综合集成详情")
private List<QxProjectSystemReplaceInfosVO> systemReplaceInfos;

}

+ 80
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/QxProjectSystemReplaceInfosVO.java View File

@@ -0,0 +1,80 @@
package com.hz.pm.api.projectlib.model.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.time.LocalDate;

/**
* <p>
* 区县系统改造情况
* </p>
*
* @author WendyYang
* @since 2024-08-31
*/
@Data
@ApiModel(value = "QxProjectSystemReplaceInfos对象")
public class QxProjectSystemReplaceInfosVO {

private Long id;

@ApiModelProperty("源系统ID")
private String sourceSystemIds;

@ApiModelProperty("源系统名称")
private String sourceSystemNames;

@ApiModelProperty("替代后系统名称")
private String targetSystemName;

@ApiModelProperty("替换类型")
private String replaceType;

@ApiModelProperty("项目ID")
private Long projectId;

@ApiModelProperty("是否等保评估")
private Boolean hasSecurityEval;

@ApiModelProperty("等保评估时间")
private LocalDate securityEvalDate;

@ApiModelProperty("等保评估文件")
private String securityEvalFile;

@ApiModelProperty("是否XCFHX评估")
private Boolean hasXcfhxEval;

@ApiModelProperty("XCFHX评估时间")
private LocalDate xcfhxEvalDate;

@ApiModelProperty("XCFHX评估文件")
private String xcfhxEvalFile;

@ApiModelProperty("服务范围")
private Integer serviceScope;

@ApiModelProperty("系统简介")
private String systemIntroduction;

@ApiModelProperty("是否IRS登记")
private Boolean hasIrsRegist;

@ApiModelProperty("IRS编码")
private String irsAppCode;

@ApiModelProperty("联系人")
private String contact;

@ApiModelProperty("联系方式")
private String contactPhone;

@ApiModelProperty("是否保密")
private Boolean isSecret;

@ApiModelProperty("ECS数量")
private Integer ecsNum;

}

+ 56
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/QxProjectVO.java View File

@@ -0,0 +1,56 @@
package com.hz.pm.api.projectlib.model.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.time.LocalDateTime;

/**
* <p>
* 区县项目信息实体
* </p>
*
* @author WendyYang
* @since 2024-08-31
*/
@Data
@ApiModel(value = "QxProject对象")
public class QxProjectVO {

private Long id;

@ApiModelProperty("状态")
private Integer status;

@ApiModelProperty("项目名称")
private String projectName;

@ApiModelProperty("项目年份")
private Integer projectYear;

@ApiModelProperty("建设单位代码")
private Long buildOrgCode;

@ApiModelProperty("建设单位")
private String buildOrgName;

@ApiModelProperty("联系人")
private String contactName;

@ApiModelProperty("联系方式")
private String contactPhone;

@ApiModelProperty("领域")
private Integer unitStrip;

@ApiModelProperty("建设方案")
private String constructionPlanFile;

@ApiModelProperty("立项批复文件")
private String approvedFile;

@ApiModelProperty("更新时间")
private LocalDateTime updateOn;

}

+ 84
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/QxPurchaseVO.java View File

@@ -0,0 +1,84 @@
package com.hz.pm.api.projectlib.model.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.math.BigDecimal;
import java.time.LocalDate;

/**
* <p>
* 区县项目采购信息实体
* </p>
*
* @author WendyYang
* @since 2024-08-31
*/
@Data
@ApiModel(value = "QxPurchase对象")
public class QxPurchaseVO {

private Long id;

@ApiModelProperty("项目ID")
private Long projectId;

@ApiModelProperty("采购预算")
private BigDecimal purchaseBudget;

@ApiModelProperty("采购方式")
private String purchaseMethod;

@ApiModelProperty("采购单位ID")
private Long purchaseUnitId;

@ApiModelProperty("采购单位名称")
private String purchaseUnitName;

@ApiModelProperty("采购内容")
private String buildContent;

@ApiModelProperty("合同签订时间")
private LocalDate contractSignDate;

@ApiModelProperty("合同金额")
private BigDecimal contractAmount;

@ApiModelProperty("供应商")
private String supplier;

@ApiModelProperty("供应商联系人")
private String supplierContact;

@ApiModelProperty("供应商联系方式")
private String supplierContactInfo;

@ApiModelProperty("采购方案文件")
private String purchasePlanFile;

@ApiModelProperty("招标文件")
private String inviteTenderFile;

@ApiModelProperty("投标文件")
private String biddingFile;

@ApiModelProperty("采购合同文件")
private String purchaseContractFile;

@ApiModelProperty("其他文件")
private String otherFile;

@ApiModelProperty("初验时间")
private LocalDate firstAcceptDate;

@ApiModelProperty("初验文件")
private String firstAcceptFile;

@ApiModelProperty("终验时间")
private LocalDate finalAcceptDate;

@ApiModelProperty("终验文件")
private String finalAcceptFile;

}

+ 16
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/IQxProjectService.java View File

@@ -0,0 +1,16 @@
package com.hz.pm.api.projectlib.service;

import com.hz.pm.api.projectlib.entity.QxProject;
import com.baomidou.mybatisplus.extension.service.IService;

/**
* <p>
* 服务类
* </p>
*
* @author WendyYang
* @since 2024-08-31
*/
public interface IQxProjectService extends IService<QxProject> {

}

+ 24
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/IQxProjectSystemReplaceInfosService.java View File

@@ -0,0 +1,24 @@
package com.hz.pm.api.projectlib.service;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.hz.pm.api.projectlib.entity.QxProjectSystemReplaceInfos;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;

/**
* <p>
* 服务类
* </p>
*
* @author WendyYang
* @since 2024-08-31
*/
public interface IQxProjectSystemReplaceInfosService extends IService<QxProjectSystemReplaceInfos> {

default List<QxProjectSystemReplaceInfos> listByProjectId(Long projectId) {
return this.list(Wrappers.lambdaQuery(QxProjectSystemReplaceInfos.class)
.eq(QxProjectSystemReplaceInfos::getProjectId, projectId));
}

}

+ 23
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/IQxPurchaseService.java View File

@@ -0,0 +1,23 @@
package com.hz.pm.api.projectlib.service;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.hz.pm.api.projectlib.entity.QxProject;
import com.hz.pm.api.projectlib.entity.QxPurchase;
import com.baomidou.mybatisplus.extension.service.IService;

/**
* <p>
* 服务类
* </p>
*
* @author WendyYang
* @since 2024-08-31
*/
public interface IQxPurchaseService extends IService<QxPurchase> {

default QxPurchase getByProjectId(Long projectId) {
return this.getOne(Wrappers.lambdaQuery(QxPurchase.class)
.eq(QxPurchase::getProjectId, projectId));
}

}

+ 20
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/impl/QxProjectServiceImpl.java View File

@@ -0,0 +1,20 @@
package com.hz.pm.api.projectlib.service.impl;

import com.hz.pm.api.projectlib.entity.QxProject;
import com.hz.pm.api.projectlib.mapper.QxProjectMapper;
import com.hz.pm.api.projectlib.service.IQxProjectService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

/**
* <p>
* 服务实现类
* </p>
*
* @author WendyYang
* @since 2024-08-31
*/
@Service
public class QxProjectServiceImpl extends ServiceImpl<QxProjectMapper, QxProject> implements IQxProjectService {

}

+ 20
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/impl/QxProjectSystemReplaceInfosServiceImpl.java View File

@@ -0,0 +1,20 @@
package com.hz.pm.api.projectlib.service.impl;

import com.hz.pm.api.projectlib.entity.QxProjectSystemReplaceInfos;
import com.hz.pm.api.projectlib.mapper.QxProjectSystemReplaceInfosMapper;
import com.hz.pm.api.projectlib.service.IQxProjectSystemReplaceInfosService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

/**
* <p>
* 服务实现类
* </p>
*
* @author WendyYang
* @since 2024-08-31
*/
@Service
public class QxProjectSystemReplaceInfosServiceImpl extends ServiceImpl<QxProjectSystemReplaceInfosMapper, QxProjectSystemReplaceInfos> implements IQxProjectSystemReplaceInfosService {

}

+ 20
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/impl/QxPurchaseServiceImpl.java View File

@@ -0,0 +1,20 @@
package com.hz.pm.api.projectlib.service.impl;

import com.hz.pm.api.projectlib.entity.QxPurchase;
import com.hz.pm.api.projectlib.mapper.QxPurchaseMapper;
import com.hz.pm.api.projectlib.service.IQxPurchaseService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

/**
* <p>
* 服务实现类
* </p>
*
* @author WendyYang
* @since 2024-08-31
*/
@Service
public class QxPurchaseServiceImpl extends ServiceImpl<QxPurchaseMapper, QxPurchase> implements IQxPurchaseService {

}

+ 1
- 0
hz-pm-api/src/main/java/com/hz/pm/api/user/convert/UserInfoConvertor.java View File

@@ -33,6 +33,7 @@ public class UserInfoConvertor {
userInfoDetails.setIsCitySoeUser(userFullInfo.getIsCitySoeUser());
userInfoDetails.setIsCityDistrictUser(userFullInfo.getIsCityDistrictUser());
userInfoDetails.setIsKeyIndustryUser(userFullInfo.getIsKeyIndustryUser());
userInfoDetails.setIsCountyXcbUser(userFullInfo.getIsCountyXcbUser());
return userInfoDetails;
}



+ 3
- 0
hz-pm-api/src/main/java/com/hz/pm/api/user/model/vo/ResUserDetailVO.java View File

@@ -69,4 +69,7 @@ public class ResUserDetailVO {
*/
private Boolean isKeyIndustryUser;

@ApiModelProperty("是否是区县信创办用户")
private Boolean isCountXcbUser;

}

+ 2
- 0
hz-pm-api/src/main/java/com/hz/pm/api/user/security/model/UserFullInfoDTO.java View File

@@ -71,6 +71,8 @@ public class UserFullInfoDTO {
*/
private Boolean isKeyIndustryUser;

private Boolean isCountyXcbUser;

private Integer unitStrip;

/**


+ 3
- 0
hz-pm-api/src/main/java/com/hz/pm/api/user/security/model/UserInfoDetails.java View File

@@ -6,6 +6,7 @@ import com.hz.pm.api.common.model.constant.MhUnitConst;
import com.hz.pm.api.sys.model.entity.Role;
import com.hz.pm.api.user.model.enumeration.RoleEnum;
import com.ningdatech.basic.auth.AbstractLoginUser;
import com.sun.org.apache.xpath.internal.operations.Bool;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.security.core.GrantedAuthority;
@@ -77,6 +78,8 @@ public class UserInfoDetails extends AbstractLoginUser implements UserDetails {
*/
private Boolean isKeyIndustryUser;

private Boolean isCountyXcbUser;

private Integer unitStrip;

public String getUserIdStr() {


+ 11
- 3
hz-pm-api/src/main/java/com/hz/pm/api/workbench/controller/WorkbenchController.java View File

@@ -2,6 +2,7 @@ package com.hz.pm.api.workbench.controller;

import com.hz.pm.api.projectlib.model.vo.ProjectLibListItemVO;
import com.hz.pm.api.projectlib.model.vo.SystemReplaceInfoVO;
import com.hz.pm.api.workbench.manage.QxWorkbenchManage;
import com.hz.pm.api.workbench.manage.WorkbenchManage;
import com.hz.pm.api.workbench.model.WorkbenchProjectLibReq;
import com.hz.pm.api.workbench.model.WorkbenchReq;
@@ -10,7 +11,7 @@ import com.ningdatech.basic.model.PageVo;
import com.ningdatech.log.annotation.WebLog;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;
@@ -25,12 +26,13 @@ import java.util.List;
* @since 18:59 2024/3/23
*/
@RestController
@AllArgsConstructor
@RequiredArgsConstructor
@Api(tags = "工作台控制器")
@RequestMapping("/api/v1/workbench")
public class WorkbenchController {

private WorkbenchManage workbenchManage;
private final WorkbenchManage workbenchManage;
private final QxWorkbenchManage qxWorkbenchManage;

/**
* @param year \
@@ -81,6 +83,12 @@ public class WorkbenchController {
return workbenchManage.projectEarlyWarnings(req);
}

@GetMapping("/qx/projectStatistics")
@ApiOperation("区县项目统计")
public QxProjectStatisticsVO qxProjectStatistics(WorkbenchReq req) {
return qxWorkbenchManage.projectStatistics(req);
}

@GetMapping("/projectMonitorEarlyWarnings")
@ApiOperation("项目监测预警")
public List<WorkbenchProjectMonitorEarlyWarnVO> projectMonitorEarlyWarnings(WorkbenchReq req) {


+ 81
- 0
hz-pm-api/src/main/java/com/hz/pm/api/workbench/manage/QxWorkbenchManage.java View File

@@ -0,0 +1,81 @@
package com.hz.pm.api.workbench.manage;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.hz.pm.api.common.model.constant.MhUnitConst;
import com.hz.pm.api.common.util.DecimalUtil;
import com.hz.pm.api.projectlib.entity.QxProject;
import com.hz.pm.api.projectlib.entity.QxProjectSystemReplaceInfos;
import com.hz.pm.api.projectlib.entity.QxPurchase;
import com.hz.pm.api.projectlib.service.IQxProjectService;
import com.hz.pm.api.projectlib.service.IQxProjectSystemReplaceInfosService;
import com.hz.pm.api.projectlib.service.IQxPurchaseService;
import com.hz.pm.api.user.helper.MhUnitCache;
import com.hz.pm.api.workbench.model.WorkbenchReq;
import com.hz.pm.api.workbench.model.vo.QxProjectStatisticsVO;
import com.ningdatech.basic.util.CollUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

/**
* <p>
* QxWorkbenchManage
* </p>
*
* @author WendyYang
* @since 14:15 2024/8/31
*/
@Component
@RequiredArgsConstructor
public class QxWorkbenchManage {

private final IQxProjectService qxProjectService;
private final MhUnitCache mhUnitCache;
private final IQxPurchaseService qxPurchaseService;
private final IQxProjectSystemReplaceInfosService qxProjectSystemReplaceInfosService;


public QxProjectStatisticsVO projectStatistics(WorkbenchReq req) {
LambdaQueryWrapper<QxProject> query = Wrappers.lambdaQuery(QxProject.class)
.eq(req.getProjectYear() != null, QxProject::getProjectYear, req.getProjectYear())
.eq(req.getUnitStrip() != null, QxProject::getUnitStrip, req.getUnitStrip())
.select(QxProject::getId);
if (req.getUnitId() != null && req.getUnitId() != MhUnitConst.ROOT_UNIT_ID) {
query.in(QxProject::getBuildOrgCode, mhUnitCache.getViewChildIdsRecursion(req.getUnitId()));
}
List<QxProject> projects = qxProjectService.list(query);
if (projects.isEmpty()) {
return null;
}
List<Long> projectIds = CollUtils.fieldList(projects, QxProject::getId);
QxProjectStatisticsVO stat = new QxProjectStatisticsVO();
stat.setDeclaredCount(projects.size());
Wrapper<QxPurchase> purchaseQuery = Wrappers.lambdaQuery(QxPurchase.class)
.select(QxPurchase::getPurchaseBudget, QxPurchase::getContractAmount,
QxPurchase::getFinalAcceptDate)
.in(QxPurchase::getProjectId, projectIds);
List<QxPurchase> purchases = qxPurchaseService.list(purchaseQuery);
if (CollUtil.isNotEmpty(purchases)) {
stat.setPurchasedCount(purchases.size());
stat.setAcceptedCount(CollUtil.count(purchases, purchase -> purchase.getFinalAcceptDate() != null));
stat.setTotalBudget(DecimalUtil.sum(purchases, QxPurchase::getPurchaseBudget));
stat.setTotalContractAmount(DecimalUtil.sum(purchases, QxPurchase::getContractAmount));
QueryWrapper<QxProjectSystemReplaceInfos> wrapper = new QueryWrapper<>();
wrapper.select("count(distinct project_id) adaptCount");
wrapper.in("project_id", projectIds);
wrapper.isNotNull("has_security_eval");
Map<String, Object> map = qxProjectSystemReplaceInfosService.getMap(wrapper);
stat.setUpgradedCount(MapUtil.getInt(map, "adaptCount"));
}
return stat;
}


}

+ 37
- 0
hz-pm-api/src/main/java/com/hz/pm/api/workbench/model/vo/QxProjectStatisticsVO.java View File

@@ -0,0 +1,37 @@
package com.hz.pm.api.workbench.model.vo;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.math.BigDecimal;

/**
* <p>
* QxProjectStatisticsVO
* </p>
*
* @author WendyYang
* @since 14:16 2024/8/31
*/
@Data
public class QxProjectStatisticsVO {

@ApiModelProperty("已立项数量")
private Integer declaredCount;

@ApiModelProperty("已采购数量")
private Integer purchasedCount;

@ApiModelProperty("改造提升&综合集成数量")
private Integer upgradedCount;

@ApiModelProperty("验收数量")
private Integer acceptedCount;

@ApiModelProperty("项目总预算")
private BigDecimal totalBudget;

@ApiModelProperty("合同金额")
private BigDecimal totalContractAmount;

}

+ 1
- 1
hz-pm-gen/src/main/java/com/hz/pm/gen/config/CodeGen.java View File

@@ -55,7 +55,7 @@ public class CodeGen {
}

public static void main(String[] args) {
generate("WendyYang", "projectlib", PATH_YYD, "mh_system_replace_info");
generate("WendyYang", "projectlib", PATH_YYD, "QX_PROJECT_SYSTEM_REPLACE_INFOS");
}

}

Loading…
Cancel
Save