Merge remote-tracking branch 'origin/main'

This commit is contained in:
2025-11-05 15:44:06 +08:00
16 changed files with 253 additions and 59 deletions

View File

@@ -1,6 +1,10 @@
package com.sdm.common.common;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.net.http.HttpRequest;
/**
* son thread get message from father thread
@@ -35,6 +39,23 @@ public class ThreadLocalContext {
}
public static boolean verifyRequest(HttpServletRequest request)
{
String jobNumber = StringUtils.isEmpty(request.getHeader("jobNumber")) ? "" : request.getHeader("jobNumber");
Long usrId = StringUtils.isEmpty(request.getHeader("userId")) ? null : Long.valueOf(request.getHeader("userId"));
Long tenantId = StringUtils.isEmpty(request.getHeader("tenantId")) ? null : Long.valueOf(request.getHeader("tenantId"));
String userName = StringUtils.isEmpty(request.getHeader("userName")) ? null : request.getHeader("userName");
if(usrId==null || tenantId==null || userName==null)
return false;
setJobNumber(jobNumber);
setCompany(request.getHeader("company"));
setSessionId(request.getHeader("sessionId"));
setUserId(usrId);
setTenantId(tenantId);
setUserName(userName);
return true;
}
public static void setUserContext(UserContext userContext) {
current.get().setUserContext(userContext);
}

View File

@@ -3,6 +3,10 @@ package com.sdm.common.entity.bo;
import java.lang.reflect.Field;
public class BaseBean {
public boolean bApprove = false;
public String approveTemplateId;
public String approveTemplateName;
protected void init()
{
Class cls = this.getClass();

View File

@@ -0,0 +1,39 @@
package com.sdm.common.entity.req.system;
public class LaunchApproveReq {
public int id;
public String cidFlowId; //CID生成的流程ID
public int approveType; //审批类型 1仿真地图审批 2知识库审批
public int approveAction; //评审动作 1新增 2修改 3删除
public String approveContents = ""; //审批内容
public String approveTitle; //审批主题
public int approveStatus = 1; //审批状态 1: 审批中 2审批通过 3审批不通过
public String comment = ""; //审批描述
public long tenantId = 0; //租户ID
public String replyUrl; //审批回复URL
public String templateName; //模版名称
public String templateId; //评审流程模版ID
public int replyStatus = 0; //审批回复状态 0未回复 1已回复
public long userId = 0; //用户ID
public String creator; //审批创建者
public String createTime; //审批创建时间
}

View File

@@ -2,6 +2,7 @@ package com.sdm.common.feign.impl.system;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.system.LaunchApproveReq;
import com.sdm.common.entity.req.system.UserListReq;
import com.sdm.common.entity.req.system.UserQueryReq;
import com.sdm.common.entity.resp.PageDataResp;
@@ -12,6 +13,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
@Slf4j
@Component
@@ -62,4 +64,9 @@ public class SysUserFeignClientImpl implements ISysUserFeignClient {
return SdmResponse.failed("人员信息未查到");
}
}
@Override
public SdmResponse launchApproval(Map<String, String> hashHeader, LaunchApproveReq approveReq) {
return null;
}
}

View File

@@ -1,6 +1,7 @@
package com.sdm.common.feign.inter.system;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.system.LaunchApproveReq;
import com.sdm.common.entity.req.system.UserListReq;
import com.sdm.common.entity.req.system.UserQueryReq;
import com.sdm.common.entity.resp.system.CIDUserResp;
@@ -10,8 +11,10 @@ import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import java.util.List;
import java.util.Map;
@FeignClient(name = "system",contextId = "sysUserFeignClient")
public interface ISysUserFeignClient {
@@ -23,4 +26,7 @@ public interface ISysUserFeignClient {
@PostMapping("/user/listUser")
SdmResponse<PageDataResp<List<CIDUserResp>>> listUser(@RequestBody UserListReq req);
@PostMapping("/systemApprove/launchApprove")
public SdmResponse launchApproval(@RequestHeader Map<String,String> hashHeader, @RequestBody LaunchApproveReq approveReq);
}

View File

@@ -25,7 +25,7 @@ public class SystemApproveController {
@PostMapping("/launchApprove")
public SdmResponse launchApproval(@RequestBody ApproveFlowBean flowBean){
return approveServer.launchApproval(flowBean.approveTitle,flowBean.templateName,flowBean.templateId,flowBean.approveType,flowBean.innerFlowId,flowBean.comment,flowBean.replyUrl);
return approveServer.launchApproval(flowBean);
}
/**

View File

@@ -13,7 +13,7 @@ import java.util.List;
public interface SimulationApproveMapper {
@Insert("INSERT INTO simulation_approve_flow(innerFlowId,cidFlowId,templateName,templateId,approveTitle,approveStatus,approveType,comment,tenantId,userId,replyUrl,creator) VALUES (#{flowBean.innerFlowId},#{flowBean.cidFlowId},#{flowBean.templateName},#{flowBean.templateId},#{flowBean.approveTitle},#{flowBean.approveStatus},#{flowBean.approveType},#{flowBean.comment},#{flowBean.tenantId},#{flowBean.userId},#{flowBean.replyUrl},#{flowBean.creator})")
@Insert("INSERT INTO simulation_approve_flow(cidFlowId,templateName,templateId,approveTitle,approveStatus,approveType,approveAction,approveContents,comment,tenantId,userId,replyUrl,creator) VALUES (#{flowBean.cidFlowId},#{flowBean.templateName},#{flowBean.templateId},#{flowBean.approveTitle},#{flowBean.approveStatus},#{flowBean.approveType},#{flowBean.approveAction},#{flowBean.approveContents},#{flowBean.comment},#{flowBean.tenantId},#{flowBean.userId},#{flowBean.replyUrl},#{flowBean.creator})")
int addSimulationApproveFlow(@Param("flowBean") ApproveFlowBean flowBean);
@Update("UPDATE simulation_approve_flow SET approveStatus=#{status} WHERE cidFlowId=#{cidFlowId}")

View File

@@ -23,21 +23,12 @@ public class AuthFilter implements Filter {
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
if (servletRequest instanceof HttpServletRequest) {
HttpServletRequest req = (HttpServletRequest) servletRequest;
String jobNumber = StringUtils.isEmpty(req.getHeader("jobNumber")) ? "" : req.getHeader("jobNumber");
Long usrId = StringUtils.isEmpty(req.getHeader("userId")) ? null : Long.valueOf(req.getHeader("userId"));
Long tenantId = StringUtils.isEmpty(req.getHeader("tenantId")) ? null : Long.valueOf(req.getHeader("tenantId"));
String userName = StringUtils.isEmpty(req.getHeader("userName")) ? null : req.getHeader("userName");
ThreadLocalContext.setJobNumber(jobNumber);
ThreadLocalContext.setCompany(req.getHeader("company"));
ThreadLocalContext.setSessionId(req.getHeader("sessionId"));
ThreadLocalContext.setUserId(usrId);
ThreadLocalContext.setTenantId(tenantId);
ThreadLocalContext.setUserName(userName);
// User user = userService.getUserByIdCode(idCode);
// if (user != null) {
// ThreadLocalContext.setUserContext(new UserContext(user));
// }
if(!ThreadLocalContext.verifyRequest(req))
{
servletResponse.setCharacterEncoding("UTF-8");
servletResponse.getWriter().println("请求信息验证错误");
return;
}
}
filterChain.doFilter(servletRequest, servletResponse);
}

View File

@@ -9,11 +9,14 @@ public class ApproveFlowBean extends BaseBean {
}
public int id;
public int innerFlowId; //SPDM系统内部流程ID
public String cidFlowId; //CID生成的流程ID
public int approveType; //审批类型
public int approveType; //审批类型 1仿真地图审批 2知识库审批
public int approveAction; //评审动作 1新增 2修改 3删除
public String approveContents; //审批内容
public String approveTitle; //审批主题

View File

@@ -19,7 +19,7 @@ public interface ISimulatinoApprovalService {
SdmResponse stopCidApprovalFlow(String flowId);
SdmResponse launchApproval(String approveTitle,String templateName,String templateId,int approveType,int innerFlowId,String comment,String replayUrl);
SdmResponse launchApproval(ApproveFlowBean flowBean);
SdmResponse receiveApprovalResult(String cidFlowId,int status);

View File

@@ -4,9 +4,10 @@ import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.common.ThreadLocalContext;
import com.sdm.common.entity.req.system.LaunchApproveReq;
import com.sdm.common.feign.inter.system.ISysUserFeignClient;
import com.sdm.common.utils.HttpClientUtil;
import com.sdm.system.dao.SimulationApproveMapper;
import com.sdm.system.model.entity.ApproveConfigBean;
import com.sdm.system.model.entity.ApproveFlowBean;
import com.sdm.system.model.entity.ApproveTemplateBean;
import com.sdm.system.service.ISimulatinoApprovalService;
@@ -15,9 +16,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@@ -182,42 +184,25 @@ public class SimulationApproveServiceImpl implements ISimulatinoApprovalService
/**
* 发起审批流
* @param approveTitle
* @param approveType
* @param approveId
* @param comment
* @param flowBean
* @return
*/
@Override
public SdmResponse launchApproval(String approveTitle,String templateName,String templateId, int approveType, int approveId,String comment,String replayUrl) {
public SdmResponse launchApproval(ApproveFlowBean flowBean) {
SdmResponse sdmResponse = SdmResponse.success();
long userId = ThreadLocalContext.getUserId();
long tenantId = ThreadLocalContext.getTenantId();
String userName = ThreadLocalContext.getUserName();
String url = cidUrl+launchApprovePath;
String cidFlowId = launchCidApprovalFlow(templateId, userId,tenantId,url);
String cidFlowId = launchCidApprovalFlow(flowBean.templateId, flowBean.userId,flowBean.tenantId,url);
if (cidFlowId.isEmpty()) {
sdmResponse = SdmResponse.failed("发起Cid审批流程失败");
} else {
ApproveFlowBean approveFlowBean = new ApproveFlowBean();
approveFlowBean.approveTitle = approveTitle;
approveFlowBean.cidFlowId = cidFlowId;
approveFlowBean.approveType = approveType;
approveFlowBean.comment = comment;
approveFlowBean.innerFlowId = approveId;
approveFlowBean.creator = userName;
approveFlowBean.tenantId = tenantId;
approveFlowBean.replyUrl = replayUrl;
approveFlowBean.userId = userId;
approveFlowBean.creator = userName;
approveFlowBean.templateId = templateId;
approveFlowBean.templateName = templateName;
if (approveMapper.addSimulationApproveFlow(approveFlowBean) <= 0) {
flowBean.cidFlowId = cidFlowId;
if (approveMapper.addSimulationApproveFlow(flowBean) <= 0) {
sdmResponse = SdmResponse.failed("保存审批流程失败");
if(!stopCidApprovalFlow(cidFlowId,userId))
if(!stopCidApprovalFlow(cidFlowId,flowBean.userId))
{
log.error("删除CID审批流["+cidFlowId+"]失败");
}
@@ -300,8 +285,7 @@ public class SimulationApproveServiceImpl implements ISimulatinoApprovalService
public SdmResponse approvalResultNotice(ApproveFlowBean flowBean) {
SdmResponse sdmResponse = SdmResponse.success();
JSONObject param = new JSONObject();
param.put("flowId", flowBean.innerFlowId);
param.put("approveType", flowBean.approveType);
param.put("approve", flowBean);
try {
String result = httpClientUtil.doPostJson(flowBean.replyUrl, param.toJSONString());
if(result == null) {
@@ -320,6 +304,8 @@ public class SimulationApproveServiceImpl implements ISimulatinoApprovalService
}
return sdmResponse;
}
@Autowired
private ISysUserFeignClient feignClient;
/**
* 查询评审流程模版
@@ -361,6 +347,16 @@ public class SimulationApproveServiceImpl implements ISimulatinoApprovalService
catch (Exception e) {
e.printStackTrace();
}
LaunchApproveReq req = new LaunchApproveReq();
req.templateId = "P202511041416483446SFON";
req.templateName = "djkfk";
req.userId = ThreadLocalContext.getUserId();
req.tenantId = ThreadLocalContext.getTenantId();
Map<String,String> hashHeader = new HashMap<>();
hashHeader.put("userId","1999");
hashHeader.put("tenantId","1999");
hashHeader.put("userName","daiqy");
SdmResponse launchReq = feignClient.launchApproval(hashHeader,req);
return sdmResponse;
}
}

View File

@@ -20,13 +20,12 @@ public class SimuluationTaskPoolController {
@ResponseBody
SdmResponse createSimulationTaskPool(@RequestBody JSONObject jsonObject )
{
return service.createTaskPool(jsonObject);
}
@GetMapping(value = "/getTaskPool")
@ResponseBody
SdmResponse createSimulationTaskPool(@RequestParam String poolName,@RequestParam String version )
SdmResponse getSimulationTaskPool(@RequestParam String poolName,@RequestParam String version )
{
return service.getPoolTreeByVersion(poolName,version);
}
@@ -86,5 +85,7 @@ public class SimuluationTaskPoolController {
{
return service.getSimulationPoolTasks(poolName,version);
}
}

View File

@@ -8,6 +8,9 @@ import java.util.List;
public class TaskPoolTree extends BaseBean {
public TaskPoolBrief poolBrief;
public List<TaskPoolNode> nodes = new ArrayList<>();
public boolean bApprove = false;
public String approveTemplateId;
public String approveTemplateName;
public void addTopNodeOrder(TaskPoolNode node)
{

View File

@@ -6,7 +6,7 @@ import com.sdm.common.entity.bo.BaseBean;
import java.util.ArrayList;
import java.util.List;
public class TaskPoolUpdateBean {
public class TaskPoolUpdateBean extends BaseBean{
public static class TaskPoolNodeAdd extends BaseBean
{

View File

@@ -4,6 +4,7 @@ package com.sdm.task.service;
import com.alibaba.fastjson2.JSONObject;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.system.LaunchApproveReq;
import com.sdm.task.model.entity.TaskPoolUpdateBean;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile;
@@ -30,4 +31,6 @@ public interface ISimulationTaskPoolService {
SdmResponse importTaskPool(MultipartFile multipartFile,String dicts,String poolName);
SdmResponse exportTaskPool(HttpServletResponse httpServletResponse,JSONObject jsonObject);
SdmResponse handleApproveNotice(LaunchApproveReq req, int status);
}

View File

@@ -1,11 +1,14 @@
package com.sdm.task.service.impl;
import cn.hutool.poi.excel.cell.CellSetter;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.sdm.common.common.ResultCode;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.common.ThreadLocalContext;
import com.sdm.common.entity.req.system.LaunchApproveReq;
import com.sdm.common.feign.inter.system.ISysUserFeignClient;
import com.sdm.common.service.BaseService;
import com.sdm.common.utils.SystemOperate;
import com.sdm.task.dao.SimulationPoolMapper;
@@ -14,14 +17,10 @@ import com.sdm.task.model.entity.*;
import com.sdm.task.service.ISimulationTaskPoolService;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -35,6 +34,9 @@ public class SimulationTaskPoolServiceImpl extends BaseService implements ISimul
@Autowired
private TaskPoolOperate poolOperate;
@Autowired
private ISysUserFeignClient approveFeignClient;
/**
* 添加仿真分析库节点以及分析项
* @param poolTree
@@ -371,6 +373,35 @@ public class SimulationTaskPoolServiceImpl extends BaseService implements ISimul
return response;
}
/**
* 发起仿真库评审
* @param templateId
* @param templateName
* @param approveContents
* @param approveAction
* @return
*/
private boolean launchTaskPoolApprove(String templateId, String templateName,String approveContents,int approveAction)
{
LaunchApproveReq req = new LaunchApproveReq();
req.templateId = templateId;
req.templateName = templateName;
req.approveContents = approveContents;
req.approveAction = approveAction;
req.approveType = 1;
req.approveTitle = "仿真地图评审";
req.tenantId = ThreadLocalContext.getTenantId();
req.userId = ThreadLocalContext.getUserId();
req.creator = ThreadLocalContext.getUserName();
Map<String,String> header = new HashMap<>();
header.put("Content-Type","application/json");
header.put("tenantId",String.valueOf(req.tenantId));
header.put("userId", String.valueOf(req.userId));
header.put("userName",req.creator);
SdmResponse response = approveFeignClient.launchApproval(header,req);
return response.isSuccess();
}
/**
* 创建仿真分析项库
* @param poolTreeObj
@@ -379,6 +410,20 @@ public class SimulationTaskPoolServiceImpl extends BaseService implements ISimul
public SdmResponse createTaskPool(JSONObject poolTreeObj)
{
TaskPoolTree poolTree = paraseTaskPoolTree(poolTreeObj);
if(poolTree.bApprove)
{
String approveContents = poolTreeObj.toJSONString();
int approveAction = 1;
//发起评审
if(launchTaskPoolApprove(poolTree.approveTemplateId,poolTree.approveTemplateName,approveContents,approveAction))
{
return SdmResponse.success();
}
else
{
return SdmResponse.failed("发起评审失败");
}
}
SdmResponse response = SdmResponse.success();
TaskPoolBrief poolBrief = poolTree.poolBrief;
poolBrief.currentVersion = "V1.0"; //新建时初始版本号
@@ -977,6 +1022,21 @@ public class SimulationTaskPoolServiceImpl extends BaseService implements ISimul
@Override
public SdmResponse updateTaskPoolTree(TaskPoolUpdateBean updateBean)
{
//评审处理
if(updateBean.bApprove)
{
String approveContents = updateBean.toString();
int approveAction = 2;
//发起评审
if(launchTaskPoolApprove(updateBean.approveTemplateId,updateBean.approveTemplateName,approveContents,approveAction))
{
return SdmResponse.success();
}
else
{
return SdmResponse.failed("发起评审失败");
}
}
SdmResponse response = SdmResponse.success();
if(!preProcessTaskUpdateBean(updateBean))
{
@@ -1238,7 +1298,8 @@ public class SimulationTaskPoolServiceImpl extends BaseService implements ISimul
{
poolBriefObj.put("poolName",poolName);
}
response = createTaskPool(poolTreeObj);
//response = createTaskPool(poolTreeObj);
response.setData(poolBriefObj);
}
return response;
}
@@ -1420,12 +1481,71 @@ public class SimulationTaskPoolServiceImpl extends BaseService implements ISimul
SystemOperate.outputHttpFileStream(httpServletResponse, taskPoolFileName, taskPoolSaveName);
file.delete();
}
}
return response;
}
/**
* 评审处理
* @param approveReq
* @param status
* @return
*/
@Override
public SdmResponse handleApproveNotice(LaunchApproveReq approveReq,int status)
{
SdmResponse response = SdmResponse.success();
String contents = approveReq.approveContents;
int approveAction = approveReq.approveAction;
if(status == 2 && contents != null) //评审成功
{
switch(approveAction)
{
case 1:
createTaskPoolApprovePostHandle(contents);
break;
case 2:
updateTaskPoolApprovePostHandle(contents);
break;
default:
break;
}
}
return response;
}
/**
* 创建仿真地图评审后处理
* @param approveContents
*/
private void createTaskPoolApprovePostHandle(String approveContents)
{
JSONObject poolTreeObj = JSONObject.from(approveContents);
poolTreeObj.put("bApprove",false); //清除上次评审标记
createTaskPool(poolTreeObj);
}
/**
* 更新仿真地图评审后处理
* @param approveContents
*/
private void updateTaskPoolApprovePostHandle(String approveContents)
{
ObjectMapper objectMapper = new ObjectMapper();
try {
TaskPoolUpdateBean updateBean = objectMapper.readValue(approveContents, TaskPoolUpdateBean.class);
if(updateBean != null)
{
updateBean.bApprove = false;//清除上次评审标记
updateTaskPoolTree(updateBean);
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
}