@@ -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)); | |||
} | |||
} | |||
} | |||
@@ -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); | |||
} | |||
} |
@@ -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; | |||
} |
@@ -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; | |||
} |
@@ -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; | |||
} |
@@ -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); | |||
@@ -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()); | |||
} | |||
} |
@@ -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> { | |||
} |
@@ -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> |
@@ -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> { | |||
} |
@@ -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> |
@@ -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> { | |||
} |
@@ -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> |
@@ -17,6 +17,8 @@ import java.time.LocalDateTime; | |||
@Data | |||
public class MhSystemReplaceInfoVO { | |||
private String id; | |||
@ApiModelProperty("替代前系统名称") | |||
private String sourceName; | |||
@@ -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; | |||
} |
@@ -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) { | |||
@@ -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(); | |||
} | |||
} |
@@ -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); | |||
} | |||
} |
@@ -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; | |||
} |
@@ -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; | |||
} |
@@ -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; | |||
} |
@@ -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; | |||
} |
@@ -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; | |||
} |
@@ -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; | |||
} |
@@ -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; | |||
} |
@@ -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; | |||
} |
@@ -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; | |||
} |
@@ -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> { | |||
} |
@@ -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)); | |||
} | |||
} |
@@ -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)); | |||
} | |||
} |
@@ -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 { | |||
} |
@@ -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 { | |||
} |
@@ -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 { | |||
} |
@@ -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; | |||
} | |||
@@ -69,4 +69,7 @@ public class ResUserDetailVO { | |||
*/ | |||
private Boolean isKeyIndustryUser; | |||
@ApiModelProperty("是否是区县信创办用户") | |||
private Boolean isCountXcbUser; | |||
} |
@@ -71,6 +71,8 @@ public class UserFullInfoDTO { | |||
*/ | |||
private Boolean isKeyIndustryUser; | |||
private Boolean isCountyXcbUser; | |||
private Integer unitStrip; | |||
/** | |||
@@ -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() { | |||
@@ -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) { | |||
@@ -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; | |||
} | |||
} |
@@ -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; | |||
} |
@@ -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"); | |||
} | |||
} |