feat: 项目组

dev
zhanglei 2026-07-23 11:29:07 +08:00
parent bab37f01c2
commit ae140a7c6e
20 changed files with 196 additions and 446 deletions

View File

@ -2,15 +2,12 @@ package org.qinan.safetyeval.adapter.web.institution;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.qinan.safetyeval.client.api.institution.EvalProjectMemberApi; import org.qinan.safetyeval.client.api.institution.EvalProjectMemberApi;
import org.qinan.safetyeval.client.co.institution.EvalProjectMemberCO; import org.qinan.safetyeval.client.co.institution.EvalProjectMemberCO;
import org.qinan.safetyeval.client.dto.PageResponse; import org.qinan.safetyeval.client.dto.PageResponse;
import org.qinan.safetyeval.client.dto.SingleResponse; import org.qinan.safetyeval.client.dto.SingleResponse;
import org.qinan.safetyeval.client.dto.institution.EvalProjectMemberAddCmd; import org.qinan.safetyeval.client.dto.institution.EvalProjectMemberAddCmd;
import org.qinan.safetyeval.client.dto.institution.EvalProjectMemberModifyCmd;
import org.qinan.safetyeval.client.dto.institution.EvalProjectMemberPageQuery; import org.qinan.safetyeval.client.dto.institution.EvalProjectMemberPageQuery;
import org.qinan.safetyeval.infrastructure.dataobject.base.Req;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -25,30 +22,15 @@ public class EvalProjectMemberController {
@Resource @Resource
private EvalProjectMemberApi evalProjectMemberApi; private EvalProjectMemberApi evalProjectMemberApi;
@ApiOperation("新增成员") @ApiOperation("保存成员(id空新增/非空修改)")
@PostMapping("/save") @PostMapping("/save")
public SingleResponse<EvalProjectMemberCO> save(@Validated @RequestBody EvalProjectMemberAddCmd cmd) { public SingleResponse<Boolean> save(@Validated @RequestBody List<EvalProjectMemberAddCmd> cmd) {
if (cmd == null || cmd.isEmpty()) {
return SingleResponse.success(true);
}
return evalProjectMemberApi.save(cmd); return evalProjectMemberApi.save(cmd);
} }
@ApiOperation("修改成员")
@PostMapping("/modify")
public SingleResponse<EvalProjectMemberCO> modify(@Validated @RequestBody EvalProjectMemberModifyCmd cmd) {
return evalProjectMemberApi.modify(cmd);
}
@ApiOperation("删除成员")
@PostMapping("/delete")
public SingleResponse<Void> delete(@RequestBody Req<Long> req) {
return evalProjectMemberApi.delete(req.getData());
}
@ApiOperation("按项目查询成员列表")
@GetMapping("/list")
public SingleResponse<List<EvalProjectMemberCO>> list(@ApiParam("项目ID") @RequestParam String projectId) {
return evalProjectMemberApi.listByProject(Long.parseLong(projectId));
}
@ApiOperation("分页查询成员") @ApiOperation("分页查询成员")
@GetMapping("/page") @GetMapping("/page")
public PageResponse<EvalProjectMemberCO> page(@Validated EvalProjectMemberPageQuery query) { public PageResponse<EvalProjectMemberCO> page(@Validated EvalProjectMemberPageQuery query) {

View File

@ -0,0 +1,35 @@
package org.qinan.safetyeval.app.convertor;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.qinan.safetyeval.client.co.institution.EvalProjectMemberCO;
import org.qinan.safetyeval.client.dto.institution.EvalProjectMemberAddCmd;
import org.qinan.safetyeval.client.dto.institution.EvalProjectMemberPageQuery;
import org.qinan.safetyeval.domain.entity.EvalProjectMemberEntity;
import org.qinan.safetyeval.domain.query.EvalProjectMemberQuery;
import java.util.List;
@Mapper(componentModel = "spring")
public interface EvalProjectMemberCmdConvertor {
// @Mapping(target = "id", expression = "java(cmd.getId() == null || cmd.getId().isEmpty() ? null : Long.parseLong(cmd.getId()))")
@Mapping(target = "orgId", ignore = true)
@Mapping(target = "projectId", expression = "java(cmd.getProjectId() == null ? null : Long.parseLong(cmd.getProjectId()))")
@Mapping(target = "personnelId", expression = "java(cmd.getPersonnelId() == null ? null : Long.parseLong(cmd.getPersonnelId()))")
@Mapping(target = "tenantId", ignore = true)
EvalProjectMemberEntity convertAddCmdToE(EvalProjectMemberAddCmd cmd);
@Mapping(target = "pageNum", source = "current")
@Mapping(target = "pageSize", source = "size")
@Mapping(target = "orgId", ignore = true)
@Mapping(target = "projectId", expression = "java(query.getProjectId() == null ? null : Long.parseLong(query.getProjectId()))")
EvalProjectMemberQuery convertPageQueryToQ(EvalProjectMemberPageQuery 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 = "personnelId", expression = "java(entity.getPersonnelId() == null ? null : String.valueOf(entity.getPersonnelId()))")
EvalProjectMemberCO convertEToCO(EvalProjectMemberEntity entity);
List<EvalProjectMemberCO> convertEListToCOList(List<EvalProjectMemberEntity> list);
}

View File

@ -20,11 +20,9 @@ import org.qinan.safetyeval.domain.constant.ProjectStageEnum;
import org.qinan.safetyeval.domain.constant.ReviewDimensionEnum; import org.qinan.safetyeval.domain.constant.ReviewDimensionEnum;
import org.qinan.safetyeval.domain.entity.EvalInternalReviewEntity; import org.qinan.safetyeval.domain.entity.EvalInternalReviewEntity;
import org.qinan.safetyeval.domain.entity.EvalProjectEntity; import org.qinan.safetyeval.domain.entity.EvalProjectEntity;
import org.qinan.safetyeval.domain.entity.EvalProjectMemberEntity;
import org.qinan.safetyeval.domain.exception.BizException; import org.qinan.safetyeval.domain.exception.BizException;
import org.qinan.safetyeval.domain.exception.ErrorCode; import org.qinan.safetyeval.domain.exception.ErrorCode;
import org.qinan.safetyeval.domain.gateway.EvalInternalReviewGateway; import org.qinan.safetyeval.domain.gateway.EvalInternalReviewGateway;
import org.qinan.safetyeval.domain.gateway.EvalProjectMemberGateway;
import org.qinan.safetyeval.domain.item.gateway.EvalReviewItemGateway; import org.qinan.safetyeval.domain.item.gateway.EvalReviewItemGateway;
import org.qinan.safetyeval.domain.item.model.EvalReviewItemE; import org.qinan.safetyeval.domain.item.model.EvalReviewItemE;
import org.qinan.safetyeval.domain.service.ProjectStageSyncService; import org.qinan.safetyeval.domain.service.ProjectStageSyncService;
@ -33,7 +31,6 @@ import org.qinan.safetyeval.infrastructure.convertor.EvalInternalReviewConvertor
import org.qinan.safetyeval.infrastructure.dataobject.EvalInternalReviewDO; import org.qinan.safetyeval.infrastructure.dataobject.EvalInternalReviewDO;
import org.qinan.safetyeval.infrastructure.mapper.EvalInternalReviewMapper; import org.qinan.safetyeval.infrastructure.mapper.EvalInternalReviewMapper;
import org.qinan.safetyeval.infrastructure.persistence.queryservice.EvalReviewItemQueryService; import org.qinan.safetyeval.infrastructure.persistence.queryservice.EvalReviewItemQueryService;
import org.qinan.safetyeval.infrastructure.support.NodeWriteAuthority;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -52,8 +49,6 @@ public class EvalInternalReviewExecutor implements EvalInternalReviewApi {
@Resource @Resource
private EvalProjectNodeSupport evalProjectNodeSupport; private EvalProjectNodeSupport evalProjectNodeSupport;
@Resource @Resource
private EvalProjectMemberGateway evalProjectMemberGateway;
@Resource
private EvalReviewItemQueryService evalReviewItemQueryService; private EvalReviewItemQueryService evalReviewItemQueryService;
@Resource @Resource
private EvalInternalReviewConvertor evalInternalReviewConvertor; private EvalInternalReviewConvertor evalInternalReviewConvertor;
@ -157,14 +152,10 @@ public class EvalInternalReviewExecutor implements EvalInternalReviewApi {
@Override @Override
public SingleResponse<EvalInternalReviewDetailCO> getDetailByProject(Long projectId) { public SingleResponse<EvalInternalReviewDetailCO> getDetailByProject(Long projectId) {
// 1. 查询项目成员中的内审人信息 // 查询内审记录,未查询到则内审记录字段为空(成员角色模型已变更,不再按旧角色筛选内审人)
List<EvalProjectMemberEntity> members = evalProjectMemberGateway
.listByProjectIdAndRoleCode(projectId, NodeWriteAuthority.ROLE_INTERNAL_REVIEWER);
// 2. 查询内审记录,未查询到则内审记录字段为空
EvalInternalReviewEntity entity = evalInternalReviewGateway.getByProjectId(projectId, null); EvalInternalReviewEntity entity = evalInternalReviewGateway.getByProjectId(projectId, null);
EvalInternalReviewDetailCO detailCO = new EvalInternalReviewDetailCO(); EvalInternalReviewDetailCO detailCO = new EvalInternalReviewDetailCO();
detailCO.setReviewers(evalInternalReviewConvertor.toMemberCOs(members)); detailCO.setReviewers(java.util.Collections.emptyList());
if (entity != null) { if (entity != null) {
detailCO.setInternalReview(evalInternalReviewConvertor.toInternalCO(entity)); detailCO.setInternalReview(evalInternalReviewConvertor.toInternalCO(entity));
// 3. 通过内审记录id查询审核项列表 // 3. 通过内审记录id查询审核项列表

View File

@ -24,6 +24,7 @@ import org.qinan.safetyeval.domain.entity.EvalProcessControlEntity;
import org.qinan.safetyeval.domain.entity.EvalReportDraftEntity; import org.qinan.safetyeval.domain.entity.EvalReportDraftEntity;
import org.qinan.safetyeval.domain.entity.EvalReportEntity; import org.qinan.safetyeval.domain.entity.EvalReportEntity;
import org.qinan.safetyeval.domain.entity.EvalSignTaskEntity; import org.qinan.safetyeval.domain.entity.EvalSignTaskEntity;
import org.qinan.safetyeval.domain.entity.*;
import org.qinan.safetyeval.domain.exception.BizException; import org.qinan.safetyeval.domain.exception.BizException;
import org.qinan.safetyeval.domain.exception.ErrorCode; import org.qinan.safetyeval.domain.exception.ErrorCode;
import org.qinan.safetyeval.domain.gateway.EvalProcessControlGateway; import org.qinan.safetyeval.domain.gateway.EvalProcessControlGateway;
@ -31,6 +32,7 @@ import org.qinan.safetyeval.domain.gateway.EvalProjectMemberGateway;
import org.qinan.safetyeval.domain.gateway.EvalReportDraftGateway; import org.qinan.safetyeval.domain.gateway.EvalReportDraftGateway;
import org.qinan.safetyeval.domain.gateway.EvalReportGateway; import org.qinan.safetyeval.domain.gateway.EvalReportGateway;
import org.qinan.safetyeval.domain.gateway.EvalSignTaskGateway; import org.qinan.safetyeval.domain.gateway.EvalSignTaskGateway;
import org.qinan.safetyeval.domain.gateway.*;
import org.qinan.safetyeval.domain.item.gateway.EvalReviewItemGateway; import org.qinan.safetyeval.domain.item.gateway.EvalReviewItemGateway;
import org.qinan.safetyeval.domain.item.model.EvalReviewItemE; import org.qinan.safetyeval.domain.item.model.EvalReviewItemE;
import org.qinan.safetyeval.domain.query.EvalReportDraftQuery; import org.qinan.safetyeval.domain.query.EvalReportDraftQuery;
@ -177,13 +179,13 @@ public class EvalProcessControlExecutor implements EvalProcessControlApi {
@Override @Override
public SingleResponse<EvalProcessControlDetailCO> getDetailByProject(Long projectId) { public SingleResponse<EvalProcessControlDetailCO> getDetailByProject(Long projectId) {
// 1. 查询项目成员中的过程控制负责人信息 // 1. 查询项目成员中的过程控制负责人信息
List<EvalProjectMemberEntity> members = evalProjectMemberGateway // List<EvalProjectMemberEntity> members = evalProjectMemberGateway
.listByProjectIdAndRoleCode(projectId, NodeWriteAuthority.ROLE_PROCESS_OWNER); // .listByProjectIdAndRoleCode(projectId, NodeWriteAuthority.ROLE_PROCESS_OWNER);
// 2. 查询过程控制记录,未查询到则过程控制记录字段为空 // 2. 查询过程控制记录,未查询到则过程控制记录字段为空
EvalProcessControlEntity entity = evalProcessControlGateway.getByProjectId(projectId, null); EvalProcessControlEntity entity = evalProcessControlGateway.getByProjectId(projectId, null);
EvalProcessControlDetailCO detailCO = new EvalProcessControlDetailCO(); EvalProcessControlDetailCO detailCO = new EvalProcessControlDetailCO();
detailCO.setControllers(evalProcessControlConvertor.toMemberCOs(members)); // detailCO.setControllers(evalProcessControlConvertor.toMemberCOs(members));
if (entity != null) { if (entity != null) {
detailCO.setProcessControl(EvalNodeCoConverter.toProcessCO(entity)); detailCO.setProcessControl(EvalNodeCoConverter.toProcessCO(entity));
// 3. 通过过程控制记录id查询审核项列表 // 3. 通过过程控制记录id查询审核项列表

View File

@ -1,26 +1,27 @@
package org.qinan.safetyeval.app.executor.institution; package org.qinan.safetyeval.app.executor.institution;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.qinan.safetyeval.app.convertor.EvalProjectMemberCmdConvertor;
import org.qinan.safetyeval.client.api.institution.EvalProjectMemberApi; import org.qinan.safetyeval.client.api.institution.EvalProjectMemberApi;
import org.qinan.safetyeval.client.co.institution.EvalProjectMemberCO; import org.qinan.safetyeval.client.co.institution.EvalProjectMemberCO;
import org.qinan.safetyeval.client.dto.PageResponse; import org.qinan.safetyeval.client.dto.PageResponse;
import org.qinan.safetyeval.client.dto.SingleResponse; import org.qinan.safetyeval.client.dto.SingleResponse;
import org.qinan.safetyeval.client.dto.institution.EvalProjectMemberAddCmd; import org.qinan.safetyeval.client.dto.institution.EvalProjectMemberAddCmd;
import org.qinan.safetyeval.client.dto.institution.EvalProjectMemberModifyCmd;
import org.qinan.safetyeval.client.dto.institution.EvalProjectMemberPageQuery; import org.qinan.safetyeval.client.dto.institution.EvalProjectMemberPageQuery;
import org.qinan.safetyeval.domain.entity.EvalProjectEntity;
import org.qinan.safetyeval.domain.entity.EvalProjectMemberEntity; import org.qinan.safetyeval.domain.entity.EvalProjectMemberEntity;
import org.qinan.safetyeval.domain.exception.ErrorCode; import org.qinan.safetyeval.domain.exception.ErrorCode;
import org.qinan.safetyeval.domain.query.EvalProjectMemberQuery; import org.qinan.safetyeval.domain.query.EvalProjectMemberQuery;
import org.qinan.safetyeval.domain.query.PageResult; 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.domain.service.EvalProjectMemberDomainService;
import org.qinan.safetyeval.infrastructure.dataobject.EvalProjectMemberDO;
import org.qinan.safetyeval.infrastructure.mapper.EvalProjectMemberMapper;
import org.qinan.safetyeval.infrastructure.support.InstitutionOrgSupport; import org.qinan.safetyeval.infrastructure.support.InstitutionOrgSupport;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
@Service @Service
public class EvalProjectMemberExecutor implements EvalProjectMemberApi { public class EvalProjectMemberExecutor implements EvalProjectMemberApi {
@ -31,95 +32,39 @@ public class EvalProjectMemberExecutor implements EvalProjectMemberApi {
@Lazy @Lazy
@Autowired(required = false) @Autowired(required = false)
private EvalProjectDomainService evalProjectDomainService; private InstitutionOrgSupport institutionOrgSupport;
@Lazy @Lazy
@Autowired(required = false) @Autowired(required = false)
private InstitutionOrgSupport institutionOrgSupport; private EvalProjectMemberCmdConvertor evalProjectMemberCmdConvertor;
@Autowired
private EvalProjectMemberMapper evalProjectMemberMapper;
@Override @Override
public SingleResponse<EvalProjectMemberCO> save(EvalProjectMemberAddCmd cmd) { @Transactional(rollbackFor = Exception.class)
Long orgId = institutionOrgSupport.resolveCurrentOrgId(); public SingleResponse<Boolean> save(List<EvalProjectMemberAddCmd> cmdList) {
assertProjectInOrg(Long.parseLong(cmd.getProjectId()), orgId); evalProjectMemberMapper.delete(new LambdaQueryWrapper<EvalProjectMemberDO>()
EvalProjectMemberEntity entity = new EvalProjectMemberEntity(); .eq(EvalProjectMemberDO::getProjectId, cmdList.get(0).getProjectId()));
entity.setProjectId(Long.parseLong(cmd.getProjectId())); for (EvalProjectMemberAddCmd cmd : cmdList) {
entity.setPersonnelId(Long.parseLong(cmd.getPersonnelId())); Long orgId = institutionOrgSupport.resolveCurrentOrgId();
entity.setRoleCode(cmd.getRoleCode()); EvalProjectMemberEntity entity = evalProjectMemberCmdConvertor.convertAddCmdToE(cmd);
entity.setRoleName(cmd.getRoleName()); if (entity.getId() == null) {
entity.setLeaderFlag(cmd.getLeaderFlag()); entity.setOrgId(orgId);
EvalProjectMemberEntity result = evalProjectMemberDomainService.add(entity, orgId); } else {
return SingleResponse.success(toCO(result)); EvalProjectMemberEntity existing = evalProjectMemberDomainService.get(entity.getId());
} institutionOrgSupport.assertOrgAccess(existing.getOrgId(), ErrorCode.EVAL_PROJECT_MEMBER_NOT_FOUND);
}
@Override evalProjectMemberDomainService.saveOrUpdate(entity);
public SingleResponse<EvalProjectMemberCO> modify(EvalProjectMemberModifyCmd cmd) {
Long orgId = institutionOrgSupport.resolveCurrentOrgId();
EvalProjectMemberEntity existing = evalProjectMemberDomainService.get(Long.parseLong(cmd.getId()));
institutionOrgSupport.assertOrgAccess(existing.getOrgId(), ErrorCode.EVAL_PROJECT_MEMBER_NOT_FOUND);
EvalProjectMemberEntity entity = new EvalProjectMemberEntity();
entity.setId(Long.parseLong(cmd.getId()));
if (cmd.getPersonnelId() != null) {
entity.setPersonnelId(Long.parseLong(cmd.getPersonnelId()));
} }
entity.setRoleCode(cmd.getRoleCode()); return SingleResponse.success(true);
entity.setRoleName(cmd.getRoleName());
entity.setLeaderFlag(cmd.getLeaderFlag());
EvalProjectMemberEntity result = evalProjectMemberDomainService.modify(entity, orgId);
return SingleResponse.success(toCO(result));
}
@Override
public SingleResponse<Void> delete(Long id) {
Long orgId = institutionOrgSupport.resolveCurrentOrgId();
EvalProjectMemberEntity existing = evalProjectMemberDomainService.get(id);
institutionOrgSupport.assertOrgAccess(existing.getOrgId(), ErrorCode.EVAL_PROJECT_MEMBER_NOT_FOUND);
evalProjectMemberDomainService.delete(id, orgId);
return SingleResponse.success();
}
@Override
public SingleResponse<List<EvalProjectMemberCO>> listByProject(Long projectId) {
Long orgId = institutionOrgSupport.resolveCurrentOrgId();
assertProjectInOrg(projectId, orgId);
List<EvalProjectMemberCO> list = evalProjectMemberDomainService.listByProjectId(projectId, orgId).stream()
.map(this::toCO)
.collect(Collectors.toList());
return SingleResponse.success(list);
} }
@Override @Override
public PageResponse<EvalProjectMemberCO> page(EvalProjectMemberPageQuery query) { public PageResponse<EvalProjectMemberCO> page(EvalProjectMemberPageQuery query) {
Long orgId = institutionOrgSupport.resolveCurrentOrgId(); EvalProjectMemberQuery domainQuery = evalProjectMemberCmdConvertor.convertPageQueryToQ(query);
EvalProjectMemberQuery domainQuery = new EvalProjectMemberQuery(); domainQuery.setOrgId(institutionOrgSupport.resolveCurrentOrgId());
domainQuery.setPageNum(query.getCurrent());
domainQuery.setPageSize(query.getSize());
domainQuery.setOrgId(orgId);
if (query.getProjectId() != null) {
domainQuery.setProjectId(Long.parseLong(query.getProjectId()));
}
PageResult<EvalProjectMemberEntity> pageResult = evalProjectMemberDomainService.page(domainQuery); PageResult<EvalProjectMemberEntity> pageResult = evalProjectMemberDomainService.page(domainQuery);
return PageResponse.of( return PageResponse.of(
pageResult.getRecords().stream().map(this::toCO).collect(Collectors.toList()), evalProjectMemberCmdConvertor.convertEListToCOList(pageResult.getRecords()),
pageResult.getTotal()); pageResult.getTotal());
} }
private void assertProjectInOrg(Long projectId, Long orgId) {
EvalProjectEntity project = evalProjectDomainService.get(projectId);
institutionOrgSupport.assertOrgAccess(project.getOrgId(), ErrorCode.EVAL_PROJECT_NOT_FOUND);
}
private EvalProjectMemberCO toCO(EvalProjectMemberEntity entity) {
if (entity == null) {
return null;
}
EvalProjectMemberCO co = new EvalProjectMemberCO();
co.setId(entity.getId() != null ? String.valueOf(entity.getId()) : null);
co.setProjectId(entity.getProjectId() != null ? String.valueOf(entity.getProjectId()) : null);
co.setPersonnelId(entity.getPersonnelId() != null ? String.valueOf(entity.getPersonnelId()) : null);
co.setPersonnelName(entity.getPersonnelName());
co.setRoleCode(entity.getRoleCode());
co.setRoleName(entity.getRoleName());
co.setLeaderFlag(entity.getLeaderFlag());
return co;
}
} }

View File

@ -17,7 +17,6 @@ import org.qinan.safetyeval.client.item.response.EvalReviewItemCo;
import org.qinan.safetyeval.domain.constant.ProjectStageEnum; import org.qinan.safetyeval.domain.constant.ProjectStageEnum;
import org.qinan.safetyeval.domain.constant.ReviewDimensionEnum; import org.qinan.safetyeval.domain.constant.ReviewDimensionEnum;
import org.qinan.safetyeval.domain.entity.EvalProjectEntity; import org.qinan.safetyeval.domain.entity.EvalProjectEntity;
import org.qinan.safetyeval.domain.entity.EvalProjectMemberEntity;
import org.qinan.safetyeval.domain.entity.EvalTechReviewEntity; import org.qinan.safetyeval.domain.entity.EvalTechReviewEntity;
import org.qinan.safetyeval.domain.exception.BizException; import org.qinan.safetyeval.domain.exception.BizException;
import org.qinan.safetyeval.domain.exception.ErrorCode; import org.qinan.safetyeval.domain.exception.ErrorCode;
@ -31,12 +30,10 @@ import org.qinan.safetyeval.infrastructure.convertor.EvalTechReviewConvertor;
import org.qinan.safetyeval.infrastructure.dataobject.EvalTechReviewDO; import org.qinan.safetyeval.infrastructure.dataobject.EvalTechReviewDO;
import org.qinan.safetyeval.infrastructure.mapper.EvalTechReviewMapper; import org.qinan.safetyeval.infrastructure.mapper.EvalTechReviewMapper;
import org.qinan.safetyeval.infrastructure.persistence.queryservice.EvalReviewItemQueryService; import org.qinan.safetyeval.infrastructure.persistence.queryservice.EvalReviewItemQueryService;
import org.qinan.safetyeval.infrastructure.support.NodeWriteAuthority;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static org.qinan.safetyeval.domain.exception.ErrorCode.ASSIGN_SIGN_TASK; import static org.qinan.safetyeval.domain.exception.ErrorCode.ASSIGN_SIGN_TASK;
@ -152,13 +149,13 @@ public class EvalTechReviewExecutor implements EvalTechReviewApi {
@Override @Override
public SingleResponse<EvalTechReviewDetailCO> getDetailByProject(Long projectId) { public SingleResponse<EvalTechReviewDetailCO> getDetailByProject(Long projectId) {
// 1. 查询项目成员中的技审人信息 // 1. 查询项目成员中的技审人信息
List<EvalProjectMemberEntity> members = evalProjectMemberGateway // List<EvalProjectMemberEntity> members = evalProjectMemberGateway
.listByProjectIdAndRoleCode(projectId, NodeWriteAuthority.ROLE_TECH_REVIEWER); // .listByProjectIdAndRoleCode(projectId, NodeWriteAuthority.ROLE_TECH_REVIEWER);
// 2. 查询技审记录,未查询到则技审记录字段为空 // 2. 查询技审记录,未查询到则技审记录字段为空
EvalTechReviewEntity entity = evalTechReviewGateway.getByProjectId(projectId, null); EvalTechReviewEntity entity = evalTechReviewGateway.getByProjectId(projectId, null);
EvalTechReviewDetailCO detailCO = new EvalTechReviewDetailCO(); EvalTechReviewDetailCO detailCO = new EvalTechReviewDetailCO();
detailCO.setReviewers(evalTechReviewConvertor.toMemberCOs(members)); // detailCO.setReviewers(evalTechReviewConvertor.toMemberCOs(members));
if (entity != null) { if (entity != null) {
detailCO.setTechReview(evalTechReviewConvertor.toTechCO(entity)); detailCO.setTechReview(evalTechReviewConvertor.toTechCO(entity));
// 3. 通过技审记录id查询审核项列表 // 3. 通过技审记录id查询审核项列表

View File

@ -4,20 +4,13 @@ import org.qinan.safetyeval.client.co.institution.EvalProjectMemberCO;
import org.qinan.safetyeval.client.dto.PageResponse; import org.qinan.safetyeval.client.dto.PageResponse;
import org.qinan.safetyeval.client.dto.SingleResponse; import org.qinan.safetyeval.client.dto.SingleResponse;
import org.qinan.safetyeval.client.dto.institution.EvalProjectMemberAddCmd; import org.qinan.safetyeval.client.dto.institution.EvalProjectMemberAddCmd;
import org.qinan.safetyeval.client.dto.institution.EvalProjectMemberModifyCmd;
import org.qinan.safetyeval.client.dto.institution.EvalProjectMemberPageQuery; import org.qinan.safetyeval.client.dto.institution.EvalProjectMemberPageQuery;
import java.util.List; import java.util.List;
public interface EvalProjectMemberApi { public interface EvalProjectMemberApi {
SingleResponse<EvalProjectMemberCO> save(EvalProjectMemberAddCmd cmd); SingleResponse<Boolean> save(List<EvalProjectMemberAddCmd> cmd);
SingleResponse<EvalProjectMemberCO> modify(EvalProjectMemberModifyCmd cmd);
SingleResponse<Void> delete(Long id);
SingleResponse<List<EvalProjectMemberCO>> listByProject(Long projectId);
PageResponse<EvalProjectMemberCO> page(EvalProjectMemberPageQuery query); PageResponse<EvalProjectMemberCO> page(EvalProjectMemberPageQuery query);
} }

View File

@ -3,6 +3,8 @@ package org.qinan.safetyeval.client.co.institution;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.util.List;
@Data @Data
public class EvalProjectMemberCO { public class EvalProjectMemberCO {
@ -18,12 +20,18 @@ public class EvalProjectMemberCO {
@ApiModelProperty("人员姓名") @ApiModelProperty("人员姓名")
private String personnelName; private String personnelName;
@ApiModelProperty(value = "项目角色编码LEADER项目负责人 PROCESS_OWNER过程控制负责人 RISK_OWNER风险分析负责人 CONTRACT_OWNER合同办理人 SURVEY_OWNER踏勘负责人 DRAFT_OWNER报告编制人 INTERNAL_REVIEWER内部审核人 TECH_REVIEWER技术审核人 MEMBER项目组成员", example = "LEADER") @ApiModelProperty("部门名称")
private String roleCode; private String deptName;
@ApiModelProperty(value = "项目角色名称:项目负责人/过程控制负责人/风险分析负责人/合同办理人/踏勘负责人/报告编制人/内部审核人/技术审核人/项目组成员", example = "项目负责人") @ApiModelProperty("岗位")
private String roleName; private String posName;
@ApiModelProperty(value = "是否负责人1是 2否", example = "2") @ApiModelProperty("人员能力")
private Integer leaderFlag; private String capacity;
@ApiModelProperty("职责")
private String responsibility;
@ApiModelProperty(value = "角色数组", example = "[\"角色1\",\"角色2\"]")
private List<String> role;
} }

View File

@ -3,21 +3,35 @@ package org.qinan.safetyeval.client.dto.institution;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.util.List;
@Data @Data
public class EvalProjectMemberAddCmd { public class EvalProjectMemberAddCmd {
// @ApiModelProperty("主键ID为空新增不为空修改")
// private String id;
@ApiModelProperty("项目ID") @ApiModelProperty("项目ID")
private String projectId; private String projectId;
@ApiModelProperty("人员ID") @ApiModelProperty("人员ID")
private String personnelId; private String personnelId;
@ApiModelProperty(value = "项目角色编码LEADER项目负责人 PROCESS_OWNER过程控制负责人 RISK_OWNER风险分析负责人 CONTRACT_OWNER合同办理人 SURVEY_OWNER踏勘负责人 DRAFT_OWNER报告编制人 INTERNAL_REVIEWER内部审核人 TECH_REVIEWER技术审核人 MEMBER项目组成员", example = "LEADER") @ApiModelProperty("人员姓名")
private String roleCode; private String personnelName;
@ApiModelProperty(value = "项目角色名称:项目负责人/过程控制负责人/风险分析负责人/合同办理人/踏勘负责人/报告编制人/内部审核人/技术审核人/项目组成员", example = "项目负责人") @ApiModelProperty("部门名称")
private String roleName; private String deptName;
@ApiModelProperty(value = "是否负责人1是 2否", example = "2") @ApiModelProperty("岗位")
private Integer leaderFlag; private String posName;
@ApiModelProperty("人员能力")
private String capacity;
@ApiModelProperty("职责")
private String responsibility;
@ApiModelProperty(value = "角色数组", example = "['1','2']")
private List<String> role;
} }

View File

@ -1,23 +0,0 @@
package org.qinan.safetyeval.client.dto.institution;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class EvalProjectMemberModifyCmd {
@ApiModelProperty("主键ID")
private String id;
@ApiModelProperty("人员ID")
private String personnelId;
@ApiModelProperty(value = "项目角色编码LEADER项目负责人 PROCESS_OWNER过程控制负责人 RISK_OWNER风险分析负责人 CONTRACT_OWNER合同办理人 SURVEY_OWNER踏勘负责人 DRAFT_OWNER报告编制人 INTERNAL_REVIEWER内部审核人 TECH_REVIEWER技术审核人 MEMBER项目组成员", example = "LEADER")
private String roleCode;
@ApiModelProperty(value = "项目角色名称:项目负责人/过程控制负责人/风险分析负责人/合同办理人/踏勘负责人/报告编制人/内部审核人/技术审核人/项目组成员", example = "项目负责人")
private String roleName;
@ApiModelProperty(value = "是否负责人1是 2否", example = "2")
private Integer leaderFlag;
}

View File

@ -0,0 +1,6 @@
package org.qinan.safetyeval.domain.constant;
public interface MsgConstant {
String MSG_TYPE_SYSTEM = "system";
Long MSG_TYPE_SYSTEM_ID = 0L;
}

View File

@ -2,6 +2,8 @@ package org.qinan.safetyeval.domain.entity;
import lombok.Data; import lombok.Data;
import java.util.List;
@Data @Data
public class EvalProjectMemberEntity { public class EvalProjectMemberEntity {
@ -10,8 +12,10 @@ public class EvalProjectMemberEntity {
private Long projectId; private Long projectId;
private Long personnelId; private Long personnelId;
private String personnelName; private String personnelName;
private String roleCode; private String deptName;
private String roleName; private String posName;
private Integer leaderFlag; private String capacity;
private String responsibility;
private List<String> role;
private Long tenantId; private Long tenantId;
} }

View File

@ -14,17 +14,7 @@ public interface EvalProjectMemberGateway {
EvalProjectMemberEntity modify(EvalProjectMemberEntity entity); EvalProjectMemberEntity modify(EvalProjectMemberEntity entity);
void delete(Long id);
PageResult<EvalProjectMemberEntity> page(EvalProjectMemberQuery query); PageResult<EvalProjectMemberEntity> page(EvalProjectMemberQuery query);
List<EvalProjectMemberEntity> listByProjectId(Long projectId, Long orgId); List<EvalProjectMemberEntity> listByProjectId(Long projectId, Long orgId);
List<EvalProjectMemberEntity> listByProjectIdAndRoleCode(Long projectId, String roleCode);
List<Long> listProjectIdsByPersonnelId(Long personnelId, Long orgId);
List<EvalProjectMemberEntity> listByPersonnelId(Long personnelId, Long orgId);
void clearLeadersOnProject(Long projectId, Long excludeMemberId, Long orgId);
} }

View File

@ -9,6 +9,4 @@ public class EvalProjectMemberQuery {
private Long pageSize; private Long pageSize;
private Long orgId; private Long orgId;
private Long projectId; private Long projectId;
private Long personnelId;
private String roleCode;
} }

View File

@ -1,15 +1,12 @@
package org.qinan.safetyeval.domain.service; package org.qinan.safetyeval.domain.service;
import org.qinan.safetyeval.domain.entity.EvalProjectMemberEntity; 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.BizException;
import org.qinan.safetyeval.domain.exception.ErrorCode; import org.qinan.safetyeval.domain.exception.ErrorCode;
import org.qinan.safetyeval.domain.gateway.EvalProjectMemberGateway; import org.qinan.safetyeval.domain.gateway.EvalProjectMemberGateway;
import org.qinan.safetyeval.domain.gateway.OrgPersonnelGateway;
import org.qinan.safetyeval.domain.query.EvalProjectMemberQuery; import org.qinan.safetyeval.domain.query.EvalProjectMemberQuery;
import org.qinan.safetyeval.domain.query.PageResult; import org.qinan.safetyeval.domain.query.PageResult;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.List; import java.util.List;
@ -17,22 +14,19 @@ import java.util.List;
@Service @Service
public class EvalProjectMemberDomainService { public class EvalProjectMemberDomainService {
private static final String ROLE_LEADER = "LEADER";
@Resource @Resource
private EvalProjectMemberGateway evalProjectMemberGateway; private EvalProjectMemberGateway evalProjectMemberGateway;
@Resource public EvalProjectMemberEntity saveOrUpdate(EvalProjectMemberEntity entity) {
private EvalProjectDomainService evalProjectDomainService; if (entity.getId() == null) {
return evalProjectMemberGateway.save(entity);
@Resource }
private OrgPersonnelGateway orgPersonnelGateway; EvalProjectMemberEntity existing = evalProjectMemberGateway.get(entity.getId());
if (existing == null) {
public EvalProjectMemberEntity add(EvalProjectMemberEntity entity, Long orgId) { throw new BizException(ErrorCode.EVAL_PROJECT_MEMBER_NOT_FOUND);
EvalProjectMemberEntity prepared = prepareMember(entity, orgId); }
EvalProjectMemberEntity saved = evalProjectMemberGateway.save(prepared); entity.setOrgId(existing.getOrgId());
syncLeader(saved, orgId); return evalProjectMemberGateway.modify(entity);
return saved;
} }
public EvalProjectMemberEntity get(Long id) { public EvalProjectMemberEntity get(Long id) {
@ -43,33 +37,6 @@ public class EvalProjectMemberDomainService {
return existing; return existing;
} }
public EvalProjectMemberEntity modify(EvalProjectMemberEntity entity, Long orgId) {
EvalProjectMemberEntity existing = get(entity.getId());
evalProjectDomainService.assertModifiable(evalProjectDomainService.get(existing.getProjectId()));
entity.setProjectId(existing.getProjectId());
entity.setOrgId(existing.getOrgId());
if (entity.getPersonnelId() != null) {
OrgPersonnelEntity personnel = requirePersonnelInOrg(entity.getPersonnelId(), orgId);
entity.setPersonnelName(personnel.getUserName());
} else {
entity.setPersonnelId(existing.getPersonnelId());
entity.setPersonnelName(existing.getPersonnelName());
}
normalizeLeaderFlag(entity);
EvalProjectMemberEntity saved = evalProjectMemberGateway.modify(entity);
syncLeader(saved, orgId);
return saved;
}
public void delete(Long id, Long orgId) {
EvalProjectMemberEntity existing = get(id);
evalProjectDomainService.assertModifiable(evalProjectDomainService.get(existing.getProjectId()));
evalProjectMemberGateway.delete(id);
if (isLeader(existing)) {
refreshProjectLeader(existing.getProjectId(), orgId);
}
}
public PageResult<EvalProjectMemberEntity> page(EvalProjectMemberQuery query) { public PageResult<EvalProjectMemberEntity> page(EvalProjectMemberQuery query) {
return evalProjectMemberGateway.page(query); return evalProjectMemberGateway.page(query);
} }
@ -77,75 +44,4 @@ public class EvalProjectMemberDomainService {
public List<EvalProjectMemberEntity> listByProjectId(Long projectId, Long orgId) { public List<EvalProjectMemberEntity> listByProjectId(Long projectId, Long orgId) {
return evalProjectMemberGateway.listByProjectId(projectId, orgId); return evalProjectMemberGateway.listByProjectId(projectId, orgId);
} }
public List<Long> listProjectIdsByPersonnelId(Long personnelId, Long orgId) {
return evalProjectMemberGateway.listProjectIdsByPersonnelId(personnelId, orgId);
}
public List<EvalProjectMemberEntity> listByPersonnelId(Long personnelId, Long orgId) {
return evalProjectMemberGateway.listByPersonnelId(personnelId, orgId);
}
private EvalProjectMemberEntity prepareMember(EvalProjectMemberEntity entity, Long orgId) {
evalProjectDomainService.assertModifiable(evalProjectDomainService.get(entity.getProjectId()));
entity.setOrgId(orgId);
OrgPersonnelEntity personnel = requirePersonnelInOrg(entity.getPersonnelId(), orgId);
entity.setPersonnelName(personnel.getUserName());
if (entity.getLeaderFlag() == null) {
entity.setLeaderFlag(2);
}
normalizeLeaderFlag(entity);
return entity;
}
private OrgPersonnelEntity requirePersonnelInOrg(Long personnelId, Long orgId) {
OrgPersonnelEntity personnel = orgPersonnelGateway.get(personnelId);
if (personnel == null) {
throw new BizException(ErrorCode.ORG_PERSONNEL_NOT_FOUND);
}
if (!orgId.equals(personnel.getOrgId())) {
throw new BizException(ErrorCode.EVAL_PERSONNEL_ORG_MISMATCH);
}
return personnel;
}
private void normalizeLeaderFlag(EvalProjectMemberEntity entity) {
if (isLeader(entity)) {
entity.setLeaderFlag(1);
if (!StringUtils.hasText(entity.getRoleCode())) {
entity.setRoleCode(ROLE_LEADER);
}
if (!StringUtils.hasText(entity.getRoleName())) {
entity.setRoleName("负责人");
}
} else if (entity.getLeaderFlag() == null) {
entity.setLeaderFlag(2);
}
}
private boolean isLeader(EvalProjectMemberEntity entity) {
return (entity.getLeaderFlag() != null && entity.getLeaderFlag() == 1)
|| ROLE_LEADER.equalsIgnoreCase(entity.getRoleCode());
}
private void syncLeader(EvalProjectMemberEntity member, Long orgId) {
if (isLeader(member)) {
evalProjectMemberGateway.clearLeadersOnProject(member.getProjectId(), member.getId(), orgId);
member.setLeaderFlag(1);
evalProjectMemberGateway.modify(member);
evalProjectDomainService.updateLeader(member.getProjectId(), member.getPersonnelId(), member.getPersonnelName());
} else {
refreshProjectLeader(member.getProjectId(), orgId);
}
}
private void refreshProjectLeader(Long projectId, Long orgId) {
List<EvalProjectMemberEntity> members = evalProjectMemberGateway.listByProjectId(projectId, orgId);
EvalProjectMemberEntity leader = members.stream().filter(this::isLeader).findFirst().orElse(null);
if (leader != null) {
evalProjectDomainService.updateLeader(projectId, leader.getPersonnelId(), leader.getPersonnelName());
} else {
evalProjectDomainService.updateLeader(projectId, null, null);
}
}
} }

View File

@ -1,16 +1,9 @@
package org.qinan.safetyeval.infrastructure.convertor; package org.qinan.safetyeval.infrastructure.convertor;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
import org.qinan.safetyeval.client.co.institution.EvalInternalReviewCO; import org.qinan.safetyeval.client.co.institution.EvalInternalReviewCO;
import org.qinan.safetyeval.client.co.institution.EvalProjectMemberCO;
import org.qinan.safetyeval.client.dto.institution.EvalInternalReviewAssignCmd;
import org.qinan.safetyeval.client.dto.institution.EvalInternalReviewConfirmCmd; import org.qinan.safetyeval.client.dto.institution.EvalInternalReviewConfirmCmd;
import org.qinan.safetyeval.domain.entity.EvalInternalReviewEntity; import org.qinan.safetyeval.domain.entity.EvalInternalReviewEntity;
import org.qinan.safetyeval.domain.entity.EvalProjectMemberEntity;
import java.util.List;
/** /**
* *
@ -20,14 +13,8 @@ public interface EvalInternalReviewConvertor {
EvalInternalReviewCO toInternalCO(EvalInternalReviewEntity entity); EvalInternalReviewCO toInternalCO(EvalInternalReviewEntity entity);
EvalProjectMemberCO toMemberCO(EvalProjectMemberEntity entity);
List<EvalProjectMemberCO> toMemberCOs(List<EvalProjectMemberEntity> entities);
/** /**
* ConfirmCmd entityprojectIdreviewerPersonnelId String Long * ConfirmCmd entityprojectIdreviewerPersonnelId String Long
*/ */
EvalInternalReviewEntity applyConfirmCmd(EvalInternalReviewConfirmCmd cmd); EvalInternalReviewEntity applyConfirmCmd(EvalInternalReviewConfirmCmd cmd);
} }

View File

@ -1,13 +1,37 @@
package org.qinan.safetyeval.infrastructure.convertor; package org.qinan.safetyeval.infrastructure.convertor;
import cn.hutool.json.JSONUtil;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.qinan.safetyeval.domain.entity.EvalProjectMemberEntity; import org.qinan.safetyeval.domain.entity.EvalProjectMemberEntity;
import org.qinan.safetyeval.infrastructure.dataobject.EvalProjectMemberDO; import org.qinan.safetyeval.infrastructure.dataobject.EvalProjectMemberDO;
import java.util.List;
@Mapper(componentModel = "spring") @Mapper(componentModel = "spring")
public interface EvalProjectMemberDoConvertor { public interface EvalProjectMemberDoConvertor {
@Mapping(target = "role", expression = "java(listToJson(entity.getRole()))")
@Mapping(target = "deleteEnum", ignore = true)
@Mapping(target = "remarks", ignore = true)
@Mapping(target = "createName", ignore = true)
@Mapping(target = "updateName", ignore = true)
@Mapping(target = "version", ignore = true)
@Mapping(target = "createTime", ignore = true)
@Mapping(target = "updateTime", ignore = true)
@Mapping(target = "createId", ignore = true)
@Mapping(target = "updateId", ignore = true)
@Mapping(target = "env", ignore = true)
EvalProjectMemberDO convertEToDo(EvalProjectMemberEntity entity); EvalProjectMemberDO convertEToDo(EvalProjectMemberEntity entity);
@Mapping(target = "role", expression = "java(jsonToList(dataObject.getRole()))")
EvalProjectMemberEntity convertDoToE(EvalProjectMemberDO dataObject); EvalProjectMemberEntity convertDoToE(EvalProjectMemberDO dataObject);
default String listToJson(List<String> list) {
return list == null ? null : JSONUtil.toJsonStr(list);
}
default List<String> jsonToList(String json) {
return json == null ? null : JSONUtil.toList(json, String.class);
}
} }

View File

@ -14,12 +14,16 @@ public class EvalProjectMemberDO {
private Long projectId; private Long projectId;
private Long personnelId; private Long personnelId;
private String personnelName; private String personnelName;
/** 项目角色编码LEADER项目负责人 PROCESS_OWNER过程控制负责人 RISK_OWNER风险分析负责人 CONTRACT_OWNER合同办理人 SURVEY_OWNER踏勘负责人 DRAFT_OWNER报告编制人 INTERNAL_REVIEWER内部审核人 TECH_REVIEWER技术审核人 MEMBER项目组成员示例LEADER */ private String deptName;
private String roleCode; private String posName;
/** 项目角色名称:项目负责人/过程控制负责人/风险分析负责人/合同办理人/踏勘负责人/报告编制人/内部审核人/技术审核人/项目组成员,示例:项目负责人 */ private String capacity;
private String roleName; private String responsibility;
/** 是否负责人1是 2否示例2 */ /**
private Integer leaderFlag; * 0: 1:
*/
private Integer msgSendState;
/** 角色 JSON 数组,示例:["角色1","角色2"] */
private String role;
private String deleteEnum; private String deleteEnum;
private String remarks; private String remarks;
private String createName; private String createName;

View File

@ -3,8 +3,11 @@ package org.qinan.safetyeval.infrastructure.gatewayimpl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.qinan.safetyeval.domain.constant.MsgConstant;
import org.qinan.safetyeval.domain.entity.EvalProjectMemberEntity; import org.qinan.safetyeval.domain.entity.EvalProjectMemberEntity;
import org.qinan.safetyeval.domain.entity.SafetyMessageEntity;
import org.qinan.safetyeval.domain.gateway.EvalProjectMemberGateway; import org.qinan.safetyeval.domain.gateway.EvalProjectMemberGateway;
import org.qinan.safetyeval.domain.gateway.SafetyMessageGateway;
import org.qinan.safetyeval.domain.query.EvalProjectMemberQuery; import org.qinan.safetyeval.domain.query.EvalProjectMemberQuery;
import org.qinan.safetyeval.domain.query.PageResult; import org.qinan.safetyeval.domain.query.PageResult;
import org.qinan.safetyeval.infrastructure.convertor.EvalProjectMemberDoConvertor; import org.qinan.safetyeval.infrastructure.convertor.EvalProjectMemberDoConvertor;
@ -12,10 +15,12 @@ import org.qinan.safetyeval.infrastructure.dataobject.EvalProjectMemberDO;
import org.qinan.safetyeval.infrastructure.mapper.EvalProjectMemberMapper; import org.qinan.safetyeval.infrastructure.mapper.EvalProjectMemberMapper;
import org.qinan.safetyeval.infrastructure.support.InsertFieldDefaults; import org.qinan.safetyeval.infrastructure.support.InsertFieldDefaults;
import org.qinan.safetyeval.infrastructure.support.OrgContextResolver; import org.qinan.safetyeval.infrastructure.support.OrgContextResolver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.Collections; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -31,12 +36,27 @@ public class EvalProjectMemberGatewayImpl implements EvalProjectMemberGateway {
@Resource @Resource
private EvalProjectMemberDoConvertor evalProjectMemberDoConvertor; private EvalProjectMemberDoConvertor evalProjectMemberDoConvertor;
@Autowired
private SafetyMessageGateway safetyMessageGateway;
@Override @Override
@Transactional(rollbackFor = Exception.class)
public EvalProjectMemberEntity save(EvalProjectMemberEntity entity) { public EvalProjectMemberEntity save(EvalProjectMemberEntity entity) {
EvalProjectMemberDO dataObject = toDO(entity); EvalProjectMemberDO dataObject = evalProjectMemberDoConvertor.convertEToDo(entity);
dataObject.setOrgId(orgContextResolver.resolveOrgId(entity.getOrgId()));
InsertFieldDefaults.apply(dataObject); InsertFieldDefaults.apply(dataObject);
evalProjectMemberMapper.insert(dataObject); evalProjectMemberMapper.insert(dataObject);
entity.setId(dataObject.getId()); entity.setId(dataObject.getId());
// 站内信通知
SafetyMessageEntity safetyMessageEntity = new SafetyMessageEntity();
safetyMessageEntity.setSendName(MsgConstant.MSG_TYPE_SYSTEM);
safetyMessageEntity.setSendId(MsgConstant.MSG_TYPE_SYSTEM_ID);
safetyMessageEntity.setSendType("系统发送");
safetyMessageEntity.setSendContent("您被添加为项目成员,请及时处理");
safetyMessageEntity.setReceiveId(entity.getPersonnelId());
safetyMessageEntity.setSendState(0);
safetyMessageEntity.setCreateTime(LocalDateTime.now());
safetyMessageGateway.save(safetyMessageEntity);
return entity; return entity;
} }
@ -50,19 +70,16 @@ public class EvalProjectMemberGatewayImpl implements EvalProjectMemberGateway {
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public EvalProjectMemberEntity modify(EvalProjectMemberEntity entity) { public EvalProjectMemberEntity modify(EvalProjectMemberEntity entity) {
EvalProjectMemberDO dataObject = toDO(entity); EvalProjectMemberDO dataObject = evalProjectMemberDoConvertor.convertEToDo(entity);
dataObject.setId(entity.getId()); dataObject.setId(entity.getId());
dataObject.setOrgId(orgContextResolver.resolveOrgId(entity.getOrgId()));
InsertFieldDefaults.applyForUpdate(dataObject); InsertFieldDefaults.applyForUpdate(dataObject);
evalProjectMemberMapper.updateById(dataObject); evalProjectMemberMapper.updateById(dataObject);
return get(entity.getId()); return get(entity.getId());
} }
@Override
public void delete(Long id) {
evalProjectMemberMapper.deleteById(id);
}
@Override @Override
public PageResult<EvalProjectMemberEntity> page(EvalProjectMemberQuery query) { public PageResult<EvalProjectMemberEntity> page(EvalProjectMemberQuery query) {
Page<EvalProjectMemberDO> page = new Page<>(query.getPageNum(), query.getPageSize()); Page<EvalProjectMemberDO> page = new Page<>(query.getPageNum(), query.getPageSize());
@ -83,60 +100,6 @@ public class EvalProjectMemberGatewayImpl implements EvalProjectMemberGateway {
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
@Override
public List<EvalProjectMemberEntity> listByProjectIdAndRoleCode(Long projectId, String roleCode) {
LambdaQueryWrapper<EvalProjectMemberDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(EvalProjectMemberDO::getDeleteEnum, "false");
wrapper.eq(EvalProjectMemberDO::getProjectId, projectId);
wrapper.eq(EvalProjectMemberDO::getRoleCode, roleCode);
wrapper.orderByDesc(EvalProjectMemberDO::getCreateTime);
return evalProjectMemberMapper.selectList(wrapper).stream()
.map(evalProjectMemberDoConvertor::convertDoToE)
.collect(Collectors.toList());
}
@Override
public List<Long> listProjectIdsByPersonnelId(Long personnelId, Long orgId) {
return listByPersonnelId(personnelId, orgId).stream()
.map(EvalProjectMemberEntity::getProjectId)
.distinct()
.collect(Collectors.toList());
}
@Override
public List<EvalProjectMemberEntity> listByPersonnelId(Long personnelId, Long orgId) {
if (personnelId == null) {
return Collections.emptyList();
}
EvalProjectMemberQuery query = new EvalProjectMemberQuery();
query.setPersonnelId(personnelId);
query.setOrgId(orgId);
return evalProjectMemberMapper.selectList(buildQueryWrapper(query)).stream()
.map(evalProjectMemberDoConvertor::convertDoToE)
.collect(Collectors.toList());
}
@Override
public void clearLeadersOnProject(Long projectId, Long excludeMemberId, Long orgId) {
LambdaQueryWrapper<EvalProjectMemberDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(EvalProjectMemberDO::getDeleteEnum, "false");
wrapper.eq(EvalProjectMemberDO::getProjectId, projectId);
wrapper.eq(EvalProjectMemberDO::getLeaderFlag, 1);
if (orgId != null) {
wrapper.eq(EvalProjectMemberDO::getOrgId, orgId);
}
if (excludeMemberId != null) {
wrapper.ne(EvalProjectMemberDO::getId, excludeMemberId);
}
List<EvalProjectMemberDO> leaders = evalProjectMemberMapper.selectList(wrapper);
for (EvalProjectMemberDO leader : leaders) {
leader.setLeaderFlag(2);
InsertFieldDefaults.applyForUpdate(leader);
evalProjectMemberMapper.updateById(leader);
}
}
private LambdaQueryWrapper<EvalProjectMemberDO> buildQueryWrapper(EvalProjectMemberQuery query) { private LambdaQueryWrapper<EvalProjectMemberDO> buildQueryWrapper(EvalProjectMemberQuery query) {
LambdaQueryWrapper<EvalProjectMemberDO> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<EvalProjectMemberDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(EvalProjectMemberDO::getDeleteEnum, "false"); wrapper.eq(EvalProjectMemberDO::getDeleteEnum, "false");
@ -146,19 +109,7 @@ public class EvalProjectMemberGatewayImpl implements EvalProjectMemberGateway {
if (query.getProjectId() != null) { if (query.getProjectId() != null) {
wrapper.eq(EvalProjectMemberDO::getProjectId, query.getProjectId()); wrapper.eq(EvalProjectMemberDO::getProjectId, query.getProjectId());
} }
if (query.getPersonnelId() != null) {
wrapper.eq(EvalProjectMemberDO::getPersonnelId, query.getPersonnelId());
}
if (query.getRoleCode() != null) {
wrapper.eq(EvalProjectMemberDO::getRoleCode, query.getRoleCode());
}
wrapper.orderByDesc(EvalProjectMemberDO::getCreateTime); wrapper.orderByDesc(EvalProjectMemberDO::getCreateTime);
return wrapper; return wrapper;
} }
private EvalProjectMemberDO toDO(EvalProjectMemberEntity entity) {
EvalProjectMemberDO dataObject = evalProjectMemberDoConvertor.convertEToDo(entity);
dataObject.setOrgId(orgContextResolver.resolveOrgId(entity.getOrgId()));
return dataObject;
}
} }

View File

@ -14,14 +14,10 @@ import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
/** /**
* LEADER DRAFT_OWNER *
*/ */
@Component @Component
public class NodeWriteAuthority { public class NodeWriteAuthority {
@ -59,26 +55,11 @@ public class NodeWriteAuthority {
} }
public boolean canWrite(Long projectId, Long orgId, String nodeCode) { public boolean canWrite(Long projectId, Long orgId, String nodeCode) {
Long personnelId = resolveCurrentPersonnelId();
if (personnelId == null) {
return false;
}
List<EvalProjectMemberEntity> members = evalProjectMemberDomainService.listByProjectId(projectId, orgId); List<EvalProjectMemberEntity> members = evalProjectMemberDomainService.listByProjectId(projectId, orgId);
if (CollectionUtils.isEmpty(members)) { if (CollectionUtils.isEmpty(members)) {
return EvalNodeCodes.NODE_03.equals(nodeCode) || EvalNodeCodes.SIGN.equals(nodeCode); return EvalNodeCodes.NODE_03.equals(nodeCode) || EvalNodeCodes.SIGN.equals(nodeCode);
} }
EvalProjectMemberEntity mine = members.stream() return isProjectMember(projectId, orgId);
.filter(m -> personnelId.equals(m.getPersonnelId()))
.findFirst()
.orElse(null);
if (mine == null) {
return false;
}
if (isLeader(mine)) {
return true;
}
Set<String> allowed = allowedRoles(nodeCode);
return allowed.contains(mine.getRoleCode());
} }
public void assertWrite(Long projectId, Long orgId, String nodeCode) { public void assertWrite(Long projectId, Long orgId, String nodeCode) {
@ -101,39 +82,4 @@ public class NodeWriteAuthority {
throw new BizException(ErrorCode.EVAL_NODE_FORBIDDEN); throw new BizException(ErrorCode.EVAL_NODE_FORBIDDEN);
} }
} }
private Set<String> allowedRoles(String nodeCode) {
if (!StringUtils.hasText(nodeCode)) {
return Collections.emptySet();
}
switch (nodeCode) {
case EvalNodeCodes.NODE_01:
return new HashSet<>(Arrays.asList(ROLE_RISK_OWNER, ROLE_LEADER));
case EvalNodeCodes.NODE_02:
return new HashSet<>(Arrays.asList(ROLE_CONTRACT_OWNER, ROLE_LEADER));
case EvalNodeCodes.NODE_03:
return new HashSet<>(Collections.singletonList(ROLE_LEADER));
case EvalNodeCodes.NODE_04:
return new HashSet<>(Arrays.asList(ROLE_SURVEY_OWNER, ROLE_LEADER));
case EvalNodeCodes.NODE_05:
return new HashSet<>(Arrays.asList(ROLE_DRAFT_OWNER, ROLE_LEADER));
case EvalNodeCodes.NODE_06:
return new HashSet<>(Arrays.asList(ROLE_INTERNAL_REVIEWER, ROLE_LEADER));
case EvalNodeCodes.NODE_07:
return new HashSet<>(Arrays.asList(ROLE_TECH_REVIEWER, ROLE_LEADER));
case EvalNodeCodes.NODE_08:
return new HashSet<>(Arrays.asList(ROLE_PROCESS_OWNER, ROLE_LEADER));
case EvalNodeCodes.SIGN:
return new HashSet<>(Arrays.asList(ROLE_LEADER, ROLE_DRAFT_OWNER, ROLE_MEMBER,
ROLE_RISK_OWNER, ROLE_CONTRACT_OWNER, ROLE_SURVEY_OWNER,
ROLE_INTERNAL_REVIEWER, ROLE_TECH_REVIEWER, ROLE_PROCESS_OWNER));
default:
return Collections.emptySet();
}
}
private boolean isLeader(EvalProjectMemberEntity member) {
return (member.getLeaderFlag() != null && member.getLeaderFlag() == 1)
|| ROLE_LEADER.equalsIgnoreCase(member.getRoleCode());
}
} }