feat: 安平项目

dev
zhanglei 2026-07-21 13:52:32 +08:00
parent 4c3a378c46
commit 5a996f38f5
23 changed files with 409 additions and 584 deletions

View File

@ -229,23 +229,22 @@ drop table if exists `eval_project`;
create table `eval_project` (
`id` bigint not null comment '主键',
`org_id` bigint not null comment '评价机构id',
`customer_id` bigint not null comment '客户id',
`project_no` varchar(64) not null comment '项目编号',
`customer_id` bigint not null comment '被评价客户id(eval_customer.id)',
`project_no` varchar(64) not null comment '项目编号(系统生成)',
`project_name` varchar(200) not null comment '项目名称',
`eval_type_code` varchar(32) default null comment '评价类型编码(PRE安全预评价 ACCEPT安全验收评价 STATUS安全现状评价)',
`eval_type_name` varchar(50) default null comment '评价类型名称(安全预评价/安全验收评价/安全现状评价)',
`business_scope` varchar(500) default null comment '业务范围',
`plan_start_date` date default null comment '计划开始日期',
`plan_end_date` date default null comment '计划结束日期',
`actual_start_date` date default null comment '实际开始日期',
`actual_end_date` date default null comment '实际结束日期',
`current_stage_code` varchar(32) default null comment '当前展示阶段编码(NODE_01风险分析 NODE_02业务合同 NODE_03项目组成立 NODE_04现场踏勘 NODE_05报告编制 NODE_06内部审核 NODE_07技术审核 NODE_08过程控制 ARCHIVED已归档 CANCELLED已作废)',
`current_stage_name` varchar(50) default null comment '当前展示阶段名称(风险分析/业务合同/项目组成立/现场踏勘/报告编制/内部审核/技术审核/过程控制/已归档/已作废)',
`status_code` int default null comment '项目状态编码(1草稿2进行中3已归档4已作废)',
`status_name` varchar(50) default null comment '项目状态名称',
`leader_personnel_id` bigint default null comment '项目负责人人员id',
`leader_name` varchar(50) default null comment '项目负责人姓名',
`cancel_reason` varchar(500) default null comment '作废原因',
`eval_type_code` varchar(32) default null comment '评价类型编码(见EvalTypeEnum:PRE/ACCEPT/STATUS)',
`customer_contact_name` varchar(50) default null comment '客户负责人(手填)',
`customer_contact_phone` varchar(20) default null comment '联系电话(手填)',
`district_code` varchar(32) default null comment '项目所在地编码(见ChongqingDistrictEnum)',
`plan_start_date` date default null comment '项目开始时间',
`plan_end_date` date default null comment '项目完成时间',
`customer_address` varchar(500) default null comment '客户所在地(手填)',
`longitude` varchar(32) default null comment '经度(手填)',
`latitude` varchar(32) default null comment '纬度(手填)',
`checkin_radius_meters` int default null comment '打卡有效范围(米,手填)',
`participants_json` json default null comment '参与人员JSON:[{"name":"名称","id":1}]',
`project_leader_name` varchar(50) default null comment '项目负责人(手填)',
`archive_flag` int not null default 0 comment '项目归档(1归档0未归档)',
`delete_enum` varchar(32) default null comment '删除标识true false',
`remarks` varchar(255) default null comment '备注',
`create_name` varchar(50) default null comment '创建人姓名',
@ -261,8 +260,10 @@ create table `eval_project` (
unique key `uk_eval_project_no` (`project_no`),
key `idx_eval_project_org` (`org_id`),
key `idx_eval_project_customer` (`customer_id`),
key `idx_eval_project_status` (`status_code`),
key `idx_eval_project_stage` (`current_stage_code`)
key `idx_eval_project_plan_start` (`plan_start_date`),
key `idx_eval_project_plan_end` (`plan_end_date`),
key `idx_eval_project_district` (`district_code`),
key `idx_eval_project_archive` (`archive_flag`)
) engine=innodb default charset=utf8mb4 collate=utf8mb4_0900_ai_ci comment='安评项目主表';
drop table if exists `eval_project_member`;

View File

@ -5,10 +5,11 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.qinan.safetyeval.client.api.institution.EvalProjectApi;
import org.qinan.safetyeval.client.co.institution.EvalProjectCO;
import org.qinan.safetyeval.client.co.institution.EvalProjectEnumsCO;
import org.qinan.safetyeval.client.dto.PageResponse;
import org.qinan.safetyeval.client.dto.SingleResponse;
import org.qinan.safetyeval.client.dto.institution.*;
import org.qinan.safetyeval.infrastructure.dataobject.base.Req;
import org.qinan.safetyeval.client.dto.institution.EvalProjectAddCmd;
import org.qinan.safetyeval.client.dto.institution.EvalProjectPageQuery;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@ -22,7 +23,7 @@ public class EvalProjectController {
@Resource
private EvalProjectApi evalProjectApi;
@ApiOperation("新项目")
@ApiOperation("新项目")
@PostMapping("/save")
public SingleResponse<EvalProjectCO> save(@Validated @RequestBody EvalProjectAddCmd cmd) {
return evalProjectApi.save(cmd);
@ -34,39 +35,15 @@ public class EvalProjectController {
return evalProjectApi.get(Long.parseLong(id));
}
@ApiOperation("修改项目")
@PostMapping("/modify")
public SingleResponse<EvalProjectCO> modify(@Validated @RequestBody EvalProjectModifyCmd cmd) {
return evalProjectApi.modify(cmd);
}
@ApiOperation("删除项目")
@PostMapping("/delete")
public SingleResponse<Void> delete(@RequestBody Req<Long> req) {
return evalProjectApi.delete(req.getData());
}
@ApiOperation("分页查询项目")
@GetMapping("/page")
public PageResponse<EvalProjectCO> page(@Validated EvalProjectPageQuery query) {
return evalProjectApi.page(query);
}
@ApiOperation("作废项目")
@PostMapping("/cancel")
public SingleResponse<EvalProjectCO> cancel(@Validated @RequestBody EvalProjectCancelCmd cmd) {
return evalProjectApi.cancel(cmd);
}
@ApiOperation("项目进度分页查询")
@GetMapping("/progress/page")
public PageResponse<EvalProjectCO> progressPage(@Validated EvalProjectPageQuery query) {
return evalProjectApi.progressPage(query);
}
@ApiOperation("我的项目分页")
@GetMapping("/my-page")
public PageResponse<EvalProjectCO> myPage(@Validated EvalProjectMyPageQuery query) {
return evalProjectApi.myPage(query);
@ApiOperation("安评项目枚举映射")
@GetMapping("/enums")
public SingleResponse<EvalProjectEnumsCO> enums() {
return evalProjectApi.enums();
}
}

View File

@ -0,0 +1,122 @@
package org.qinan.safetyeval.app.convertor;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.mapstruct.AfterMapping;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
import org.qinan.safetyeval.client.co.institution.EnumOptionCO;
import org.qinan.safetyeval.client.co.institution.EvalProjectCO;
import org.qinan.safetyeval.client.co.institution.EvalProjectEnumsCO;
import org.qinan.safetyeval.client.co.institution.EvalProjectParticipantItemCO;
import org.qinan.safetyeval.client.dto.institution.EvalProjectAddCmd;
import org.qinan.safetyeval.client.dto.institution.EvalProjectPageQuery;
import org.qinan.safetyeval.domain.constant.ChongqingDistrictEnum;
import org.qinan.safetyeval.domain.constant.EvalTypeEnum;
import org.qinan.safetyeval.domain.entity.EvalProjectEntity;
import org.qinan.safetyeval.domain.query.EvalProjectQuery;
import org.springframework.util.StringUtils;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
@Mapper(componentModel = "spring")
public interface EvalProjectCmdConvertor {
ObjectMapper OBJECT_MAPPER = new ObjectMapper();
@Mapping(target = "id", ignore = true)
@Mapping(target = "orgId", ignore = true)
@Mapping(target = "projectNo", ignore = true)
@Mapping(target = "customerId", expression = "java(cmd.getCustomerId() == null ? null : Long.parseLong(cmd.getCustomerId()))")
@Mapping(target = "participantsJson", expression = "java(toParticipantsJson(cmd.getParticipants()))")
@Mapping(target = "archiveFlag", expression = "java(cmd.getArchiveFlag() == null ? 0 : cmd.getArchiveFlag())")
@Mapping(target = "tenantId", ignore = true)
EvalProjectEntity convertAddCmdToE(EvalProjectAddCmd cmd);
@Mapping(target = "pageNum", source = "current")
@Mapping(target = "pageSize", source = "size")
@Mapping(target = "orgId", ignore = true)
@Mapping(target = "projectIds", ignore = true)
EvalProjectQuery convertPageQueryToQ(EvalProjectPageQuery query);
@Mapping(target = "id", expression = "java(entity.getId() == null ? null : String.valueOf(entity.getId()))")
@Mapping(target = "customerId", expression = "java(entity.getCustomerId() == null ? null : String.valueOf(entity.getCustomerId()))")
@Mapping(target = "evalTypeName", ignore = true)
@Mapping(target = "districtName", ignore = true)
@Mapping(target = "participants", ignore = true)
@Mapping(target = "projectPhaseCode", ignore = true)
@Mapping(target = "projectPhaseName", ignore = true)
EvalProjectCO convertEToCO(EvalProjectEntity entity);
List<EvalProjectCO> convertEListToCOList(List<EvalProjectEntity> list);
@AfterMapping
default void fillDisplayFields(EvalProjectEntity entity, @MappingTarget EvalProjectCO co) {
if (entity == null || co == null) {
return;
}
EvalTypeEnum evalType = EvalTypeEnum.ofCode(entity.getEvalTypeCode());
if (evalType != null) {
co.setEvalTypeName(evalType.getValue());
}
ChongqingDistrictEnum district = ChongqingDistrictEnum.ofCode(entity.getDistrictCode());
if (district != null) {
co.setDistrictName(district.getValue());
}
co.setParticipants(fromParticipantsJson(entity.getParticipantsJson()));
fillProjectPhase(entity.getPlanEndDate(), co);
}
default void fillProjectPhase(LocalDate planEndDate, EvalProjectCO co) {
if (planEndDate == null) {
return;
}
LocalDate today = LocalDate.now();
if (today.isAfter(planEndDate)) {
co.setProjectPhaseCode("DELAY");
co.setProjectPhaseName("延期");
} else {
co.setProjectPhaseCode("NORMAL");
co.setProjectPhaseName("正常");
}
}
default String toParticipantsJson(List<EvalProjectParticipantItemCO> participants) {
if (participants == null) {
return null;
}
try {
return OBJECT_MAPPER.writeValueAsString(participants);
} catch (Exception e) {
throw new IllegalArgumentException("参与人员JSON序列化失败", e);
}
}
default List<EvalProjectParticipantItemCO> fromParticipantsJson(String json) {
if (!StringUtils.hasText(json)) {
return Collections.emptyList();
}
try {
return OBJECT_MAPPER.readValue(json, new TypeReference<List<EvalProjectParticipantItemCO>>() {
});
} catch (Exception e) {
return Collections.emptyList();
}
}
default EvalProjectEnumsCO buildEnums() {
EvalProjectEnumsCO co = new EvalProjectEnumsCO();
co.setEvalType(Arrays.stream(EvalTypeEnum.values())
.map(e -> new EnumOptionCO(e.getCode(), e.getValue()))
.collect(Collectors.toList()));
co.setDistrict(Arrays.stream(ChongqingDistrictEnum.values())
.map(e -> new EnumOptionCO(e.getCode(), e.getValue()))
.collect(Collectors.toList()));
return co;
}
}

View File

@ -8,6 +8,7 @@ import org.qinan.safetyeval.client.co.institution.EvalProcessControlCO;
import org.qinan.safetyeval.client.dto.SingleResponse;
import org.qinan.safetyeval.client.dto.institution.EvalProcessArchiveCmd;
import org.qinan.safetyeval.client.dto.institution.EvalProcessControlSaveCmd;
import org.qinan.safetyeval.domain.constant.EvalTypeEnum;
import org.qinan.safetyeval.domain.entity.EvalProjectEntity;
import org.qinan.safetyeval.domain.entity.EvalProcessControlEntity;
import org.qinan.safetyeval.domain.entity.EvalReportDraftEntity;
@ -81,7 +82,7 @@ public class EvalProcessControlExecutor implements EvalProcessControlApi {
public SingleResponse<EvalProcessControlCO> archive(EvalProcessArchiveCmd cmd) {
Long projectId = Long.parseLong(cmd.getProjectId());
EvalProjectEntity project = evalProjectNodeSupport.requireProject(projectId);
if (project.getStatusCode() != null && project.getStatusCode() == 3) {
if (project.getArchiveFlag() != null && project.getArchiveFlag() == 1) {
throw new BizException(ErrorCode.EVAL_ARCHIVE_ALREADY_DONE);
}
evalProjectNodeSupport.assertWrite(projectId, EvalNodeCodes.NODE_08);
@ -122,8 +123,8 @@ public class EvalProcessControlExecutor implements EvalProcessControlApi {
report.setReportName(project.getProjectName() + "安评报告");
report.setReportYear(LocalDateTime.now().getYear());
report.setEvalTypeCode(project.getEvalTypeCode());
report.setEvalTypeName(project.getEvalTypeName());
report.setBusinessScope(project.getBusinessScope());
EvalTypeEnum evalType = EvalTypeEnum.ofCode(project.getEvalTypeCode());
report.setEvalTypeName(evalType != null ? evalType.getValue() : null);
report.setPublicFlag(2);
report.setCompleteFlag(1);
report.setReportStatusCode(1);

View File

@ -1,36 +1,25 @@
package org.qinan.safetyeval.app.executor.institution;
import org.qinan.safetyeval.app.convertor.EvalProjectCmdConvertor;
import org.qinan.safetyeval.client.api.institution.EvalProjectApi;
import org.qinan.safetyeval.client.co.institution.EvalProjectCO;
import org.qinan.safetyeval.client.co.institution.EvalProjectEnumsCO;
import org.qinan.safetyeval.client.dto.PageResponse;
import org.qinan.safetyeval.client.dto.SingleResponse;
import org.qinan.safetyeval.client.dto.institution.*;
import org.qinan.safetyeval.client.dto.institution.EvalProjectAddCmd;
import org.qinan.safetyeval.client.dto.institution.EvalProjectPageQuery;
import org.qinan.safetyeval.domain.entity.EvalProjectEntity;
import org.qinan.safetyeval.domain.entity.EvalProjectMemberEntity;
import org.qinan.safetyeval.domain.entity.OrgPersonnelEntity;
import org.qinan.safetyeval.domain.exception.BizException;
import org.qinan.safetyeval.domain.exception.ErrorCode;
import org.qinan.safetyeval.domain.gateway.OrgPersonnelGateway;
import org.qinan.safetyeval.domain.query.EvalProjectQuery;
import org.qinan.safetyeval.domain.query.PageResult;
import org.qinan.safetyeval.domain.service.EvalProjectDomainService;
import org.qinan.safetyeval.domain.service.EvalProjectMemberDomainService;
import org.qinan.safetyeval.infrastructure.adapter.auth.AuthUserContextAdapter;
import org.qinan.safetyeval.infrastructure.adapter.auth.AuthUserInfo;
import org.qinan.safetyeval.infrastructure.support.InstitutionOrgSupport;
import org.qinan.safetyeval.infrastructure.support.ProjectNoGenerator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
@Service
public class EvalProjectExecutor implements EvalProjectApi {
@ -49,115 +38,36 @@ public class EvalProjectExecutor implements EvalProjectApi {
@Lazy
@Autowired(required = false)
private OrgPersonnelGateway orgPersonnelGateway;
@Lazy
@Autowired(required = false)
private EvalProjectMemberDomainService evalProjectMemberDomainService;
private EvalProjectCmdConvertor evalProjectCmdConvertor;
@Override
public SingleResponse<EvalProjectCO> save(EvalProjectAddCmd cmd) {
Long orgId = institutionOrgSupport.resolveCurrentOrgId();
EvalProjectEntity entity = new EvalProjectEntity();
entity.setCustomerId(Long.parseLong(cmd.getCustomerId()));
entity.setProjectName(cmd.getProjectName());
entity.setEvalTypeCode(cmd.getEvalTypeCode());
entity.setEvalTypeName(cmd.getEvalTypeName());
entity.setBusinessScope(cmd.getBusinessScope());
entity.setPlanStartDate(cmd.getPlanStartDate());
entity.setPlanEndDate(cmd.getPlanEndDate());
entity.setStatusCode(cmd.getStatusCode());
evalProjectDomainService.applyDefaultStatusAndStage(entity);
EvalProjectEntity entity = evalProjectCmdConvertor.convertAddCmdToE(cmd);
EvalProjectEntity result = saveWithProjectNo(entity, orgId);
return SingleResponse.success(toCO(result));
return SingleResponse.success(evalProjectCmdConvertor.convertEToCO(result));
}
@Override
public SingleResponse<EvalProjectCO> get(Long id) {
EvalProjectEntity entity = evalProjectDomainService.get(id);
institutionOrgSupport.assertOrgAccess(entity.getOrgId(), ErrorCode.EVAL_PROJECT_NOT_FOUND);
return SingleResponse.success(toCO(entity));
}
@Override
public SingleResponse<EvalProjectCO> modify(EvalProjectModifyCmd cmd) {
EvalProjectEntity existing = evalProjectDomainService.get(Long.parseLong(cmd.getId()));
institutionOrgSupport.assertOrgAccess(existing.getOrgId(), ErrorCode.EVAL_PROJECT_NOT_FOUND);
EvalProjectEntity entity = new EvalProjectEntity();
entity.setId(Long.parseLong(cmd.getId()));
if (cmd.getCustomerId() != null) {
entity.setCustomerId(Long.parseLong(cmd.getCustomerId()));
}
entity.setProjectName(cmd.getProjectName());
entity.setEvalTypeCode(cmd.getEvalTypeCode());
entity.setEvalTypeName(cmd.getEvalTypeName());
entity.setBusinessScope(cmd.getBusinessScope());
entity.setPlanStartDate(cmd.getPlanStartDate());
entity.setPlanEndDate(cmd.getPlanEndDate());
entity.setActualStartDate(cmd.getActualStartDate());
entity.setActualEndDate(cmd.getActualEndDate());
entity.setStatusCode(cmd.getStatusCode());
EvalProjectEntity result = evalProjectDomainService.modify(entity);
return SingleResponse.success(toCO(result));
}
@Override
public SingleResponse<Void> delete(Long id) {
EvalProjectEntity existing = evalProjectDomainService.get(id);
institutionOrgSupport.assertOrgAccess(existing.getOrgId(), ErrorCode.EVAL_PROJECT_NOT_FOUND);
evalProjectDomainService.delete(id);
return SingleResponse.success();
return SingleResponse.success(evalProjectCmdConvertor.convertEToCO(entity));
}
@Override
public PageResponse<EvalProjectCO> page(EvalProjectPageQuery query) {
Long orgId = institutionOrgSupport.resolveCurrentOrgId();
EvalProjectQuery domainQuery = toDomainQuery(query, orgId, null);
EvalProjectQuery domainQuery = evalProjectCmdConvertor.convertPageQueryToQ(query);
domainQuery.setOrgId(institutionOrgSupport.resolveCurrentOrgId());
PageResult<EvalProjectEntity> pageResult = evalProjectDomainService.page(domainQuery);
return PageResponse.of(
pageResult.getRecords().stream().map(this::toCO).collect(Collectors.toList()),
evalProjectCmdConvertor.convertEListToCOList(pageResult.getRecords()),
pageResult.getTotal());
}
@Override
public SingleResponse<EvalProjectCO> cancel(EvalProjectCancelCmd cmd) {
Long id = Long.parseLong(cmd.getId());
EvalProjectEntity existing = evalProjectDomainService.get(id);
institutionOrgSupport.assertOrgAccess(existing.getOrgId(), ErrorCode.EVAL_PROJECT_NOT_FOUND);
evalProjectDomainService.cancel(id, cmd.getCancelReason());
return SingleResponse.success(toCO(evalProjectDomainService.get(id)));
}
@Override
public PageResponse<EvalProjectCO> progressPage(EvalProjectPageQuery query) {
return page(query);
}
@Override
public PageResponse<EvalProjectCO> myPage(EvalProjectMyPageQuery query) {
Long orgId = institutionOrgSupport.resolveCurrentOrgId();
Long personnelId = resolvePersonnelId(query.getPersonnelId());
if (personnelId == null) {
return PageResponse.of(Collections.emptyList(), 0L);
}
List<EvalProjectMemberEntity> memberships =
evalProjectMemberDomainService.listByPersonnelId(personnelId, orgId);
if (CollectionUtils.isEmpty(memberships)) {
return PageResponse.of(Collections.emptyList(), 0L);
}
Map<Long, EvalProjectMemberEntity> memberByProject = memberships.stream()
.collect(Collectors.toMap(EvalProjectMemberEntity::getProjectId, Function.identity(), (a, b) -> a));
List<Long> projectIds = memberships.stream()
.map(EvalProjectMemberEntity::getProjectId)
.distinct()
.collect(Collectors.toList());
EvalProjectQuery domainQuery = toDomainQuery(query, orgId, projectIds);
PageResult<EvalProjectEntity> pageResult = evalProjectDomainService.page(domainQuery);
return PageResponse.of(
pageResult.getRecords().stream()
.map(entity -> toMyProjectCO(entity, memberByProject.get(entity.getId())))
.collect(Collectors.toList()),
pageResult.getTotal());
public SingleResponse<EvalProjectEnumsCO> enums() {
return SingleResponse.success(evalProjectCmdConvertor.buildEnums());
}
private EvalProjectEntity saveWithProjectNo(EvalProjectEntity entity, Long orgId) {
@ -175,81 +85,4 @@ public class EvalProjectExecutor implements EvalProjectApi {
}
throw new BizException(ErrorCode.EVAL_PROJECT_NO_GENERATE_FAILED);
}
private Long resolvePersonnelId(String personnelIdOverride) {
if (StringUtils.hasText(personnelIdOverride)) {
return Long.parseLong(personnelIdOverride);
}
AuthUserInfo user = AuthUserContextAdapter.getCurrentUser();
if (user == null) {
return null;
}
String account = user.getAccount();
if (!StringUtils.hasText(account)) {
account = user.getUserName();
}
if (!StringUtils.hasText(account)) {
return null;
}
OrgPersonnelEntity personnel = orgPersonnelGateway.getByAccount(account);
return personnel == null ? null : personnel.getId();
}
private EvalProjectQuery toDomainQuery(EvalProjectPageQuery query, Long orgId, List<Long> projectIds) {
EvalProjectQuery domainQuery = new EvalProjectQuery();
domainQuery.setPageNum(query.getCurrent());
domainQuery.setPageSize(query.getSize());
domainQuery.setOrgId(orgId);
domainQuery.setProjectName(query.getProjectName());
domainQuery.setStatusCode(query.getStatusCode());
domainQuery.setLeaderName(query.getLeaderName());
domainQuery.setPlanStartDateFrom(query.getPlanStartDateFrom());
domainQuery.setPlanStartDateTo(query.getPlanStartDateTo());
domainQuery.setPlanEndDateFrom(query.getPlanEndDateFrom());
domainQuery.setPlanEndDateTo(query.getPlanEndDateTo());
domainQuery.setCurrentStageCode(query.getCurrentStageCode());
domainQuery.setProjectIds(projectIds);
return domainQuery;
}
private EvalProjectCO toMyProjectCO(EvalProjectEntity entity, EvalProjectMemberEntity membership) {
EvalProjectCO co = toCO(entity);
if (co == null) {
return null;
}
// P1 占位:待办数/摘要固定空P2 八节点办理后填实
co.setPendingTodoCount(0);
co.setTodoSummary("");
if (membership != null) {
co.setMyRoleCode(membership.getRoleCode());
co.setMyRoleName(membership.getRoleName());
}
return co;
}
private EvalProjectCO toCO(EvalProjectEntity entity) {
if (entity == null) {
return null;
}
EvalProjectCO co = new EvalProjectCO();
co.setId(entity.getId() != null ? String.valueOf(entity.getId()) : null);
co.setCustomerId(entity.getCustomerId() != null ? String.valueOf(entity.getCustomerId()) : null);
co.setProjectNo(entity.getProjectNo());
co.setProjectName(entity.getProjectName());
co.setEvalTypeCode(entity.getEvalTypeCode());
co.setEvalTypeName(entity.getEvalTypeName());
co.setBusinessScope(entity.getBusinessScope());
co.setPlanStartDate(entity.getPlanStartDate());
co.setPlanEndDate(entity.getPlanEndDate());
co.setActualStartDate(entity.getActualStartDate());
co.setActualEndDate(entity.getActualEndDate());
co.setCurrentStageCode(entity.getCurrentStageCode());
co.setCurrentStageName(entity.getCurrentStageName());
co.setStatusCode(entity.getStatusCode());
co.setStatusName(entity.getStatusName());
co.setLeaderPersonnelId(entity.getLeaderPersonnelId() != null ? String.valueOf(entity.getLeaderPersonnelId()) : null);
co.setLeaderName(entity.getLeaderName());
co.setCancelReason(entity.getCancelReason());
return co;
}
}

View File

@ -53,7 +53,7 @@ public class EvalProjectNodeSupport {
if (project == null) {
return false;
}
if (project.getStatusCode() != null && (project.getStatusCode() == 3 || project.getStatusCode() == 4)) {
if (project.getArchiveFlag() != null && project.getArchiveFlag() == 1) {
return false;
}
return nodeWriteAuthority.canWrite(projectId, project.getOrgId(), nodeCode);

View File

@ -33,10 +33,6 @@ public class RegulatorEvalProjectMonitorExecutor implements RegulatorEvalProject
domainQuery.setPageNum(query.getCurrent());
domainQuery.setPageSize(query.getSize());
domainQuery.setOrgId(query.getOrgId());
domainQuery.setStatusCode(query.getStatusCode());
domainQuery.setCurrentStageCode(query.getCurrentStageCode());
domainQuery.setCreateTimeFrom(query.getCreateTimeFrom());
domainQuery.setCreateTimeTo(query.getCreateTimeTo());
domainQuery.setPlanStartDateFrom(query.getPlanStartDateFrom());
domainQuery.setPlanStartDateTo(query.getPlanStartDateTo());
PageResult<EvalProjectEntity> pageResult = evalProjectGateway.page(domainQuery);

View File

@ -6,6 +6,7 @@ import org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectMonitorCO;
import org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectNodeItemCO;
import org.qinan.safetyeval.client.co.regulator.RegulatorEvalProjectNodeOverviewCO;
import org.qinan.safetyeval.client.co.regulator.RegulatorEvalSurveySupervisionCO;
import org.qinan.safetyeval.domain.constant.EvalTypeEnum;
import org.qinan.safetyeval.domain.entity.EvalProjectEntity;
import org.qinan.safetyeval.domain.entity.EvalSurveyEntity;
@ -29,20 +30,13 @@ public final class RegulatorMonitorCoConverter {
co.setProjectNo(entity.getProjectNo());
co.setProjectName(entity.getProjectName());
co.setEvalTypeCode(entity.getEvalTypeCode());
co.setEvalTypeName(entity.getEvalTypeName());
co.setBusinessScope(entity.getBusinessScope());
EvalTypeEnum evalType = EvalTypeEnum.ofCode(entity.getEvalTypeCode());
if (evalType != null) {
co.setEvalTypeName(evalType.getValue());
}
co.setPlanStartDate(entity.getPlanStartDate());
co.setPlanEndDate(entity.getPlanEndDate());
co.setActualStartDate(entity.getActualStartDate());
co.setActualEndDate(entity.getActualEndDate());
co.setCurrentStageCode(entity.getCurrentStageCode());
co.setCurrentStageName(entity.getCurrentStageName());
co.setStatusCode(entity.getStatusCode());
co.setStatusName(entity.getStatusName());
co.setLeaderPersonnelId(entity.getLeaderPersonnelId() != null
? String.valueOf(entity.getLeaderPersonnelId()) : null);
co.setLeaderName(entity.getLeaderName());
co.setCancelReason(entity.getCancelReason());
co.setLeaderName(entity.getProjectLeaderName());
return co;
}

View File

@ -1,9 +1,11 @@
package org.qinan.safetyeval.client.api.institution;
import org.qinan.safetyeval.client.co.institution.EvalProjectCO;
import org.qinan.safetyeval.client.co.institution.EvalProjectEnumsCO;
import org.qinan.safetyeval.client.dto.PageResponse;
import org.qinan.safetyeval.client.dto.SingleResponse;
import org.qinan.safetyeval.client.dto.institution.*;
import org.qinan.safetyeval.client.dto.institution.EvalProjectAddCmd;
import org.qinan.safetyeval.client.dto.institution.EvalProjectPageQuery;
public interface EvalProjectApi {
@ -11,15 +13,7 @@ public interface EvalProjectApi {
SingleResponse<EvalProjectCO> get(Long id);
SingleResponse<EvalProjectCO> modify(EvalProjectModifyCmd cmd);
SingleResponse<Void> delete(Long id);
PageResponse<EvalProjectCO> page(EvalProjectPageQuery query);
SingleResponse<EvalProjectCO> cancel(EvalProjectCancelCmd cmd);
PageResponse<EvalProjectCO> progressPage(EvalProjectPageQuery query);
PageResponse<EvalProjectCO> myPage(EvalProjectMyPageQuery query);
SingleResponse<EvalProjectEnumsCO> enums();
}

View File

@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDate;
import java.util.List;
@Data
public class EvalProjectCO {
@ -11,7 +12,7 @@ public class EvalProjectCO {
@ApiModelProperty("主键ID")
private String id;
@ApiModelProperty("客户ID")
@ApiModelProperty("被评价客户id")
private String customerId;
@ApiModelProperty("项目编号")
@ -20,65 +21,54 @@ public class EvalProjectCO {
@ApiModelProperty("项目名称")
private String projectName;
@ApiModelProperty(value = "评价类型编码PRE安全预评价 ACCEPT安全验收评价 STATUS安全现状评价", example = "PRE")
@ApiModelProperty("评价类型编码")
private String evalTypeCode;
@ApiModelProperty(value = "评价类型名称:安全预评价/安全验收评价/安全现状评价", example = "安全预评价")
@ApiModelProperty("评价类型名称")
private String evalTypeName;
@ApiModelProperty("业务范围")
private String businessScope;
@ApiModelProperty("客户负责人")
private String customerContactName;
@ApiModelProperty("计划开始日期")
@ApiModelProperty("联系电话")
private String customerContactPhone;
@ApiModelProperty("项目所在地编码")
private String districtCode;
@ApiModelProperty("项目所在地名称")
private String districtName;
@ApiModelProperty("项目开始时间")
private LocalDate planStartDate;
@ApiModelProperty("计划结束日期")
@ApiModelProperty("项目完成时间")
private LocalDate planEndDate;
@ApiModelProperty("实际开始日期")
private LocalDate actualStartDate;
@ApiModelProperty("客户所在地")
private String customerAddress;
@ApiModelProperty("实际结束日期")
private LocalDate actualEndDate;
@ApiModelProperty("经度")
private String longitude;
@ApiModelProperty(value = "当前阶段编码NODE_01风险分析 NODE_02业务合同 NODE_03项目组成立 NODE_04现场踏勘 NODE_05报告编制 NODE_06内部审核 NODE_07技术审核 NODE_08过程控制 ARCHIVED已归档 CANCELLED已作废", example = "NODE_02")
private String currentStageCode;
@ApiModelProperty("纬度")
private String latitude;
@ApiModelProperty(value = "当前阶段名称:风险分析/业务合同/项目组成立/现场踏勘/报告编制/内部审核/技术审核/过程控制/已归档/已作废", example = "业务合同")
private String currentStageName;
@ApiModelProperty("打卡有效范围(米)")
private Integer checkinRadiusMeters;
@ApiModelProperty(value = "项目状态编码1草稿 2进行中 3已归档 4已作废", example = "2")
private Integer statusCode;
@ApiModelProperty("参与人员")
private List<EvalProjectParticipantItemCO> participants;
@ApiModelProperty(value = "项目状态名称:草稿/进行中/已归档/已作废", example = "进行中")
private String statusName;
@ApiModelProperty("项目负责人")
private String projectLeaderName;
@ApiModelProperty("负责人人员ID")
private String leaderPersonnelId;
@ApiModelProperty(value = "项目归档1归档 0未归档", example = "0")
private Integer archiveFlag;
@ApiModelProperty("负责人姓名")
private String leaderName;
@ApiModelProperty("项目阶段编码NORMAL正常 DELAY延期(按完成时间判定,不落库)")
private String projectPhaseCode;
@ApiModelProperty("作废原因")
private String cancelReason;
/** 我的项目:当前人在该项目的角色编码(非 my-page 可为空) */
@ApiModelProperty(value = "我的角色编码LEADER项目负责人 PROCESS_OWNER过程控制负责人 RISK_OWNER风险分析负责人 CONTRACT_OWNER合同办理人 SURVEY_OWNER踏勘负责人 DRAFT_OWNER报告编制人 INTERNAL_REVIEWER内部审核人 TECH_REVIEWER技术审核人 MEMBER项目组成员", example = "MEMBER")
private String myRoleCode;
/** 我的项目:当前人在该项目的角色名称 */
@ApiModelProperty(value = "我的角色名称:项目负责人/过程控制负责人/风险分析负责人/合同办理人/踏勘负责人/报告编制人/内部审核人/技术审核人/项目组成员", example = "项目组成员")
private String myRoleName;
/**
* P1 0P2
*/
@ApiModelProperty("待我处理数P1 占位,固定 0")
private Integer pendingTodoCount;
/**
* P1 P2
*/
@ApiModelProperty("待办摘要P1 占位,固定空串)")
private String todoSummary;
@ApiModelProperty("项目阶段名称:正常/延期")
private String projectPhaseName;
}

View File

@ -0,0 +1,16 @@
package org.qinan.safetyeval.client.co.institution;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class EvalProjectEnumsCO {
@ApiModelProperty("评价类型")
private List<EnumOptionCO> evalType;
@ApiModelProperty("项目所在地(重庆市区级)")
private List<EnumOptionCO> district;
}

View File

@ -0,0 +1,18 @@
package org.qinan.safetyeval.client.co.institution;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class EvalProjectParticipantItemCO {
@ApiModelProperty("人员id")
private Long id;
@ApiModelProperty("人员名称")
private String name;
}

View File

@ -2,33 +2,64 @@ package org.qinan.safetyeval.client.dto.institution;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.qinan.safetyeval.client.co.institution.EvalProjectParticipantItemCO;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.time.LocalDate;
import java.util.List;
@Data
public class EvalProjectAddCmd {
@ApiModelProperty("客户ID")
private String customerId;
@ApiModelProperty("项目名称")
@NotBlank(message = "项目名称不能为空")
@ApiModelProperty(value = "项目名称", required = true)
private String projectName;
@ApiModelProperty(value = "评价类型编码PRE安全预评价 ACCEPT安全验收评价 STATUS安全现状评价", example = "PRE")
@NotBlank(message = "评价类型不能为空")
@ApiModelProperty(value = "评价类型编码PRE/ACCEPT/STATUS", required = true, example = "PRE")
private String evalTypeCode;
@ApiModelProperty(value = "评价类型名称:安全预评价/安全验收评价/安全现状评价", example = "安全预评价")
private String evalTypeName;
@NotBlank(message = "被评价客户不能为空")
@ApiModelProperty(value = "被评价客户id(客户管理id)", required = true)
private String customerId;
@ApiModelProperty("业务范围")
private String businessScope;
@ApiModelProperty("客户负责人(手填)")
private String customerContactName;
@ApiModelProperty("计划开始日期")
@ApiModelProperty("联系电话(手填)")
private String customerContactPhone;
@ApiModelProperty("项目所在地编码(ChongqingDistrictEnum)")
private String districtCode;
@ApiModelProperty("项目开始时间")
private LocalDate planStartDate;
@ApiModelProperty("计划结束日期")
@ApiModelProperty("项目完成时间")
private LocalDate planEndDate;
@ApiModelProperty(value = "项目状态编码1草稿 2进行中 3已归档 4已作废", example = "2")
private Integer statusCode;
@ApiModelProperty("客户所在地(手填)")
private String customerAddress;
@ApiModelProperty("经度")
private String longitude;
@ApiModelProperty("纬度")
private String latitude;
@ApiModelProperty("打卡有效范围(米)")
private Integer checkinRadiusMeters;
@NotNull(message = "参与人员不能为空")
@Size(min = 5, message = "请至少选取5名项目参与人员")
@ApiModelProperty(value = "参与人员", required = true)
private List<EvalProjectParticipantItemCO> participants;
@ApiModelProperty("项目负责人(手填)")
private String projectLeaderName;
@ApiModelProperty(value = "项目归档1归档 0未归档", example = "0")
private Integer archiveFlag;
}

View File

@ -15,28 +15,25 @@ public class EvalProjectPageQuery extends BasePageQuery {
@ApiModelProperty("项目名称")
private String projectName;
@ApiModelProperty(value = "项目状态编码1草稿 2进行中 3已归档 4已作废", example = "2")
private Integer statusCode;
@ApiModelProperty("项目负责人")
private String projectLeaderName;
@ApiModelProperty("负责人姓名")
private String leaderName;
@ApiModelProperty("客户负责人")
private String customerContactName;
@ApiModelProperty("计划开始日期起")
@ApiModelProperty("项目开始时间起")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate planStartDateFrom;
@ApiModelProperty("计划开始日期止")
@ApiModelProperty("项目开始时间止")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate planStartDateTo;
@ApiModelProperty("计划结束日期起")
@ApiModelProperty("项目完成时间起")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate planEndDateFrom;
@ApiModelProperty("计划结束日期止")
@ApiModelProperty("项目完成时间止")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate planEndDateTo;
@ApiModelProperty(value = "当前阶段编码NODE_01风险分析 NODE_02业务合同 NODE_03项目组成立 NODE_04现场踏勘 NODE_05报告编制 NODE_06内部审核 NODE_07技术审核 NODE_08过程控制 ARCHIVED已归档 CANCELLED已作废", example = "NODE_02")
private String currentStageCode;
}

View File

@ -0,0 +1,40 @@
package org.qinan.safetyeval.domain.constant;
/**
*
*/
public enum EvalTypeEnum {
PRE("PRE", "安全预评价"),
ACCEPT("ACCEPT", "安全设施竣工验收评价"),
STATUS("STATUS", "安全现状评价"),
;
private final String code;
private final String value;
EvalTypeEnum(String code, String value) {
this.code = code;
this.value = value;
}
public String getCode() {
return code;
}
public String getValue() {
return value;
}
public static EvalTypeEnum ofCode(String code) {
if (code == null) {
return null;
}
for (EvalTypeEnum item : values()) {
if (item.code.equals(code)) {
return item;
}
}
return null;
}
}

View File

@ -1,12 +1,11 @@
package org.qinan.safetyeval.domain.entity;
import lombok.Data;
import org.qinan.safetyeval.domain.support.EvalStatusHelper;
import java.time.LocalDate;
@Data
public class EvalProjectEntity{
public class EvalProjectEntity {
private Long id;
private Long orgId;
@ -14,18 +13,19 @@ public class EvalProjectEntity{
private String projectNo;
private String projectName;
private String evalTypeCode;
private String evalTypeName;
private String businessScope;
private String customerContactName;
private String customerContactPhone;
private String districtCode;
private LocalDate planStartDate;
private LocalDate planEndDate;
private LocalDate actualStartDate;
private LocalDate actualEndDate;
private String currentStageCode;
private String currentStageName;
private Integer statusCode;
private String statusName;
private Long leaderPersonnelId;
private String leaderName;
private String cancelReason;
private String customerAddress;
private String longitude;
private String latitude;
private Integer checkinRadiusMeters;
/** JSON: [{"name":"名称","id":1}] */
private String participantsJson;
private String projectLeaderName;
/** 1归档 0未归档 */
private Integer archiveFlag;
private Long tenantId;
}

View File

@ -18,5 +18,5 @@ public interface EvalProjectGateway {
long countByCustomerId(Long customerId, Long orgId);
void updateLeader(Long projectId, Long leaderPersonnelId, String leaderName);
void updateLeader(Long projectId, String leaderName);
}

View File

@ -3,7 +3,6 @@ package org.qinan.safetyeval.domain.query;
import lombok.Data;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@Data
@ -13,16 +12,11 @@ public class EvalProjectQuery {
private Long pageSize;
private Long orgId;
private String projectName;
/** 项目状态编码1草稿 2进行中 3已归档 4已作废示例2 */
private Integer statusCode;
private String leaderName;
private String projectLeaderName;
private String customerContactName;
private LocalDate planStartDateFrom;
private LocalDate planStartDateTo;
private LocalDate planEndDateFrom;
private LocalDate planEndDateTo;
/** 当前阶段编码NODE_01风险分析 NODE_02业务合同 NODE_03项目组成立 NODE_04现场踏勘 NODE_05报告编制 NODE_06内部审核 NODE_07技术审核 NODE_08过程控制 ARCHIVED已归档 CANCELLED已作废示例NODE_02 */
private String currentStageCode;
private LocalDateTime createTimeFrom;
private LocalDateTime createTimeTo;
private List<Long> projectIds;
}

View File

@ -13,11 +13,6 @@ import javax.annotation.Resource;
@Service
public class EvalProjectDomainService {
private static final String STAGE_NODE_01 = "NODE_01";
private static final String STAGE_NODE_01_NAME = "风险分析";
private static final String STAGE_CANCELLED = "CANCELLED";
private static final String STAGE_CANCELLED_NAME = "已作废";
@Resource
private EvalProjectGateway evalProjectGateway;
@ -27,7 +22,9 @@ public class EvalProjectDomainService {
public EvalProjectEntity add(EvalProjectEntity entity, Long orgId) {
evalCustomerDomainService.requireCustomerInOrg(entity.getCustomerId(), orgId);
entity.setOrgId(orgId);
applyDefaultStatusAndStage(entity);
if (entity.getArchiveFlag() == null) {
entity.setArchiveFlag(0);
}
return evalProjectGateway.save(entity);
}
@ -39,82 +36,23 @@ public class EvalProjectDomainService {
return existing;
}
public EvalProjectEntity modify(EvalProjectEntity entity) {
EvalProjectEntity existing = get(entity.getId());
assertModifiable(existing);
if (entity.getCustomerId() != null && !entity.getCustomerId().equals(existing.getCustomerId())) {
evalCustomerDomainService.requireCustomerInOrg(entity.getCustomerId(), existing.getOrgId());
}
entity.setOrgId(existing.getOrgId());
entity.setProjectNo(existing.getProjectNo());
fillStatusName(entity);
return evalProjectGateway.modify(entity);
}
public void delete(Long id) {
get(id);
evalProjectGateway.delete(id);
}
public void cancel(Long id, String cancelReason) {
EvalProjectEntity existing = get(id);
existing.setStatusCode(4);
existing.setStatusName("已作废");
existing.setCurrentStageCode(STAGE_CANCELLED);
existing.setCurrentStageName(STAGE_CANCELLED_NAME);
existing.setCancelReason(cancelReason);
evalProjectGateway.modify(existing);
}
public PageResult<EvalProjectEntity> page(EvalProjectQuery query) {
return evalProjectGateway.page(query);
}
public void updateLeader(Long projectId, Long leaderPersonnelId, String leaderName) {
evalProjectGateway.updateLeader(projectId, leaderPersonnelId, leaderName);
evalProjectGateway.updateLeader(projectId, leaderName);
}
public void assertModifiable(EvalProjectEntity existing) {
if (existing.getStatusCode() != null && existing.getStatusCode() == 4) {
throw new BizException(ErrorCode.EVAL_PROJECT_CANCELLED);
}
if (existing.getStatusCode() != null && existing.getStatusCode() == 3) {
if (existing.getArchiveFlag() != null && existing.getArchiveFlag() == 1) {
throw new BizException(ErrorCode.EVAL_PROJECT_ARCHIVED);
}
}
public void applyDefaultStatusAndStage(EvalProjectEntity entity) {
if (entity.getStatusCode() == null || entity.getStatusCode() != 1) {
entity.setStatusCode(2);
entity.setStatusName("进行中");
} else {
entity.setStatusName("草稿");
}
if (entity.getCurrentStageCode() == null) {
entity.setCurrentStageCode(STAGE_NODE_01);
entity.setCurrentStageName(STAGE_NODE_01_NAME);
}
}
private void fillStatusName(EvalProjectEntity entity) {
if (entity.getStatusCode() == null) {
return;
}
switch (entity.getStatusCode()) {
case 1:
entity.setStatusName("草稿");
break;
case 2:
entity.setStatusName("进行中");
break;
case 3:
entity.setStatusName("已归档");
break;
case 4:
entity.setStatusName("已作废");
break;
default:
break;
}
public void markArchived(Long projectId) {
EvalProjectEntity existing = get(projectId);
existing.setArchiveFlag(1);
evalProjectGateway.modify(existing);
}
}

View File

@ -2,13 +2,12 @@ package org.qinan.safetyeval.domain.service;
import org.qinan.safetyeval.domain.entity.EvalProjectEntity;
import org.qinan.safetyeval.domain.gateway.EvalProjectGateway;
import org.qinan.safetyeval.domain.support.EvalNodeCodes;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* current_stage status
* / archive_flag
*/
@Service
public class ProjectStageSyncService {
@ -17,24 +16,7 @@ public class ProjectStageSyncService {
private EvalProjectGateway evalProjectGateway;
public void onNodeCompleted(Long projectId, String completedNodeCode) {
if (projectId == null || completedNodeCode == null) {
return;
}
EvalProjectEntity project = evalProjectGateway.get(projectId);
if (project == null) {
return;
}
String nextStage = nextStageAfterComplete(completedNodeCode);
if (nextStage == null) {
return;
}
project.setCurrentStageCode(nextStage);
project.setCurrentStageName(stageName(nextStage));
if (project.getStatusCode() == null || project.getStatusCode() == 1) {
project.setStatusCode(2);
project.setStatusName("进行中");
}
evalProjectGateway.modify(project);
// 项目主表不再维护 current_stage节点完成不再回写主表
}
public void onArchived(Long projectId) {
@ -42,59 +24,7 @@ public class ProjectStageSyncService {
if (project == null) {
return;
}
project.setStatusCode(3);
project.setStatusName("已归档");
project.setCurrentStageCode(EvalNodeCodes.ARCHIVED);
project.setCurrentStageName(EvalNodeCodes.ARCHIVED_NAME);
project.setArchiveFlag(1);
evalProjectGateway.modify(project);
}
private String nextStageAfterComplete(String completedNodeCode) {
switch (completedNodeCode) {
case EvalNodeCodes.NODE_01:
return EvalNodeCodes.NODE_02;
case EvalNodeCodes.NODE_02:
return EvalNodeCodes.NODE_03;
case EvalNodeCodes.NODE_03:
return EvalNodeCodes.NODE_04;
case EvalNodeCodes.NODE_04:
return EvalNodeCodes.NODE_05;
case EvalNodeCodes.NODE_05:
return EvalNodeCodes.NODE_06;
case EvalNodeCodes.NODE_06:
return EvalNodeCodes.NODE_07;
case EvalNodeCodes.NODE_07:
return EvalNodeCodes.NODE_08;
case EvalNodeCodes.NODE_08:
// 归档阶段仅由 onArchived 推进,禁止 get-or-save 完成误推 ARCHIVED
return null;
default:
return null;
}
}
private String stageName(String stageCode) {
switch (stageCode) {
case EvalNodeCodes.NODE_01:
return EvalNodeCodes.NODE_01_NAME;
case EvalNodeCodes.NODE_02:
return EvalNodeCodes.NODE_02_NAME;
case EvalNodeCodes.NODE_03:
return EvalNodeCodes.NODE_03_NAME;
case EvalNodeCodes.NODE_04:
return EvalNodeCodes.NODE_04_NAME;
case EvalNodeCodes.NODE_05:
return EvalNodeCodes.NODE_05_NAME;
case EvalNodeCodes.NODE_06:
return EvalNodeCodes.NODE_06_NAME;
case EvalNodeCodes.NODE_07:
return EvalNodeCodes.NODE_07_NAME;
case EvalNodeCodes.NODE_08:
return EvalNodeCodes.NODE_08_NAME;
case EvalNodeCodes.ARCHIVED:
return EvalNodeCodes.ARCHIVED_NAME;
default:
return stageCode;
}
}
}

View File

@ -0,0 +1,13 @@
package org.qinan.safetyeval.infrastructure.convertor;
import org.mapstruct.Mapper;
import org.qinan.safetyeval.domain.entity.EvalProjectEntity;
import org.qinan.safetyeval.infrastructure.dataobject.EvalProjectDO;
@Mapper(componentModel = "spring")
public interface EvalProjectDoConvertor {
EvalProjectDO convertEToDo(EvalProjectEntity entity);
EvalProjectEntity convertDoToE(EvalProjectDO dataObject);
}

View File

@ -15,26 +15,19 @@ public class EvalProjectDO {
private Long customerId;
private String projectNo;
private String projectName;
/** 评价类型编码PRE安全预评价 ACCEPT安全验收评价 STATUS安全现状评价示例PRE */
private String evalTypeCode;
/** 评价类型名称:安全预评价/安全验收评价/安全现状评价,示例:安全预评价 */
private String evalTypeName;
private String businessScope;
private String customerContactName;
private String customerContactPhone;
private String districtCode;
private LocalDate planStartDate;
private LocalDate planEndDate;
private LocalDate actualStartDate;
private LocalDate actualEndDate;
/** 当前阶段编码NODE_01风险分析 NODE_02业务合同 NODE_03项目组成立 NODE_04现场踏勘 NODE_05报告编制 NODE_06内部审核 NODE_07技术审核 NODE_08过程控制 ARCHIVED已归档 CANCELLED已作废示例NODE_02 */
private String currentStageCode;
/** 当前阶段名称:风险分析/业务合同/项目组成立/现场踏勘/报告编制/内部审核/技术审核/过程控制/已归档/已作废,示例:业务合同 */
private String currentStageName;
/** 项目状态编码1草稿 2进行中 3已归档 4已作废示例2 */
private Integer statusCode;
/** 项目状态名称:草稿/进行中/已归档/已作废,示例:进行中 */
private String statusName;
private Long leaderPersonnelId;
private String leaderName;
private String cancelReason;
private String customerAddress;
private String longitude;
private String latitude;
private Integer checkinRadiusMeters;
private String participantsJson;
private String projectLeaderName;
private Integer archiveFlag;
private String deleteEnum;
private String remarks;
private String createName;

View File

@ -7,6 +7,7 @@ import org.qinan.safetyeval.domain.entity.EvalProjectEntity;
import org.qinan.safetyeval.domain.gateway.EvalProjectGateway;
import org.qinan.safetyeval.domain.query.EvalProjectQuery;
import org.qinan.safetyeval.domain.query.PageResult;
import org.qinan.safetyeval.infrastructure.convertor.EvalProjectDoConvertor;
import org.qinan.safetyeval.infrastructure.dataobject.EvalProjectDO;
import org.qinan.safetyeval.infrastructure.mapper.EvalProjectMapper;
import org.qinan.safetyeval.infrastructure.support.InsertFieldDefaults;
@ -25,12 +26,19 @@ public class EvalProjectGatewayImpl implements EvalProjectGateway {
@Resource
private EvalProjectMapper evalProjectMapper;
@Resource
private EvalProjectDoConvertor evalProjectDoConvertor;
@Resource
private OrgContextResolver orgContextResolver;
@Override
public EvalProjectEntity save(EvalProjectEntity entity) {
EvalProjectDO dataObject = toDO(entity);
EvalProjectDO dataObject = evalProjectDoConvertor.convertEToDo(entity);
dataObject.setOrgId(orgContextResolver.resolveOrgId(entity.getOrgId()));
if (dataObject.getArchiveFlag() == null) {
dataObject.setArchiveFlag(0);
}
InsertFieldDefaults.apply(dataObject);
evalProjectMapper.insert(dataObject);
entity.setId(dataObject.getId());
@ -43,13 +51,14 @@ public class EvalProjectGatewayImpl implements EvalProjectGateway {
if (dataObject == null || !"false".equals(dataObject.getDeleteEnum())) {
return null;
}
return toEntity(dataObject);
return evalProjectDoConvertor.convertDoToE(dataObject);
}
@Override
public EvalProjectEntity modify(EvalProjectEntity entity) {
EvalProjectDO dataObject = toDO(entity);
EvalProjectDO dataObject = evalProjectDoConvertor.convertEToDo(entity);
dataObject.setId(entity.getId());
dataObject.setOrgId(orgContextResolver.resolveOrgId(entity.getOrgId()));
InsertFieldDefaults.applyForUpdate(dataObject);
evalProjectMapper.updateById(dataObject);
return get(entity.getId());
@ -65,7 +74,7 @@ public class EvalProjectGatewayImpl implements EvalProjectGateway {
Page<EvalProjectDO> page = new Page<>(query.getPageNum(), query.getPageSize());
IPage<EvalProjectDO> result = evalProjectMapper.selectPage(page, buildQueryWrapper(query));
List<EvalProjectEntity> entities = result.getRecords().stream()
.map(this::toEntity)
.map(evalProjectDoConvertor::convertDoToE)
.collect(Collectors.toList());
return PageResult.of(entities, result.getTotal(), result.getCurrent(), result.getSize());
}
@ -82,11 +91,10 @@ public class EvalProjectGatewayImpl implements EvalProjectGateway {
}
@Override
public void updateLeader(Long projectId, Long leaderPersonnelId, String leaderName) {
public void updateLeader(Long projectId, String leaderName) {
EvalProjectDO dataObject = new EvalProjectDO();
dataObject.setId(projectId);
dataObject.setLeaderPersonnelId(leaderPersonnelId);
dataObject.setLeaderName(leaderName);
dataObject.setProjectLeaderName(leaderName);
InsertFieldDefaults.applyForUpdate(dataObject);
evalProjectMapper.updateById(dataObject);
}
@ -100,11 +108,11 @@ public class EvalProjectGatewayImpl implements EvalProjectGateway {
if (StringUtils.hasText(query.getProjectName())) {
wrapper.like(EvalProjectDO::getProjectName, query.getProjectName());
}
if (query.getStatusCode() != null) {
wrapper.eq(EvalProjectDO::getStatusCode, query.getStatusCode());
if (StringUtils.hasText(query.getProjectLeaderName())) {
wrapper.like(EvalProjectDO::getProjectLeaderName, query.getProjectLeaderName());
}
if (StringUtils.hasText(query.getLeaderName())) {
wrapper.like(EvalProjectDO::getLeaderName, query.getLeaderName());
if (StringUtils.hasText(query.getCustomerContactName())) {
wrapper.like(EvalProjectDO::getCustomerContactName, query.getCustomerContactName());
}
if (query.getPlanStartDateFrom() != null) {
wrapper.ge(EvalProjectDO::getPlanStartDate, query.getPlanStartDateFrom());
@ -118,71 +126,10 @@ public class EvalProjectGatewayImpl implements EvalProjectGateway {
if (query.getPlanEndDateTo() != null) {
wrapper.le(EvalProjectDO::getPlanEndDate, query.getPlanEndDateTo());
}
if (StringUtils.hasText(query.getCurrentStageCode())) {
wrapper.eq(EvalProjectDO::getCurrentStageCode, query.getCurrentStageCode());
}
if (!CollectionUtils.isEmpty(query.getProjectIds())) {
wrapper.in(EvalProjectDO::getId, query.getProjectIds());
}
if (query.getCreateTimeFrom() != null) {
wrapper.ge(EvalProjectDO::getCreateTime, query.getCreateTimeFrom());
}
if (query.getCreateTimeTo() != null) {
wrapper.le(EvalProjectDO::getCreateTime, query.getCreateTimeTo());
}
wrapper.orderByDesc(EvalProjectDO::getCreateTime);
wrapper.orderByDesc(EvalProjectDO::getPlanStartDate);
return wrapper;
}
private EvalProjectDO toDO(EvalProjectEntity entity) {
EvalProjectDO dataObject = new EvalProjectDO();
dataObject.setOrgId(orgContextResolver.resolveOrgId(entity.getOrgId()));
dataObject.setCustomerId(entity.getCustomerId());
dataObject.setProjectNo(entity.getProjectNo());
dataObject.setProjectName(entity.getProjectName());
dataObject.setEvalTypeCode(entity.getEvalTypeCode());
dataObject.setEvalTypeName(entity.getEvalTypeName());
dataObject.setBusinessScope(entity.getBusinessScope());
dataObject.setPlanStartDate(entity.getPlanStartDate());
dataObject.setPlanEndDate(entity.getPlanEndDate());
dataObject.setActualStartDate(entity.getActualStartDate());
dataObject.setActualEndDate(entity.getActualEndDate());
dataObject.setCurrentStageCode(entity.getCurrentStageCode());
dataObject.setCurrentStageName(entity.getCurrentStageName());
dataObject.setStatusCode(entity.getStatusCode());
dataObject.setStatusName(entity.getStatusName());
dataObject.setLeaderPersonnelId(entity.getLeaderPersonnelId());
dataObject.setLeaderName(entity.getLeaderName());
dataObject.setCancelReason(entity.getCancelReason());
dataObject.setTenantId(entity.getTenantId());
return dataObject;
}
private EvalProjectEntity toEntity(EvalProjectDO dataObject) {
if (dataObject == null) {
return null;
}
EvalProjectEntity entity = new EvalProjectEntity();
entity.setId(dataObject.getId());
entity.setOrgId(dataObject.getOrgId());
entity.setCustomerId(dataObject.getCustomerId());
entity.setProjectNo(dataObject.getProjectNo());
entity.setProjectName(dataObject.getProjectName());
entity.setEvalTypeCode(dataObject.getEvalTypeCode());
entity.setEvalTypeName(dataObject.getEvalTypeName());
entity.setBusinessScope(dataObject.getBusinessScope());
entity.setPlanStartDate(dataObject.getPlanStartDate());
entity.setPlanEndDate(dataObject.getPlanEndDate());
entity.setActualStartDate(dataObject.getActualStartDate());
entity.setActualEndDate(dataObject.getActualEndDate());
entity.setCurrentStageCode(dataObject.getCurrentStageCode());
entity.setCurrentStageName(dataObject.getCurrentStageName());
entity.setStatusCode(dataObject.getStatusCode());
entity.setStatusName(dataObject.getStatusName());
entity.setLeaderPersonnelId(dataObject.getLeaderPersonnelId());
entity.setLeaderName(dataObject.getLeaderName());
entity.setCancelReason(dataObject.getCancelReason());
entity.setTenantId(dataObject.getTenantId());
return entity;
}
}