1.8问题修改-模板方面流程添加直送、退回指定节点,修改撤回逻辑;修复对比数据表格下载为空的问题和其他小问题
This commit is contained in:
parent
7a7dd75536
commit
8eeea683e9
@ -60,10 +60,21 @@ public class DeleteController {
|
|||||||
for (String modelId : request.getModelIds()) {
|
for (String modelId : request.getModelIds()) {
|
||||||
try {
|
try {
|
||||||
String redisKey = request.getUserID() + ":" + modelId + ":" + "ComparisonExport";
|
String redisKey = request.getUserID() + ":" + modelId + ":" + "ComparisonExport";
|
||||||
|
log.info("尝试从Redis获取,KEY: {}", redisKey);
|
||||||
|
sb.append(redisKey).append(",");
|
||||||
|
|
||||||
String cachedData = redisTemplate.opsForValue().get(redisKey);
|
String cachedData = redisTemplate.opsForValue().get(redisKey);
|
||||||
sb.append(cachedData).append("\n");
|
|
||||||
|
if (cachedData == null) {
|
||||||
|
log.warn("Redis中未找到数据,KEY: {}", redisKey);
|
||||||
|
sb.append(modelId).append("未找到数据").append(",");
|
||||||
|
} else {
|
||||||
|
log.info("成功获取到数据,长度: {}", cachedData.length());
|
||||||
|
sb.append(cachedData).append("\n");
|
||||||
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("删除缓存失败", e);
|
log.error("从Redis获取数据失败", e); // 修正日志信息
|
||||||
|
sb.append(e.getMessage()).append("\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Response.ok().data(sb);
|
return Response.ok().data(sb);
|
||||||
|
|||||||
@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.*;
|
|||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
|
import javax.validation.constraints.NotBlank;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@ -36,7 +37,7 @@ public class TemplateApprovalController {
|
|||||||
.doQuery(DepartmentUserView.class);
|
.doQuery(DepartmentUserView.class);
|
||||||
return Response.ok().data(users);
|
return Response.ok().data(users);
|
||||||
}
|
}
|
||||||
// 发起审批
|
// 发起人发起审批
|
||||||
@PostMapping("/startApproval")
|
@PostMapping("/startApproval")
|
||||||
public Response startApproval(
|
public Response startApproval(
|
||||||
@RequestBody @Valid StartApprovalRequest request,
|
@RequestBody @Valid StartApprovalRequest request,
|
||||||
@ -50,6 +51,16 @@ public class TemplateApprovalController {
|
|||||||
return Response.ok().data(templateApprovalService.startApproval(request));
|
return Response.ok().data(templateApprovalService.startApproval(request));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 发起人拒绝后重新发起审批
|
||||||
|
@GetMapping("/restartApproval")
|
||||||
|
public Response restartApproval(
|
||||||
|
@RequestParam @NotBlank String templateId,
|
||||||
|
@RequestParam @NotBlank String userId
|
||||||
|
) {
|
||||||
|
templateApprovalService.restartApproval(templateId, userId);
|
||||||
|
return Response.ok();
|
||||||
|
}
|
||||||
|
|
||||||
// 查询审批列表
|
// 查询审批列表
|
||||||
@GetMapping("/getApprovalList")
|
@GetMapping("/getApprovalList")
|
||||||
public Response getTodoList(
|
public Response getTodoList(
|
||||||
@ -64,7 +75,7 @@ public class TemplateApprovalController {
|
|||||||
return Response.ok().data(templateApprovalService.getApprovalList(form));
|
return Response.ok().data(templateApprovalService.getApprovalList(form));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 处理审批
|
// 处理人处理审批通过还是拒绝
|
||||||
@PostMapping("/handleApproval")
|
@PostMapping("/handleApproval")
|
||||||
public Response handleApproval(
|
public Response handleApproval(
|
||||||
@RequestBody @Valid HandleApprovalRequest request,
|
@RequestBody @Valid HandleApprovalRequest request,
|
||||||
@ -79,7 +90,31 @@ public class TemplateApprovalController {
|
|||||||
return Response.ok();
|
return Response.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 撤回审批
|
// 获取可退回节点
|
||||||
|
@GetMapping("/getReturnNodes")
|
||||||
|
public Response getReturnNodes(
|
||||||
|
@NotBlank String flowId
|
||||||
|
) {
|
||||||
|
List<String> result = templateApprovalService.getReturnNodes(flowId);
|
||||||
|
return Response.ok().data(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理人退回指定节点
|
||||||
|
@PostMapping("/handleReturnToNode")
|
||||||
|
public Response handleReturnToNode(
|
||||||
|
@RequestBody @Valid HandleReturnNodeForm form,
|
||||||
|
BindingResult bindingResult
|
||||||
|
) {
|
||||||
|
if (bindingResult.hasErrors()) {
|
||||||
|
bindingResult.getFieldErrors().forEach(error -> {
|
||||||
|
throw new CommonException(error.getDefaultMessage());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
templateApprovalService.handleReturnToNode(form);
|
||||||
|
return Response.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 发起人撤回审批
|
||||||
@PostMapping("/handleReturn")
|
@PostMapping("/handleReturn")
|
||||||
public Response handleReturn(
|
public Response handleReturn(
|
||||||
@RequestBody @Valid HandleApprovalRequest request,
|
@RequestBody @Valid HandleApprovalRequest request,
|
||||||
|
|||||||
@ -16,6 +16,7 @@ import org.springframework.web.multipart.MultipartFile;
|
|||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
|
import javax.validation.constraints.NotBlank;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@ -43,6 +44,16 @@ public class TemplateController {
|
|||||||
return Response.ok().data(page);
|
return Response.ok().data(page);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取指定模板详情
|
||||||
|
@GetMapping("/getTemplateById")
|
||||||
|
public Response getTemplateById(
|
||||||
|
@NotBlank String templateId
|
||||||
|
) {
|
||||||
|
Template template = templateService.getTemplateById(templateId);
|
||||||
|
return Response.ok().data(template);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// 查看版本 某个模板的全部版本
|
// 查看版本 某个模板的全部版本
|
||||||
@GetMapping("getTemplateVersion")
|
@GetMapping("getTemplateVersion")
|
||||||
public Response getTemplateVersion(
|
public Response getTemplateVersion(
|
||||||
|
|||||||
@ -0,0 +1,17 @@
|
|||||||
|
package com.xdap.self_development.controller.form;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotBlank;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class HandleReturnNodeForm {
|
||||||
|
@NotBlank(message = "流程不能为空")
|
||||||
|
private String flowId;
|
||||||
|
@NotBlank(message = "节点不能为空")
|
||||||
|
private String nodeName;
|
||||||
|
@NotBlank(message = "创建人不能为空")
|
||||||
|
private String createUserId;
|
||||||
|
@NotBlank(message = "处理人不能为空")
|
||||||
|
private String processUserId;
|
||||||
|
}
|
||||||
@ -24,4 +24,18 @@ public class ApprovalRecord extends MpaasBasePojo {
|
|||||||
private String result; // PASS, REJECT
|
private String result; // PASS, REJECT
|
||||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||||
private Timestamp approvalTime;
|
private Timestamp approvalTime;
|
||||||
|
private Integer approvalLevel;
|
||||||
|
|
||||||
|
public ApprovalRecord() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public ApprovalRecord(String flowId, String node, String userId, String opinion, String result, Timestamp approvalTime, Integer approvalLevel) {
|
||||||
|
this.flowId = flowId;
|
||||||
|
this.node = node;
|
||||||
|
this.userId = userId;
|
||||||
|
this.opinion = opinion;
|
||||||
|
this.result = result;
|
||||||
|
this.approvalTime = approvalTime;
|
||||||
|
this.approvalLevel = approvalLevel;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -15,7 +15,7 @@ import java.sql.Timestamp;
|
|||||||
// 查找每个模板的最新版本并且优先级按照已发布、审核中、草稿状态转变(只有这三种状态)
|
// 查找每个模板的最新版本并且优先级按照已发布、审核中、草稿状态转变(只有这三种状态)
|
||||||
// CASE ranked.status WHEN 'COMPLETE' THEN 1 WHEN 'APPROVING' THEN 2 WHEN 'DRAFT' THEN 3 WHEN 'RETURNED' THEN 4 WHEN 'REJECTED' THEN 5 ELSE 6 END ASC,
|
// CASE ranked.status WHEN 'COMPLETE' THEN 1 WHEN 'APPROVING' THEN 2 WHEN 'DRAFT' THEN 3 WHEN 'RETURNED' THEN 4 WHEN 'REJECTED' THEN 5 ELSE 6 END ASC,
|
||||||
@SQL(view = "getLatestTemplate",
|
@SQL(view = "getLatestTemplate",
|
||||||
sql = "SELECT ROW_NUMBER() OVER (ORDER BY ranked.order_num DESC) AS display_order_num, ranked.id, ranked.template_name, ranked.version , ranked.status, ranked.created_time, ranked.published_time, ROW_NUMBER() OVER (ORDER BY ranked.order_num DESC) AS order_num , xu.username AS \"createBy\" FROM ( SELECT t.*, ROW_NUMBER() OVER (PARTITION BY template_name ORDER BY CASE WHEN status = 'COMPLETE' THEN 1 WHEN status = 'APPROVING' THEN 2 ELSE 3 END, version DESC) AS rn FROM yfsjglpt_model_template t WHERE status IN ('COMPLETE', 'DRAFT', 'APPROVING') ) ranked LEFT JOIN xdap_users xu ON xu.id = ranked.create_by WHERE rn = 1 ORDER BY ranked.order_num DESC"
|
sql = "SELECT ROW_NUMBER() OVER (ORDER BY ranked.order_num DESC) AS display_order_num, ranked.id, ranked.template_name, ranked.version, ranked.return_num , ranked.status, ranked.created_time, ranked.published_time, ROW_NUMBER() OVER (ORDER BY ranked.order_num DESC) AS order_num , xu.username AS \"createBy\" FROM ( SELECT t.*, ROW_NUMBER() OVER (PARTITION BY template_name ORDER BY CASE WHEN status = 'COMPLETE' THEN 1 WHEN status = 'APPROVING' THEN 2 ELSE 3 END, version DESC) AS rn FROM yfsjglpt_model_template t WHERE status IN ('COMPLETE', 'DRAFT', 'APPROVING') ) ranked LEFT JOIN xdap_users xu ON xu.id = ranked.create_by WHERE rn = 1 ORDER BY ranked.order_num DESC"
|
||||||
// sql = "SELECT ROW_NUMBER() OVER (ORDER BY CASE ranked.status WHEN 'COMPLETE' THEN 1 WHEN 'APPROVING' THEN 2 WHEN 'DRAFT' THEN 3 WHEN 'RETURNED' THEN 4 WHEN 'REJECTED' THEN 5 ELSE 6 END ASC, ranked.order_num DESC) AS order_num, ranked.id, ranked.template_name, ranked.version , ranked.status, ranked.created_time, ranked.published_time, xu.username AS \"createBy\" FROM ( SELECT t.*, ROW_NUMBER() OVER (PARTITION BY template_name ORDER BY CASE WHEN status = 'COMPLETE' THEN 1 WHEN status = 'APPROVING' THEN 2 ELSE 3 END, version DESC) AS rn FROM yfsjglpt_model_template t WHERE status IN ('COMPLETE', 'DRAFT', 'APPROVING') ) ranked LEFT JOIN xdap_users xu ON xu.id = ranked.create_by WHERE rn = 1 ORDER BY ranked.order_num DESC"
|
// sql = "SELECT ROW_NUMBER() OVER (ORDER BY CASE ranked.status WHEN 'COMPLETE' THEN 1 WHEN 'APPROVING' THEN 2 WHEN 'DRAFT' THEN 3 WHEN 'RETURNED' THEN 4 WHEN 'REJECTED' THEN 5 ELSE 6 END ASC, ranked.order_num DESC) AS order_num, ranked.id, ranked.template_name, ranked.version , ranked.status, ranked.created_time, ranked.published_time, xu.username AS \"createBy\" FROM ( SELECT t.*, ROW_NUMBER() OVER (PARTITION BY template_name ORDER BY CASE WHEN status = 'COMPLETE' THEN 1 WHEN status = 'APPROVING' THEN 2 ELSE 3 END, version DESC) AS rn FROM yfsjglpt_model_template t WHERE status IN ('COMPLETE', 'DRAFT', 'APPROVING') ) ranked LEFT JOIN xdap_users xu ON xu.id = ranked.create_by WHERE rn = 1 ORDER BY ranked.order_num DESC"
|
||||||
),
|
),
|
||||||
// 获取所有模板的最新版本号(包括所有状态)
|
// 获取所有模板的最新版本号(包括所有状态)
|
||||||
|
|||||||
@ -10,7 +10,7 @@ import java.sql.Timestamp;
|
|||||||
@SQLQuery(value = {
|
@SQLQuery(value = {
|
||||||
// CASE br.status WHEN 'COMPLETE' THEN 1 WHEN 'APPROVING' THEN 2 WHEN 'REJECTED' THEN 3 ELSE 4 END ASC ,
|
// CASE br.status WHEN 'COMPLETE' THEN 1 WHEN 'APPROVING' THEN 2 WHEN 'REJECTED' THEN 3 ELSE 4 END ASC ,
|
||||||
@SQL(view = "getAllReport",
|
@SQL(view = "getAllReport",
|
||||||
sql = "SELECT br.id AS \"reportId\", br.*, af.id AS \"flowId\" FROM yfsjglpt_model_benchmarking_report br LEFT JOIN yfsjglpt_model_approval_flow af ON af.template_id = br.id WHERE br.is_delete = 0 and br.title like CONCAT('%', #title, '%') and br.manufacturer_name like CONCAT('%', #manufacturerName, '%') and br.model_name like CONCAT('%', #modelName, '%') and br.product_number like CONCAT('%', #productNumber, '%') and br.module like CONCAT('%', #module, '%') and br.plate like CONCAT('%', #plate, '%') and br.platform like CONCAT('%', #platform, '%') and br.series like CONCAT('%', #series, '%') and br.market_segment like CONCAT('%', #marketSegment, '%') and br.project_name like CONCAT('%', #projectName, '%') and br.project_number like CONCAT('%', #projectNumber, '%') and br.status like CONCAT('%', #status, '%') ORDER BY br.upload_time DESC")
|
sql = "SELECT br.id AS \"reportId\", br.*, af.id AS \"flowId\" FROM yfsjglpt_model_benchmarking_report br LEFT JOIN ( SELECT af1.* FROM yfsjglpt_model_approval_flow af1 INNER JOIN ( SELECT template_id, MAX(created_time) AS max_create_time FROM yfsjglpt_model_approval_flow WHERE template_id IS NOT NULL GROUP BY template_id ) af2 ON af1.template_id = af2.template_id AND af1.created_time = af2.max_create_time ) af ON af.template_id = br.id WHERE br.is_delete = 0 and br.title like CONCAT('%', #title, '%') and br.manufacturer_name like CONCAT('%', #manufacturerName, '%') and br.model_name like CONCAT('%', #modelName, '%') and br.product_number like CONCAT('%', #productNumber, '%') and br.module like CONCAT('%', #module, '%') and br.plate like CONCAT('%', #plate, '%') and br.platform like CONCAT('%', #platform, '%') and br.series like CONCAT('%', #series, '%') and br.market_segment like CONCAT('%', #marketSegment, '%') and br.project_name like CONCAT('%', #projectName, '%') and br.project_number like CONCAT('%', #projectNumber, '%') and br.status like CONCAT('%', #status, '%') ORDER BY br.upload_time DESC")
|
||||||
})
|
})
|
||||||
@Data
|
@Data
|
||||||
public class TodoAndReportView {
|
public class TodoAndReportView {
|
||||||
|
|||||||
@ -4,16 +4,21 @@ import com.definesys.mpaas.query.db.PageQueryResult;
|
|||||||
import com.xdap.self_development.controller.form.*;
|
import com.xdap.self_development.controller.form.*;
|
||||||
import com.xdap.self_development.pojo.ApprovalConfigPojo;
|
import com.xdap.self_development.pojo.ApprovalConfigPojo;
|
||||||
import com.xdap.self_development.pojo.ApprovalFlow;
|
import com.xdap.self_development.pojo.ApprovalFlow;
|
||||||
|
import com.xdap.self_development.pojo.ApprovalRecord;
|
||||||
import com.xdap.self_development.pojo.Template;
|
import com.xdap.self_development.pojo.Template;
|
||||||
import com.xdap.self_development.pojo.view.ApprovalFlowNodeView;
|
import com.xdap.self_development.pojo.view.ApprovalFlowNodeView;
|
||||||
import com.xdap.self_development.pojo.view.TemplateChangeView;
|
import com.xdap.self_development.pojo.view.TemplateChangeView;
|
||||||
import com.xdap.self_development.pojo.view.TodoAndTemplateView;
|
import com.xdap.self_development.pojo.view.TodoAndTemplateView;
|
||||||
|
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
|
import javax.validation.constraints.NotBlank;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public interface TemplateApprovalService {
|
public interface TemplateApprovalService {
|
||||||
String startApproval(StartApprovalRequest request);
|
String startApproval(StartApprovalRequest request);
|
||||||
|
|
||||||
|
void restartApproval(@NotBlank String templateId, @NotBlank String userId);
|
||||||
|
|
||||||
PageQueryResult<TodoAndTemplateView> getApprovalList(ApprovalListForm form);
|
PageQueryResult<TodoAndTemplateView> getApprovalList(ApprovalListForm form);
|
||||||
|
|
||||||
void handleApproval(HandleApprovalRequest request);
|
void handleApproval(HandleApprovalRequest request);
|
||||||
@ -24,11 +29,13 @@ public interface TemplateApprovalService {
|
|||||||
|
|
||||||
void handleReturn(@Valid HandleApprovalRequest request);
|
void handleReturn(@Valid HandleApprovalRequest request);
|
||||||
|
|
||||||
|
void handleReturnToNode(@Valid HandleReturnNodeForm form);
|
||||||
|
|
||||||
void processApprovalLogic(
|
void processApprovalLogic(
|
||||||
ApprovalFlow flow, HandleApprovalRequest request, ApprovalConfigPojo currentNode
|
ApprovalFlow flow, HandleApprovalRequest request, ApprovalConfigPojo currentNode, ApprovalRecord lastedRecord
|
||||||
);
|
);
|
||||||
|
|
||||||
void cancelProcess(ApprovalFlow flow, String status);
|
void cancelProcess(ApprovalFlow flow, ApprovalConfigPojo node, String status, String userId);
|
||||||
|
|
||||||
void processNextNode(ApprovalFlow flow, ApprovalConfigPojo currentNode, String userId);
|
void processNextNode(ApprovalFlow flow, ApprovalConfigPojo currentNode, String userId);
|
||||||
|
|
||||||
@ -37,4 +44,6 @@ public interface TemplateApprovalService {
|
|||||||
void updateTasks(ApprovalFlow flow, String status);
|
void updateTasks(ApprovalFlow flow, String status);
|
||||||
|
|
||||||
void addNodeTodo(ApprovalFlow flow, ApprovalConfigPojo node, Template template, String createBy);
|
void addNodeTodo(ApprovalFlow flow, ApprovalConfigPojo node, Template template, String createBy);
|
||||||
|
|
||||||
|
List<String> getReturnNodes(@NotBlank String flowId);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,6 +8,7 @@ import com.xdap.self_development.pojo.Template;
|
|||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import javax.validation.constraints.NotBlank;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public interface TemplateService {
|
public interface TemplateService {
|
||||||
@ -28,4 +29,5 @@ public interface TemplateService {
|
|||||||
|
|
||||||
List<Template> getTemplateVersion(TemplateRowIdForm form);
|
List<Template> getTemplateVersion(TemplateRowIdForm form);
|
||||||
|
|
||||||
|
Template getTemplateById(@NotBlank String templateId);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -55,7 +55,7 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
|
|||||||
private String clientSecret;
|
private String clientSecret;
|
||||||
|
|
||||||
private static final String FLOW_LOCK_PREFIX = "report:lock:";
|
private static final String FLOW_LOCK_PREFIX = "report:lock:";
|
||||||
private static final int FLOW_LOCK_EXPIRE_SECONDS = 15;
|
private static final int FLOW_LOCK_EXPIRE_SECONDS = 5;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
|||||||
@ -345,10 +345,12 @@ public class TcDataQueryServiceImpl implements TcDataQueryService {
|
|||||||
try {
|
try {
|
||||||
String redisKey = userID + ":" + engineModelID + ":" + "ComparisonExport";
|
String redisKey = userID + ":" + engineModelID + ":" + "ComparisonExport";
|
||||||
String jsonValue = objectMapper.writeValueAsString(allPojos);
|
String jsonValue = objectMapper.writeValueAsString(allPojos);
|
||||||
|
|
||||||
redisTemplate.opsForValue().set(redisKey, jsonValue, 24, java.util.concurrent.TimeUnit.HOURS);
|
redisTemplate.opsForValue().set(redisKey, jsonValue, 24, java.util.concurrent.TimeUnit.HOURS);
|
||||||
log.info("成功将数据存储到Redis,KEY: {}", redisKey);
|
log.info("成功将数据存储到Redis,KEY: {}", redisKey);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("存储数据到Redis失败: {}", e.getMessage());
|
log.error("存储数据到Redis失败: {}", e.getMessage());
|
||||||
|
throw new RuntimeException("存储数据到Redis失败:"+e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, List<EngineParamDetailPojo>> valueBySubSysName =
|
Map<String, List<EngineParamDetailPojo>> valueBySubSysName =
|
||||||
@ -651,14 +653,14 @@ public class TcDataQueryServiceImpl implements TcDataQueryService {
|
|||||||
systemDataList.addAll(tcDataPojos);
|
systemDataList.addAll(tcDataPojos);
|
||||||
}
|
}
|
||||||
//将allPojos存到Redis,KEY为userID+engineModelID+预操作,过期时间24小时
|
//将allPojos存到Redis,KEY为userID+engineModelID+预操作,过期时间24小时
|
||||||
// try {
|
try {
|
||||||
// String redisKey = analysisRequest.getUserID() + ":" + analysisRequest.getEngineModelID() + ":" + "ComparisonExport";
|
String redisKey = analysisRequest.getUserID() + ":" + analysisRequest.getEngineModelID() + ":" + "ComparisonExport";
|
||||||
// String jsonValue = objectMapper.writeValueAsString(systemDataList);
|
String jsonValue = objectMapper.writeValueAsString(systemDataList);
|
||||||
// redisTemplate.opsForValue().set(redisKey, jsonValue, 24, java.util.concurrent.TimeUnit.HOURS);
|
redisTemplate.opsForValue().set(redisKey, jsonValue, 24, java.util.concurrent.TimeUnit.HOURS);
|
||||||
// log.info("成功将数据存储到Redis,KEY: {}", redisKey);
|
log.info("成功将数据存储到Redis,KEY: {}", redisKey);
|
||||||
// } catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// log.error("存储数据到Redis失败: {}", e.getMessage());
|
log.error("存储数据到Redis失败: {}", e.getMessage());
|
||||||
// }
|
}
|
||||||
|
|
||||||
Map<String, List<EngineParamDetailPojo>> valueBySubSysName =
|
Map<String, List<EngineParamDetailPojo>> valueBySubSysName =
|
||||||
systemDataList.stream().collect(Collectors.groupingBy(EngineParamDetailPojo::getSubsystemName));
|
systemDataList.stream().collect(Collectors.groupingBy(EngineParamDetailPojo::getSubsystemName));
|
||||||
|
|||||||
@ -24,6 +24,7 @@ import java.sql.Timestamp;
|
|||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@ -41,7 +42,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
|
|||||||
// 分布式锁标志
|
// 分布式锁标志
|
||||||
private static final String FLOW_LOCK_PREFIX = "approval:lock:";
|
private static final String FLOW_LOCK_PREFIX = "approval:lock:";
|
||||||
// 分布式锁有效时间
|
// 分布式锁有效时间
|
||||||
private static final int FLOW_LOCK_EXPIRE_SECONDS = 15;
|
private static final int FLOW_LOCK_EXPIRE_SECONDS = 5;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
@ -153,6 +154,20 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
|
|||||||
initiatedTask.setModelId(flow.getTemplateId());
|
initiatedTask.setModelId(flow.getTemplateId());
|
||||||
bd.getBusinessDatabase().doInsert(initiatedTask);
|
bd.getBusinessDatabase().doInsert(initiatedTask);
|
||||||
|
|
||||||
|
// 增加发起记录
|
||||||
|
bd.getBusinessDatabase().doInsert(
|
||||||
|
new ApprovalRecord(
|
||||||
|
flow.getId(),
|
||||||
|
"发起审批",
|
||||||
|
xdapDeptUsersService.selectUserByID(request.getUserId()).getUsername(),
|
||||||
|
"发起审批",
|
||||||
|
"MSG",
|
||||||
|
Timestamp.valueOf(LocalDateTime.now()),
|
||||||
|
1
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
// 更新模板状态为校对中
|
// 更新模板状态为校对中
|
||||||
template.setStatus("APPROVING");
|
template.setStatus("APPROVING");
|
||||||
bd.getBusinessDatabase()
|
bd.getBusinessDatabase()
|
||||||
@ -162,6 +177,88 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
|
|||||||
return flow.getId();
|
return flow.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public void restartApproval(String templateId, String userId) {
|
||||||
|
// 判断当前模板是否存在
|
||||||
|
Template template = bd.getBusinessDatabase()
|
||||||
|
.eq("id", templateId)
|
||||||
|
.eq("status", "DRAFT")
|
||||||
|
.doQueryFirst(Template.class);
|
||||||
|
if (template == null) {
|
||||||
|
throw new CommonException("模板不存在");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查找上次未完成的流程
|
||||||
|
ApprovalFlow approvalFlow = bd.getBusinessDatabase()
|
||||||
|
.eq("templateId", templateId)
|
||||||
|
.eq("flow_status", "REJECTED")
|
||||||
|
.orderBy("created_time", "desc")
|
||||||
|
.doQueryFirst(ApprovalFlow.class);
|
||||||
|
if (approvalFlow == null) {
|
||||||
|
throw new CommonException("没有上次未完成的流程");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查找当前节点
|
||||||
|
ApprovalConfigPojo currentNode = bd.getBusinessDatabase()
|
||||||
|
.eq("approval_id", approvalFlow.getId())
|
||||||
|
.eq("node_order", approvalFlow.getCurrentNode())
|
||||||
|
.doQueryFirst(ApprovalConfigPojo.class);
|
||||||
|
|
||||||
|
String lockKey = FLOW_LOCK_PREFIX + approvalFlow.getId() + ":" + currentNode.getNodeName();
|
||||||
|
String lockValue = UUID.randomUUID().toString();
|
||||||
|
boolean lockAcquired = redisLockUtil
|
||||||
|
.tryLock(lockKey, lockValue, FLOW_LOCK_EXPIRE_SECONDS, TimeUnit.SECONDS);
|
||||||
|
if (!lockAcquired) {
|
||||||
|
throw new CommonException("当前节点正在处理,请稍后重试");
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
// 重新创建待办继续流程
|
||||||
|
myself.addNodeTodo(
|
||||||
|
approvalFlow,
|
||||||
|
currentNode,
|
||||||
|
template,
|
||||||
|
userId
|
||||||
|
);
|
||||||
|
|
||||||
|
bd.getBusinessDatabase()
|
||||||
|
.eq("id", approvalFlow.getId())
|
||||||
|
.update("flow_status", "APPROVING")
|
||||||
|
.doUpdate(ApprovalFlow.class);
|
||||||
|
|
||||||
|
bd.getBusinessDatabase()
|
||||||
|
.eq("id", template.getId())
|
||||||
|
.update("status", "APPROVING")
|
||||||
|
.doUpdate(Template.class);
|
||||||
|
|
||||||
|
// 清除拒绝提醒待办
|
||||||
|
bd.getBusinessDatabase()
|
||||||
|
.eq("document_no", approvalFlow.getId())
|
||||||
|
.eq("current_node", currentNode.getNodeName())
|
||||||
|
.eq("data_type", "模板拒绝")
|
||||||
|
.update("is_delete", 1)
|
||||||
|
.doUpdate(TodoTaskPojo.class);
|
||||||
|
|
||||||
|
// 创建直送记录
|
||||||
|
ApprovalRecord lastedRecord = bd.getBusinessDatabase()
|
||||||
|
.eq("flow_id", approvalFlow.getId())
|
||||||
|
.orderBy("approval_time", "desc")
|
||||||
|
.doQueryFirst(ApprovalRecord.class);
|
||||||
|
ApprovalRecord record = new ApprovalRecord(
|
||||||
|
approvalFlow.getId(),
|
||||||
|
"直送至" + currentNode.getNodeName(),
|
||||||
|
xdapDeptUsersService.selectUserByID(userId).getUsername(),
|
||||||
|
"直送",
|
||||||
|
"MSG",
|
||||||
|
Timestamp.valueOf(LocalDateTime.now()),
|
||||||
|
lastedRecord.getApprovalLevel() + 1
|
||||||
|
);
|
||||||
|
bd.getBusinessDatabase().doInsert(record);
|
||||||
|
} finally {
|
||||||
|
redisLockUtil.unlock(lockKey, lockValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 查询所有流程
|
// 查询所有流程
|
||||||
@Override
|
@Override
|
||||||
public PageQueryResult<TodoAndTemplateView> getApprovalList(ApprovalListForm form) {
|
public PageQueryResult<TodoAndTemplateView> getApprovalList(ApprovalListForm form) {
|
||||||
@ -216,6 +313,12 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
|
|||||||
throw new CommonException("无权限处理或已被处理");
|
throw new CommonException("无权限处理或已被处理");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取最新处理记录
|
||||||
|
ApprovalRecord lastedRecord = bd.getBusinessDatabase()
|
||||||
|
.eq("flow_id", flow.getId())
|
||||||
|
.orderBy("approval_time", "desc")
|
||||||
|
.doQueryFirst(ApprovalRecord.class);
|
||||||
|
|
||||||
// 抢签节点
|
// 抢签节点
|
||||||
if (!"会签".equals(currentNode.getNodeName())) {
|
if (!"会签".equals(currentNode.getNodeName())) {
|
||||||
String lockKey = FLOW_LOCK_PREFIX + flow.getId() + ":" + currentNode.getNodeName();
|
String lockKey = FLOW_LOCK_PREFIX + flow.getId() + ":" + currentNode.getNodeName();
|
||||||
@ -230,18 +333,19 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
|
|||||||
int processedCount = bd.getBusinessDatabase()
|
int processedCount = bd.getBusinessDatabase()
|
||||||
.eq("flow_id", flow.getId())
|
.eq("flow_id", flow.getId())
|
||||||
.eq("node", currentNode.getNodeName())
|
.eq("node", currentNode.getNodeName())
|
||||||
|
.eq("approval_level", lastedRecord.getApprovalLevel())
|
||||||
.doQuery(ApprovalRecord.class).size();
|
.doQuery(ApprovalRecord.class).size();
|
||||||
if (processedCount > 0) {
|
if (processedCount > 0) {
|
||||||
throw new CommonException("此节点已被他人处理");
|
throw new CommonException("此节点已被他人处理");
|
||||||
}
|
}
|
||||||
myself.processApprovalLogic(flow, request, currentNode);
|
myself.processApprovalLogic(flow, request, currentNode, lastedRecord);
|
||||||
} finally {
|
} finally {
|
||||||
redisLockUtil.unlock(lockKey, lockValue);
|
redisLockUtil.unlock(lockKey, lockValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 会签节点
|
// 会签节点
|
||||||
else {
|
else {
|
||||||
myself.processApprovalLogic(flow, request, currentNode);
|
myself.processApprovalLogic(flow, request, currentNode, lastedRecord);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -252,16 +356,19 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void processApprovalLogic(
|
public void processApprovalLogic(
|
||||||
ApprovalFlow flow, HandleApprovalRequest request, ApprovalConfigPojo currentNode
|
ApprovalFlow flow, HandleApprovalRequest request, ApprovalConfigPojo currentNode, ApprovalRecord lastedRecord
|
||||||
) {
|
) {
|
||||||
// 记录审批结果
|
|
||||||
ApprovalRecord record = new ApprovalRecord();
|
// 记录当前审批结果
|
||||||
record.setFlowId(flow.getId());
|
ApprovalRecord record = new ApprovalRecord(
|
||||||
record.setNode(currentNode.getNodeName());
|
flow.getId(),
|
||||||
record.setUserId(request.getUserId());
|
currentNode.getNodeName(),
|
||||||
record.setOpinion(request.getOpinion());
|
request.getUserId(),
|
||||||
record.setResult(request.getResult());
|
request.getOpinion(),
|
||||||
record.setApprovalTime(Timestamp.valueOf(LocalDateTime.now()));
|
request.getResult(),
|
||||||
|
Timestamp.valueOf(LocalDateTime.now()),
|
||||||
|
lastedRecord == null ? 1 : lastedRecord.getApprovalLevel()
|
||||||
|
);
|
||||||
bd.getBusinessDatabase().doInsert(record);
|
bd.getBusinessDatabase().doInsert(record);
|
||||||
|
|
||||||
// 当前流程当前节点的所有待办全部删除
|
// 当前流程当前节点的所有待办全部删除
|
||||||
@ -291,23 +398,20 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
|
|||||||
// 处理驳回逻辑
|
// 处理驳回逻辑
|
||||||
if ("REJECT".equals(request.getResult())) {
|
if ("REJECT".equals(request.getResult())) {
|
||||||
// 审批人退回
|
// 审批人退回
|
||||||
myself.cancelProcess(flow, "REJECTED");
|
myself.cancelProcess(flow, currentNode, "REJECTED", request.getUserId());
|
||||||
return;
|
|
||||||
} else if ("RETURN".equals(request.getResult())) {
|
|
||||||
// 申请人撤回
|
|
||||||
myself.cancelProcess(flow, "RETURNED");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 处理通过逻辑,流转到下一节点
|
// 处理通过逻辑,流转到下一节点
|
||||||
myself.processNextNode(flow, currentNode, request.getUserId());
|
myself.processNextNode(flow, currentNode, request.getUserId());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void cancelProcess(ApprovalFlow flow, String status) {
|
public void cancelProcess(ApprovalFlow flow, ApprovalConfigPojo node, String status, String userId) {
|
||||||
// 更新流程状态
|
// 更新流程状态
|
||||||
flow.setFlowStatus(status);
|
flow.setFlowStatus(status);
|
||||||
bd.getBusinessDatabase()
|
bd.getBusinessDatabase()
|
||||||
.rowid("id", flow.getRowId())
|
.rowid("id", flow.getRowId())
|
||||||
.update("flow_status", flow.getFlowStatus())
|
.update("flow_status", flow.getFlowStatus())
|
||||||
|
.update("return_num", flow.getReturnNum() + 1)
|
||||||
.doUpdate(ApprovalFlow.class);
|
.doUpdate(ApprovalFlow.class);
|
||||||
// 更新模板状态(重新打回草稿状态)
|
// 更新模板状态(重新打回草稿状态)
|
||||||
Template template = bd.getBusinessDatabase()
|
Template template = bd.getBusinessDatabase()
|
||||||
@ -319,8 +423,27 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
|
|||||||
.update("status", template.getStatus())
|
.update("status", template.getStatus())
|
||||||
.update("return_num", template.getReturnNum() + 1)
|
.update("return_num", template.getReturnNum() + 1)
|
||||||
.doUpdate(Template.class);
|
.doUpdate(Template.class);
|
||||||
|
// 增加拒绝待办
|
||||||
myself.updateTasks(flow, "已拒绝");
|
if (Objects.equals(status, "REJECTED")) {
|
||||||
|
TodoTaskPojo todoTask = new TodoTaskPojo();
|
||||||
|
todoTask.setCreatedById(userId);
|
||||||
|
todoTask.setCreatedBy(xdapDeptUsersService.selectUserByID(userId).getUsername());
|
||||||
|
todoTask.setCurrentNode(node.getNodeName());
|
||||||
|
todoTask.setDataType("模板拒绝");
|
||||||
|
todoTask.setDocumentNo(flow.getId());
|
||||||
|
todoTask.setCreationDate(Timestamp.valueOf(LocalDateTime.now()));
|
||||||
|
todoTask.setIsDelete(0);
|
||||||
|
todoTask.setModelId(template.getId());
|
||||||
|
todoTask.setModelName(template.getTemplateName());
|
||||||
|
todoTask.setProcessTitle("拒绝提醒:"+flow.getProcessTitle());
|
||||||
|
todoTask.setStatusCode(flow.getFlowStatus());
|
||||||
|
todoTask.setVersionNumber(template.getVersion());
|
||||||
|
todoTask.setOwnerId(flow.getCreateBy());
|
||||||
|
todoTask.setCurrentProcessor(JSON.toJSONString(Collections.singletonList(flow.getCreateBy())));
|
||||||
|
bd.getBusinessDatabase().doInsert(todoTask);
|
||||||
|
}
|
||||||
|
// 更新发起和已办
|
||||||
|
myself.updateTasks(flow, Objects.equals(status, "REJECTED") ? "已拒绝" : "已撤回");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 处理下一节点流转
|
// 处理下一节点流转
|
||||||
@ -374,9 +497,14 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
|
|||||||
|
|
||||||
// 检查节点是否完成
|
// 检查节点是否完成
|
||||||
public boolean checkNodeComplete(ApprovalFlow flow, ApprovalConfigPojo node) {
|
public boolean checkNodeComplete(ApprovalFlow flow, ApprovalConfigPojo node) {
|
||||||
|
ApprovalRecord lastedRecord = bd.getBusinessDatabase()
|
||||||
|
.eq("flow_id", flow.getId())
|
||||||
|
.orderBy("approval_time", "desc")
|
||||||
|
.doQueryFirst(ApprovalRecord.class);
|
||||||
Integer processedCount = bd.getBusinessDatabase()
|
Integer processedCount = bd.getBusinessDatabase()
|
||||||
.eq("flow_id", flow.getId())
|
.eq("flow_id", flow.getId())
|
||||||
.eq("node", node.getNodeName())
|
.eq("node", node.getNodeName())
|
||||||
|
.eq("approval_level", lastedRecord.getApprovalLevel())
|
||||||
.doQuery(ApprovalRecord.class).size();
|
.doQuery(ApprovalRecord.class).size();
|
||||||
if ("会签".equals(node.getNodeName())) {
|
if ("会签".equals(node.getNodeName())) {
|
||||||
return processedCount.equals(JSON.parseArray(node.getAssignees()).size());
|
return processedCount.equals(JSON.parseArray(node.getAssignees()).size());
|
||||||
@ -417,6 +545,21 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getReturnNodes(String flowId) {
|
||||||
|
ApprovalFlow flow = bd.getBusinessDatabase()
|
||||||
|
.eq("id", flowId)
|
||||||
|
.doQueryFirst(ApprovalFlow.class);
|
||||||
|
return bd.getBusinessDatabase()
|
||||||
|
.eq("approval_id", flowId)
|
||||||
|
.lt("node_order", flow.getCurrentNode())
|
||||||
|
.doQuery(ApprovalConfigPojo.class)
|
||||||
|
.stream().sorted(Comparator.comparingInt(ApprovalConfigPojo::getNodeOrder))
|
||||||
|
.collect(Collectors.toList())
|
||||||
|
.stream().map(ApprovalConfigPojo::getNodeName)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
public void updateTasks(ApprovalFlow flow, String status) {
|
public void updateTasks(ApprovalFlow flow, String status) {
|
||||||
// 更新已办和发起的节点状态
|
// 更新已办和发起的节点状态
|
||||||
bd.getBusinessDatabase()
|
bd.getBusinessDatabase()
|
||||||
@ -473,77 +616,158 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
|
|||||||
if (approvalFlow == null) {
|
if (approvalFlow == null) {
|
||||||
return flowNodeView;
|
return flowNodeView;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<FlowNode> flowNodes = new ArrayList<>();
|
||||||
|
|
||||||
|
List<ApprovalRecord> allRecord = bd.getBusinessDatabase()
|
||||||
|
.eq("flow_id", approvalFlow.getId())
|
||||||
|
.orderBy("approval_time", "asc")
|
||||||
|
.doQuery(ApprovalRecord.class);
|
||||||
|
|
||||||
Template template = bd.getBusinessDatabase()
|
Template template = bd.getBusinessDatabase()
|
||||||
.eq("id", approvalFlow.getTemplateId())
|
.eq("id", approvalFlow.getTemplateId())
|
||||||
.doQueryFirst(Template.class);
|
.doQueryFirst(Template.class);
|
||||||
|
|
||||||
// 获取流程信息
|
// 获取流程信息
|
||||||
flowNodeView.setProgressTitle(approvalFlow.getProcessTitle());
|
flowNodeView.setProgressTitle(approvalFlow.getProcessTitle());
|
||||||
flowNodeView.setContentName(template.getTemplateName());
|
flowNodeView.setContentName(template.getTemplateName());
|
||||||
flowNodeView.setTemplateVersion(template.getVersion());
|
flowNodeView.setTemplateVersion(template.getVersion());
|
||||||
flowNodeView.setExplanation(approvalFlow.getExplanation());
|
flowNodeView.setExplanation(approvalFlow.getExplanation());
|
||||||
flowNodeView.setFlowStatus(approvalFlow.getFlowStatus());
|
flowNodeView.setFlowStatus(approvalFlow.getFlowStatus());
|
||||||
|
|
||||||
// 获取节点信息
|
// 获取节点信息
|
||||||
List<ApprovalConfigPojo> nodes = bd.getBusinessDatabase()
|
List<ApprovalConfigPojo> nodes = bd.getBusinessDatabase()
|
||||||
.eq("approval_id", form.getFlowId())
|
.eq("approval_id", form.getFlowId())
|
||||||
.doQuery(ApprovalConfigPojo.class);
|
.doQuery(ApprovalConfigPojo.class);
|
||||||
List<FlowNode> flowNodes = new ArrayList<>();
|
Map<String, ApprovalConfigPojo> nodesMap = nodes.stream()
|
||||||
nodes.forEach(node -> {
|
.filter(config -> config.getNodeName() != null)
|
||||||
FlowNode nodeView = new FlowNode();
|
.collect(Collectors.toMap(
|
||||||
if (Objects.equals(node.getNodeName(), "会签")) {
|
ApprovalConfigPojo::getNodeName,
|
||||||
List<ApprovalRecord> records = bd.getBusinessDatabase()
|
config -> config,
|
||||||
.eq("flow_id", form.getFlowId())
|
(existing, replacement) -> existing // 如果有重复键,保留第一个
|
||||||
.eq("node", node.getNodeName())
|
));
|
||||||
.doQuery(ApprovalRecord.class);
|
|
||||||
List<String> results = records.stream()
|
// 获取所有层级
|
||||||
.map(ApprovalRecord::getResult).collect(Collectors.toList());
|
Map<Integer, List<ApprovalRecord>> levelMap = allRecord.stream()
|
||||||
List<ApprovalRecord> reversedTime = records.stream().sorted(Comparator
|
.collect(Collectors.groupingBy(
|
||||||
.comparing(ApprovalRecord::getApprovalTime).reversed()).collect(Collectors.toList());
|
ApprovalRecord::getApprovalLevel,
|
||||||
if (records.size() == JSON.parseArray(node.getAssignees()).size()) {
|
Collectors.collectingAndThen(
|
||||||
// 节点已完成
|
Collectors.toList(),
|
||||||
nodeView.setNodeOrder(node.getNodeOrder());
|
list -> list.stream()
|
||||||
nodeView.setResult(results.contains("REJECT") ? "REJECT" : "PASS");
|
.sorted(Comparator.comparing(ApprovalRecord::getApprovalTime))
|
||||||
nodeView.setNode(node.getNodeName());
|
.collect(Collectors.toList())
|
||||||
nodeView.setUndoUserName(getUserNames(JSON.parseArray(node.getAssignees()).toJavaList(String.class)));
|
)
|
||||||
nodeView.setTodoUserName(getUserNames(JSON.parseArray(node.getAssignees()).toJavaList(String.class)));
|
));
|
||||||
nodeView.setApprovalTime(reversedTime.get(0).getApprovalTime());
|
|
||||||
nodeView.setOpinions(records.stream().map(approvalRecord ->
|
// 获取最大层级
|
||||||
getUserNames(Collections.singletonList(approvalRecord.getUserId())) + ":" + approvalRecord.getOpinion()).collect(Collectors.toList()));
|
int maxLevel = levelMap.keySet().stream().max(Integer::compare).orElse(1);
|
||||||
|
|
||||||
|
for (Map.Entry<Integer, List<ApprovalRecord>> entry : levelMap.entrySet()) {
|
||||||
|
// 获取到每一层
|
||||||
|
int level = entry.getKey();
|
||||||
|
List<ApprovalRecord> records = entry.getValue();
|
||||||
|
List<ApprovalRecord> uniqueRecords = new ArrayList<>(records.stream()
|
||||||
|
.collect(Collectors.toMap(
|
||||||
|
ApprovalRecord::getNode,
|
||||||
|
Function.identity(),
|
||||||
|
(first, second) -> first
|
||||||
|
))
|
||||||
|
.values());
|
||||||
|
uniqueRecords.forEach(record -> {
|
||||||
|
ApprovalConfigPojo approvalConfigPojo = nodesMap.get(record.getNode());
|
||||||
|
if (approvalConfigPojo != null) {
|
||||||
|
flowNodes.add(getFlowNodeView(approvalConfigPojo, form.getFlowId(), level));
|
||||||
} else {
|
} else {
|
||||||
// 节点未完成
|
FlowNode flowNode = new FlowNode();
|
||||||
nodeView.setNodeOrder(node.getNodeOrder());
|
flowNode.setNode(record.getNode());
|
||||||
nodeView.setNode(node.getNodeName());
|
flowNode.setTodoUserName(record.getUserId());
|
||||||
nodeView.setResult("待审批");
|
flowNode.setResult(record.getResult());
|
||||||
List<String> includedIds = records.stream().map(ApprovalRecord::getUserId).collect(Collectors.toList());
|
flowNode.setApprovalTime(record.getApprovalTime());
|
||||||
nodeView.setTodoUserName(getUserNames(includedIds));
|
flowNodes.add(flowNode);
|
||||||
nodeView.setUndoUserName(getUserNames(JSON.parseArray(node.getAssignees()).toJavaList(String.class)));
|
|
||||||
}
|
}
|
||||||
} else {
|
});
|
||||||
ApprovalRecord record = bd.getBusinessDatabase()
|
|
||||||
.eq("flow_id", form.getFlowId())
|
if (level == maxLevel && Objects.equals(approvalFlow.getFlowStatus(), "APPROVING")) {
|
||||||
.eq("node", node.getNodeName())
|
// 最后一层,添加待处理信息
|
||||||
.doQueryFirst(ApprovalRecord.class);
|
nodes.forEach(node -> {
|
||||||
nodeView.setNodeOrder(node.getNodeOrder());
|
if (node.getNodeOrder() >= approvalFlow.getCurrentNode()) {
|
||||||
nodeView.setNode(node.getNodeName());
|
flowNodes.add(getFlowNodeView(node, form.getFlowId(), maxLevel));
|
||||||
if (record != null) {
|
}
|
||||||
// 节点已完成
|
});
|
||||||
nodeView.setResult(record.getResult());
|
|
||||||
nodeView.setOpinions(Collections.singletonList(getUserNames(Collections.singletonList(record.getUserId())) + ":" + record.getOpinion()));
|
|
||||||
nodeView.setApprovalTime(record.getApprovalTime());
|
|
||||||
nodeView.setTodoUserName(getUserNames(Collections.singletonList(record.getUserId())));
|
|
||||||
} else {
|
|
||||||
// 节点未完成
|
|
||||||
nodeView.setResult("待审批");
|
|
||||||
nodeView.setTodoUserName("");
|
|
||||||
}
|
|
||||||
nodeView.setUndoUserName(getUserNames(JSON.parseArray(node.getAssignees()).toJavaList(String.class)));
|
|
||||||
}
|
}
|
||||||
flowNodes.add(nodeView);
|
}
|
||||||
});
|
List<FlowNode> sortedNode = flowNodes.stream()
|
||||||
List<FlowNode> sortedNode = flowNodes.stream().sorted(Comparator.comparing(FlowNode::getNodeOrder)).collect(Collectors.toList());
|
.sorted(Comparator.comparing(FlowNode::getApprovalTime,
|
||||||
|
Comparator.nullsLast(Comparator.naturalOrder()))
|
||||||
|
.thenComparing(FlowNode::getNodeOrder))
|
||||||
|
.collect(Collectors.toList());
|
||||||
flowNodeView.setFlowNodes(sortedNode);
|
flowNodeView.setFlowNodes(sortedNode);
|
||||||
return flowNodeView;
|
return flowNodeView;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private FlowNode getFlowNodeView(
|
||||||
|
ApprovalConfigPojo node,
|
||||||
|
String flowId,
|
||||||
|
int level
|
||||||
|
) {
|
||||||
|
FlowNode nodeView = new FlowNode();
|
||||||
|
if (Objects.equals(node.getNodeName(), "会签")) {
|
||||||
|
List<ApprovalRecord> records = bd.getBusinessDatabase()
|
||||||
|
.eq("flow_id", flowId)
|
||||||
|
.eq("node", node.getNodeName())
|
||||||
|
.eq("approval_level", level)
|
||||||
|
.doQuery(ApprovalRecord.class);
|
||||||
|
List<String> results = records.stream()
|
||||||
|
.map(ApprovalRecord::getResult).collect(Collectors.toList());
|
||||||
|
List<ApprovalRecord> reversedTime = records.stream().sorted(Comparator
|
||||||
|
.comparing(ApprovalRecord::getApprovalTime).reversed()).collect(Collectors.toList());
|
||||||
|
if (records.size() == JSON.parseArray(node.getAssignees()).size() || results.contains("REJECT") || results.contains("RETURN")) {
|
||||||
|
// 节点已完成
|
||||||
|
nodeView.setNodeOrder(node.getNodeOrder());
|
||||||
|
String r = results.contains("RETURN") ? "RETURN" : "PASS";
|
||||||
|
if (results.contains("REJECT")) {
|
||||||
|
r = "REJECT";
|
||||||
|
}
|
||||||
|
nodeView.setResult(r);
|
||||||
|
nodeView.setNode(node.getNodeName());
|
||||||
|
nodeView.setUndoUserName(getUserNames(JSON.parseArray(node.getAssignees()).toJavaList(String.class)));
|
||||||
|
nodeView.setTodoUserName(getUserNames(JSON.parseArray(node.getAssignees()).toJavaList(String.class)));
|
||||||
|
nodeView.setApprovalTime(reversedTime.get(0).getApprovalTime());
|
||||||
|
nodeView.setOpinions(records.stream().map(approvalRecord ->
|
||||||
|
getUserNames(Collections.singletonList(approvalRecord.getUserId())) + ":" + approvalRecord.getOpinion()).collect(Collectors.toList()));
|
||||||
|
} else {
|
||||||
|
// 节点未完成
|
||||||
|
nodeView.setNodeOrder(node.getNodeOrder());
|
||||||
|
nodeView.setNode(node.getNodeName());
|
||||||
|
nodeView.setResult("待审批");
|
||||||
|
List<String> includedIds = records.stream().map(ApprovalRecord::getUserId).collect(Collectors.toList());
|
||||||
|
nodeView.setTodoUserName(getUserNames(includedIds));
|
||||||
|
nodeView.setUndoUserName(getUserNames(JSON.parseArray(node.getAssignees()).toJavaList(String.class)));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ApprovalRecord record = bd.getBusinessDatabase()
|
||||||
|
.eq("flow_id", flowId)
|
||||||
|
.eq("node", node.getNodeName())
|
||||||
|
.eq("approval_level", level)
|
||||||
|
.doQueryFirst(ApprovalRecord.class);
|
||||||
|
nodeView.setNodeOrder(node.getNodeOrder());
|
||||||
|
nodeView.setNode(node.getNodeName());
|
||||||
|
if (record != null) {
|
||||||
|
// 节点已完成
|
||||||
|
nodeView.setResult(record.getResult());
|
||||||
|
nodeView.setOpinions(Collections.singletonList(getUserNames(Collections.singletonList(record.getUserId())) + ":" + record.getOpinion()));
|
||||||
|
nodeView.setApprovalTime(record.getApprovalTime());
|
||||||
|
nodeView.setTodoUserName(getUserNames(Collections.singletonList(record.getUserId())));
|
||||||
|
} else {
|
||||||
|
// 节点未完成
|
||||||
|
nodeView.setResult("待审批");
|
||||||
|
nodeView.setTodoUserName("");
|
||||||
|
}
|
||||||
|
nodeView.setUndoUserName(getUserNames(JSON.parseArray(node.getAssignees()).toJavaList(String.class)));
|
||||||
|
}
|
||||||
|
return nodeView;
|
||||||
|
}
|
||||||
|
|
||||||
private String getUserNames(List<String> userIds) {
|
private String getUserNames(List<String> userIds) {
|
||||||
StringJoiner joiner = new StringJoiner(" ");
|
StringJoiner joiner = new StringJoiner(" ");
|
||||||
for (String userId : userIds) {
|
for (String userId : userIds) {
|
||||||
@ -559,6 +783,7 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void handleReturn(HandleApprovalRequest request) {
|
public void handleReturn(HandleApprovalRequest request) {
|
||||||
ApprovalFlow flow = bd.getBusinessDatabase()
|
ApprovalFlow flow = bd.getBusinessDatabase()
|
||||||
.eq("id", request.getFlowId())
|
.eq("id", request.getFlowId())
|
||||||
@ -566,31 +791,140 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
|
|||||||
if (!Objects.equals(flow.getCreateBy(), request.getUserId())) {
|
if (!Objects.equals(flow.getCreateBy(), request.getUserId())) {
|
||||||
throw new CommonException("不是申请人无法撤回");
|
throw new CommonException("不是申请人无法撤回");
|
||||||
}
|
}
|
||||||
if (!Objects.equals(flow.getCurrentNode(), "PROOFREAD")) {
|
|
||||||
throw new CommonException("已进入流程无法撤回");
|
|
||||||
}
|
|
||||||
if (!Objects.equals(flow.getFlowStatus(), "APPROVING")) {
|
if (!Objects.equals(flow.getFlowStatus(), "APPROVING")) {
|
||||||
throw new CommonException("不在流程无法撤回");
|
throw new CommonException("不在流程无法撤回");
|
||||||
}
|
}
|
||||||
ApprovalConfigPojo currentNode = bd.getBusinessDatabase()
|
ApprovalConfigPojo currentNode = bd.getBusinessDatabase()
|
||||||
.eq("approval_id", request.getFlowId())
|
.eq("approval_id", request.getFlowId())
|
||||||
.eq("current_node", flow.getCurrentNode())
|
.eq("node_order", flow.getCurrentNode())
|
||||||
.doQueryFirst(ApprovalConfigPojo.class);
|
.doQueryFirst(ApprovalConfigPojo.class);
|
||||||
if ("RETURN".equals(request.getResult())) {
|
|
||||||
ApprovalRecord record = new ApprovalRecord();
|
|
||||||
record.setFlowId(flow.getId());
|
|
||||||
record.setNode(currentNode.getNodeName());
|
|
||||||
record.setUserId(request.getUserId());
|
|
||||||
record.setOpinion(request.getOpinion());
|
|
||||||
record.setResult(request.getResult());
|
|
||||||
record.setApprovalTime(Timestamp.valueOf(LocalDateTime.now()));
|
|
||||||
bd.getBusinessDatabase().doInsert(record);
|
|
||||||
|
|
||||||
// 申请人撤回
|
String lockKey = FLOW_LOCK_PREFIX + flow.getId() + ":" + currentNode.getNodeName();
|
||||||
cancelProcess(flow, "RETURNED");
|
String lockValue = UUID.randomUUID().toString();
|
||||||
} else {
|
boolean lockAcquired = redisLockUtil
|
||||||
throw new CommonException("无法撤回");
|
.tryLock(lockKey, lockValue, FLOW_LOCK_EXPIRE_SECONDS, TimeUnit.SECONDS);
|
||||||
|
if (!lockAcquired) {
|
||||||
|
throw new CommonException("当前节点正在处理,请稍后重试");
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
if ("RETURN".equals(request.getResult())) {
|
||||||
|
// 删除待办
|
||||||
|
bd.getBusinessDatabase()
|
||||||
|
.eq("document_no", flow.getId())
|
||||||
|
.eq("current_node", currentNode.getNodeName())
|
||||||
|
.update("is_delete", 1)
|
||||||
|
.update("last_update_date", Timestamp.valueOf(LocalDateTime.now()))
|
||||||
|
.doUpdate(TodoTaskPojo.class);
|
||||||
|
|
||||||
|
ApprovalRecord lastedRecord = bd.getBusinessDatabase()
|
||||||
|
.eq("flow_id", flow.getId())
|
||||||
|
.orderBy("approval_time", "desc")
|
||||||
|
.doQueryFirst(ApprovalRecord.class);
|
||||||
|
|
||||||
|
ApprovalRecord record = new ApprovalRecord(
|
||||||
|
flow.getId(),
|
||||||
|
currentNode.getNodeName(),
|
||||||
|
request.getUserId(),
|
||||||
|
request.getOpinion(),
|
||||||
|
request.getResult(),
|
||||||
|
Timestamp.valueOf(LocalDateTime.now()),
|
||||||
|
lastedRecord.getApprovalLevel()
|
||||||
|
);
|
||||||
|
bd.getBusinessDatabase().doInsert(record);
|
||||||
|
|
||||||
|
// 申请人撤回
|
||||||
|
myself.cancelProcess(flow, currentNode, "RETURNED", request.getUserId());
|
||||||
|
} else {
|
||||||
|
throw new CommonException("无法撤回");
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
redisLockUtil.unlock(lockKey, lockValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public void handleReturnToNode(HandleReturnNodeForm form) {
|
||||||
|
// 查找流程
|
||||||
|
ApprovalFlow flow = bd.getBusinessDatabase()
|
||||||
|
.eq("id", form.getFlowId())
|
||||||
|
.doQueryFirst(ApprovalFlow.class);
|
||||||
|
|
||||||
|
// 查找模板
|
||||||
|
Template template = bd.getBusinessDatabase()
|
||||||
|
.eq("id", flow.getTemplateId())
|
||||||
|
.doQueryFirst(Template.class);
|
||||||
|
|
||||||
|
// 查找当前节点
|
||||||
|
ApprovalConfigPojo currentNode = bd.getBusinessDatabase()
|
||||||
|
.eq("approval_id", flow.getId())
|
||||||
|
.eq("node_order", flow.getCurrentNode())
|
||||||
|
.doQueryFirst(ApprovalConfigPojo.class);
|
||||||
|
|
||||||
|
if (!currentNode.getAssignees().contains(form.getProcessUserId())) {
|
||||||
|
throw new CommonException("无权限操作");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String lockKey = FLOW_LOCK_PREFIX + flow.getId() + ":" + currentNode.getNodeName();
|
||||||
|
String lockValue = UUID.randomUUID().toString();
|
||||||
|
boolean lockAcquired = redisLockUtil
|
||||||
|
.tryLock(lockKey, lockValue, FLOW_LOCK_EXPIRE_SECONDS, TimeUnit.SECONDS);
|
||||||
|
if (!lockAcquired) {
|
||||||
|
throw new CommonException("当前节点正在处理,请稍后重试");
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
// 删除当前节点待办
|
||||||
|
bd.getBusinessDatabase()
|
||||||
|
.eq("document_no", flow.getId())
|
||||||
|
.eq("current_node", currentNode.getNodeName())
|
||||||
|
.update("is_delete", 1)
|
||||||
|
.update("last_update_date", Timestamp.valueOf(LocalDateTime.now()))
|
||||||
|
.doUpdate(TodoTaskPojo.class);
|
||||||
|
|
||||||
|
// 更新流程节点
|
||||||
|
ApprovalConfigPojo toNode = bd.getBusinessDatabase()
|
||||||
|
.eq("approval_id", form.getFlowId())
|
||||||
|
.eq("node_name", form.getNodeName())
|
||||||
|
.doQueryFirst(ApprovalConfigPojo.class);
|
||||||
|
if (toNode == null) {
|
||||||
|
throw new CommonException("找不到目标节点");
|
||||||
|
}
|
||||||
|
flow.setCurrentNode(toNode.getNodeOrder());
|
||||||
|
bd.getBusinessDatabase()
|
||||||
|
.eq("id", flow.getId())
|
||||||
|
.update("current_node", flow.getCurrentNode())
|
||||||
|
.doUpdate(ApprovalFlow.class);
|
||||||
|
|
||||||
|
// 生成新的待办
|
||||||
|
myself.addNodeTodo(flow, toNode, template, form.getCreateUserId());
|
||||||
|
|
||||||
|
// 生成处理记录
|
||||||
|
ApprovalRecord lastedRecord = bd.getBusinessDatabase()
|
||||||
|
.eq("flow_id", flow.getId())
|
||||||
|
.orderBy("approval_time", "desc")
|
||||||
|
.doQueryFirst(ApprovalRecord.class);
|
||||||
|
ApprovalRecord record = new ApprovalRecord(
|
||||||
|
flow.getId(),
|
||||||
|
currentNode.getNodeName(),
|
||||||
|
form.getCreateUserId(),
|
||||||
|
"退回",
|
||||||
|
"RETURN",
|
||||||
|
Timestamp.valueOf(LocalDateTime.now()),
|
||||||
|
lastedRecord.getApprovalLevel()
|
||||||
|
);
|
||||||
|
bd.getBusinessDatabase().doInsert(record);
|
||||||
|
ApprovalRecord approvalRecord = new ApprovalRecord(
|
||||||
|
flow.getId(),
|
||||||
|
"退回至" + toNode.getNodeName(),
|
||||||
|
xdapDeptUsersService.selectUserByID(form.getCreateUserId()).getUsername(),
|
||||||
|
"退回",
|
||||||
|
"MSG",
|
||||||
|
Timestamp.valueOf(LocalDateTime.now().plusSeconds(1)),
|
||||||
|
lastedRecord.getApprovalLevel() + 1
|
||||||
|
);
|
||||||
|
bd.getBusinessDatabase().doInsert(approvalRecord);
|
||||||
|
} finally {
|
||||||
|
redisLockUtil.unlock(lockKey, lockValue);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -216,6 +216,13 @@ public class TemplateServiceImpl implements TemplateService {
|
|||||||
.doQuery(Template.class);
|
.doQuery(Template.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Template getTemplateById(String templateId) {
|
||||||
|
return bd.getBusinessDatabase()
|
||||||
|
.eq("id", templateId)
|
||||||
|
.doQueryFirst(Template.class);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void processSheetData(List<Parameter> dataList, String sheetName,
|
public void processSheetData(List<Parameter> dataList, String sheetName,
|
||||||
@ -248,9 +255,6 @@ public class TemplateServiceImpl implements TemplateService {
|
|||||||
problems.getErrors().add(errorMsg);
|
problems.getErrors().add(errorMsg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (problems.getFlag()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 处理模板版本
|
// 处理模板版本
|
||||||
@ -274,9 +278,12 @@ public class TemplateServiceImpl implements TemplateService {
|
|||||||
.eq("template_name", templateName)
|
.eq("template_name", templateName)
|
||||||
.orderBy("version", "desc")
|
.orderBy("version", "desc")
|
||||||
.doQueryFirst(Template.class);
|
.doQueryFirst(Template.class);
|
||||||
if (Objects.equals(template.getStatus(), "APPROVING")) {
|
if (template != null && Objects.equals(template.getStatus(), "APPROVING")) {
|
||||||
problems.setFlag(true);
|
problems.setFlag(true);
|
||||||
problems.getErrors().add("模板导入失败:模板'" + templateName + "'正在审批中");
|
problems.getErrors().add("模板导入失败:模板'" + templateName + "'正在审批中");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (problems.getFlag()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -29,6 +29,8 @@ import java.text.ParseException;
|
|||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.function.BinaryOperator;
|
||||||
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -187,7 +189,14 @@ public class TodoTaskServiceImpl implements TodoTaskService {
|
|||||||
taskPojo1.setCurrentProcessor(String.join(",", strings));
|
taskPojo1.setCurrentProcessor(String.join(",", strings));
|
||||||
tods.add(taskPojo1);
|
tods.add(taskPojo1);
|
||||||
}
|
}
|
||||||
pageResultDTO.setList(tods);
|
List<CompletedTaskPojo> collect = new ArrayList<>(tods.stream()
|
||||||
|
.collect(Collectors
|
||||||
|
.toMap(CompletedTaskPojo::getDocumentNo, Function.identity(),
|
||||||
|
BinaryOperator
|
||||||
|
.maxBy(Comparator.comparing(CompletedTaskPojo::getCreationDate))))
|
||||||
|
.values());
|
||||||
|
collect.sort(Comparator.comparing(CompletedTaskPojo::getCreationDate).reversed());
|
||||||
|
pageResultDTO.setList(collect);
|
||||||
pageResultDTO.setTotalCount(queryResult.getCount());
|
pageResultDTO.setTotalCount(queryResult.getCount());
|
||||||
return pageResultDTO;
|
return pageResultDTO;
|
||||||
|
|
||||||
@ -221,6 +230,8 @@ public class TodoTaskServiceImpl implements TodoTaskService {
|
|||||||
ArrayList<TodoTaskPojo> todoTaskPojos = new ArrayList<>();
|
ArrayList<TodoTaskPojo> todoTaskPojos = new ArrayList<>();
|
||||||
ArrayList<InitiatedTaskPojo> taskPojos = new ArrayList<>();
|
ArrayList<InitiatedTaskPojo> taskPojos = new ArrayList<>();
|
||||||
|
|
||||||
|
// todo清除待办
|
||||||
|
|
||||||
XdapUsers xdapUsersPojo = xdapDeptUsersService.selectUserByID(userID);
|
XdapUsers xdapUsersPojo = xdapDeptUsersService.selectUserByID(userID);
|
||||||
DataEntryEngineModelPojo modelPojo = dataEntryEngineModelService.selectBymodelId(modelId);
|
DataEntryEngineModelPojo modelPojo = dataEntryEngineModelService.selectBymodelId(modelId);
|
||||||
for (EngineParamDetailDTO engineParamDetailDTO : dtoList) {
|
for (EngineParamDetailDTO engineParamDetailDTO : dtoList) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user