提交 63aaf335 authored 作者: Matrix's avatar Matrix

feat(核查模块): 修正了自动办结,审阅的相关机制

- 省退回之后,新的任务显示应该是`无` 而不是`未通过` - 省本级的任务完成之后,自动触发省审核通过 - 省审核通过之后,检验整个节点树是否所有节点都是审核通过,如果是,则自动完结任务。
上级 b51a26ec
......@@ -44,6 +44,7 @@ import com.tykj.dev.device.user.subject.entity.Units;
import com.tykj.dev.device.user.subject.entity.User;
import com.tykj.dev.device.user.subject.entity.bto.AreaUnit;
import com.tykj.dev.device.user.subject.service.AuService;
import com.tykj.dev.device.user.subject.service.UnitsService;
import com.tykj.dev.device.user.subject.service.UserService;
import com.tykj.dev.device.user.util.AuthenticationUtils;
import com.tykj.dev.misc.base.ResultObj;
......@@ -134,6 +135,8 @@ public class DeviceCheckController {
private MessageService messageService;
@Autowired
private TaskLogService taskLogService;
@Autowired
private UnitsService unitsService;
@GetMapping("/area/{fatherId}")
@ApiOperation(value = "查询指定区域下的所有区域信息")
......@@ -548,19 +551,21 @@ public class DeviceCheckController {
finalTime = System.currentTimeMillis();
log.info("[TEST] COST {} MS", finalTime - startTime);
}
// check type = 1 检查页面 看见的是自查
// check type = 1 检查页面 看见的是自查 1=省核查,2=省检查,3=3级结构下的市检查,4=2级结构下的市检查
if (ctVo.getCheckType() == 1) {
Integer createUserId = ctVo.getCreateUserId();
if (userIsProv(createUserId)) {
Integer ownUnit = rootTask.getOwnUnit();
if (unitsService.isProvUnit(ownUnit)) {
linkVo.setType(2);
} else {
} else if (rootTask.getParentTaskId() != 0) {
linkVo.setType(3);
} else {
linkVo.setType(4);
}
// 找到所有的子节点
List<Task> childTask = taskRepo.findAllByParentTaskId(rootTask.getId());
//核查组成员和名称 找到父亲级节点 然后找到父节点的统计节点
String[] checkArray = ctVo.getRemark().split("\\|");// x,a |x ,b
List<String> groupNames = new ArrayList<>();
......@@ -1214,8 +1219,13 @@ public class DeviceCheckController {
log.info("[核查模块] 详情任务推进到下个阶段...");
taskService.moveToNext(currentTask);
summaryDetail(currentTask, currentDetail);
// // 检查该exam任务是否可以完结推进了
advanceExamTask(currentTask.getParentTaskId());
// 检查该exam任务是否可以完结推进了
advanceExamTask(currentTask.getParentTaskId(), true);
// 如果是省本级的自查任务,则自动触发省审核通过
if (unitsService.isProvUnit(currentTask.getOwnUnit())) {
provAudit(currentDetail.getId(), true);
}
}
} else {
//不通过则回到第一阶段
......@@ -1257,7 +1267,7 @@ public class DeviceCheckController {
currentDetail = detailRepo.save(currentDetail);
summaryDetail(currentTask, currentDetail);
// // 检查该exam任务是否可以完结推进了
advanceExamTask(currentTask.getParentTaskId());
advanceExamTask(currentTask.getParentTaskId(), false);
return ResponseEntity.ok("市专管员审核通过,结束" + currentDetail.getCheckUnit() + " 区的自查任务并汇总数据");
} else {
......@@ -1625,7 +1635,7 @@ public class DeviceCheckController {
String remark = task.getRemark();
if (situation.equals("无")) {
if (Objects.nonNull(remark) && remark.contains("ROLLBACK")) {
situation = "未通过";
situation = "";
}
}
......@@ -1735,9 +1745,16 @@ public class DeviceCheckController {
*
* @param exam的taskId
*/
private void advanceExamTask(Integer examTaskId) {
private void advanceExamTask(Integer examTaskId, boolean exec) {
TaskBto parentTask = taskService.findByTaskId(examTaskId);
if (parentTask.getBillStatus().equals(CHECK_EXAM_STAT_1.id) && parentTask.getParentTaskId() != 0 && taskService.TaskTreeIsOver(examTaskId)) {
if (exec) {
exec = parentTask.getParentTaskId() != 0;
} else {
exec = true;
}
// && parentTask.getParentTaskId() != 0
if (parentTask.getBillStatus().equals(CHECK_EXAM_STAT_1.id) && exec && taskService.TaskTreeIsOver(examTaskId)) {
log.info("[核查模块] 检测到task id = {}的检查任务已经可以自动推进了,自动推进至下一步", examTaskId);
statConfirm(parentTask.getBillId());
}
......@@ -1779,13 +1796,14 @@ public class DeviceCheckController {
// 添加阅知信息
List<Integer> involveUserIds = node.parse2Bto().getInvolveUserIdList();
int lastUserId = involveUserIds.get(involveUserIds.size() - 1) == null ? 0 : involveUserIds.get(involveUserIds.size() - 1);
List<Integer> msgUserIds;
List<Integer> msgUserIds = new ArrayList<>();
if (lastUserId == 0) {
msgUserIds = userService.findByUniteId(node.getOwnUnit()).stream()
.map(UserShenRe::getUserId)
.collect(toList());
} else {
msgUserIds = new ArrayList<>(lastUserId);
msgUserIds = new ArrayList<>();
msgUserIds.add(lastUserId);
}
MessageBto msgBto = new MessageBto(node.getId(), node.getBusinessType(), shutDownMsg, msgUserIds);
messageService.add(msgBto);
......@@ -1845,6 +1863,7 @@ public class DeviceCheckController {
cDetail.setCheckDetail(initalDetail);
cDetail.setCheckFiles("");
cDetail.setCheckFileList(Lists.newArrayList());
cDetail.setReview(false);
cDetail = detailRepo.save(cDetail);
// 创建新的任务(被拒绝的自查单位如果是区则是140状态,否则是160状态 )
String unitName = cDetail.getCheckUnit();
......@@ -1893,6 +1912,14 @@ public class DeviceCheckController {
//4.父级任务变为进行中 如果父级是核查,变成111,如果父级是检查,变成131
if (fatherTask.getCustomInfo().contains("exam")) {
fatherTask.setBillStatus(CHECK_EXAM_STAT_1.id);
// 父级的父级也要设置 exam的父级是check
if (fatherTask.getParentTaskId() != 0) {
Task checkTask = taskRepo.findById(fatherTask.getParentTaskId())
.orElseThrow(() -> new ApiException(String.format("没有找到核查任务,子Task id %d", fatherTask.getId())));
log.info("[核查模块] 回滚核查任务 taskId = {}", checkTask.getId());
checkTask.setBillStatus(CHECK_STAT_1.id);
taskRepo.save(checkTask);
}
} else if (fatherTask.getCustomInfo().contains("check")) {
fatherTask.setBillStatus(CHECK_STAT_1.id);
}
......@@ -1914,6 +1941,7 @@ public class DeviceCheckController {
String updatedString = changeHunds(detail.getCheckDetail(), 2);
detail.setCheckDetail(updatedString);
detail.setUserCId(authenticationUtils.getAuthentication().getCurrentUserInfo().getUserId());
detail.setReview(true);
log.info("[核查模块] 审核通过 - 更新后的detailString形如 {}", updatedString.split(",")[0]);
detailRepo.save(detail);
......@@ -1931,10 +1959,53 @@ public class DeviceCheckController {
}
}
}
// 检验整个节点树是否所有节点都是审核通过,如果是,则自动完结任务
TaskBto topNode = taskService.getTopNode(currentTask.getId());
if (allDetailIsReview(topNode)) {
log.info("[核查模块] 该节点树的时候自查节点都已经完结,完结整个节点树,触发的子节点id = {},顶节点id = {}", currentTask.getId(), topNode.getId());
shutDown(topNode.getBillId());
}
return ResponseEntity.ok(new ResultObj<>("审核通过!"));
}
/**
* 查询该节点所在的节点树的所有detail是否都已经被查阅
*
* @param topTask
* @return
*/
private boolean allDetailIsReview(TaskBto topTask) {
// 获取顶节点
List<Task> c1Tasks = taskRepo.findAllByParentTaskId(topTask.getId());
// 获取detailList 根据detailList的checkUnit分组,取id最大的一条,每个组里必须为true才能触发
List<Integer> detailIdList = new ArrayList<>();
// 所有的检查任务是否都完结了
boolean examIsDone = true;
boolean detailIsDone = true;
for (Task c1 : c1Tasks) {
if (c1.getCustomInfo().equals("manual")) {
detailIdList.add(c1.getBillId());
}
if (c1.getCustomInfo().equals("exam")) {
if (!(c1.getBillStatus().equals(END.id) || c1.getBillStatus().equals(CHECK_SHUT_DOWN.id))) {
examIsDone = false;
}
Collection<Integer> regionDetailIds = taskRepo.findAllByParentTaskId(c1.getId()).stream()
.filter(t -> t.getCustomInfo().equals("manual"))
.collect(groupingBy(Task::getOwnUnit,
collectingAndThen(maxBy(Comparator.comparing(Task::getId)), task -> task.get().getBillId())))
.values();
detailIdList.addAll(regionDetailIds);
}
}
detailIsDone = detailRepo.findAllById(detailIdList).stream()
.allMatch(DeviceCheckDetail::isReview);
return detailIsDone && examIsDone;
}
private void removeDetailFromDcs(DeviceCheckDetail detail, DeviceCheckStat dcs) {
......
......@@ -131,6 +131,12 @@ public class DeviceCheckDetail extends BaseEntity {
@ApiModelProperty(value = "备注")
private String remark;
/**
* true-已审阅,false-未审阅
*/
@ApiModelProperty(value = "省是否审阅")
private boolean review = false;
/**
* 预留字段2 现在用来记录该自查任务的初始状态号
*/
......@@ -199,29 +205,6 @@ public class DeviceCheckDetail extends BaseEntity {
this.remark = remark;
}
public void updateDevice(List<DeviceLibrary> devInLib,List<DeviceLibrary> devNotInLib){
//构造checkDetail 分当前在库与不在库的 赋予不同状态
String goodCheckDetail = "";
if (!CollectionUtils.isEmpty(devInLib)) {
goodCheckDetail = devInLib.stream()
.map(device -> device.getId() + "-9")
.collect(Collectors.joining(","));
}
String badCheckDetail = "";
if (!CollectionUtils.isEmpty(devNotInLib)) {
badCheckDetail = devNotInLib.stream()
.map(device -> device.getId() + "-3")
.collect(Collectors.joining(","));
}
//如果不在库的不为空,则拼接,否则没必要
String checkDetail = StringUtils.isEmpty(badCheckDetail) ? goodCheckDetail : goodCheckDetail + "," + badCheckDetail;
this.checkDetail = checkDetail;
}
/**
* @param checkUnit 要核查的单位
* @param devInLib 所属与所在均在本单位的装备集合
......@@ -275,7 +258,30 @@ public class DeviceCheckDetail extends BaseEntity {
);
}
public DeviceCheckDetail copyWithoutId(){
public void updateDevice(List<DeviceLibrary> devInLib, List<DeviceLibrary> devNotInLib) {
//构造checkDetail 分当前在库与不在库的 赋予不同状态
String goodCheckDetail = "";
if (!CollectionUtils.isEmpty(devInLib)) {
goodCheckDetail = devInLib.stream()
.map(device -> device.getId() + "-9")
.collect(Collectors.joining(","));
}
String badCheckDetail = "";
if (!CollectionUtils.isEmpty(devNotInLib)) {
badCheckDetail = devNotInLib.stream()
.map(device -> device.getId() + "-3")
.collect(Collectors.joining(","));
}
//如果不在库的不为空,则拼接,否则没必要
String checkDetail = StringUtils.isEmpty(badCheckDetail) ? goodCheckDetail : goodCheckDetail + "," + badCheckDetail;
this.checkDetail = checkDetail;
}
public DeviceCheckDetail copyWithoutId() {
ModelMapper mapper = BeanHelper.getUserMapper();
DeviceCheckDetail detail = mapper.map(this, DeviceCheckDetail.class);
this.setCreateTime(LocalDateTime.now());
......
......@@ -313,7 +313,7 @@ public class ConfirmCheckServiceImpl implements ConfirmCheckService, CommandLine
List<TaskBto> topStatList = taskService.findBillType(7);
List<Integer> topIdList = topStatList.stream()
.filter(taskBto -> taskBto.getParentTaskId().equals(0) || taskBto.getParentTaskId() == null)
.filter(taskBto -> taskBto.getParentTaskId().equals(0) || taskBto.getParentTaskId() == null || taskBto.getCustomInfo().equals("exam"))
.map(TaskBto::getBillId)
.collect(toList());
......
......@@ -43,8 +43,7 @@ import java.util.function.Function;
import java.util.stream.Collectors;
import static com.tykj.dev.misc.base.StatusEnum.*;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toMap;
import static java.util.stream.Collectors.*;
/**
* ObjTransUtil.
......@@ -146,10 +145,12 @@ public class ObjTransUtil {
boolean flag = false;
// 3/3 -> 统计待确认 -> 省统计任务待完结
childTask = childTask.stream()
.filter(task -> !task.getTitle().contains("统计数据待办任务"))
.filter(task -> !task.getTitle().contains("统计数据确认任务"))
.collect(groupingBy(Task::getOwnUnit,
collectingAndThen(maxBy(Comparator.comparing(Task::getId)), Optional::get)))
.values().stream()
.collect(toList());
long total = childTask.size();
......@@ -192,7 +193,7 @@ public class ObjTransUtil {
checkUserNames,
stat.getCreateTime(),
completion,
stat.getCheckType().CT_CHECK.getId(),
stat.getCheckType().getId(),
joiner.toString()
);
......
......@@ -180,6 +180,13 @@ public interface TaskService {
*/
boolean TaskTreeIsStart(int rootId,boolean currentIsOver);
/**
* 获得该task树下的最顶部节点
* @param taskId 任务主键id
* @return 最顶部的节点
*/
TaskBto getTopNode(Integer taskId);
/**
......
......@@ -1033,6 +1033,27 @@ public class TaskServiceImpl implements TaskService {
}
/**
* 获得该task树下的最顶部节点
*
* @param taskId 任务主键id
* @return 最顶部的节点
*/
@Override
public TaskBto getTopNode(Integer taskId) {
Task task = taskDao.findById(taskId).orElseThrow(() -> new ApiException(String.format("没有找到taskId = %d 的节点", taskId)));
Task rootTask = task;
while (true){
if (rootTask.getParentTaskId() == 0 || rootTask.getParentTaskId() == null) {
break;
}else {
rootTask = taskDao.findById(rootTask.getParentTaskId()).get();
}
}
return rootTask.parse2Bto();
}
/**
* @param oldUserId 旧专管员id
* @param newUserId 新交接专管员id
......
......@@ -178,4 +178,6 @@ public interface UnitsService extends PublicService<Units> {
Units findNameUnit(UnitNameVo unitNameVo);
void addUnitSortMap();
boolean isProvUnit(Integer unitId);
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论