Merge remote-tracking branch 'origin/master'

This commit is contained in:
ys.git 2025-12-15 15:51:47 +08:00
commit 153ddc2df1
4 changed files with 110 additions and 28 deletions

View File

@ -29,7 +29,7 @@ public class ParameterForm {
private String numberOrFormula; private String numberOrFormula;
@NotBlank(message = "部门不能为空") @NotBlank(message = "部门不能为空")
private String department; private String department;
private String remarks; private String remarks;

View File

@ -4,6 +4,7 @@ import cn.hutool.core.codec.Base64;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSON;
import com.xdap.runtime.service.RuntimeAppContextService; import com.xdap.runtime.service.RuntimeAppContextService;
import com.xdap.self_development.common.UserPermissionGetter;
import com.xdap.self_development.config.BusinessDatabase; import com.xdap.self_development.config.BusinessDatabase;
import com.xdap.self_development.controller.form.BenchmarkingReportPageForm; import com.xdap.self_development.controller.form.BenchmarkingReportPageForm;
import com.xdap.self_development.controller.form.HandleApprovalRequest; import com.xdap.self_development.controller.form.HandleApprovalRequest;
@ -14,14 +15,12 @@ import com.xdap.self_development.feign.ApaasMyTokenFeign;
import com.xdap.self_development.feign.dto.AppTokenDTO; import com.xdap.self_development.feign.dto.AppTokenDTO;
import com.xdap.self_development.feign.dto.FileUploadDTO; import com.xdap.self_development.feign.dto.FileUploadDTO;
import com.xdap.self_development.feign.dto.UserTokenDT0; import com.xdap.self_development.feign.dto.UserTokenDT0;
import com.xdap.self_development.pojo.ApprovalFlow; import com.xdap.self_development.pojo.*;
import com.xdap.self_development.pojo.ApprovalRecord;
import com.xdap.self_development.pojo.ApprovalXdapUsers;
import com.xdap.self_development.pojo.BenchmarkingReport;
import com.xdap.self_development.pojo.view.ApprovalFlowView; import com.xdap.self_development.pojo.view.ApprovalFlowView;
import com.xdap.self_development.pojo.view.ApprovalNodeView; import com.xdap.self_development.pojo.view.ApprovalNodeView;
import com.xdap.self_development.pojo.view.TodoAndReportView; import com.xdap.self_development.pojo.view.TodoAndReportView;
import com.xdap.self_development.service.BenchmarkingReportService; import com.xdap.self_development.service.BenchmarkingReportService;
import com.xdap.self_development.service.XdapDeptUsersService;
import com.xdap.self_development.utils.RedisLockUtil; import com.xdap.self_development.utils.RedisLockUtil;
import org.bson.types.ObjectId; import org.bson.types.ObjectId;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
@ -50,6 +49,10 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
private ApaasMyTokenFeign apaasMyTokenFeign; private ApaasMyTokenFeign apaasMyTokenFeign;
@Resource @Resource
private RedisLockUtil redisLockUtil; private RedisLockUtil redisLockUtil;
@Resource
private UserPermissionGetter permissionGetter;
@Resource
private XdapDeptUsersService xdapDeptUsersService;
@Value("${apaas.token.clientId}") @Value("${apaas.token.clientId}")
private String clientId; private String clientId;
@ -88,12 +91,42 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
flow.setExplanation(form.getExplanation()); flow.setExplanation(form.getExplanation());
bd.getBusinessDatabase().doInsert(flow); bd.getBusinessDatabase().doInsert(flow);
// 新增待办
List<TodoTaskPojo> list = new ArrayList<>();
for (String person : form.getProofreadUsers()) {
TodoTaskPojo todoTask = new TodoTaskPojo();
todoTask.setCreatedById(permissionGetter.getCurrentUserId());
todoTask.setCreatedBy(xdapDeptUsersService.selectUserByID(permissionGetter.getCurrentUserId()).getUsername());
todoTask.setCurrentNode(getNodeName(flow.getCurrentNode()));
todoTask.setDataType("-");
todoTask.setDocumentNo(flow.getId());
todoTask.setCreationDate(Timestamp.valueOf(LocalDateTime.now()));
todoTask.setIsDelete(0);
todoTask.setModelId(report.getId());
todoTask.setModelName(report.getProjectName()+"对标报告");
todoTask.setProcessTitle("对标报告审核");
todoTask.setStatusCode(flow.getFlowStatus());
todoTask.setVersionNumber(1);
todoTask.setOwnerId(person);
list.add(todoTask);
}
bd.getBusinessDatabase().doBatchInsert(list);
// 3. 初始化Redis待办信息(校对节点) // 3. 初始化Redis待办信息(校对节点)
form.getProofreadUsers().forEach(userId -> { form.getProofreadUsers().forEach(userId -> {
redisTemplate.opsForSet().add(TODO_PREFIX + userId, flow.getId()); redisTemplate.opsForSet().add(TODO_PREFIX + userId, flow.getId());
}); });
} }
private String getNodeName(String node) {
switch (node) {
case "PROOFREAD": return "校对";
case "REVIEW": return "审核";
case "APPROVE": return "批准";
default: return "-";
}
}
@Override @Override
public void restartReportApproval(UpdateBenchmarkingReportForm form) { public void restartReportApproval(UpdateBenchmarkingReportForm form) {
BenchmarkingReport originalReport = bd.getBusinessDatabase() BenchmarkingReport originalReport = bd.getBusinessDatabase()
@ -287,7 +320,8 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
} }
} }
private void processApprovalLogic(ApprovalFlow flow, HandleApprovalRequest request, String currentNode) { @Transactional(rollbackFor = CommonException.class)
public void processApprovalLogic(ApprovalFlow flow, HandleApprovalRequest request, String currentNode) {
// 记录审批结果 // 记录审批结果
ApprovalRecord record = new ApprovalRecord(); ApprovalRecord record = new ApprovalRecord();
record.setFlowId(flow.getId()); record.setFlowId(flow.getId());
@ -300,6 +334,16 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
redisTemplate.opsForSet().add(NODE_PROCESSED_PREFIX + flow.getId() + ":" + currentNode, redisTemplate.opsForSet().add(NODE_PROCESSED_PREFIX + flow.getId() + ":" + currentNode,
request.getUserId()); request.getUserId());
bd.getBusinessDatabase()
.eq("document_no", flow.getId())
.eq("owner_id", permissionGetter.getCurrentUserId())
.update("is_delete", 1)
.doUpdate(TodoTaskPojo.class);
bd.getBusinessDatabase()
.eq("document_no", flow.getId())
.ne("owner_id", permissionGetter.getCurrentUserId())
.update("is_delete", 2)
.doDelete(TodoTaskPojo.class);
// 处理驳回逻辑 // 处理驳回逻辑
if ("REJECT".equals(request.getResult())) { if ("REJECT".equals(request.getResult())) {
@ -334,7 +378,7 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
clearProcessed(flow); clearProcessed(flow);
} else { } else {
flow.setCurrentNode(nextNode); flow.setCurrentNode(nextNode);
addNodeTodo(flow, nextNode); addNodeTodo(flow, nextNode, report);
} }
bd.getBusinessDatabase() bd.getBusinessDatabase()
@ -358,11 +402,31 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
} }
} }
private void addNodeTodo(ApprovalFlow flow, String node) { private void addNodeTodo(ApprovalFlow flow, String node, BenchmarkingReport report) {
List<String> users = getNodeUsers(flow, node); List<String> users = getNodeUsers(flow, node);
users.forEach(userId -> { users.forEach(userId -> {
redisTemplate.opsForSet().add(TODO_PREFIX+ userId, flow.getId()); redisTemplate.opsForSet().add(TODO_PREFIX+ userId, flow.getId());
}); });
// 新增待办
List<TodoTaskPojo> list = new ArrayList<>();
for (String person : users) {
TodoTaskPojo todoTask = new TodoTaskPojo();
todoTask.setCreatedById(permissionGetter.getCurrentUserId());
todoTask.setCreatedBy(xdapDeptUsersService.selectUserByID(permissionGetter.getCurrentUserId()).getUsername());
todoTask.setCurrentNode(getNodeName(flow.getCurrentNode()));
todoTask.setDataType("-");
todoTask.setDocumentNo(flow.getId());
todoTask.setCreationDate(Timestamp.valueOf(LocalDateTime.now()));
todoTask.setIsDelete(0);
todoTask.setModelId(report.getId());
todoTask.setModelName(report.getProjectName()+"对标报告");
todoTask.setProcessTitle("对标报告审核");
todoTask.setStatusCode(flow.getFlowStatus());
todoTask.setVersionNumber(1);
todoTask.setOwnerId(person);
list.add(todoTask);
}
bd.getBusinessDatabase().doBatchInsert(list);
} }
private boolean checkNodeComplete(ApprovalFlow flow, String node) { private boolean checkNodeComplete(ApprovalFlow flow, String node) {
@ -410,6 +474,12 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
clearNodeTodo(flow, "PROOFREAD"); clearNodeTodo(flow, "PROOFREAD");
clearNodeTodo(flow, "REVIEW"); clearNodeTodo(flow, "REVIEW");
clearNodeTodo(flow, "APPROVE"); clearNodeTodo(flow, "APPROVE");
// 清除已有待办
bd.getBusinessDatabase()
.eq("document_no", flow.getId())
.ne("owner_id", permissionGetter.getCurrentUserId())
.update("is_delete", 2)
.doDelete(TodoTaskPojo.class);
} }
private void clearProcessed(ApprovalFlow flow) { private void clearProcessed(ApprovalFlow flow) {

View File

@ -117,7 +117,7 @@ public class ParameterServiceImpl implements ParameterService {
private void validateTemplateStatus(TemplateBenchmark benchmark) { private void validateTemplateStatus(TemplateBenchmark benchmark) {
// 当前修改的模板不为最新版 // 当前修改的模板不为最新版
if (!Objects.equals(benchmark.getLastTemplate().getId(), benchmark.getBaseTemplate().getId())) { if (!Objects.equals(benchmark.getLastTemplate().getId(), benchmark.getBaseTemplate().getId())) {
throw new CommonException("状态的模板不可修改"); throw new CommonException("模板不可修改,请修改最新版本");
} }
// 校验模板状态仅允许草稿/已发布 // 校验模板状态仅允许草稿/已发布
@ -336,15 +336,18 @@ public class ParameterServiceImpl implements ParameterService {
// 如果是原模板就更新 // 如果是原模板就更新
if (Objects.equals(baseTemplate.getId(), newTemplate.getId())) { if (Objects.equals(baseTemplate.getId(), newTemplate.getId())) {
BeanUtils.copyProperties(form, updatedParameter); BeanUtils.copyProperties(form, updatedParameter);
updatedParameter.setId(originalParameter.getId()); updatedParameter.setId(null);
updatedParameter.setCreatedBy(permissionGetter.getCurrentUserId()); updatedParameter.setCreatedBy(permissionGetter.getCurrentUserId());
detail = getParameterChange(originalParameter, updatedParameter); detail = getParameterChange(originalParameter, updatedParameter);
bd.getBusinessDatabase().rowid("id", originalParameter.getRowId()).doUpdate(updatedParameter); bd.getBusinessDatabase()
.rowid("id", originalParameter.getRowId())
.doUpdate(updatedParameter);
} }
// 如果是新模板就新增 // 如果是新模板就新增
else { else {
BeanUtils.copyProperties(form, updatedParameter); BeanUtils.copyProperties(form, updatedParameter);
updatedParameter.setCreatedBy(permissionGetter.getCurrentUserId()); updatedParameter.setCreatedBy(permissionGetter.getCurrentUserId());
updatedParameter.setId(null);
detail = getParameterChange(originalParameter, updatedParameter); detail = getParameterChange(originalParameter, updatedParameter);
bd.getBusinessDatabase().doInsert(updatedParameter); bd.getBusinessDatabase().doInsert(updatedParameter);
} }

View File

@ -198,7 +198,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
throw new CommonException("无权限处理或已被处理"); throw new CommonException("无权限处理或已被处理");
} }
// 签节点 // 签节点
if (!"COUNTERSIGN".equals(currentNode)) { if (!"COUNTERSIGN".equals(currentNode)) {
String lockKey = FLOW_LOCK_PREFIX + flow.getId() + ":" + currentNode; String lockKey = FLOW_LOCK_PREFIX + flow.getId() + ":" + currentNode;
String lockValue = UUID.randomUUID().toString(); String lockValue = UUID.randomUUID().toString();
@ -224,7 +224,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
redisLockUtil.unlock(lockKey, lockValue); redisLockUtil.unlock(lockKey, lockValue);
} }
} }
// 签节点 // 签节点
else { else {
processApprovalLogic(flow, request, currentNode); processApprovalLogic(flow, request, currentNode);
} }
@ -248,15 +248,18 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
// 删除当前节点的已处理待办 // 删除当前节点的已处理待办
if ("COUNTERSIGN".equals(flow.getCurrentNode())) { if ("COUNTERSIGN".equals(flow.getCurrentNode())) {
redisTemplate.opsForSet().remove(TODO_PREFIX + request.getUserId(), flow.getId()); redisTemplate.opsForSet().remove(TODO_PREFIX + request.getUserId(), flow.getId());
bd.getBusinessDatabase()
.eq("document_no", flow.getId())
.eq("owner_id", permissionGetter.getCurrentUserId())
.doDelete(TodoTaskPojo.class);
} else { } else {
bd.getBusinessDatabase() bd.getBusinessDatabase()
.eq("document_no", flow.getId()) .eq("document_no", flow.getId())
.ne("owner_id", permissionGetter.getCurrentUserId())
.update("is_delete", 2)
.doDelete(TodoTaskPojo.class); .doDelete(TodoTaskPojo.class);
} }
bd.getBusinessDatabase()
.eq("document_no", flow.getId())
.eq("owner_id", permissionGetter.getCurrentUserId())
.update("is_delete", 1)
.doUpdate(TodoTaskPojo.class);
// 处理驳回逻辑 // 处理驳回逻辑
if ("REJECT".equals(request.getResult())) { if ("REJECT".equals(request.getResult())) {
@ -280,17 +283,17 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
.setVar("templateId", form.getTemplateId()) .setVar("templateId", form.getTemplateId())
.doPageQuery(form.getPageNumber(), form.getPageSize(), TemplateChangeView.class); .doPageQuery(form.getPageNumber(), form.getPageSize(), TemplateChangeView.class);
results.getResult().forEach(item -> { // results.getResult().forEach(item -> {
if (item.getPreTemplateId() != null) { // if (item.getPreTemplateId() != null) {
Parameter parameter = bd.getBusinessDatabase() // Parameter parameter = bd.getBusinessDatabase()
.viewQueryMode(true) // .viewQueryMode(true)
.view("selectParametersByTemplateId") // .view("selectParametersByTemplateId")
.setVar("templateId", item.getPreTemplateId()) // .setVar("templateId", item.getPreTemplateId())
.eq("parameter_number", item.getParameterNumber()) // .eq("parameter_number", item.getParameterNumber())
.doQueryFirst(Parameter.class); // .doQueryFirst(Parameter.class);
BeanUtils.copyProperties(parameter, item); // BeanUtils.copyProperties(parameter, item);
} // }
}); // });
return results; return results;
} }
@ -528,6 +531,12 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
clearNodeTodo(flow, "COUNTERSIGN"); clearNodeTodo(flow, "COUNTERSIGN");
} }
clearNodeTodo(flow, "APPROVE"); clearNodeTodo(flow, "APPROVE");
// 清除已有待办
bd.getBusinessDatabase()
.eq("document_no", flow.getId())
.ne("owner_id", permissionGetter.getCurrentUserId())
.update("is_delete", 2)
.doDelete(TodoTaskPojo.class);
} }
private void clearNodeTodoSmart(ApprovalFlow flow, String currentNode, String nextNode) { private void clearNodeTodoSmart(ApprovalFlow flow, String currentNode, String nextNode) {