feat: 项目资料

dev
zhanglei 2026-07-21 15:50:32 +08:00
parent fbaeb3e073
commit 766fc59573
25 changed files with 348 additions and 409 deletions

View File

@ -297,13 +297,11 @@ create table `eval_project_doc` (
`id` bigint not null comment '主键',
`org_id` bigint not null comment '机构id',
`project_id` bigint not null comment '项目id',
`doc_name` varchar(200) not null comment '资料名称',
`doc_type_code` varchar(32) default null comment '资料类型编码(ENTERPRISE_BASE企业基础资料 LICENSE合法证照 DESIGN设计资料 SAFETY_SYSTEM安全管理制度 INSPECT_REPORT检测检验报告 SURVEY现场踏勘资料 RECTIFY整改资料 REPORT_REVIEW报告及审核资料 OTHER其他过程资料)',
`doc_type_name` varchar(50) default null comment '资料类型名称(企业基础资料/合法证照/设计资料/安全管理制度/检测检验报告/现场踏勘资料/整改资料/报告及审核资料/其他过程资料)',
`latest_version_no` int default 1 comment '最新版本号',
`latest_file_url` varchar(500) default null comment '最新文件地址',
`confirm_status_code` int default null comment '确认状态编码(1待确认2已确认3已退回)',
`confirm_status_name` varchar(50) default null comment '确认状态名称',
`project_no` varchar(64) not null comment '项目编号(eval_project.project_no)',
`project_name` varchar(200) not null comment '项目名称(eval_project.project_name)',
`customer_name` varchar(200) not null comment '被评价客户企业名称(eval_customer.customer_name)',
`eval_type_code` varchar(32) default null comment '评价类型编码(eval_project.eval_type_code)',
`project_doc_url` json default null comment '资料上传地址:[{"materialName":"","materialType":"","project_doc_url":""}]',
`delete_enum` varchar(32) default null comment '删除标识true false',
`remarks` varchar(255) default null comment '备注',
`create_name` varchar(50) default null comment '创建人姓名',

View File

@ -21,23 +21,7 @@ public class LocalDevUserContextConfig implements WebMvcConfigurer {
private Long defaultOrgId;
private static final String[] LOCAL_DEV_PATHS = {
"/**/org-info/**",
"/**/org-department/**",
"/**/org-position/**",
"/**/org-qualification/**",
"/**/org-personnel/**",
"/**/org-personnel-cert/**",
"/**/org-personnel-change/**",
"/**/org-resign-apply/**",
"/**/org-equipment/**",
"/**/qual-filing/**",
"/**/qual-filing-change/**",
"/**/qual-filing-change-detail/**",
"/**/qual-filing-commitment/**",
"/**/qual-filing-equipment/**",
"/**/qual-filing-material/**",
"/**/qual-filing-personnel/**",
"/**/qual-filing-personnel-cert/**",
"/safetyEval/**"
};
@Override

View File

@ -2,18 +2,20 @@ package org.qinan.safetyeval.adapter.web.institution;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.qinan.safetyeval.client.api.institution.EvalProjectDocApi;
import org.qinan.safetyeval.client.co.institution.EvalProjectDocCO;
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.EvalProjectDocAddCmd;
import org.qinan.safetyeval.client.dto.institution.EvalProjectDocPageQuery;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
@Api(tags = "机构端-安评项目资料")
@RestController
@ -29,33 +31,9 @@ public class EvalProjectDocController {
return evalProjectDocApi.save(cmd);
}
@ApiOperation("修改资料")
@PostMapping("/modify")
public SingleResponse<EvalProjectDocCO> modify(@Validated @RequestBody EvalProjectDocModifyCmd cmd) {
return evalProjectDocApi.modify(cmd);
}
@ApiOperation("删除资料")
@PostMapping("/delete")
public SingleResponse<Void> delete(@RequestBody Req<Long> req) {
return evalProjectDocApi.delete(req.getData());
}
@ApiOperation("分页查询资料")
@GetMapping("/page")
public PageResponse<EvalProjectDocCO> page(@Validated EvalProjectDocPageQuery query) {
return evalProjectDocApi.page(query);
}
@ApiOperation("按项目查询资料列表")
@GetMapping("/list")
public SingleResponse<List<EvalProjectDocCO>> list(@ApiParam("项目ID") @RequestParam String projectId) {
return evalProjectDocApi.listByProject(Long.parseLong(projectId));
}
@ApiOperation("确认资料状态")
@PostMapping("/confirm")
public SingleResponse<EvalProjectDocCO> confirm(@Validated @RequestBody EvalProjectDocConfirmCmd cmd) {
return evalProjectDocApi.confirm(cmd);
}
}

View File

@ -0,0 +1,85 @@
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.EvalProjectDocCO;
import org.qinan.safetyeval.client.co.institution.EvalProjectDocMaterialItemCO;
import org.qinan.safetyeval.client.dto.institution.EvalProjectDocAddCmd;
import org.qinan.safetyeval.client.dto.institution.EvalProjectDocPageQuery;
import org.qinan.safetyeval.domain.constant.EvalTypeEnum;
import org.qinan.safetyeval.domain.entity.EvalProjectDocEntity;
import org.qinan.safetyeval.domain.query.EvalProjectDocQuery;
import org.springframework.util.StringUtils;
import java.util.Collections;
import java.util.List;
@Mapper(componentModel = "spring")
public interface EvalProjectDocCmdConvertor {
ObjectMapper OBJECT_MAPPER = new ObjectMapper();
@Mapping(target = "id", ignore = true)
@Mapping(target = "orgId", ignore = true)
@Mapping(target = "projectId", expression = "java(cmd.getProjectId() == null ? null : Long.parseLong(cmd.getProjectId()))")
@Mapping(target = "projectNo", ignore = true)
@Mapping(target = "projectName", ignore = true)
@Mapping(target = "customerName", ignore = true)
@Mapping(target = "evalTypeCode", ignore = true)
@Mapping(target = "projectDocUrl", expression = "java(toProjectDocUrlJson(cmd.getProjectDocUrl()))")
@Mapping(target = "tenantId", ignore = true)
EvalProjectDocEntity convertAddCmdToE(EvalProjectDocAddCmd cmd);
@Mapping(target = "pageNum", source = "current")
@Mapping(target = "pageSize", source = "size")
@Mapping(target = "orgId", ignore = true)
EvalProjectDocQuery convertPageQueryToQ(EvalProjectDocPageQuery query);
@Mapping(target = "id", expression = "java(entity.getId() == null ? null : String.valueOf(entity.getId()))")
@Mapping(target = "projectId", expression = "java(entity.getProjectId() == null ? null : String.valueOf(entity.getProjectId()))")
@Mapping(target = "evalTypeName", ignore = true)
@Mapping(target = "projectDocUrl", ignore = true)
@Mapping(target = "projectDocUrlMap", ignore = true)
EvalProjectDocCO convertEToCO(EvalProjectDocEntity entity);
List<EvalProjectDocCO> convertEListToCOList(List<EvalProjectDocEntity> list);
@AfterMapping
default void fillDisplayFields(EvalProjectDocEntity entity, @MappingTarget EvalProjectDocCO co) {
if (entity == null || co == null) {
return;
}
EvalTypeEnum evalType = EvalTypeEnum.ofCode(entity.getEvalTypeCode());
if (evalType != null) {
co.setEvalTypeName(evalType.getValue());
}
co.setProjectDocUrl(fromProjectDocUrlJson(entity.getProjectDocUrl()));
}
default String toProjectDocUrlJson(List<EvalProjectDocMaterialItemCO> items) {
if (items == null) {
return null;
}
try {
return OBJECT_MAPPER.writeValueAsString(items);
} catch (Exception e) {
throw new IllegalArgumentException("资料上传地址JSON序列化失败", e);
}
}
default List<EvalProjectDocMaterialItemCO> fromProjectDocUrlJson(String json) {
if (!StringUtils.hasText(json)) {
return Collections.emptyList();
}
try {
return OBJECT_MAPPER.readValue(json, new TypeReference<List<EvalProjectDocMaterialItemCO>>() {
});
} catch (Exception e) {
return Collections.emptyList();
}
}
}

View File

@ -2,6 +2,7 @@ package org.qinan.safetyeval.app.executor.institution;
import org.qinan.safetyeval.app.convertor.EvalCustomerCmdConvertor;
import org.qinan.safetyeval.client.api.institution.EvalCustomerApi;
import org.qinan.safetyeval.client.api.institution.EvalProjectApi;
import org.qinan.safetyeval.client.co.institution.EnumOptionCO;
import org.qinan.safetyeval.client.co.institution.EvalCustomerCO;
import org.qinan.safetyeval.client.co.institution.EvalCustomerEnumsCO;
@ -10,11 +11,8 @@ import org.qinan.safetyeval.client.dto.SingleResponse;
import org.qinan.safetyeval.client.dto.institution.EvalCustomerAddCmd;
import org.qinan.safetyeval.client.dto.institution.EvalCustomerModifyCmd;
import org.qinan.safetyeval.client.dto.institution.EvalCustomerPageQuery;
import org.qinan.safetyeval.domain.constant.ChongqingDistrictEnum;
import org.qinan.safetyeval.domain.constant.CustomerStatusEnum;
import org.qinan.safetyeval.domain.constant.EnterpriseScaleEnum;
import org.qinan.safetyeval.domain.constant.EnterpriseStatusEnum;
import org.qinan.safetyeval.domain.constant.IndustryEnum;
import org.qinan.safetyeval.client.dto.institution.EvalProjectPageQuery;
import org.qinan.safetyeval.domain.constant.*;
import org.qinan.safetyeval.domain.entity.EvalCustomerEntity;
import org.qinan.safetyeval.domain.exception.ErrorCode;
import org.qinan.safetyeval.domain.query.EvalCustomerQuery;
@ -42,6 +40,8 @@ public class EvalCustomerExecutor implements EvalCustomerApi {
@Lazy
@Autowired(required = false)
private EvalCustomerCmdConvertor evalCustomerCmdConvertor;
@Autowired
private EvalProjectApi evalProjectApi;
@Override
public SingleResponse<EvalCustomerCO> save(EvalCustomerAddCmd cmd) {
@ -59,6 +59,9 @@ public class EvalCustomerExecutor implements EvalCustomerApi {
long projectCount = evalCustomerDomainService.countProjects(id, entity.getOrgId());
EvalCustomerCO co = evalCustomerCmdConvertor.convertEToCO(entity);
co.setProjectCount(projectCount);
EvalProjectPageQuery evalProjectPageQuery = new EvalProjectPageQuery();
evalProjectPageQuery.setCustomerId(id);
co.setProjects(evalProjectApi.page(evalProjectPageQuery).getData());
return SingleResponse.success(co);
}

View File

@ -1,23 +1,29 @@
package org.qinan.safetyeval.app.executor.institution;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.qinan.safetyeval.app.convertor.EvalProjectDocCmdConvertor;
import org.qinan.safetyeval.client.api.institution.EvalProjectDocApi;
import org.qinan.safetyeval.client.co.institution.EvalProjectDocCO;
import org.qinan.safetyeval.client.co.institution.EvalProjectDocMaterialItemCO;
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.EvalProjectDocAddCmd;
import org.qinan.safetyeval.client.dto.institution.EvalProjectDocPageQuery;
import org.qinan.safetyeval.domain.entity.EvalProjectDocEntity;
import org.qinan.safetyeval.domain.entity.EvalProjectEntity;
import org.qinan.safetyeval.domain.exception.ErrorCode;
import org.qinan.safetyeval.domain.query.EvalProjectDocQuery;
import org.qinan.safetyeval.domain.query.PageResult;
import org.qinan.safetyeval.domain.service.EvalProjectDocDomainService;
import org.qinan.safetyeval.domain.service.EvalProjectDomainService;
import org.qinan.safetyeval.infrastructure.dataobject.EvalProjectDocDO;
import org.qinan.safetyeval.infrastructure.mapper.EvalProjectDocMapper;
import org.qinan.safetyeval.infrastructure.support.InstitutionOrgSupport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@Service
@ -29,102 +35,62 @@ public class EvalProjectDocExecutor implements EvalProjectDocApi {
@Lazy
@Autowired(required = false)
private EvalProjectDomainService evalProjectDomainService;
private InstitutionOrgSupport institutionOrgSupport;
@Lazy
@Autowired(required = false)
private InstitutionOrgSupport institutionOrgSupport;
private EvalProjectDocCmdConvertor evalProjectDocCmdConvertor;
@Autowired
private EvalProjectDocMapper evalProjectDocMapper;
@Override
public SingleResponse<EvalProjectDocCO> save(EvalProjectDocAddCmd cmd) {
EvalProjectDocDO evalProjectDocDO = evalProjectDocMapper.selectOne(new LambdaQueryWrapper<EvalProjectDocDO>()
.eq(EvalProjectDocDO::getProjectId, cmd.getProjectId()));
if (Objects.nonNull(evalProjectDocDO)) {
String jsonString;
// 项目资料已经存在, 则追加上传文件
if (evalProjectDocDO.getProjectDocUrl() != null) {
// 不存在url
List<EvalProjectDocMaterialItemCO> evalProjectDocMaterialItemCOS = JSON.parseArray(evalProjectDocDO.getProjectDocUrl(), EvalProjectDocMaterialItemCO.class);
evalProjectDocMaterialItemCOS.addAll(cmd.getProjectDocUrl());
jsonString = JSON.toJSONString(evalProjectDocMaterialItemCOS);
evalProjectDocDO.setProjectDocUrl(jsonString);
} else {
jsonString = JSON.toJSONString(cmd.getProjectDocUrl());
evalProjectDocDO.setProjectDocUrl(jsonString);
}
evalProjectDocMapper.update(new LambdaUpdateWrapper<EvalProjectDocDO>()
.eq(EvalProjectDocDO::getId, evalProjectDocDO.getId())
.set(EvalProjectDocDO::getProjectDocUrl, jsonString));
return SingleResponse.success(new EvalProjectDocCO());
}
Long orgId = institutionOrgSupport.resolveCurrentOrgId();
assertProjectInOrg(Long.parseLong(cmd.getProjectId()), orgId);
EvalProjectDocEntity entity = new EvalProjectDocEntity();
entity.setProjectId(Long.parseLong(cmd.getProjectId()));
entity.setDocName(cmd.getDocName());
entity.setDocTypeCode(cmd.getDocTypeCode());
entity.setDocTypeName(cmd.getDocTypeName());
entity.setLatestFileUrl(cmd.getLatestFileUrl());
EvalProjectDocEntity entity = evalProjectDocCmdConvertor.convertAddCmdToE(cmd);
EvalProjectDocEntity result = evalProjectDocDomainService.add(entity, orgId);
return SingleResponse.success(toCO(result));
}
@Override
public SingleResponse<EvalProjectDocCO> modify(EvalProjectDocModifyCmd cmd) {
EvalProjectDocEntity existing = evalProjectDocDomainService.get(Long.parseLong(cmd.getId()));
institutionOrgSupport.assertOrgAccess(existing.getOrgId(), ErrorCode.EVAL_PROJECT_DOC_NOT_FOUND);
EvalProjectDocEntity entity = new EvalProjectDocEntity();
entity.setId(Long.parseLong(cmd.getId()));
entity.setDocName(cmd.getDocName());
entity.setDocTypeCode(cmd.getDocTypeCode());
entity.setDocTypeName(cmd.getDocTypeName());
entity.setLatestFileUrl(cmd.getLatestFileUrl());
entity.setLatestVersionNo(cmd.getLatestVersionNo());
EvalProjectDocEntity result = evalProjectDocDomainService.modify(entity);
return SingleResponse.success(toCO(result));
}
@Override
public SingleResponse<Void> delete(Long id) {
EvalProjectDocEntity existing = evalProjectDocDomainService.get(id);
institutionOrgSupport.assertOrgAccess(existing.getOrgId(), ErrorCode.EVAL_PROJECT_DOC_NOT_FOUND);
evalProjectDocDomainService.delete(id);
return SingleResponse.success();
}
@Override
public PageResponse<EvalProjectDocCO> page(EvalProjectDocPageQuery query) {
Long orgId = institutionOrgSupport.resolveCurrentOrgId();
EvalProjectDocQuery domainQuery = new EvalProjectDocQuery();
domainQuery.setPageNum(query.getCurrent());
domainQuery.setPageSize(query.getSize());
domainQuery.setOrgId(orgId);
if (query.getProjectId() != null) {
domainQuery.setProjectId(Long.parseLong(query.getProjectId()));
}
EvalProjectDocQuery domainQuery = evalProjectDocCmdConvertor.convertPageQueryToQ(query);
domainQuery.setOrgId(institutionOrgSupport.resolveCurrentOrgId());
PageResult<EvalProjectDocEntity> pageResult = evalProjectDocDomainService.page(domainQuery);
return PageResponse.of(
pageResult.getRecords().stream().map(this::toCO).collect(Collectors.toList()),
pageResult.getTotal());
}
@Override
public SingleResponse<List<EvalProjectDocCO>> listByProject(Long projectId) {
Long orgId = institutionOrgSupport.resolveCurrentOrgId();
assertProjectInOrg(projectId, orgId);
List<EvalProjectDocCO> list = evalProjectDocDomainService.listByProjectId(projectId, orgId).stream()
List<EvalProjectDocCO> list = pageResult.getRecords().stream()
.map(this::toCO)
.collect(Collectors.toList());
return SingleResponse.success(list);
}
@Override
public SingleResponse<EvalProjectDocCO> confirm(EvalProjectDocConfirmCmd cmd) {
EvalProjectDocEntity existing = evalProjectDocDomainService.get(Long.parseLong(cmd.getId()));
institutionOrgSupport.assertOrgAccess(existing.getOrgId(), ErrorCode.EVAL_PROJECT_DOC_NOT_FOUND);
EvalProjectDocEntity result = evalProjectDocDomainService.confirm(Long.parseLong(cmd.getId()), cmd.getConfirmStatusCode());
return SingleResponse.success(toCO(result));
}
private void assertProjectInOrg(Long projectId, Long orgId) {
EvalProjectEntity project = evalProjectDomainService.get(projectId);
institutionOrgSupport.assertOrgAccess(project.getOrgId(), ErrorCode.EVAL_PROJECT_NOT_FOUND);
return PageResponse.of(list, pageResult.getTotal());
}
private EvalProjectDocCO toCO(EvalProjectDocEntity entity) {
if (entity == null) {
return null;
EvalProjectDocCO co = evalProjectDocCmdConvertor.convertEToCO(entity);
if (co != null && co.getProjectDocUrl() != null) {
List<EvalProjectDocMaterialItemCO> evalProjectDocMaterialItemCOS = JSON.parseArray(entity.getProjectDocUrl(), EvalProjectDocMaterialItemCO.class);
co.setProjectDocUrl(evalProjectDocMaterialItemCOS);
co.setProjectDocUrlMap(evalProjectDocMaterialItemCOS.stream()
.collect(Collectors.groupingBy(EvalProjectDocMaterialItemCO::getMaterialType)));
}
EvalProjectDocCO co = new EvalProjectDocCO();
co.setId(entity.getId() != null ? String.valueOf(entity.getId()) : null);
co.setProjectId(entity.getProjectId() != null ? String.valueOf(entity.getProjectId()) : null);
co.setDocName(entity.getDocName());
co.setDocTypeCode(entity.getDocTypeCode());
co.setDocTypeName(entity.getDocTypeName());
co.setLatestVersionNo(entity.getLatestVersionNo());
co.setLatestFileUrl(entity.getLatestFileUrl());
co.setConfirmStatusCode(entity.getConfirmStatusCode());
co.setConfirmStatusName(entity.getConfirmStatusName());
return co;
}
}

View File

@ -3,21 +3,12 @@ package org.qinan.safetyeval.client.api.institution;
import org.qinan.safetyeval.client.co.institution.EvalProjectDocCO;
import org.qinan.safetyeval.client.dto.PageResponse;
import org.qinan.safetyeval.client.dto.SingleResponse;
import org.qinan.safetyeval.client.dto.institution.*;
import java.util.List;
import org.qinan.safetyeval.client.dto.institution.EvalProjectDocAddCmd;
import org.qinan.safetyeval.client.dto.institution.EvalProjectDocPageQuery;
public interface EvalProjectDocApi {
SingleResponse<EvalProjectDocCO> save(EvalProjectDocAddCmd cmd);
SingleResponse<EvalProjectDocCO> modify(EvalProjectDocModifyCmd cmd);
SingleResponse<Void> delete(Long id);
PageResponse<EvalProjectDocCO> page(EvalProjectDocPageQuery query);
SingleResponse<List<EvalProjectDocCO>> listByProject(Long projectId);
SingleResponse<EvalProjectDocCO> confirm(EvalProjectDocConfirmCmd cmd);
}

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 EvalCustomerCO {
@ -71,4 +72,7 @@ public class EvalCustomerCO {
@ApiModelProperty("服务项目数")
private Long projectCount;
@ApiModelProperty("绑定项目")
private List<EvalProjectCO> projects;
}

View File

@ -3,6 +3,9 @@ package org.qinan.safetyeval.client.co.institution;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
import java.util.Map;
@Data
public class EvalProjectDocCO {
@ -12,24 +15,24 @@ public class EvalProjectDocCO {
@ApiModelProperty("项目ID")
private String projectId;
@ApiModelProperty("资料名称")
private String docName;
@ApiModelProperty("项目编号")
private String projectNo;
@ApiModelProperty(value = "资料类型编码ENTERPRISE_BASE企业基础资料 LICENSE合法证照 DESIGN设计资料 SAFETY_SYSTEM安全管理制度 INSPECT_REPORT检测检验报告 SURVEY现场踏勘资料 RECTIFY整改资料 REPORT_REVIEW报告及审核资料 OTHER其他过程资料", example = "ENTERPRISE_BASE")
private String docTypeCode;
@ApiModelProperty("项目名称")
private String projectName;
@ApiModelProperty(value = "资料类型名称:企业基础资料/合法证照/设计资料/安全管理制度/检测检验报告/现场踏勘资料/整改资料/报告及审核资料/其他过程资料", example = "企业基础资料")
private String docTypeName;
@ApiModelProperty("被评价客户企业名称")
private String customerName;
@ApiModelProperty("最新版本号")
private Integer latestVersionNo;
@ApiModelProperty(value = "评价类型编码PRE/ACCEPT/STATUS", example = "PRE")
private String evalTypeCode;
@ApiModelProperty("最新文件地址")
private String latestFileUrl;
@ApiModelProperty(value = "评价类型名称", example = "安全预评价")
private String evalTypeName;
@ApiModelProperty(value = "确认状态编码1待确认 2已确认 3已退回", example = "1")
private Integer confirmStatusCode;
@ApiModelProperty("资料上传地址")
private List<EvalProjectDocMaterialItemCO> projectDocUrl;
@ApiModelProperty(value = "确认状态名称:待确认/已确认/已退回", example = "待确认")
private String confirmStatusName;
@ApiModelProperty("查看文档列表, key对应资料类别枚举, val对应同类型的集合")
private Map<String, List<EvalProjectDocMaterialItemCO>> projectDocUrlMap;
}

View File

@ -0,0 +1,23 @@
package org.qinan.safetyeval.client.co.institution;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class EvalProjectDocMaterialItemCO {
@ApiModelProperty("资料名称")
private String materialName;
@ApiModelProperty("资料类型")
private String materialType;
@ApiModelProperty("资料上传地址")
@JsonProperty("project_doc_url")
private String projectDocUrl;
}

View File

@ -2,22 +2,20 @@ package org.qinan.safetyeval.client.dto.institution;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.qinan.safetyeval.client.co.institution.EvalProjectDocMaterialItemCO;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import java.util.List;
@Data
public class EvalProjectDocAddCmd {
@ApiModelProperty("项目ID")
@NotBlank(message = "项目ID不能为空")
@ApiModelProperty(value = "项目ID", required = true)
private String projectId;
@ApiModelProperty("资料名称")
private String docName;
@ApiModelProperty(value = "资料类型编码ENTERPRISE_BASE企业基础资料 LICENSE合法证照 DESIGN设计资料 SAFETY_SYSTEM安全管理制度 INSPECT_REPORT检测检验报告 SURVEY现场踏勘资料 RECTIFY整改资料 REPORT_REVIEW报告及审核资料 OTHER其他过程资料", example = "ENTERPRISE_BASE")
private String docTypeCode;
@ApiModelProperty(value = "资料类型名称:企业基础资料/合法证照/设计资料/安全管理制度/检测检验报告/现场踏勘资料/整改资料/报告及审核资料/其他过程资料", example = "企业基础资料")
private String docTypeName;
@ApiModelProperty("最新文件地址")
private String latestFileUrl;
@NotEmpty(message = "资料列表不能为空")
@ApiModelProperty(value = "资料上传地址", required = true)
private List<EvalProjectDocMaterialItemCO> projectDocUrl;
}

View File

@ -1,14 +0,0 @@
package org.qinan.safetyeval.client.dto.institution;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class EvalProjectDocConfirmCmd {
@ApiModelProperty("主键ID")
private String id;
@ApiModelProperty(value = "确认状态编码1待确认 2已确认 3已退回", example = "1")
private Integer confirmStatusCode;
}

View File

@ -1,26 +0,0 @@
package org.qinan.safetyeval.client.dto.institution;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class EvalProjectDocModifyCmd {
@ApiModelProperty("主键ID")
private String id;
@ApiModelProperty("资料名称")
private String docName;
@ApiModelProperty(value = "资料类型编码ENTERPRISE_BASE企业基础资料 LICENSE合法证照 DESIGN设计资料 SAFETY_SYSTEM安全管理制度 INSPECT_REPORT检测检验报告 SURVEY现场踏勘资料 RECTIFY整改资料 REPORT_REVIEW报告及审核资料 OTHER其他过程资料", example = "ENTERPRISE_BASE")
private String docTypeCode;
@ApiModelProperty(value = "资料类型名称:企业基础资料/合法证照/设计资料/安全管理制度/检测检验报告/现场踏勘资料/整改资料/报告及审核资料/其他过程资料", example = "企业基础资料")
private String docTypeName;
@ApiModelProperty("最新文件地址")
private String latestFileUrl;
@ApiModelProperty("最新版本号")
private Integer latestVersionNo;
}

View File

@ -9,6 +9,9 @@ import org.qinan.safetyeval.client.dto.BasePageQuery;
@EqualsAndHashCode(callSuper = true)
public class EvalProjectDocPageQuery extends BasePageQuery {
@ApiModelProperty("项目ID")
private String projectId;
@ApiModelProperty("项目名称")
private String projectName;
@ApiModelProperty("企业名称")
private String customerName;
}

View File

@ -4,9 +4,6 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.qinan.safetyeval.client.dto.BasePageQuery;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
@Data
@EqualsAndHashCode(callSuper = true)
@ -21,19 +18,5 @@ public class EvalProjectPageQuery extends BasePageQuery {
@ApiModelProperty("客户负责人")
private String customerContactName;
@ApiModelProperty("项目开始时间起")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate planStartDateFrom;
@ApiModelProperty("项目开始时间止")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate planStartDateTo;
@ApiModelProperty("项目完成时间起")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate planEndDateFrom;
@ApiModelProperty("项目完成时间止")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate planEndDateTo;
private Long customerId;
}

View File

@ -0,0 +1,61 @@
package org.qinan.safetyeval.domain.constant;
import lombok.Getter;
/**
*
* (val)(msg)
*/
@Getter
public enum MaterialCategory {
SITE_SURVEY("SITE_SURVEY", "现场踏勘资料"),
REPORT("REPORT", "报告资料"),
RECTIFICATION("RECTIFICATION", "整改资料"),
OTHER("OTHER", "其他项目资料");
private final String val; // 编码/值
private final String msg; // 描述信息
MaterialCategory(String val, String msg) {
this.val = val;
this.msg = msg;
}
public String getVal() {
return val;
}
public String getMsg() {
return msg;
}
/**
* (val)
*/
public static MaterialCategory fromVal(String val) {
for (MaterialCategory category : values()) {
if (category.val.equals(val)) {
return category;
}
}
return null;
}
/**
* (msg)
*/
public static MaterialCategory fromMsg(String msg) {
for (MaterialCategory category : values()) {
if (category.msg.equals(msg)) {
return category;
}
}
return null;
}
@Override
public String toString() {
return msg; // 默认输出描述
}
}

View File

@ -8,12 +8,11 @@ public class EvalProjectDocEntity {
private Long id;
private Long orgId;
private Long projectId;
private String docName;
private String docTypeCode;
private String docTypeName;
private Integer latestVersionNo;
private String latestFileUrl;
private Integer confirmStatusCode;
private String confirmStatusName;
private String projectNo;
private String projectName;
private String customerName;
private String evalTypeCode;
/** 资料上传地址 JSON 原文 */
private String projectDocUrl;
private Long tenantId;
}

View File

@ -4,19 +4,9 @@ import org.qinan.safetyeval.domain.entity.EvalProjectDocEntity;
import org.qinan.safetyeval.domain.query.EvalProjectDocQuery;
import org.qinan.safetyeval.domain.query.PageResult;
import java.util.List;
public interface EvalProjectDocGateway {
EvalProjectDocEntity save(EvalProjectDocEntity entity);
EvalProjectDocEntity get(Long id);
EvalProjectDocEntity modify(EvalProjectDocEntity entity);
void delete(Long id);
PageResult<EvalProjectDocEntity> page(EvalProjectDocQuery query);
List<EvalProjectDocEntity> listByProjectId(Long projectId, Long orgId);
}

View File

@ -8,5 +8,6 @@ public class EvalProjectDocQuery {
private Long pageNum;
private Long pageSize;
private Long orgId;
private Long projectId;
private String projectName;
private String customerName;
}

View File

@ -1,8 +1,10 @@
package org.qinan.safetyeval.domain.query;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@Data
@ -14,9 +16,13 @@ public class EvalProjectQuery {
private String projectName;
private String projectLeaderName;
private String customerContactName;
private LocalDate planStartDateFrom;
private LocalDate planStartDateTo;
private LocalDate planEndDateFrom;
private LocalDate planEndDateTo;
private Long customerId;
@ApiModelProperty(value = "开始时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime startTime;
@ApiModelProperty(value = "结束时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime endTime;
private List<Long> projectIds;
}

View File

@ -1,6 +1,8 @@
package org.qinan.safetyeval.domain.service;
import org.qinan.safetyeval.domain.entity.EvalCustomerEntity;
import org.qinan.safetyeval.domain.entity.EvalProjectDocEntity;
import org.qinan.safetyeval.domain.entity.EvalProjectEntity;
import org.qinan.safetyeval.domain.exception.BizException;
import org.qinan.safetyeval.domain.exception.ErrorCode;
import org.qinan.safetyeval.domain.gateway.EvalProjectDocGateway;
@ -9,7 +11,6 @@ import org.qinan.safetyeval.domain.query.PageResult;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class EvalProjectDocDomainService {
@ -20,68 +21,25 @@ public class EvalProjectDocDomainService {
@Resource
private EvalProjectDomainService evalProjectDomainService;
@Resource
private EvalCustomerDomainService evalCustomerDomainService;
public EvalProjectDocEntity add(EvalProjectDocEntity entity, Long orgId) {
evalProjectDomainService.get(entity.getProjectId());
EvalProjectEntity project = evalProjectDomainService.get(entity.getProjectId());
if (!orgId.equals(project.getOrgId())) {
throw new BizException(ErrorCode.EVAL_PROJECT_NOT_FOUND);
}
evalProjectDomainService.assertModifiable(project);
EvalCustomerEntity customer = evalCustomerDomainService.get(project.getCustomerId());
entity.setOrgId(orgId);
if (entity.getLatestVersionNo() == null) {
entity.setLatestVersionNo(1);
}
if (entity.getConfirmStatusCode() == null) {
entity.setConfirmStatusCode(1);
entity.setConfirmStatusName("待确认");
}
entity.setProjectNo(project.getProjectNo());
entity.setProjectName(project.getProjectName());
entity.setEvalTypeCode(project.getEvalTypeCode());
entity.setCustomerName(customer.getCustomerName());
return evalProjectDocGateway.save(entity);
}
public EvalProjectDocEntity get(Long id) {
EvalProjectDocEntity existing = evalProjectDocGateway.get(id);
if (existing == null) {
throw new BizException(ErrorCode.EVAL_PROJECT_DOC_NOT_FOUND);
}
return existing;
}
public EvalProjectDocEntity modify(EvalProjectDocEntity entity) {
EvalProjectDocEntity existing = get(entity.getId());
evalProjectDomainService.assertModifiable(evalProjectDomainService.get(existing.getProjectId()));
entity.setOrgId(existing.getOrgId());
entity.setProjectId(existing.getProjectId());
return evalProjectDocGateway.modify(entity);
}
public void delete(Long id) {
get(id);
evalProjectDocGateway.delete(id);
}
public EvalProjectDocEntity confirm(Long id, Integer confirmStatusCode) {
EvalProjectDocEntity existing = get(id);
evalProjectDomainService.assertModifiable(evalProjectDomainService.get(existing.getProjectId()));
if (confirmStatusCode == null || confirmStatusCode < 1 || confirmStatusCode > 3) {
throw new BizException(ErrorCode.EVAL_DOC_CONFIRM_STATUS_INVALID);
}
existing.setConfirmStatusCode(confirmStatusCode);
switch (confirmStatusCode) {
case 1:
existing.setConfirmStatusName("待确认");
break;
case 2:
existing.setConfirmStatusName("已确认");
break;
case 3:
existing.setConfirmStatusName("已退回");
break;
default:
throw new BizException(ErrorCode.EVAL_DOC_CONFIRM_STATUS_INVALID);
}
return evalProjectDocGateway.modify(existing);
}
public PageResult<EvalProjectDocEntity> page(EvalProjectDocQuery query) {
return evalProjectDocGateway.page(query);
}
public List<EvalProjectDocEntity> listByProjectId(Long projectId, Long orgId) {
return evalProjectDocGateway.listByProjectId(projectId, orgId);
}
}

View File

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

View File

@ -12,17 +12,12 @@ public class EvalProjectDocDO {
private Long id;
private Long orgId;
private Long projectId;
private String docName;
/** 资料类型编码ENTERPRISE_BASE企业基础资料 LICENSE合法证照 DESIGN设计资料 SAFETY_SYSTEM安全管理制度 INSPECT_REPORT检测检验报告 SURVEY现场踏勘资料 RECTIFY整改资料 REPORT_REVIEW报告及审核资料 OTHER其他过程资料示例ENTERPRISE_BASE */
private String docTypeCode;
/** 资料类型名称:企业基础资料/合法证照/设计资料/安全管理制度/检测检验报告/现场踏勘资料/整改资料/报告及审核资料/其他过程资料,示例:企业基础资料 */
private String docTypeName;
private Integer latestVersionNo;
private String latestFileUrl;
/** 确认状态编码1待确认 2已确认 3已退回示例1 */
private Integer confirmStatusCode;
/** 确认状态名称:待确认/已确认/已退回,示例:待确认 */
private String confirmStatusName;
private String projectNo;
private String projectName;
private String customerName;
private String evalTypeCode;
/** 资料上传地址 JSON:[{"materialName":"","materialType":"","project_doc_url":""}] */
private String projectDocUrl;
private String deleteEnum;
private String remarks;
private String createName;

View File

@ -7,11 +7,13 @@ import org.qinan.safetyeval.domain.entity.EvalProjectDocEntity;
import org.qinan.safetyeval.domain.gateway.EvalProjectDocGateway;
import org.qinan.safetyeval.domain.query.EvalProjectDocQuery;
import org.qinan.safetyeval.domain.query.PageResult;
import org.qinan.safetyeval.infrastructure.convertor.EvalProjectDocDoConvertor;
import org.qinan.safetyeval.infrastructure.dataobject.EvalProjectDocDO;
import org.qinan.safetyeval.infrastructure.mapper.EvalProjectDocMapper;
import org.qinan.safetyeval.infrastructure.support.InsertFieldDefaults;
import org.qinan.safetyeval.infrastructure.support.OrgContextResolver;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.util.List;
@ -23,105 +25,45 @@ public class EvalProjectDocGatewayImpl implements EvalProjectDocGateway {
@Resource
private EvalProjectDocMapper evalProjectDocMapper;
@Resource
private EvalProjectDocDoConvertor evalProjectDocDoConvertor;
@Resource
private OrgContextResolver orgContextResolver;
@Override
public EvalProjectDocEntity save(EvalProjectDocEntity entity) {
EvalProjectDocDO dataObject = toDO(entity);
EvalProjectDocDO dataObject = evalProjectDocDoConvertor.convertEToDo(entity);
dataObject.setOrgId(orgContextResolver.resolveOrgId(entity.getOrgId()));
InsertFieldDefaults.apply(dataObject);
evalProjectDocMapper.insert(dataObject);
entity.setId(dataObject.getId());
return entity;
}
@Override
public EvalProjectDocEntity get(Long id) {
EvalProjectDocDO dataObject = evalProjectDocMapper.selectById(id);
if (dataObject == null || !"false".equals(dataObject.getDeleteEnum())) {
return null;
}
return toEntity(dataObject);
}
@Override
public EvalProjectDocEntity modify(EvalProjectDocEntity entity) {
EvalProjectDocDO dataObject = toDO(entity);
dataObject.setId(entity.getId());
InsertFieldDefaults.applyForUpdate(dataObject);
evalProjectDocMapper.updateById(dataObject);
return get(entity.getId());
}
@Override
public void delete(Long id) {
evalProjectDocMapper.deleteById(id);
}
@Override
public PageResult<EvalProjectDocEntity> page(EvalProjectDocQuery query) {
Page<EvalProjectDocDO> page = new Page<>(query.getPageNum(), query.getPageSize());
IPage<EvalProjectDocDO> result = evalProjectDocMapper.selectPage(page, buildQueryWrapper(query));
List<EvalProjectDocEntity> entities = result.getRecords().stream()
.map(this::toEntity)
.map(evalProjectDocDoConvertor::convertDoToE)
.collect(Collectors.toList());
return PageResult.of(entities, result.getTotal(), result.getCurrent(), result.getSize());
}
@Override
public List<EvalProjectDocEntity> listByProjectId(Long projectId, Long orgId) {
EvalProjectDocQuery query = new EvalProjectDocQuery();
query.setProjectId(projectId);
query.setOrgId(orgId);
return evalProjectDocMapper.selectList(buildQueryWrapper(query)).stream()
.map(this::toEntity)
.collect(Collectors.toList());
}
private LambdaQueryWrapper<EvalProjectDocDO> buildQueryWrapper(EvalProjectDocQuery query) {
LambdaQueryWrapper<EvalProjectDocDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(EvalProjectDocDO::getDeleteEnum, "false");
if (query.getOrgId() != null) {
wrapper.eq(EvalProjectDocDO::getOrgId, query.getOrgId());
}
if (query.getProjectId() != null) {
wrapper.eq(EvalProjectDocDO::getProjectId, query.getProjectId());
if (StringUtils.hasText(query.getProjectName())) {
wrapper.like(EvalProjectDocDO::getProjectName, query.getProjectName());
}
wrapper.orderByDesc(EvalProjectDocDO::getCreateTime);
if (StringUtils.hasText(query.getCustomerName())) {
wrapper.like(EvalProjectDocDO::getCustomerName, query.getCustomerName());
}
wrapper.orderByDesc(EvalProjectDocDO::getId);
return wrapper;
}
private EvalProjectDocDO toDO(EvalProjectDocEntity entity) {
EvalProjectDocDO dataObject = new EvalProjectDocDO();
dataObject.setOrgId(orgContextResolver.resolveOrgId(entity.getOrgId()));
dataObject.setProjectId(entity.getProjectId());
dataObject.setDocName(entity.getDocName());
dataObject.setDocTypeCode(entity.getDocTypeCode());
dataObject.setDocTypeName(entity.getDocTypeName());
dataObject.setLatestVersionNo(entity.getLatestVersionNo());
dataObject.setLatestFileUrl(entity.getLatestFileUrl());
dataObject.setConfirmStatusCode(entity.getConfirmStatusCode());
dataObject.setConfirmStatusName(entity.getConfirmStatusName());
dataObject.setTenantId(entity.getTenantId());
return dataObject;
}
private EvalProjectDocEntity toEntity(EvalProjectDocDO dataObject) {
if (dataObject == null) {
return null;
}
EvalProjectDocEntity entity = new EvalProjectDocEntity();
entity.setId(dataObject.getId());
entity.setOrgId(dataObject.getOrgId());
entity.setProjectId(dataObject.getProjectId());
entity.setDocName(dataObject.getDocName());
entity.setDocTypeCode(dataObject.getDocTypeCode());
entity.setDocTypeName(dataObject.getDocTypeName());
entity.setLatestVersionNo(dataObject.getLatestVersionNo());
entity.setLatestFileUrl(dataObject.getLatestFileUrl());
entity.setConfirmStatusCode(dataObject.getConfirmStatusCode());
entity.setConfirmStatusName(dataObject.getConfirmStatusName());
entity.setTenantId(dataObject.getTenantId());
return entity;
}
}

View File

@ -114,22 +114,17 @@ public class EvalProjectGatewayImpl implements EvalProjectGateway {
if (StringUtils.hasText(query.getCustomerContactName())) {
wrapper.like(EvalProjectDO::getCustomerContactName, query.getCustomerContactName());
}
if (query.getPlanStartDateFrom() != null) {
wrapper.ge(EvalProjectDO::getPlanStartDate, query.getPlanStartDateFrom());
if (query.getStartTime() != null && query.getEndTime() != null) {
wrapper.le(EvalProjectDO::getPlanStartDate, query.getStartTime().toLocalDate())
.ge(EvalProjectDO::getPlanEndDate, query.getEndTime().toLocalDate());
}
if (query.getPlanStartDateTo() != null) {
wrapper.le(EvalProjectDO::getPlanStartDate, query.getPlanStartDateTo());
}
if (query.getPlanEndDateFrom() != null) {
wrapper.ge(EvalProjectDO::getPlanEndDate, query.getPlanEndDateFrom());
}
if (query.getPlanEndDateTo() != null) {
wrapper.le(EvalProjectDO::getPlanEndDate, query.getPlanEndDateTo());
if (query.getCustomerId() != null) {
wrapper.eq(EvalProjectDO::getCustomerId, query.getCustomerId());
}
if (!CollectionUtils.isEmpty(query.getProjectIds())) {
wrapper.in(EvalProjectDO::getId, query.getProjectIds());
}
wrapper.orderByDesc(EvalProjectDO::getPlanStartDate);
wrapper.orderByDesc(EvalProjectDO::getId);
return wrapper;
}
}