dev
luotaiqian 2026-07-24 11:35:35 +08:00
parent 703a4d5264
commit 071fd41976
12 changed files with 226 additions and 33 deletions

View File

@ -9,19 +9,23 @@ import org.qinan.safetyeval.app.item.convertor.EvalReviewItemCmdConvertor;
import org.qinan.safetyeval.client.api.institution.EvalInternalReviewApi; import org.qinan.safetyeval.client.api.institution.EvalInternalReviewApi;
import org.qinan.safetyeval.client.co.institution.EvalInternalReviewCO; import org.qinan.safetyeval.client.co.institution.EvalInternalReviewCO;
import org.qinan.safetyeval.client.co.institution.EvalInternalReviewDetailCO; import org.qinan.safetyeval.client.co.institution.EvalInternalReviewDetailCO;
import org.qinan.safetyeval.client.co.institution.SignTaskPersonCo;
import org.qinan.safetyeval.client.dto.SingleResponse; import org.qinan.safetyeval.client.dto.SingleResponse;
import org.qinan.safetyeval.client.dto.institution.EvalInternalReviewAssignCmd; 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.client.dto.institution.EvalInternalReviewSaveCmd; import org.qinan.safetyeval.client.dto.institution.EvalInternalReviewSaveCmd;
import org.qinan.safetyeval.client.dto.institution.SignTaskPersonCmd;
import org.qinan.safetyeval.client.item.request.EvalReviewItemAddCmd; import org.qinan.safetyeval.client.item.request.EvalReviewItemAddCmd;
import org.qinan.safetyeval.client.item.response.EvalReviewItemCo; import org.qinan.safetyeval.client.item.response.EvalReviewItemCo;
import org.qinan.safetyeval.domain.constant.*; import org.qinan.safetyeval.domain.constant.*;
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.entity.EvalProjectMemberEntity;
import org.qinan.safetyeval.domain.entity.EvalSignTaskEntity;
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.EvalSignTaskGateway;
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;
@ -30,8 +34,10 @@ import org.qinan.safetyeval.infrastructure.convertor.EvalInternalReviewConvertor
import org.qinan.safetyeval.infrastructure.convertor.EvalProjectMemberDoConvertor; import org.qinan.safetyeval.infrastructure.convertor.EvalProjectMemberDoConvertor;
import org.qinan.safetyeval.infrastructure.dataobject.EvalInternalReviewDO; import org.qinan.safetyeval.infrastructure.dataobject.EvalInternalReviewDO;
import org.qinan.safetyeval.infrastructure.dataobject.EvalProjectMemberDO; import org.qinan.safetyeval.infrastructure.dataobject.EvalProjectMemberDO;
import org.qinan.safetyeval.infrastructure.dataobject.EvalSignTaskDO;
import org.qinan.safetyeval.infrastructure.mapper.EvalInternalReviewMapper; import org.qinan.safetyeval.infrastructure.mapper.EvalInternalReviewMapper;
import org.qinan.safetyeval.infrastructure.mapper.EvalProjectMemberMapper; import org.qinan.safetyeval.infrastructure.mapper.EvalProjectMemberMapper;
import org.qinan.safetyeval.infrastructure.mapper.EvalSignTaskMapper;
import org.qinan.safetyeval.infrastructure.persistence.queryservice.EvalReviewItemQueryService; import org.qinan.safetyeval.infrastructure.persistence.queryservice.EvalReviewItemQueryService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -66,6 +72,10 @@ public class EvalInternalReviewExecutor implements EvalInternalReviewApi {
private EvalProjectMemberMapper evalProjectMemberMapper; private EvalProjectMemberMapper evalProjectMemberMapper;
@Resource @Resource
private EvalProjectMemberDoConvertor evalProjectMemberDoConvertor; private EvalProjectMemberDoConvertor evalProjectMemberDoConvertor;
@Resource
private EvalSignTaskGateway evalSignTaskGateway;
@Resource
private EvalSignTaskMapper evalSignTaskMapper;
@Override @Override
public SingleResponse<EvalInternalReviewCO> getOrSave(EvalInternalReviewSaveCmd cmd) { public SingleResponse<EvalInternalReviewCO> getOrSave(EvalInternalReviewSaveCmd cmd) {
@ -162,18 +172,46 @@ public class EvalInternalReviewExecutor implements EvalInternalReviewApi {
entity.setReviewerSignatureTaskStatus(SignatureTaskStatusEnum.DISPATCHED.getCode()); entity.setReviewerSignatureTaskStatus(SignatureTaskStatusEnum.DISPATCHED.getCode());
evalInternalReviewGateway.save(entity); evalInternalReviewGateway.save(entity);
} else { } else {
// 已存在数据,若已下发则提示不要重复下发
if (SignatureTaskStatusEnum.DISPATCHED.getCode().equals(entity.getReviewerSignatureTaskStatus())) {
throw new BizException(ErrorCode.SIGN_TASK_ALREADY_DISPATCHED);
}
entity.setReviewerSignatureTaskStatus(SignatureTaskStatusEnum.DISPATCHED.getCode()); entity.setReviewerSignatureTaskStatus(SignatureTaskStatusEnum.DISPATCHED.getCode());
evalInternalReviewGateway.modify(entity); evalInternalReviewGateway.modify(entity);
} }
// todo 保存任务 // 保存签字任务到 eval_sign_task
upsertSignTask(entity.getId(), projectId, project.getOrgId(),
ProjectStageEnum.INTERNAL_REVIEW, cmd.getSignTaskPersonCmd());
return SingleResponse.success(); return SingleResponse.success();
} }
private void upsertSignTask(Long bizRefId, Long projectId, Long orgId,
ProjectStageEnum stage, SignTaskPersonCmd person) {
EvalSignTaskDO existTask = evalSignTaskMapper.selectOne(new LambdaQueryWrapper<EvalSignTaskDO>()
.select(EvalSignTaskDO::getId)
.eq(EvalSignTaskDO::getProjectId, projectId)
.eq(EvalSignTaskDO::getBizRefId, bizRefId)
.eq(EvalSignTaskDO::getDeleteEnum, BooleanQAEnum.FALSE.getValue())
.last(" limit 1 "));
if (existTask != null && existTask.getTaskStatusCode() != null && existTask.getTaskStatusCode() == 2) {
throw new BizException(ErrorCode.SIGN_TASK_ALREADY_COMPLETED);
}
if (existTask != null) {
EvalSignTaskDO update = new EvalSignTaskDO();
update.setId(existTask.getId());
update.setSignerPersonnelId(person.getSignerPersonnelId());
update.setTaskStatusCode(1);
evalSignTaskMapper.updateById(update);
} else {
EvalSignTaskDO task = new EvalSignTaskDO();
task.setOrgId(orgId);
task.setProjectId(projectId);
task.setNodeCode(stage.getNode());
task.setBizRefId(bizRefId);
task.setSignerPersonnelId(person.getSignerPersonnelId());
task.setTaskTitle(stage.getMsg() + "签字任务");
task.setTaskStatusCode(1);
evalSignTaskMapper.insert(task);
}
}
@Override @Override
public SingleResponse<EvalInternalReviewCO> getByProject(Long projectId) { public SingleResponse<EvalInternalReviewCO> getByProject(Long projectId) {
evalProjectNodeSupport.assertRead(projectId); evalProjectNodeSupport.assertRead(projectId);
@ -206,6 +244,9 @@ public class EvalInternalReviewExecutor implements EvalInternalReviewApi {
// 3. 通过内审记录id查询审核项列表 // 3. 通过内审记录id查询审核项列表
detailCO.setReviewItems(evalReviewItemQueryService.listByBizIdAndBizType( detailCO.setReviewItems(evalReviewItemQueryService.listByBizIdAndBizType(
entity.getId(), ReviewDimensionEnum.TypeEnum.EVAL_INTERNAL_REVIEW.getCode())); entity.getId(), ReviewDimensionEnum.TypeEnum.EVAL_INTERNAL_REVIEW.getCode()));
// 4. 查询签字任务人员
SignTaskPersonCo personCo = evalSignTaskMapper.selectSignerPerson(entity.getId(), projectId);
detailCO.setSignTaskPersonCo(personCo);
} else { } else {
// 未查询到内审记录,按审核维度枚举构建默认审核项 // 未查询到内审记录,按审核维度枚举构建默认审核项
detailCO.setReviewItems(ReviewDimensionEnum.getListByType(ReviewDimensionEnum.TypeEnum.EVAL_INTERNAL_REVIEW) detailCO.setReviewItems(ReviewDimensionEnum.getListByType(ReviewDimensionEnum.TypeEnum.EVAL_INTERNAL_REVIEW)

View File

@ -1,9 +1,9 @@
package org.qinan.safetyeval.app.executor.institution; package org.qinan.safetyeval.app.executor.institution;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.qinan.safetyeval.app.executor.institution.support.EvalCmdCopy; import org.qinan.safetyeval.app.executor.institution.support.EvalCmdCopy;
@ -39,9 +39,11 @@ import org.qinan.safetyeval.infrastructure.convertor.EvalProjectMemberDoConverto
import org.qinan.safetyeval.infrastructure.dataobject.EvalProcessControlDO; import org.qinan.safetyeval.infrastructure.dataobject.EvalProcessControlDO;
import org.qinan.safetyeval.infrastructure.dataobject.EvalProjectDocDO; import org.qinan.safetyeval.infrastructure.dataobject.EvalProjectDocDO;
import org.qinan.safetyeval.infrastructure.dataobject.EvalProjectMemberDO; import org.qinan.safetyeval.infrastructure.dataobject.EvalProjectMemberDO;
import org.qinan.safetyeval.infrastructure.dataobject.EvalSignTaskDO;
import org.qinan.safetyeval.infrastructure.mapper.EvalProcessControlMapper; import org.qinan.safetyeval.infrastructure.mapper.EvalProcessControlMapper;
import org.qinan.safetyeval.infrastructure.mapper.EvalProjectDocMapper; import org.qinan.safetyeval.infrastructure.mapper.EvalProjectDocMapper;
import org.qinan.safetyeval.infrastructure.mapper.EvalProjectMemberMapper; import org.qinan.safetyeval.infrastructure.mapper.EvalProjectMemberMapper;
import org.qinan.safetyeval.infrastructure.mapper.EvalSignTaskMapper;
import org.qinan.safetyeval.infrastructure.persistence.queryservice.*; import org.qinan.safetyeval.infrastructure.persistence.queryservice.*;
import org.qinan.safetyeval.infrastructure.support.InsertFieldDefaults; import org.qinan.safetyeval.infrastructure.support.InsertFieldDefaults;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -104,6 +106,8 @@ public class EvalProcessControlExecutor implements EvalProcessControlApi {
private EvalProcessControlMapper evalProcessControlMapper; private EvalProcessControlMapper evalProcessControlMapper;
@Resource @Resource
private EvalProjectDocMapper evalProjectDocMapper; private EvalProjectDocMapper evalProjectDocMapper;
@Resource
private EvalSignTaskMapper evalSignTaskMapper;
@Override @Override
public SingleResponse<EvalProcessControlCO> getOrSave(EvalProcessControlSaveCmd cmd) { public SingleResponse<EvalProcessControlCO> getOrSave(EvalProcessControlSaveCmd cmd) {
@ -190,17 +194,45 @@ public class EvalProcessControlExecutor implements EvalProcessControlApi {
entity.setReviewerSignatureTaskStatus(SignatureTaskStatusEnum.DISPATCHED.getCode()); entity.setReviewerSignatureTaskStatus(SignatureTaskStatusEnum.DISPATCHED.getCode());
evalProcessControlGateway.save(entity); evalProcessControlGateway.save(entity);
} else { } else {
// 已存在数据,若已下发则提示不要重复下发
if (SignatureTaskStatusEnum.DISPATCHED.getCode().equals(entity.getReviewerSignatureTaskStatus())) {
throw new BizException(ErrorCode.SIGN_TASK_ALREADY_DISPATCHED);
}
entity.setReviewerSignatureTaskStatus(SignatureTaskStatusEnum.DISPATCHED.getCode()); entity.setReviewerSignatureTaskStatus(SignatureTaskStatusEnum.DISPATCHED.getCode());
evalProcessControlGateway.modify(entity); evalProcessControlGateway.modify(entity);
} }
// todo 保存任务 // 保存签字任务到 eval_sign_task
upsertSignTask(entity.getId(), projectId, project.getOrgId(),
ProjectStageEnum.PROCESS_CONTROL, cmd.getSignTaskPersonCmd());
return SingleResponse.success(); return SingleResponse.success();
} }
private void upsertSignTask(Long bizRefId, Long projectId, Long orgId,
ProjectStageEnum stage, SignTaskPersonCmd person) {
EvalSignTaskDO existTask = evalSignTaskMapper.selectOne(new LambdaQueryWrapper<EvalSignTaskDO>()
.select(EvalSignTaskDO::getId)
.eq(EvalSignTaskDO::getProjectId, projectId)
.eq(EvalSignTaskDO::getBizRefId, bizRefId)
.eq(EvalSignTaskDO::getDeleteEnum, BooleanQAEnum.FALSE.getValue())
.last(" limit 1 "));
if (existTask != null && existTask.getTaskStatusCode() != null && existTask.getTaskStatusCode() == 2) {
throw new BizException(ErrorCode.SIGN_TASK_ALREADY_COMPLETED);
}
if (existTask != null) {
EvalSignTaskDO update = new EvalSignTaskDO();
update.setId(existTask.getId());
update.setSignerPersonnelId(person.getSignerPersonnelId());
update.setTaskStatusCode(1);
evalSignTaskMapper.updateById(update);
} else {
EvalSignTaskDO task = new EvalSignTaskDO();
task.setOrgId(orgId);
task.setProjectId(projectId);
task.setNodeCode(stage.getNode());
task.setBizRefId(bizRefId);
task.setSignerPersonnelId(person.getSignerPersonnelId());
task.setTaskTitle(stage.getMsg() + "签字任务");
task.setTaskStatusCode(1);
evalSignTaskMapper.insert(task);
}
}
@Override @Override
public SingleResponse<EvalProcessControlCO> getByProject(String projectId) { public SingleResponse<EvalProcessControlCO> getByProject(String projectId) {
Long pid = Long.parseLong(projectId); Long pid = Long.parseLong(projectId);
@ -235,6 +267,9 @@ public class EvalProcessControlExecutor implements EvalProcessControlApi {
// 3. 通过过程控制记录id查询审核项列表 // 3. 通过过程控制记录id查询审核项列表
detailCO.setReviewItems(evalReviewItemQueryService.listByBizIdAndBizType( detailCO.setReviewItems(evalReviewItemQueryService.listByBizIdAndBizType(
entity.getId(), ReviewDimensionEnum.TypeEnum.EVAL_PROCESS_CONTROL.getCode())); entity.getId(), ReviewDimensionEnum.TypeEnum.EVAL_PROCESS_CONTROL.getCode()));
// 4. 查询签字任务人员
SignTaskPersonCo personCo = evalSignTaskMapper.selectSignerPerson(entity.getId(), projectId);
detailCO.setSignTaskPersonCo(personCo);
} else { } else {
// 未查询到过程控制记录,按审核维度枚举构建默认审核项 // 未查询到过程控制记录,按审核维度枚举构建默认审核项
detailCO.setReviewItems(ReviewDimensionEnum.getListByType(ReviewDimensionEnum.TypeEnum.EVAL_PROCESS_CONTROL) detailCO.setReviewItems(ReviewDimensionEnum.getListByType(ReviewDimensionEnum.TypeEnum.EVAL_PROCESS_CONTROL)
@ -352,25 +387,24 @@ public class EvalProcessControlExecutor implements EvalProcessControlApi {
} }
String trimmed = raw.trim(); String trimmed = raw.trim();
JSONArray result = new JSONArray(); JSONArray result = new JSONArray();
if (trimmed.startsWith("[")) {
try { if (JSONUtil.isTypeJSONArray(trimmed)) {
JSONArray arr = JSON.parseArray(trimmed); // 字符串数组 ["url1","url2"] 或 对象数组 [{"url":"xxx","name":"xxx"}]
for (int i = 0; i < arr.size(); i++) { JSONArray arr = JSONUtil.parseArray(trimmed);
Object item = arr.get(i); for (Object item : arr) {
if (item instanceof JSONObject) { if (item instanceof JSONObject) {
result.add(item); // 已是 {url, name} 对象,直接保留
} else { result.add(item);
result.add(buildUrlNameObj(String.valueOf(item))); } else {
} // 字符串元素,构造为 {url, name}
result.add(buildUrlNameObj(String.valueOf(item)));
} }
co.setProjectDocUrl(result.toJSONString());
return;
} catch (Exception ignored) {
// 非合法JSON数组按纯字符串处理
} }
} else {
// 纯字符串URL
result.add(buildUrlNameObj(trimmed));
} }
result.add(buildUrlNameObj(trimmed)); co.setProjectDocUrl(result.toString());
co.setProjectDocUrl(result.toJSONString());
} }
private JSONObject buildUrlNameObj(String url) { private JSONObject buildUrlNameObj(String url) {

View File

@ -8,10 +8,12 @@ import org.qinan.safetyeval.app.item.convertor.EvalReviewItemCmdConvertor;
import org.qinan.safetyeval.client.api.institution.EvalTechReviewApi; import org.qinan.safetyeval.client.api.institution.EvalTechReviewApi;
import org.qinan.safetyeval.client.co.institution.EvalTechReviewCO; import org.qinan.safetyeval.client.co.institution.EvalTechReviewCO;
import org.qinan.safetyeval.client.co.institution.EvalTechReviewDetailCO; import org.qinan.safetyeval.client.co.institution.EvalTechReviewDetailCO;
import org.qinan.safetyeval.client.co.institution.SignTaskPersonCo;
import org.qinan.safetyeval.client.dto.SingleResponse; import org.qinan.safetyeval.client.dto.SingleResponse;
import org.qinan.safetyeval.client.dto.institution.EvalTechReviewAssignCmd; import org.qinan.safetyeval.client.dto.institution.EvalTechReviewAssignCmd;
import org.qinan.safetyeval.client.dto.institution.EvalTechReviewConfirmCmd; import org.qinan.safetyeval.client.dto.institution.EvalTechReviewConfirmCmd;
import org.qinan.safetyeval.client.dto.institution.EvalTechReviewSaveCmd; import org.qinan.safetyeval.client.dto.institution.EvalTechReviewSaveCmd;
import org.qinan.safetyeval.client.dto.institution.SignTaskPersonCmd;
import org.qinan.safetyeval.client.item.request.EvalReviewItemAddCmd; import org.qinan.safetyeval.client.item.request.EvalReviewItemAddCmd;
import org.qinan.safetyeval.client.item.response.EvalReviewItemCo; import org.qinan.safetyeval.client.item.response.EvalReviewItemCo;
import org.qinan.safetyeval.domain.constant.*; import org.qinan.safetyeval.domain.constant.*;
@ -28,8 +30,10 @@ import org.qinan.safetyeval.domain.support.EvalNodeCodes;
import org.qinan.safetyeval.infrastructure.convertor.EvalProjectMemberDoConvertor; import org.qinan.safetyeval.infrastructure.convertor.EvalProjectMemberDoConvertor;
import org.qinan.safetyeval.infrastructure.convertor.EvalTechReviewConvertor; import org.qinan.safetyeval.infrastructure.convertor.EvalTechReviewConvertor;
import org.qinan.safetyeval.infrastructure.dataobject.EvalProjectMemberDO; import org.qinan.safetyeval.infrastructure.dataobject.EvalProjectMemberDO;
import org.qinan.safetyeval.infrastructure.dataobject.EvalSignTaskDO;
import org.qinan.safetyeval.infrastructure.dataobject.EvalTechReviewDO; import org.qinan.safetyeval.infrastructure.dataobject.EvalTechReviewDO;
import org.qinan.safetyeval.infrastructure.mapper.EvalProjectMemberMapper; import org.qinan.safetyeval.infrastructure.mapper.EvalProjectMemberMapper;
import org.qinan.safetyeval.infrastructure.mapper.EvalSignTaskMapper;
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.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -65,6 +69,8 @@ public class EvalTechReviewExecutor implements EvalTechReviewApi {
private ProjectStageSyncService projectStageSyncService; private ProjectStageSyncService projectStageSyncService;
@Resource @Resource
private EvalTechReviewMapper evalTechReviewMapper; private EvalTechReviewMapper evalTechReviewMapper;
@Resource
private EvalSignTaskMapper evalSignTaskMapper;
@Override @Override
public SingleResponse<EvalTechReviewCO> getOrSave(EvalTechReviewSaveCmd cmd) { public SingleResponse<EvalTechReviewCO> getOrSave(EvalTechReviewSaveCmd cmd) {
@ -170,17 +176,45 @@ public class EvalTechReviewExecutor implements EvalTechReviewApi {
entity.setReviewerSignatureTaskStatus(SignatureTaskStatusEnum.DISPATCHED.getCode()); entity.setReviewerSignatureTaskStatus(SignatureTaskStatusEnum.DISPATCHED.getCode());
evalTechReviewGateway.save(entity); evalTechReviewGateway.save(entity);
} else { } else {
// 已存在数据,若已下发则提示不要重复下发
if (SignatureTaskStatusEnum.DISPATCHED.getCode().equals(entity.getReviewerSignatureTaskStatus())) {
throw new BizException(ErrorCode.SIGN_TASK_ALREADY_DISPATCHED);
}
entity.setReviewerSignatureTaskStatus(SignatureTaskStatusEnum.DISPATCHED.getCode()); entity.setReviewerSignatureTaskStatus(SignatureTaskStatusEnum.DISPATCHED.getCode());
evalTechReviewGateway.modify(entity); evalTechReviewGateway.modify(entity);
} }
// todo 保存任务 // 保存签字任务到 eval_sign_task
upsertSignTask(entity.getId(), projectId, project.getOrgId(),
ProjectStageEnum.TECHNICAL_REVIEW, cmd.getSignTaskPersonCmd());
return SingleResponse.success(); return SingleResponse.success();
} }
private void upsertSignTask(Long bizRefId, Long projectId, Long orgId,
ProjectStageEnum stage, SignTaskPersonCmd person) {
EvalSignTaskDO existTask = evalSignTaskMapper.selectOne(new LambdaQueryWrapper<EvalSignTaskDO>()
.select(EvalSignTaskDO::getId)
.eq(EvalSignTaskDO::getProjectId, projectId)
.eq(EvalSignTaskDO::getBizRefId, bizRefId)
.eq(EvalSignTaskDO::getDeleteEnum, BooleanQAEnum.FALSE.getValue())
.last(" limit 1 "));
if (existTask != null && existTask.getTaskStatusCode() != null && existTask.getTaskStatusCode() == 2) {
throw new BizException(ErrorCode.SIGN_TASK_ALREADY_COMPLETED);
}
if (existTask != null) {
EvalSignTaskDO update = new EvalSignTaskDO();
update.setId(existTask.getId());
update.setSignerPersonnelId(person.getSignerPersonnelId());
update.setTaskStatusCode(1);
evalSignTaskMapper.updateById(update);
} else {
EvalSignTaskDO task = new EvalSignTaskDO();
task.setOrgId(orgId);
task.setProjectId(projectId);
task.setNodeCode(stage.getNode());
task.setBizRefId(bizRefId);
task.setSignerPersonnelId(person.getSignerPersonnelId());
task.setTaskTitle(stage.getMsg() + "签字任务");
task.setTaskStatusCode(1);
evalSignTaskMapper.insert(task);
}
}
@Override @Override
public SingleResponse<EvalTechReviewDetailCO> getDetailByProject(Long projectId) { public SingleResponse<EvalTechReviewDetailCO> getDetailByProject(Long projectId) {
// 1. 查询项目成员中的技审人信息role包含TECHNICAL_LEAD // 1. 查询项目成员中的技审人信息role包含TECHNICAL_LEAD
@ -194,6 +228,9 @@ public class EvalTechReviewExecutor implements EvalTechReviewApi {
detailCO.setTechReview(evalTechReviewConvertor.toTechCO(entity)); detailCO.setTechReview(evalTechReviewConvertor.toTechCO(entity));
// 3. 通过技审记录id查询审核项列表 // 3. 通过技审记录id查询审核项列表
detailCO.setReviewItems(evalReviewItemQueryService.listByBizIdAndBizType(entity.getId(), ReviewDimensionEnum.TypeEnum.EVAL_TECH_REVIEW.getCode())); detailCO.setReviewItems(evalReviewItemQueryService.listByBizIdAndBizType(entity.getId(), ReviewDimensionEnum.TypeEnum.EVAL_TECH_REVIEW.getCode()));
// 4. 查询签字任务人员
SignTaskPersonCo personCo = evalSignTaskMapper.selectSignerPerson(entity.getId(), projectId);
detailCO.setSignTaskPersonCo(personCo);
} else { } else {
// 未查询到技审记录,按审核维度枚举构建默认审核项 // 未查询到技审记录,按审核维度枚举构建默认审核项
detailCO.setReviewItems(ReviewDimensionEnum.getListByType(ReviewDimensionEnum.TypeEnum.EVAL_TECH_REVIEW).stream().map(dimension -> { detailCO.setReviewItems(ReviewDimensionEnum.getListByType(ReviewDimensionEnum.TypeEnum.EVAL_TECH_REVIEW).stream().map(dimension -> {

View File

@ -20,4 +20,7 @@ public class EvalInternalReviewDetailCO {
@ApiModelProperty("审核项列表") @ApiModelProperty("审核项列表")
private List<EvalReviewItemCo> reviewItems; private List<EvalReviewItemCo> reviewItems;
@ApiModelProperty("签字任务人员")
private SignTaskPersonCo signTaskPersonCo;
} }

View File

@ -20,4 +20,7 @@ public class EvalProcessControlDetailCO {
@ApiModelProperty("审核项列表") @ApiModelProperty("审核项列表")
private List<EvalReviewItemCo> reviewItems; private List<EvalReviewItemCo> reviewItems;
@ApiModelProperty("签字任务人员")
private SignTaskPersonCo signTaskPersonCo;
} }

View File

@ -20,4 +20,7 @@ public class EvalTechReviewDetailCO {
@ApiModelProperty("审核项列表") @ApiModelProperty("审核项列表")
private List<EvalReviewItemCo> reviewItems; private List<EvalReviewItemCo> reviewItems;
@ApiModelProperty("签字任务人员")
private SignTaskPersonCo signTaskPersonCo;
} }

View File

@ -0,0 +1,14 @@
package org.qinan.safetyeval.client.co.institution;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class SignTaskPersonCo {
@ApiModelProperty("待签人员id")
private Long signerPersonnelId;
@ApiModelProperty("待签人员姓名")
private String signerName;
}

View File

@ -120,6 +120,7 @@ public enum ErrorCode {
ASSIGN_SIGN_TASK("04-02-001", "请先下发签字任务"), ASSIGN_SIGN_TASK("04-02-001", "请先下发签字任务"),
SIGN_TASK_NOT_COMPLETE("04-02-002", "签字任务未完成"), SIGN_TASK_NOT_COMPLETE("04-02-002", "签字任务未完成"),
SIGN_TASK_ALREADY_DISPATCHED("04-02-003", "签字任务已下发,请勿重复下发"), SIGN_TASK_ALREADY_DISPATCHED("04-02-003", "签字任务已下发,请勿重复下发"),
SIGN_TASK_ALREADY_COMPLETED("04-02-004", "签字任务已完成,无法再次下发"),
// gbs // gbs
GBS_USER_ERROR("04-01-001", "gbs用户未登录"), GBS_USER_ERROR("04-01-001", "gbs用户未登录"),

View File

@ -11,4 +11,9 @@ public interface EvalSignTaskGateway {
EvalSignTaskEntity get(Long id); EvalSignTaskEntity get(Long id);
PageResult<EvalSignTaskEntity> page(EvalSignTaskQuery query); PageResult<EvalSignTaskEntity> page(EvalSignTaskQuery query);
/**
* ID
*/
EvalSignTaskEntity getByBizRefIdAndType(Long bizRefId, String bizTypeCode, Long projectId);
} }

View File

@ -10,6 +10,7 @@ import org.qinan.safetyeval.domain.query.PageResult;
import org.qinan.safetyeval.infrastructure.convertor.EvalSignTaskDoConvertor; import org.qinan.safetyeval.infrastructure.convertor.EvalSignTaskDoConvertor;
import org.qinan.safetyeval.infrastructure.dataobject.EvalSignTaskDO; import org.qinan.safetyeval.infrastructure.dataobject.EvalSignTaskDO;
import org.qinan.safetyeval.infrastructure.mapper.EvalSignTaskMapper; import org.qinan.safetyeval.infrastructure.mapper.EvalSignTaskMapper;
import org.qinan.safetyeval.infrastructure.support.EvalBeanCopy;
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.stereotype.Component; import org.springframework.stereotype.Component;
@ -74,4 +75,27 @@ public class EvalSignTaskGatewayImpl implements EvalSignTaskGateway {
wrapper.orderByDesc(EvalSignTaskDO::getCreateTime); wrapper.orderByDesc(EvalSignTaskDO::getCreateTime);
return wrapper; return wrapper;
} }
@Override
public EvalSignTaskEntity getByBizRefIdAndType(Long bizRefId, String bizTypeCode, Long projectId) {
EvalSignTaskDO dataObject = evalSignTaskMapper.selectOne(new LambdaQueryWrapper<EvalSignTaskDO>()
.eq(EvalSignTaskDO::getDeleteEnum, "false")
.eq(EvalSignTaskDO::getBizRefId, bizRefId)
.eq(EvalSignTaskDO::getProjectId, projectId)
.last("LIMIT 1"));
return toEntity(dataObject);
}
private EvalSignTaskDO toDO(EvalSignTaskEntity entity) {
EvalSignTaskDO dataObject = EvalBeanCopy.toNew(entity, EvalSignTaskDO.class);
dataObject.setOrgId(orgContextResolver.resolveOrgId(entity.getOrgId()));
return dataObject;
}
private EvalSignTaskEntity toEntity(EvalSignTaskDO dataObject) {
if (dataObject == null) {
return null;
}
return EvalBeanCopy.toNew(dataObject, EvalSignTaskEntity.class);
}
} }

View File

@ -2,8 +2,19 @@ package org.qinan.safetyeval.infrastructure.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.qinan.safetyeval.client.co.institution.SignTaskPersonCo;
import org.qinan.safetyeval.infrastructure.dataobject.EvalSignTaskDO; import org.qinan.safetyeval.infrastructure.dataobject.EvalSignTaskDO;
@Mapper @Mapper
public interface EvalSignTaskMapper extends BaseMapper<EvalSignTaskDO> { public interface EvalSignTaskMapper extends BaseMapper<EvalSignTaskDO> {
/**
* org_personnel id +
*
* @param bizRefId ID
* @param projectId ID
* @return
*/
SignTaskPersonCo selectSignerPerson(@Param("bizRefId") Long bizRefId, @Param("projectId") Long projectId);
} }

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.qinan.safetyeval.infrastructure.mapper.EvalSignTaskMapper">
<!-- 关联 org_personnel 查询签字人员信息id + 姓名) -->
<select id="selectSignerPerson" resultType="org.qinan.safetyeval.client.co.institution.SignTaskPersonCo">
SELECT t.signer_personnel_id AS signerPersonnelId,
p.user_name AS signerName
FROM eval_sign_task t
LEFT JOIN org_personnel p ON p.id = t.signer_personnel_id
WHERE t.biz_ref_id = #{bizRefId}
AND t.project_id = #{projectId}
AND t.delete_enum = 'false'
LIMIT 1
</select>
</mapper>