diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/common/helper/impl/UserInfoHelperImpl.java b/hz-pm-api/src/main/java/com/hz/pm/api/common/helper/impl/UserInfoHelperImpl.java index b4c6b6b..b647f41 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/common/helper/impl/UserInfoHelperImpl.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/common/helper/impl/UserInfoHelperImpl.java @@ -83,18 +83,20 @@ public class UserInfoHelperImpl implements UserInfoHelper { // 是否市属国有企业下用户 List citySoeUnitIds = mhUnitCache.getViewChildIdsRecursion(MhUnitConst.CITY_SOE_UNIT_ID); userFullInfo.setIsCitySoeUser(citySoeUnitIds.contains(userInfo.getMhUnitId())); - if (!userFullInfo.getIsCitySoeUser()) { + if (Boolean.FALSE.equals(userFullInfo.getIsCitySoeUser())) { // 是否关键行业部门下用户 List keyIndustryUnitIds = mhUnitCache.getViewChildIdsRecursion(MhUnitConst.KEY_INDUSTRY_UNIT_ID); userFullInfo.setIsKeyIndustryUser(keyIndustryUnitIds.contains(userInfo.getMhUnitId())); - if (!userFullInfo.getIsKeyIndustryUser()) { + if (Boolean.FALSE.equals(userFullInfo.getIsKeyIndustryUser())) { // 是否区县部门下用户 List countyUnitIds = mhUnitCache.getViewChildIdsRecursion(MhUnitConst.COUNTY_PARENT_UNIT_ID); userFullInfo.setIsCountyUser(countyUnitIds.contains(userInfo.getMhUnitId())); - if (!userFullInfo.getIsCountyUser()) { + if (Boolean.FALSE.equals(userFullInfo.getIsCountyUser())) { // 是否市本级用户 List cityDistrictUnitIds = mhUnitCache.getViewChildIdsRecursion(MhUnitConst.CITY_DISTRICT_UNIT_ID); userFullInfo.setIsCityDistrictUser(cityDistrictUnitIds.contains(userInfo.getMhUnitId())); + } else { + userFullInfo.setIsCountyXcbUser(unit.getName().contains(MhUnitConst.UNIT_XCB)); } } } diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/controller/QxProjectController.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/controller/QxProjectController.java new file mode 100644 index 0000000..c87315e --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/controller/QxProjectController.java @@ -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; + +/** + *

+ * 前端控制器 + *

+ * + * @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 page(QxProjectLibReq req) { + return qxProjectManage.page(req); + } + +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/entity/QxProject.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/entity/QxProject.java new file mode 100644 index 0000000..5fc57d2 --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/entity/QxProject.java @@ -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; + +/** + *

+ * 区县项目信息实体 + *

+ * + * @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; +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/entity/QxProjectSystemReplaceInfos.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/entity/QxProjectSystemReplaceInfos.java new file mode 100644 index 0000000..32d1dcf --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/entity/QxProjectSystemReplaceInfos.java @@ -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; + +/** + *

+ * 区县系统改造情况 + *

+ * + * @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; + +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/entity/QxPurchase.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/entity/QxPurchase.java new file mode 100644 index 0000000..3d86e34 --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/entity/QxPurchase.java @@ -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; + +/** + *

+ * 区县项目采购信息实体 + *

+ * + * @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; + +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/MhSystemReplaceManage.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/MhSystemReplaceManage.java index 82221ff..2b9a1c2 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/MhSystemReplaceManage.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/MhSystemReplaceManage.java @@ -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 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 page = mhSystemReplaceInfoService.page(req.page(), query); diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/QxProjectManage.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/QxProjectManage.java new file mode 100644 index 0000000..46924ee --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/QxProjectManage.java @@ -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; + +/** + *

+ * QxProjectManage + *

+ * + * @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 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 sourceSystemIds = req.getSourceSystemIds(); + List systemReplaceInfos = mhSystemReplaceInfoService.listByIds(sourceSystemIds); + Map> replaceInfosMap = CollUtils.group(systemReplaceInfos, + w -> MhSystemReplaceType.IT.eq(w.getReplaceType())); + List projectSystemReplaceInfos = new ArrayList<>(); + List itReplaceInfos = replaceInfosMap.get(true); + if (CollUtil.isNotEmpty(itReplaceInfos)) { + Map> group = CollUtils.group(itReplaceInfos, MhSystemReplaceInfo::getTargetName); + for (Map.Entry> entry : group.entrySet()) { + List 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 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 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 replaceInfos = req.getSystemReplaceInfos(); + List 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 systemReplaceInfos = qxProjectSystemReplaceInfosService.listByProjectId(projectId); + if (CollUtil.isNotEmpty(systemReplaceInfos)) { + List retSystemReplaceInfos = BeanUtil.copyToList(systemReplaceInfos, QxProjectSystemReplaceInfosVO.class); + projectDetail.setSystemReplaceInfos(retSystemReplaceInfos); + } + return projectDetail; + } + + public PageVo page(QxProjectLibReq req) { + LambdaQueryWrapper 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 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 page = qxProjectService.page(req.page(), query); + return PageVo.of(BeanUtil.copyToList(page.getRecords(), QxProjectVO.class), page.getTotal()); + } + +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxProjectMapper.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxProjectMapper.java new file mode 100644 index 0000000..bf9cb1f --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxProjectMapper.java @@ -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; + +/** + *

+ * Mapper 接口 + *

+ * + * @author WendyYang + * @since 2024-08-31 + */ +public interface QxProjectMapper extends BaseMapper { + +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxProjectMapper.xml b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxProjectMapper.xml new file mode 100644 index 0000000..5861206 --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxProjectMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxProjectSystemReplaceInfosMapper.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxProjectSystemReplaceInfosMapper.java new file mode 100644 index 0000000..dd901d8 --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxProjectSystemReplaceInfosMapper.java @@ -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; + +/** + *

+ * Mapper 接口 + *

+ * + * @author WendyYang + * @since 2024-08-31 + */ +public interface QxProjectSystemReplaceInfosMapper extends BaseMapper { + +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxProjectSystemReplaceInfosMapper.xml b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxProjectSystemReplaceInfosMapper.xml new file mode 100644 index 0000000..fb87c94 --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxProjectSystemReplaceInfosMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxPurchaseMapper.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxPurchaseMapper.java new file mode 100644 index 0000000..e28b732 --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxPurchaseMapper.java @@ -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; + +/** + *

+ * Mapper 接口 + *

+ * + * @author WendyYang + * @since 2024-08-31 + */ +public interface QxPurchaseMapper extends BaseMapper { + +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxPurchaseMapper.xml b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxPurchaseMapper.xml new file mode 100644 index 0000000..86ae800 --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/QxPurchaseMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/dto/MhSystemReplaceInfoVO.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/dto/MhSystemReplaceInfoVO.java index 202f18a..f2a3ca2 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/dto/MhSystemReplaceInfoVO.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/dto/MhSystemReplaceInfoVO.java @@ -17,6 +17,8 @@ import java.time.LocalDateTime; @Data public class MhSystemReplaceInfoVO { + private String id; + @ApiModelProperty("替代前系统名称") private String sourceName; diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/dto/QxProjectSystemReplaceInfosDTO.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/dto/QxProjectSystemReplaceInfosDTO.java new file mode 100644 index 0000000..626612f --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/dto/QxProjectSystemReplaceInfosDTO.java @@ -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; + +/** + *

+ * 区县系统改造情况 + *

+ * + * @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; + +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/enumeration/GovSystemReplaceTypeEnum.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/enumeration/GovSystemReplaceTypeEnum.java index 85b5903..4e9329f 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/enumeration/GovSystemReplaceTypeEnum.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/enumeration/GovSystemReplaceTypeEnum.java @@ -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 get(Integer code) { diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/enumeration/MhSystemReplaceType.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/enumeration/MhSystemReplaceType.java new file mode 100644 index 0000000..a81d348 --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/enumeration/MhSystemReplaceType.java @@ -0,0 +1,52 @@ +package com.hz.pm.api.projectlib.model.enumeration; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Optional; + +/** + *

+ * MhSystemReplaceType + *

+ * + * @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 getByCode(String code) { + for (MhSystemReplaceType value : MhSystemReplaceType.values()) { + if (value.getCode().equals(code)) { + return Optional.of(value); + } + } + return Optional.empty(); + } + +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/enumeration/QxProjectStatus.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/enumeration/QxProjectStatus.java new file mode 100644 index 0000000..cf63d08 --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/enumeration/QxProjectStatus.java @@ -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; + +/** + *

+ * QxProjectStatus + *

+ * + * @author WendyYang + * @since 14:37 2024/8/31 + */ +@Getter +@AllArgsConstructor +public enum QxProjectStatus implements IStatus { + + 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); + } + +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/QxAcceptRecordReq.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/QxAcceptRecordReq.java new file mode 100644 index 0000000..54c39d3 --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/QxAcceptRecordReq.java @@ -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; + +/** + *

+ * QxAcceptRecordReq + *

+ * + * @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; + +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/QxProjectLibReq.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/QxProjectLibReq.java new file mode 100644 index 0000000..12c2886 --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/QxProjectLibReq.java @@ -0,0 +1,33 @@ +package com.hz.pm.api.projectlib.model.req; + +import com.ningdatech.basic.model.PagePo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * QxProjectLibReq + *

+ * + * @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; + +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/QxProjectRecordReq.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/QxProjectRecordReq.java new file mode 100644 index 0000000..5c75f86 --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/QxProjectRecordReq.java @@ -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; + +/** + *

+ * QxProjectRecordReq + *

+ * + * @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 sourceSystemIds; + +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/QxPurchaseRecordReq.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/QxPurchaseRecordReq.java new file mode 100644 index 0000000..f1b0f79 --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/QxPurchaseRecordReq.java @@ -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; + +/** + *

+ * 区县项目采购信息实体 + *

+ * + * @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; + +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/QxUpgradeRecordReq.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/QxUpgradeRecordReq.java new file mode 100644 index 0000000..cd57c2b --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/QxUpgradeRecordReq.java @@ -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; + +/** + *

+ * QxUpgradeRecordReq + *

+ * + * @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 systemReplaceInfos; + +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/QxProjectDetailVO.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/QxProjectDetailVO.java new file mode 100644 index 0000000..50be4d3 --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/QxProjectDetailVO.java @@ -0,0 +1,28 @@ +package com.hz.pm.api.projectlib.model.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + *

+ * QxProjectDetailVO + *

+ * + * @author WendyYang + * @since 11:58 2024/8/31 + */ +@Data +public class QxProjectDetailVO { + + @ApiModelProperty("项目详情") + private QxProjectVO project; + + @ApiModelProperty("采购详情") + private QxPurchaseVO purchase; + + @ApiModelProperty("改造提升&综合集成详情") + private List systemReplaceInfos; + +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/QxProjectSystemReplaceInfosVO.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/QxProjectSystemReplaceInfosVO.java new file mode 100644 index 0000000..102d72c --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/QxProjectSystemReplaceInfosVO.java @@ -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; + +/** + *

+ * 区县系统改造情况 + *

+ * + * @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; + +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/QxProjectVO.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/QxProjectVO.java new file mode 100644 index 0000000..b6c558c --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/QxProjectVO.java @@ -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; + +/** + *

+ * 区县项目信息实体 + *

+ * + * @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; + +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/QxPurchaseVO.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/QxPurchaseVO.java new file mode 100644 index 0000000..4377c8a --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/QxPurchaseVO.java @@ -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; + +/** + *

+ * 区县项目采购信息实体 + *

+ * + * @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; + +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/IQxProjectService.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/IQxProjectService.java new file mode 100644 index 0000000..9fe6337 --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/IQxProjectService.java @@ -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; + +/** + *

+ * 服务类 + *

+ * + * @author WendyYang + * @since 2024-08-31 + */ +public interface IQxProjectService extends IService { + +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/IQxProjectSystemReplaceInfosService.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/IQxProjectSystemReplaceInfosService.java new file mode 100644 index 0000000..d2aa1f0 --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/IQxProjectSystemReplaceInfosService.java @@ -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; + +/** + *

+ * 服务类 + *

+ * + * @author WendyYang + * @since 2024-08-31 + */ +public interface IQxProjectSystemReplaceInfosService extends IService { + + default List listByProjectId(Long projectId) { + return this.list(Wrappers.lambdaQuery(QxProjectSystemReplaceInfos.class) + .eq(QxProjectSystemReplaceInfos::getProjectId, projectId)); + } + +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/IQxPurchaseService.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/IQxPurchaseService.java new file mode 100644 index 0000000..3f005e6 --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/IQxPurchaseService.java @@ -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; + +/** + *

+ * 服务类 + *

+ * + * @author WendyYang + * @since 2024-08-31 + */ +public interface IQxPurchaseService extends IService { + + default QxPurchase getByProjectId(Long projectId) { + return this.getOne(Wrappers.lambdaQuery(QxPurchase.class) + .eq(QxPurchase::getProjectId, projectId)); + } + +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/impl/QxProjectServiceImpl.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/impl/QxProjectServiceImpl.java new file mode 100644 index 0000000..3df7a34 --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/impl/QxProjectServiceImpl.java @@ -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; + +/** + *

+ * 服务实现类 + *

+ * + * @author WendyYang + * @since 2024-08-31 + */ +@Service +public class QxProjectServiceImpl extends ServiceImpl implements IQxProjectService { + +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/impl/QxProjectSystemReplaceInfosServiceImpl.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/impl/QxProjectSystemReplaceInfosServiceImpl.java new file mode 100644 index 0000000..f30d69c --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/impl/QxProjectSystemReplaceInfosServiceImpl.java @@ -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; + +/** + *

+ * 服务实现类 + *

+ * + * @author WendyYang + * @since 2024-08-31 + */ +@Service +public class QxProjectSystemReplaceInfosServiceImpl extends ServiceImpl implements IQxProjectSystemReplaceInfosService { + +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/impl/QxPurchaseServiceImpl.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/impl/QxPurchaseServiceImpl.java new file mode 100644 index 0000000..4d36088 --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/service/impl/QxPurchaseServiceImpl.java @@ -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; + +/** + *

+ * 服务实现类 + *

+ * + * @author WendyYang + * @since 2024-08-31 + */ +@Service +public class QxPurchaseServiceImpl extends ServiceImpl implements IQxPurchaseService { + +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/user/convert/UserInfoConvertor.java b/hz-pm-api/src/main/java/com/hz/pm/api/user/convert/UserInfoConvertor.java index b88f79c..1db6000 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/user/convert/UserInfoConvertor.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/user/convert/UserInfoConvertor.java @@ -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; } diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/user/model/vo/ResUserDetailVO.java b/hz-pm-api/src/main/java/com/hz/pm/api/user/model/vo/ResUserDetailVO.java index f95c6fe..de869eb 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/user/model/vo/ResUserDetailVO.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/user/model/vo/ResUserDetailVO.java @@ -69,4 +69,7 @@ public class ResUserDetailVO { */ private Boolean isKeyIndustryUser; + @ApiModelProperty("是否是区县信创办用户") + private Boolean isCountXcbUser; + } diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/user/security/model/UserFullInfoDTO.java b/hz-pm-api/src/main/java/com/hz/pm/api/user/security/model/UserFullInfoDTO.java index 0d617b7..4e48a7a 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/user/security/model/UserFullInfoDTO.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/user/security/model/UserFullInfoDTO.java @@ -71,6 +71,8 @@ public class UserFullInfoDTO { */ private Boolean isKeyIndustryUser; + private Boolean isCountyXcbUser; + private Integer unitStrip; /** diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/user/security/model/UserInfoDetails.java b/hz-pm-api/src/main/java/com/hz/pm/api/user/security/model/UserInfoDetails.java index 1e44040..f4cbb36 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/user/security/model/UserInfoDetails.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/user/security/model/UserInfoDetails.java @@ -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() { diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/workbench/controller/WorkbenchController.java b/hz-pm-api/src/main/java/com/hz/pm/api/workbench/controller/WorkbenchController.java index 26d6b37..31020f5 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/workbench/controller/WorkbenchController.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/workbench/controller/WorkbenchController.java @@ -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 projectMonitorEarlyWarnings(WorkbenchReq req) { diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/workbench/manage/QxWorkbenchManage.java b/hz-pm-api/src/main/java/com/hz/pm/api/workbench/manage/QxWorkbenchManage.java new file mode 100644 index 0000000..769a9ec --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/workbench/manage/QxWorkbenchManage.java @@ -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; + +/** + *

+ * QxWorkbenchManage + *

+ * + * @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 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 projects = qxProjectService.list(query); + if (projects.isEmpty()) { + return null; + } + List projectIds = CollUtils.fieldList(projects, QxProject::getId); + QxProjectStatisticsVO stat = new QxProjectStatisticsVO(); + stat.setDeclaredCount(projects.size()); + Wrapper purchaseQuery = Wrappers.lambdaQuery(QxPurchase.class) + .select(QxPurchase::getPurchaseBudget, QxPurchase::getContractAmount, + QxPurchase::getFinalAcceptDate) + .in(QxPurchase::getProjectId, projectIds); + List 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 wrapper = new QueryWrapper<>(); + wrapper.select("count(distinct project_id) adaptCount"); + wrapper.in("project_id", projectIds); + wrapper.isNotNull("has_security_eval"); + Map map = qxProjectSystemReplaceInfosService.getMap(wrapper); + stat.setUpgradedCount(MapUtil.getInt(map, "adaptCount")); + } + return stat; + } + + +} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/workbench/model/vo/QxProjectStatisticsVO.java b/hz-pm-api/src/main/java/com/hz/pm/api/workbench/model/vo/QxProjectStatisticsVO.java new file mode 100644 index 0000000..81751df --- /dev/null +++ b/hz-pm-api/src/main/java/com/hz/pm/api/workbench/model/vo/QxProjectStatisticsVO.java @@ -0,0 +1,37 @@ +package com.hz.pm.api.workbench.model.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + *

+ * QxProjectStatisticsVO + *

+ * + * @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; + +} diff --git a/hz-pm-gen/src/main/java/com/hz/pm/gen/config/CodeGen.java b/hz-pm-gen/src/main/java/com/hz/pm/gen/config/CodeGen.java index 6677e12..58fd729 100644 --- a/hz-pm-gen/src/main/java/com/hz/pm/gen/config/CodeGen.java +++ b/hz-pm-gen/src/main/java/com/hz/pm/gen/config/CodeGen.java @@ -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"); } }