TODO abilityprocess_v3 能力申请流程的发起
This commit is contained in:
parent
617ecd64c8
commit
964bf55f12
|
@ -54,7 +54,8 @@ import java.util.stream.Collectors;
|
|||
@RestController
|
||||
@RequestMapping("/ability/center/v2")
|
||||
public class AbilityCenterControllerV2 {
|
||||
private static final ExecutorService executor = Executors.newCachedThreadPool();
|
||||
private static final Integer CPUNUM = Runtime.getRuntime().availableProcessors();
|
||||
private static final ExecutorService executor = Executors.newWorkStealingPool(CPUNUM * 2);
|
||||
private static final Logger logger = LoggerFactory.getLogger(AbilityCenterControllerV2.class);
|
||||
private static final ObjectMapper oMapper = new ObjectMapper();
|
||||
@Autowired
|
||||
|
|
|
@ -0,0 +1,265 @@
|
|||
package io.renren.common.controller;
|
||||
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import io.renren.common.annotation.LogOperation;
|
||||
import io.renren.common.constant.Constant;
|
||||
import io.renren.common.dto.AuditingBaseDTO;
|
||||
import io.renren.common.page.PageData;
|
||||
import io.renren.common.utils.CodeGenerationUtils;
|
||||
import io.renren.common.utils.Result;
|
||||
import io.renren.common.validator.ValidatorUtils;
|
||||
import io.renren.common.validator.group.AddGroup;
|
||||
import io.renren.common.validator.group.DefaultGroup;
|
||||
import io.renren.modules.activiti.dto.ProcessInstanceDTO;
|
||||
import io.renren.modules.activiti.dto.ProcessStartDTO;
|
||||
import io.renren.modules.activiti.service.ActProcessService;
|
||||
import io.renren.modules.activiti.service.ActRunningService;
|
||||
import io.renren.modules.processForm.dto.TAbilityApplicationDTO;
|
||||
import io.renren.modules.processForm.dto.TAbilityBatchApplicationDTO;
|
||||
import io.renren.modules.processForm.service.TAbilityApplicationService;
|
||||
import io.renren.modules.resource.dto.ResourceDTO;
|
||||
import io.renren.modules.resource.service.ResourceService;
|
||||
import io.renren.modules.security.user.SecurityUser;
|
||||
import io.renren.modules.security.user.UserDetail;
|
||||
import io.renren.modules.sys.dto.SysDeptDTO;
|
||||
import io.renren.modules.sys.service.SysDeptService;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.codehaus.jackson.map.ObjectMapper;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Api(tags = "能力集中")
|
||||
@RestController
|
||||
@RequestMapping("/ability/center/v3")
|
||||
public class AbilityCenterControllerV3 {
|
||||
private static final Logger logger = LoggerFactory.getLogger(AbilityCenterControllerV3.class);
|
||||
|
||||
private final CodeGenerationUtils codeGenerationUtils = CodeGenerationUtils.getInstance();
|
||||
private static final Integer CPUNUM = Runtime.getRuntime().availableProcessors();
|
||||
|
||||
private static final ExecutorService executor = Executors.newWorkStealingPool(CPUNUM * 2);
|
||||
|
||||
private static final ObjectMapper oMapper = new ObjectMapper();
|
||||
|
||||
@Value("${project.place}")
|
||||
private Integer projectPlace;
|
||||
|
||||
@Value("${big_date.name}")
|
||||
private String bigDateDeptName; // 大数据局名称
|
||||
|
||||
@Lazy
|
||||
@Autowired
|
||||
private JdbcTemplate jdbcTemplate;
|
||||
|
||||
@Autowired
|
||||
private ActProcessService actProcessService;
|
||||
|
||||
@Autowired
|
||||
private TAbilityApplicationService tAbilityApplicationService;
|
||||
@Autowired
|
||||
private ActRunningService actRunningService;
|
||||
@Autowired
|
||||
private ResourceService resourceService;
|
||||
@Autowired
|
||||
private SysDeptService sysDeptService;
|
||||
|
||||
|
||||
private static final String KEY = "abilityprocess_v3";
|
||||
private static final Map<String, Object> params = new HashMap<String, Object>() {
|
||||
{
|
||||
put("isLatestVersion", true); // 取最新版本
|
||||
put("key", KEY); // 限定
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 批量进行批量能力申请(按资源所属部门分配审核人)
|
||||
*/
|
||||
@PostMapping(value = "/apply")
|
||||
@ApiOperation("批量进行能力申请")
|
||||
@LogOperation("批量进行能力申请")
|
||||
public Result<List<ProcessInstanceDTO>> applyV2(@RequestBody TAbilityBatchApplicationDTO abilityBatchApplicationDTO) {
|
||||
// 仿照请求接口 /act/process/lastestPage
|
||||
PageData<Map<String, Object>> page = actProcessService.page(params);
|
||||
if (page.getTotal() <= 0) { //
|
||||
return new Result().error("联系管理员添加流程");
|
||||
}
|
||||
final String applyFlag = UUID.randomUUID().toString();
|
||||
abilityBatchApplicationDTO.setApplyFlag(applyFlag); // 同一次的申请标识
|
||||
logger.info("申请入参{}", JSON.toJSONString(abilityBatchApplicationDTO));
|
||||
final Optional<SysDeptDTO> deptDTO = Optional.ofNullable(sysDeptService.getByName(bigDateDeptName));
|
||||
final UserDetail user = SecurityUser.getUser();
|
||||
switch (Constant.ProjectPlace.getByFlag(projectPlace)) {
|
||||
case TSINGTAO: { // 青岛市局 异步会死锁
|
||||
deal(abilityBatchApplicationDTO, deptDTO, applyFlag, user);
|
||||
}
|
||||
break;
|
||||
default: {
|
||||
executor.execute(() -> {
|
||||
deal(abilityBatchApplicationDTO, deptDTO, applyFlag, user);
|
||||
});
|
||||
}
|
||||
}
|
||||
return new Result().ok(LocalDateTime.now().toString());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 拆单进行审核
|
||||
*
|
||||
* @param abilityBatchApplicationDTO
|
||||
* @param deptDTO
|
||||
* @param applyFlag
|
||||
* @param user
|
||||
*/
|
||||
// TODO 拆单进行审核 abilityprocess_v3
|
||||
private void deal(TAbilityBatchApplicationDTO abilityBatchApplicationDTO, Optional<SysDeptDTO> deptDTO, String applyFlag, UserDetail user) {
|
||||
List<TAbilityApplicationDTO> tAbilityApplicationDTOList = abilityBatchApplicationDTO.getSystem().stream().map(index -> {
|
||||
if (tAbilityApplicationService.countUserResourceApply(SecurityUser.getUserId(), Long.valueOf(index.get("resourceId"))) > 0) { // 防止重复发起申请
|
||||
logger.error("重复发起申请");
|
||||
return null;
|
||||
}
|
||||
TAbilityApplicationDTO tAbilityApplicationDTO = new TAbilityApplicationDTO();
|
||||
tAbilityApplicationDTO.setArea(abilityBatchApplicationDTO.getArea());
|
||||
tAbilityApplicationDTO.setAttachment(abilityBatchApplicationDTO.getAttachment());
|
||||
tAbilityApplicationDTO.setBasis(abilityBatchApplicationDTO.getBasis());
|
||||
tAbilityApplicationDTO.setPhone(abilityBatchApplicationDTO.getPhone());
|
||||
tAbilityApplicationDTO.setScene(abilityBatchApplicationDTO.getScene());
|
||||
tAbilityApplicationDTO.setInstanceId(abilityBatchApplicationDTO.getInstanceId());
|
||||
tAbilityApplicationDTO.setUnit(abilityBatchApplicationDTO.getUnit());
|
||||
tAbilityApplicationDTO.setUser(abilityBatchApplicationDTO.getUser());
|
||||
tAbilityApplicationDTO.setResourceId(index.get("resourceId"));
|
||||
tAbilityApplicationDTO.setUser(abilityBatchApplicationDTO.getUser());
|
||||
tAbilityApplicationDTO.setSystem(index.get("resourceName"));
|
||||
tAbilityApplicationDTO.setEnclosure(abilityBatchApplicationDTO.getEnclosure()); // 附件
|
||||
tAbilityApplicationDTO.setUserId(abilityBatchApplicationDTO.getUserId());
|
||||
tAbilityApplicationDTO.setApproveStatus("审核中");
|
||||
tAbilityApplicationDTO.setDelFlag(0);
|
||||
// v2 新增字段
|
||||
tAbilityApplicationDTO.setCameraList(index.get("channelId") == null ? null : JSON.toJSONString(index));
|
||||
tAbilityApplicationDTO.setTitle(abilityBatchApplicationDTO.getTitle());
|
||||
tAbilityApplicationDTO.setApplicationBackground(abilityBatchApplicationDTO.getApplicationBackground());
|
||||
tAbilityApplicationDTO.setApplicationScene(abilityBatchApplicationDTO.getApplicationScene());
|
||||
tAbilityApplicationDTO.setApplicationSystem(abilityBatchApplicationDTO.getApplicationSystem());
|
||||
tAbilityApplicationDTO.setEffectWish(abilityBatchApplicationDTO.getEffectWish());
|
||||
tAbilityApplicationDTO.setEnclosureName(abilityBatchApplicationDTO.getEnclosureName());
|
||||
tAbilityApplicationDTO.setCreateDate(new Date());
|
||||
|
||||
// 归为同一次申请
|
||||
tAbilityApplicationDTO.setApplyFlag(abilityBatchApplicationDTO.getApplyFlag());
|
||||
|
||||
tAbilityApplicationDTO.setFlowType("能力申请");
|
||||
|
||||
// 仿照请求接口 /processForm/tabilityapplication
|
||||
ValidatorUtils.validateEntity(tAbilityApplicationDTO, AddGroup.class, DefaultGroup.class);
|
||||
tAbilityApplicationService.save(tAbilityApplicationDTO); // 写能力申请数据
|
||||
if (tAbilityApplicationDTO.getId() == null) {
|
||||
logger.error("插入申请单失败!");
|
||||
return null;
|
||||
}
|
||||
tAbilityApplicationDTO.setCompleteEntry(Boolean.TRUE);
|
||||
return tAbilityApplicationDTO;
|
||||
}).filter(ObjectUtil::isNotNull).collect(Collectors.toList()); // 申请入库
|
||||
if (!tAbilityApplicationDTOList.isEmpty()) {
|
||||
codeGenerationUtils.setApplyNumber("NLSY", tAbilityApplicationDTOList.stream().map(TAbilityApplicationDTO::getId).collect(Collectors.toList()), jdbcTemplate);
|
||||
|
||||
Map<Long, List<TAbilityApplicationDTO>> temp = tAbilityApplicationDTOList.stream()
|
||||
.filter(Objects::nonNull)
|
||||
.filter(index -> StringUtils.isNotEmpty(index.getResourceId()))
|
||||
.collect(Collectors.groupingBy(t -> {
|
||||
ResourceDTO resourceDTO = resourceService.get(Long.valueOf(t.getResourceId()));
|
||||
if (resourceDTO == null && deptDTO.isPresent()) { // 资源不存在时
|
||||
return deptDTO.get().getId();
|
||||
}
|
||||
if (resourceDTO.getDeptId() == null && deptDTO.isPresent()) {
|
||||
return deptDTO.get().getId();
|
||||
}
|
||||
return resourceDTO.getDeptId();
|
||||
})); // 按部门分组
|
||||
temp.keySet().stream().distinct().forEach(deptId -> {
|
||||
if (deptId == 0L) { // 部门id不存在时
|
||||
return;
|
||||
}
|
||||
final SysDeptDTO sysDeptDTO = sysDeptService.get(deptId);
|
||||
if (sysDeptDTO == null) { // 部门不存在
|
||||
return;
|
||||
}
|
||||
List<TAbilityApplicationDTO> dtoList = temp.get(deptId);
|
||||
|
||||
CompletableFuture.runAsync(() -> {
|
||||
String[] sqls = dtoList.stream().map(index -> String.format("UPDATE t_ability_application SET resource_owner_dept = '%s' WHERE id = %s", JSON.toJSONString(sysDeptDTO), index.getId())).collect(Collectors.toList()).toArray(new String[dtoList.size()]);
|
||||
jdbcTemplate.batchUpdate(sqls); // 批量更新资源所属部门信息
|
||||
logger.info("批量更新申请的资源的部门信息完成");
|
||||
}, executor);
|
||||
|
||||
Boolean basicFacilities = dtoList.stream().map(index -> {
|
||||
Optional<ResourceDTO> resourceDTOOptional = Optional.ofNullable(resourceService.get(Long.valueOf(index.getResourceId())));
|
||||
if (!resourceDTOOptional.isPresent()) { // 从本库内查不到 视为其它平台的基础设施资源
|
||||
return true;
|
||||
}
|
||||
if ("基础设施".equals(resourceDTOOptional.get().getType())) { // 基础设施
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}).filter(index -> index).findAny().orElse(Boolean.FALSE);
|
||||
logger.error("--------------------是否全是基础设施{}----------------------------------------------", basicFacilities);
|
||||
final List<Long> ids = dtoList.stream().map(TAbilityApplicationDTO::getId).collect(Collectors.toList()); // 发起申请的表单id
|
||||
// 仿照请求接口 /act/running/startOfBusinessKey
|
||||
ProcessStartDTO processStartDTO = new ProcessStartDTO();
|
||||
processStartDTO.setBusinessKey(Boolean.TRUE.equals(basicFacilities) ? tAbilityApplicationDTOList.stream().filter(index -> StringUtils.isNotEmpty(index.getResourceId()))
|
||||
.map(TAbilityApplicationDTO::getResourceId).findFirst().orElse(null) :
|
||||
JSON.toJSONString(ids.stream().limit(5).collect(Collectors.toList()))); // 申请的id列表 json字符 做businesskey
|
||||
processStartDTO.setProcessDefinitionKey(KEY); //限定
|
||||
AuditingBaseDTO auditingBaseDTO = new AuditingBaseDTO();
|
||||
auditingBaseDTO.setCompleteEntry(Boolean.TRUE); // 首次录入
|
||||
auditingBaseDTO.setFlowType("能力申请");
|
||||
|
||||
Map<String, Object> variables = oMapper.convertValue(auditingBaseDTO, Map.class);
|
||||
|
||||
variables.putAll(new HashMap<String, Object>() { // 流程内携带属性值
|
||||
{
|
||||
put("tAbilityApplicationDTOList", dtoList); // 归属该部门的申请
|
||||
put("key", processStartDTO.getBusinessKey()); // 归属该部门申请的表单id
|
||||
put("deptId", deptId); // 归属部门
|
||||
put("id", applyFlag); //申请id
|
||||
put("creator", user == null ? null : user.getId().toString()); // 创建人
|
||||
put("userId", user == null ? null : user.getId().toString()); // 创建人
|
||||
put("basic_facilities", basicFacilities); // 是否为基础设施
|
||||
}
|
||||
});
|
||||
|
||||
processStartDTO.setVariables(variables);
|
||||
ProcessInstanceDTO dto = actRunningService.startOfBusinessKey(processStartDTO);
|
||||
|
||||
// 仿照请求接口 /processForm/tabilityapplication/updateInstanceId
|
||||
CompletableFuture.runAsync(() -> {
|
||||
if (dto.getBusinessKey() != null) {
|
||||
String[] sqls = dtoList.stream().map(i -> String.format("UPDATE t_ability_application SET instance_id = %s WHERE id = %s", dto.getProcessInstanceId(), i.getId()))
|
||||
.collect(Collectors.toList()).toArray(new String[dtoList.size()]);
|
||||
jdbcTemplate.batchUpdate(sqls);
|
||||
}
|
||||
}, executor);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue