@@ -83,18 +83,20 @@ public class UserInfoHelperImpl implements UserInfoHelper { | |||||
// 是否市属国有企业下用户 | // 是否市属国有企业下用户 | ||||
List<Long> citySoeUnitIds = mhUnitCache.getViewChildIdsRecursion(MhUnitConst.CITY_SOE_UNIT_ID); | List<Long> citySoeUnitIds = mhUnitCache.getViewChildIdsRecursion(MhUnitConst.CITY_SOE_UNIT_ID); | ||||
userFullInfo.setIsCitySoeUser(citySoeUnitIds.contains(userInfo.getMhUnitId())); | 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); | List<Long> keyIndustryUnitIds = mhUnitCache.getViewChildIdsRecursion(MhUnitConst.KEY_INDUSTRY_UNIT_ID); | ||||
userFullInfo.setIsKeyIndustryUser(keyIndustryUnitIds.contains(userInfo.getMhUnitId())); | 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); | List<Long> countyUnitIds = mhUnitCache.getViewChildIdsRecursion(MhUnitConst.COUNTY_PARENT_UNIT_ID); | ||||
userFullInfo.setIsCountyUser(countyUnitIds.contains(userInfo.getMhUnitId())); | 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); | List<Long> cityDistrictUnitIds = mhUnitCache.getViewChildIdsRecursion(MhUnitConst.CITY_DISTRICT_UNIT_ID); | ||||
userFullInfo.setIsCityDistrictUser(cityDistrictUnitIds.contains(userInfo.getMhUnitId())); | 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.conditions.query.LambdaQueryWrapper; | ||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 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.external.MhApiClient; | ||||
import com.hz.pm.api.projectlib.entity.MhSystemReplaceInfo; | import com.hz.pm.api.projectlib.entity.MhSystemReplaceInfo; | ||||
import com.hz.pm.api.projectlib.model.dto.MhSystemReplaceInfoDTO; | import com.hz.pm.api.projectlib.model.dto.MhSystemReplaceInfoDTO; | ||||
@@ -38,7 +39,6 @@ public class MhSystemReplaceManage { | |||||
private final MhUnitCache mhUnitCache; | private final MhUnitCache mhUnitCache; | ||||
private final MhApiClient mhApiClient; | private final MhApiClient mhApiClient; | ||||
@Transactional(rollbackFor = Exception.class) | @Transactional(rollbackFor = Exception.class) | ||||
public synchronized void syncMhSystemReplaceInfo() { | public synchronized void syncMhSystemReplaceInfo() { | ||||
List<MhSystemReplaceInfoDTO> systemReplaceInfos = mhApiClient.querySystemReplaceInfos(); | List<MhSystemReplaceInfoDTO> systemReplaceInfos = mhApiClient.querySystemReplaceInfos(); | ||||
@@ -90,7 +90,7 @@ public class MhSystemReplaceManage { | |||||
} else { | } else { | ||||
query.orderByDesc(MhSystemReplaceInfo::getPlanFinishDate); | 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())); | query.in(MhSystemReplaceInfo::getBuildOrgCode, mhUnitCache.getViewChildIdsRecursion(req.getBuildOrgCode())); | ||||
} | } | ||||
Page<MhSystemReplaceInfo> page = mhSystemReplaceInfoService.page(req.page(), query); | 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 | @Data | ||||
public class MhSystemReplaceInfoVO { | public class MhSystemReplaceInfoVO { | ||||
private String id; | |||||
@ApiModelProperty("替代前系统名称") | @ApiModelProperty("替代前系统名称") | ||||
private String sourceName; | 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; | package com.hz.pm.api.projectlib.model.enumeration; | ||||
import com.hz.pm.api.common.util.StrUtils; | import com.hz.pm.api.common.util.StrUtils; | ||||
import io.swagger.models.auth.In; | |||||
import lombok.AllArgsConstructor; | import lombok.AllArgsConstructor; | ||||
import lombok.Data; | |||||
import lombok.Getter; | import lombok.Getter; | ||||
import java.util.Arrays; | 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 String val; | ||||
private final Integer code; | private final Integer code; | ||||
private final MhSystemReplaceType mhReplaceType; | |||||
public static Optional<GovSystemReplaceTypeEnum> get(Integer code) { | 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.setIsCitySoeUser(userFullInfo.getIsCitySoeUser()); | ||||
userInfoDetails.setIsCityDistrictUser(userFullInfo.getIsCityDistrictUser()); | userInfoDetails.setIsCityDistrictUser(userFullInfo.getIsCityDistrictUser()); | ||||
userInfoDetails.setIsKeyIndustryUser(userFullInfo.getIsKeyIndustryUser()); | userInfoDetails.setIsKeyIndustryUser(userFullInfo.getIsKeyIndustryUser()); | ||||
userInfoDetails.setIsCountyXcbUser(userFullInfo.getIsCountyXcbUser()); | |||||
return userInfoDetails; | return userInfoDetails; | ||||
} | } | ||||
@@ -69,4 +69,7 @@ public class ResUserDetailVO { | |||||
*/ | */ | ||||
private Boolean isKeyIndustryUser; | private Boolean isKeyIndustryUser; | ||||
@ApiModelProperty("是否是区县信创办用户") | |||||
private Boolean isCountXcbUser; | |||||
} | } |
@@ -71,6 +71,8 @@ public class UserFullInfoDTO { | |||||
*/ | */ | ||||
private Boolean isKeyIndustryUser; | private Boolean isKeyIndustryUser; | ||||
private Boolean isCountyXcbUser; | |||||
private Integer unitStrip; | 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.sys.model.entity.Role; | ||||
import com.hz.pm.api.user.model.enumeration.RoleEnum; | import com.hz.pm.api.user.model.enumeration.RoleEnum; | ||||
import com.ningdatech.basic.auth.AbstractLoginUser; | import com.ningdatech.basic.auth.AbstractLoginUser; | ||||
import com.sun.org.apache.xpath.internal.operations.Bool; | |||||
import lombok.Data; | import lombok.Data; | ||||
import lombok.EqualsAndHashCode; | import lombok.EqualsAndHashCode; | ||||
import org.springframework.security.core.GrantedAuthority; | import org.springframework.security.core.GrantedAuthority; | ||||
@@ -77,6 +78,8 @@ public class UserInfoDetails extends AbstractLoginUser implements UserDetails { | |||||
*/ | */ | ||||
private Boolean isKeyIndustryUser; | private Boolean isKeyIndustryUser; | ||||
private Boolean isCountyXcbUser; | |||||
private Integer unitStrip; | private Integer unitStrip; | ||||
public String getUserIdStr() { | 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.ProjectLibListItemVO; | ||||
import com.hz.pm.api.projectlib.model.vo.SystemReplaceInfoVO; | 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.manage.WorkbenchManage; | ||||
import com.hz.pm.api.workbench.model.WorkbenchProjectLibReq; | import com.hz.pm.api.workbench.model.WorkbenchProjectLibReq; | ||||
import com.hz.pm.api.workbench.model.WorkbenchReq; | 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 com.ningdatech.log.annotation.WebLog; | ||||
import io.swagger.annotations.Api; | import io.swagger.annotations.Api; | ||||
import io.swagger.annotations.ApiOperation; | import io.swagger.annotations.ApiOperation; | ||||
import lombok.AllArgsConstructor; | |||||
import lombok.RequiredArgsConstructor; | |||||
import org.springframework.web.bind.annotation.*; | import org.springframework.web.bind.annotation.*; | ||||
import java.time.LocalDate; | import java.time.LocalDate; | ||||
@@ -25,12 +26,13 @@ import java.util.List; | |||||
* @since 18:59 2024/3/23 | * @since 18:59 2024/3/23 | ||||
*/ | */ | ||||
@RestController | @RestController | ||||
@AllArgsConstructor | |||||
@RequiredArgsConstructor | |||||
@Api(tags = "工作台控制器") | @Api(tags = "工作台控制器") | ||||
@RequestMapping("/api/v1/workbench") | @RequestMapping("/api/v1/workbench") | ||||
public class WorkbenchController { | public class WorkbenchController { | ||||
private WorkbenchManage workbenchManage; | |||||
private final WorkbenchManage workbenchManage; | |||||
private final QxWorkbenchManage qxWorkbenchManage; | |||||
/** | /** | ||||
* @param year \ | * @param year \ | ||||
@@ -81,6 +83,12 @@ public class WorkbenchController { | |||||
return workbenchManage.projectEarlyWarnings(req); | return workbenchManage.projectEarlyWarnings(req); | ||||
} | } | ||||
@GetMapping("/qx/projectStatistics") | |||||
@ApiOperation("区县项目统计") | |||||
public QxProjectStatisticsVO qxProjectStatistics(WorkbenchReq req) { | |||||
return qxWorkbenchManage.projectStatistics(req); | |||||
} | |||||
@GetMapping("/projectMonitorEarlyWarnings") | @GetMapping("/projectMonitorEarlyWarnings") | ||||
@ApiOperation("项目监测预警") | @ApiOperation("项目监测预警") | ||||
public List<WorkbenchProjectMonitorEarlyWarnVO> projectMonitorEarlyWarnings(WorkbenchReq req) { | 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) { | 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"); | |||||
} | } | ||||
} | } |