提交 85450c1d authored 作者: Matrix's avatar Matrix

[核查模块] 修复了两级核查与三级核查相关的BUG

上级 1c8a5e4f
......@@ -150,6 +150,8 @@ public enum LogType {
CONFIRM_CHECK_EXAM_DETAIL_3(419, CONFIRM_CHECK_DETAIL.id, CHECK_EXAM_DETAIL_1.id, CHECK_EXAM_DETAIL_0.id, "B岗审核失败,跳回A岗人员操作"),
CONFIRM_CHECK_EXAM_STAT_3(420, CONFIRM_CHECK_DETAIL.id, CHECK_EXAM_STAT_0.id, END.id, "检查统计任务数据已确认完毕,任务完结"),
ALLOT_BACK_1(57, ALLOT_BACK.id, ORIGIN_STATUS.id, ALLOT_BACKING.id, "发起装备退回"),
ALLOT_BACK_2(58,ALLOT_BACK.id, ALLOT_BACKING.id, END.id, "退回装备接收成功"),
......
package com.tykj.dev.device.confirmcheck.controller;
import com.github.wenhao.jpa.Specifications;
import com.google.common.collect.ImmutableMap;
import com.tykj.dev.config.GlobalMap;
import com.tykj.dev.config.swagger.AutoDocument;
......@@ -39,11 +40,13 @@ import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.function.Function;
......@@ -174,14 +177,13 @@ public class DeviceCheckController {
@PostMapping("/auto")
public ResultObj<Map<String, List<Integer>>> startAutoCheck() {
Map<String, List<Integer>> resultIds = ccService.autoCheck();
myWebSocket.sendMessage1();
return new ResultObj<>(resultIds, "自动核查任务发起成功");
}
@ApiOperation(value = "发起核查", notes = "对指定地区发起核查任务")
@PostMapping("/startCheck")
public ResponseEntity startCheckCheck(@RequestBody CheckCheckVo ccVO) {
public ResponseEntity startCheck(@RequestBody CheckCheckVo ccVO) {
//构建省的统计账单
Integer startUnitId = ccVO.getUnitId();
Units startUnit = unitsRepo.findById(startUnitId).get();
......@@ -189,7 +191,7 @@ public class DeviceCheckController {
List<String> checkedUnitNames = checkedUnits.stream().map(Units::getName).collect(toList());
log.info("[核查模块]发起核查,发起单位为{},被查单位为{}", startUnit.getName(), checkedUnitNames);
DeviceCheckStat provinceCheckStat = initStatData(ccVO.getTitle(), ccVO.getRemark(), 0, 0, startUnit.getName(), checkedUnits);
DeviceCheckStat provinceCheckStat = initStatData(ccVO.getTitle(), ccVO.getRemark(), 0, 0, startUnit.getName(), checkedUnits, ccVO.getEndTime().atStartOfDay());
Integer statId = statRepo.save(provinceCheckStat).getId();
List<CheckDeviceStatVo> deviceStatVos = Arrays.stream(
Objects.requireNonNull(JacksonUtil.readValue(provinceCheckStat.getStatInfo(), CheckDeviceStatVo[].class)))
......@@ -208,7 +210,7 @@ public class DeviceCheckController {
for (Units unit : checkedUnits) {
//构建市的统计账单
String cityTitle = unit.getName() + "检查统计";
DeviceCheckStat cityCheckStat = initStatData(cityTitle, ccVO.getRemark(), 0, 0, unit.getName(), Collections.emptyList());
DeviceCheckStat cityCheckStat = initStatData(cityTitle, ccVO.getRemark(), 0, 0, unit.getName(), Collections.emptyList(), ccVO.getEndTime().atStartOfDay());
Integer cityStatId = statRepo.save(cityCheckStat).getId();
log.info("[核查模块] {} 检查统计账单构建完毕,id 为 {}", unit.getName(), cityStatId);
......@@ -219,7 +221,6 @@ public class DeviceCheckController {
cityStatTask.setCustomInfo("exam");
taskService.start(cityStatTask);
}
myWebSocket.sendMessage1();
return ResponseEntity.ok(ImmutableMap.of("msg", "发起核查成功"));
}
......@@ -233,15 +234,9 @@ public class DeviceCheckController {
*/
@ApiOperation(value = "发起检查", notes = "手动发起核查,需要指定参数")
@PostMapping("/startExam")
public ResponseEntity<ResultObj> startManualCheck(@RequestBody CheckExamVo ceVo) {
public ResponseEntity<ResultObj> startExam(@RequestBody CheckExamVo ceVo) {
//初始化数据结构
List<Integer> detailIds = new ArrayList<>();
// 1. 添加发起核查bill记录
// DeviceCheckBill billDo = transUtil.checkBillVo2Do(billVo);
// billRepo.save(billDo);
// 构建(设置)发起市的检查统计账单 - 检查统计任务
// 2 构建发起单位的 统计账单 与 统计任务
Integer startUnitId = ceVo.getUnitId();
Units startUnit = unitsRepo.findById(startUnitId).get();
List<CheckExamDetailVo> examDetailVos = ceVo.getDetail();
......@@ -258,7 +253,7 @@ public class DeviceCheckController {
// 2-1 构建发起单位的 统计账单
DeviceCheckStat provinceCheckStat;
//根据examStatId来判断是update还是create
DeviceCheckStat initCheckStat = initStatData(ceVo.getTitle(), groupUserString, 0, 0, startUnit.getName(), checkedUnits);
DeviceCheckStat initCheckStat = initStatData(ceVo.getTitle(), groupUserString, 0, 0, startUnit.getName(), checkedUnits, ceVo.getEndTime().atStartOfDay());
if (ceVo.getExamStatId() != 0) {
DeviceCheckStat oriCheckStat = statRepo.findById(ceVo.getExamStatId()).get();
oriCheckStat.setRemark(initCheckStat.getRemark());
......@@ -274,12 +269,13 @@ public class DeviceCheckController {
// 2-2 构建发起单位的 统计任务
// 根据examStatId来判断要不要重新创建任务
Integer currentUserId = authenticationUtils.getAuthentication().getCurrentUserInfo().getUserId();
TaskBto cityStatTask;
if (ceVo.getExamStatId() == 0) {
cityStatTask = new Task(CHECK_EXAM_STAT_0.id, CHECK_EXAM_STAT_0.name, 0, ".0.", CONFIRM_CHECK_STAT.id, statId, startUnitId)
.parse2Bto();
cityStatTask.setCustomInfo("exam");
cityStatTask.getInvolveUserIdList().add(authenticationUtils.getAuthentication().getCurrentUserInfo().getUserId());
cityStatTask.getInvolveUserIdList().add(currentUserId);
cityStatTask.getInvolveUserIdList().add(-1);
cityStatTask.setCurrentPoint(1);
cityStatTask = taskService.start(cityStatTask);
......@@ -288,6 +284,7 @@ public class DeviceCheckController {
cityStatTask = taskRepo.findByBillIdAndBusinessType(ceVo.getExamStatId(), CONFIRM_CHECK_STAT.id).get().parse2Bto();
cityStatTask.getInvolveUserIdList().add(-1);
cityStatTask.setCurrentPoint(cityStatTask.getCurrentPoint() + 1);
cityStatTask.setCreateUserId(currentUserId);
taskService.update(cityStatTask);
}
......@@ -330,7 +327,6 @@ public class DeviceCheckController {
// 4. 重新设置并保存统计账单
provinceCheckStat.setStatInfo(JacksonUtil.toJSon(deviceStatVos));
statRepo.save(provinceCheckStat);
myWebSocket.sendMessage1();
log.info("[核查模块] {}单位成功发起对 {} 单位的检查任务分发", startUnit.getName(), checkedUnitNames);
return ResponseEntity.ok(new ResultObj<>(
ImmutableMap.of("statIds", statId, "detailIds", detailIds),
......@@ -415,9 +411,8 @@ public class DeviceCheckController {
}
});
statRepo.save(provVo.toDo());
log.info("[核查模块 检测到是自动核查任务,将省级统计 id = {} 认为开启]", provStat.getId());
log.info("[核查模块] 检测到是自动核查任务,将省级统计 id = {} 认为开启", provStat.getId());
}
myWebSocket.sendMessage1();
return ResponseEntity.ok(new ResultObj<>("专管员A操作成功"));
}
......@@ -461,15 +456,14 @@ public class DeviceCheckController {
} else {
// 如果是2流程的,则直接结束该任务
log.info("[核查模块] 该详情任务是一个2流程任务,结束任务并统计数据...");
taskService.moveToEnd(currentTask);
summaryDetail(currentTask, currentDetail);
taskService.moveToEnd(currentTask);
}
} else {
//不通过则回到第一阶段
StatusEnum firstStatus = getFirstStatus(currentTask.getBillStatus());
taskService.moveToSpecial(currentTask, firstStatus, currentTask.getFirstUserId());
}
myWebSocket.sendMessage1();
log.info("[核查模块] 专管员B操作成功");
return ResponseEntity.ok(new ResultObj<>("专管B操作成功"));
}
......@@ -500,8 +494,8 @@ public class DeviceCheckController {
}
// 如果当前是第4步,则直接结束任务,并且进行结果汇总
log.info("[核查模块] D 检查组成员A正在进行核查操作,核查详情账单id为 : {}", id);
currentTask = taskService.moveToEnd(currentTask);
summaryDetail(currentTask, currentDetail);
currentTask = taskService.moveToEnd(currentTask);
log.info("[核查模块] D 操作完毕");
}
} else {
......@@ -509,10 +503,68 @@ public class DeviceCheckController {
StatusEnum firstStatus = getFirstStatus(currentTask.getBillStatus());
taskService.moveToSpecial(currentTask, firstStatus, currentTask.getFirstUserId());
}
myWebSocket.sendMessage1();
return ResponseEntity.ok(new ResultObj<>("操作成功"));
}
/**
* @param taskId 待办任务id
* @param statId 市级统计的STAT ID
* @return
*/
@ApiOperation(value = "跟踪任务待办办结确认")
@PostMapping("/stat/done")
public ResponseEntity confirmDone(@RequestParam int taskId, @RequestParam int statId) {
log.info("[核查模块] 正在进行办结任务确认,任务id为 : {}", taskId);
TaskBto cityDoneTask = taskService.get(taskId);
//市的task 且statId保持一致 省待办 需要的是 市的统计taskId
Specification<Task> pred = Specifications.<Task>and()
.eq("billId", statId)
.eq("businessType", CONFIRM_CHECK_STAT.id)
.build();
// 找到child任务 -> 市级任务 如果是2级的则直接找自己
List<Task> tasks = taskRepo.findAll(pred);
Task cityTask = tasks.stream()
.filter(task -> task.getParentTaskId() != 0 && task.getParentTaskId() != null)
.findFirst()
.orElse(tasks.get(0));
// 如果没有父统计TASK 则证明是两级
boolean doubleLevel = cityTask.getParentTaskId() == 0 || cityTask.getParentTaskId() == null;
if (doubleLevel) {
log.info("[核查模块] 办结确认两级检查任务");
} else {
log.info("[核查模块] 办结确认三级检查任务");
//1.累加数据 累加市级数据数据到省级
CheckStatVo cityStat = transUtil.checkStatDo2Vo(statRepo.findById(statId).get());
Integer provStatId = taskService.get(cityTask.getParentTaskId()).getBillId();
CheckStatVo provinceStat = transUtil.checkStatDo2Vo(statRepo.findById(provStatId).get());
String cityName = areaCache.findById(unitsRepo.findAreaId(cityTask.getOwnUnit())).getName();
// 将区级信息合并到市中
List<CheckDeviceStatVo> mergedVo = cityStat.getDeviceStatVoList().stream()
.map(vo -> vo.combine(cityName, cityStat.getId()))
.collect(toList());
// 如果是第一个市,则替换,否则累加
boolean firstCity = taskService.TaskTreeIsStart(cityTask.getParentTaskId(),true);
if (firstCity){
provinceStat.setDeviceStatVoList(mergedVo);
log.info("[核查模块] 检测到该任务的合并状态为第一个市统计任务,因此直接替换省级统计数据");
}else {
provinceStat.cleanReduce(mergedVo);
log.info("[核查模块] 数据累加成功");
}
DeviceCheckStat dcs = provinceStat.toDo();
statRepo.save(dcs);
}
//2.办结待办
taskService.moveToEnd(cityDoneTask);
log.info("[核查模块] 办结统计待办操作成功");
return ResponseEntity.ok(new ResultObj<>("办结统计待办确认完毕"));
}
/**
* @param statId 统计账单主键id
*/
......@@ -520,35 +572,23 @@ public class DeviceCheckController {
@PostMapping("/stat/verify")
public ResponseEntity<ResultObj> statConfirm(@RequestParam int statId) {
log.info("[核查模块] 正在进行统计数据确认,统计账单id为 : {}", statId);
//将当前的统计task
//将当前的统计task
TaskBto currentTask = taskService.get(statId, CONFIRM_CHECK_STAT.id);
currentTask = taskService.moveToEnd(currentTask);
//如果有上级统计任务 则累加当前地区数据
Integer parentTaskId = currentTask.getParentTaskId();
boolean hasParent = parentTaskId != 0;
if (hasParent) {
// 累加当前地区数据到上级(省级)
TaskBto parentTask = taskService.get(parentTaskId);
CheckStatVo cityStat = transUtil.checkStatDo2Vo(statRepo.findById(statId).get());
CheckStatVo provinceStat = transUtil.checkStatDo2Vo(statRepo.findById(parentTask.getBillId()).get());
String cityName = areaCache.findById(unitsRepo.findAreaId(currentTask.getOwnUnit())).getName();
// 将区级信息合并到市中
List<CheckDeviceStatVo> mergedVo = cityStat.getDeviceStatVoList().stream()
.map(vo -> vo.combine(cityName, cityStat.getId()))
.collect(toList());
provinceStat.cleanReduce(mergedVo);
statRepo.save(provinceStat.toDo());
// 如果所有子地区统计任务都已经完结,则推进父地区统计任务进度
boolean allOver = taskService.TaskTreeIsOver(parentTaskId);
if (allOver) {
TaskBto provTask = taskService.moveToNext(parentTask, 0);
log.info("[核查任务] 所有市的核查统计任务已经完毕,推进省级 id = {}的核查统计任务", provTask.getId());
}
if (hasParent) {
//市统计的办结 -> 开启对应市的待办任务
String areaName = auService.findOne(AuExample.UnitId, currentTask.getOwnUnit()).getName();
Integer provId = areaRepo.findAreasByType(1).get(0).getId();
TaskBto cityDoneTask = new TaskBto(CHECK_STAT_1.id, areaName + "统计确认待办任务", 0, ".", CONFIRM_CHECK_STAT.id, statId, provId, 0);
cityDoneTask = taskService.start(cityDoneTask);
log.info("[核查模块] 统计确认待办任务生成成功, id为 : {}", cityDoneTask.getId());
}
log.info("[核查模块] 统计数据确认操作成功");
myWebSocket.sendMessage1();
return ResponseEntity.ok(new ResultObj<>("统计数据确认完毕"));
}
......@@ -564,11 +604,25 @@ public class DeviceCheckController {
Integer fatherTaskId = currentTask.getParentTaskId();
int statId = taskRepo.findBillId(fatherTaskId, CONFIRM_CHECK_STAT.id);
// 获得当前城市的统计信息 以及 要汇总的地区信息 并累加保存
// 如果是第一个区域(通过判断所有的child节点没有结束),替换掉父级的统计,如果不是第一个区域,则累加
boolean firstArea = taskService.TaskTreeIsStart(fatherTaskId,false);
List<CheckDeviceStatVo> addVos = parseStatString2Vo(currentTask, currentDetail.getCheckDetail());
CheckStatVo resultVo = transUtil.checkStatDo2Vo(statRepo.findById(statId).get());
resultVo = resultVo.cleanReduce(addVos);
statRepo.save(resultVo.toDo());
CheckStatVo cityStatVo = transUtil.checkStatDo2Vo(statRepo.findById(statId).get());
//addVos在内部reduce一次
addVos = addVos.stream()
.collect(groupingBy(v -> v.getDeviceModel() + v.getDeviceName()))
.values()
.stream()
.map(v -> v.stream().reduce(CheckDeviceStatVo::reduce).get())
.collect(toList());
// 第一个区域替换,否则累加
if (firstArea) {
cityStatVo.setDeviceStatVoList(addVos);
} else {
// 获得当前城市的统计信息 以及 要汇总的地区信息 并累加保存
cityStatVo = cityStatVo.cleanReduce(addVos);
}
statRepo.save(cityStatVo.toDo());
// 判断地区数据是否均汇总完毕
boolean over = taskService.TaskTreeIsOver(fatherTaskId);
......@@ -646,7 +700,7 @@ public class DeviceCheckController {
* @param unitsList 被核查单位列表
* @return 一份初始化好统计数据(没有向上合并 , 只做了同级地区数据合并)的核查统计单
*/
private DeviceCheckStat initStatData(String title, String remark, Integer checkAId, Integer checkBId, String startUnitName, List<Units> unitsList) {
private DeviceCheckStat initStatData(String title, String remark, Integer checkAId, Integer checkBId, String startUnitName, List<Units> unitsList, LocalDateTime endTime) {
//获得要被统计的单位名列表
List<String> unitNameList = unitsList.stream()
.map(Units::getName)
......@@ -660,22 +714,22 @@ public class DeviceCheckController {
.stream()
.filter(dev -> unitNameList.contains(dev.getOwnUnit()))
.map(transUtil::device2InitStatVo)
.collect(toMap(CheckDeviceStatVo::getDeviceModel, Function.identity(), CheckDeviceStatVo::reduce))
.collect(toMap(d -> d.getDeviceModel() + d.getDeviceName(), Function.identity(), CheckDeviceStatVo::reduce))
.values();
//缺省地区数据补充
for (CheckDeviceStatVo statVo : statVos) {
if (statVo.getAreaStatList().size() < unitNameList.size()) {
List<String> existsAreaNames = statVo.getAreaStatList().stream()
.map(CheckAreaStatVo::getAreaName)
.collect(toList());
List<CheckAreaStatVo> supplementVos = auList.stream()
.filter(au -> !existsAreaNames.contains(au.getName()))
.map(au -> new CheckAreaStatVo(au.getName(), 0, 0, 0, 0, 0, 0))
.collect(toList());
statVo.getAreaStatList().addAll(supplementVos);
}
}
//缺省地区数据补充 下面这段代码意义不明 - - 先注释掉 ,后面想起来了再决定是用还是删除
// for (CheckDeviceStatVo statVo : statVos) {
// if (statVo.getAreaStatList().size() < unitNameList.size()) {
// List<String> existsAreaNames = statVo.getAreaStatList().stream()
// .map(CheckAreaStatVo::getAreaName)
// .collect(toList());
// List<CheckAreaStatVo> supplementVos = auList.stream()
// .filter(au -> !existsAreaNames.contains(au.getName()))
// .map(au -> new CheckAreaStatVo(au.getName(), 0, 0, 0, 0, 0, 0))
// .collect(toList());
// statVo.getAreaStatList().addAll(supplementVos);
// }
// }
return new DeviceCheckStat(
CheckType.MANUAL_CHECK,
......@@ -684,7 +738,8 @@ public class DeviceCheckController {
JacksonUtil.toJSon(new ArrayList<>(statVos)),
checkAId,
checkBId,
remark);
remark,
endTime);
}
private String addNode(String originalNode, Integer fatherId) {
......
......@@ -102,12 +102,12 @@ public class DeviceCheckStat extends BaseEntity {
this.remark = remark;
}
public DeviceCheckStat(CheckType checkType, String title, String subtitle, String statInfo, Integer checkUserAId, Integer checkUserBId, String remark) {
public DeviceCheckStat(CheckType checkType, String title, String subtitle, String statInfo, Integer checkUserAId, Integer checkUserBId, String remark,LocalDateTime endTime) {
this.checkType = checkType;
this.title = title;
this.subtitle = subtitle;
this.startTime = LocalDateTime.now();
this.endTime = LocalDateTime.now().plusMonths(1);
this.endTime = endTime;
this.statInfo = statInfo;
this.checkUserAId = checkUserAId;
this.checkUserBId = checkUserBId;
......
......@@ -70,7 +70,7 @@ public class CheckDeviceStatVo implements Cloneable {
}
/**
* 累加装备统计数据(相同型号),并将其下面各个地区的统计信息合并(次级地区会强制更改为{cityName})
* 累加装备统计数据(相同型号&名字),并将其下面各个地区的统计信息合并(次级地区会强制更改为{cityName})
* 多用于装备统计数据中既附带区又附带市的统计信息,想全部合并为市的操作(为了统一给省级单位查看统计数据)
* <li>将所有地区全部改名为市级地区</li>
* <li>合并所有数据</li>
......@@ -80,8 +80,9 @@ public class CheckDeviceStatVo implements Cloneable {
* @return 合并后的装备统计对象,基于深拷贝的新对象
*/
public CheckDeviceStatVo reduce(CheckDeviceStatVo other, String cityName, Integer cityStatId) {
if (!deviceModel.equals(other.deviceModel)) {
throw new IllegalArgumentException("累加的统计信息对象必须是相同型号的装备");
boolean flag = deviceModel.equals(other.deviceModel) && deviceName.equals(other.deviceName);
if (!flag) {
throw new IllegalArgumentException("累加的统计信息对象必须是相同型号与名字的装备");
}
CheckDeviceStatVo mergeVo = new CheckDeviceStatVo(this);
mergeVo.deviceCount += other.deviceCount;
......@@ -95,11 +96,12 @@ public class CheckDeviceStatVo implements Cloneable {
*
* @param other 要合并的装备统计信息
* @return 合并后的装备统计信息对相关,基于深拷贝
* @throws IllegalArgumentException 累加的统计信息对象必须是相同型号的装备
* @throws IllegalArgumentException 累加的统计信息对象必须是相同型号与名字的装备
*/
public CheckDeviceStatVo reduce(CheckDeviceStatVo other) {
if (!deviceModel.equals(other.getDeviceModel())) {
throw new IllegalArgumentException("累加的统计信息对象必须是相同型号的装备");
boolean flag = deviceModel.equals(other.getDeviceModel()) && deviceName.equals(other.getDeviceName());
if (!flag) {
throw new IllegalArgumentException("累加的统计信息对象必须是相同型号与名字的装备");
}
CheckDeviceStatVo mergeVo = new CheckDeviceStatVo(this);
......@@ -130,11 +132,12 @@ public class CheckDeviceStatVo implements Cloneable {
*
* @param other 要合并的装备统计信息
* @return 合并后的装备统计信息对相关,基于深拷贝
* @throws IllegalArgumentException 累加的统计信息对象必须是相同型号的装备
* @throws IllegalArgumentException 累加的统计信息对象必须是相同型号与名字的装备
*/
public CheckDeviceStatVo cleanReduce(CheckDeviceStatVo other) {
if (!deviceModel.equals(other.getDeviceModel())) {
throw new IllegalArgumentException("累加的统计信息对象必须是相同型号的装备");
boolean flag = deviceModel.equals(other.getDeviceModel()) && deviceName.equals(other.getDeviceName());
if (!flag) {
throw new IllegalArgumentException("累加的统计信息对象必须是相同型号且名称相同的装备");
}
CheckDeviceStatVo mergeVo = new CheckDeviceStatVo(this);
......
......@@ -110,13 +110,14 @@ public class CheckStatVo {
return this;
}
//map key deviceModel+deviceName
Map<String, CheckDeviceStatVo> oriModelMap = deviceStatVoList.stream()
.collect(Collectors.toMap(CheckDeviceStatVo::getDeviceModel, Function.identity()));
.collect(Collectors.toMap(d -> d.getDeviceModel()+d.getDeviceName(), Function.identity()));
//遍历要加入的LIST 如果在源数据map中寻找到了则累加,否则添加进去
for (CheckDeviceStatVo vo : otherList) {
oriModelMap.computeIfPresent(vo.getDeviceModel(), (k, v) -> v.cleanReduce(vo));
oriModelMap.putIfAbsent(vo.getDeviceModel(), vo);
oriModelMap.computeIfPresent(vo.getDeviceModel()+vo.getDeviceName(), (k, v) -> v.cleanReduce(vo));
oriModelMap.putIfAbsent(vo.getDeviceModel()+vo.getDeviceName(), vo);
}
deviceStatVoList = new ArrayList<>(oriModelMap.values());
......
......@@ -251,17 +251,17 @@ public class ConfirmCheckServiceImpl implements ConfirmCheckService, CommandLine
List<CheckDeviceStatVo> countyVo = regionMap.get(true);
// 市级数据
Map<String, CheckDeviceStatVo> map = regionMap.get(false).stream()
.collect(toMap(CheckDeviceStatVo::getDeviceModel, Function.identity()));
.collect(toMap(d -> d.getDeviceModel()+d.getDeviceName(), Function.identity()));
//查找区域数据内的父级地区(即市),将数据count数据add进去(通过两次get),将areaList数据也加进去
for (CheckDeviceStatVo v : countyVo) {
String couName = v.getAreaStatList().get(0).getAreaName();
String cityName = areaCache.findFatherByName(couName).getName();
//把相同型号的区级的数据merge到市级即可,没有的话改个名加进去
//把相同型号与名字的的区级的数据merge到市级即可,没有的话改个名加进去
Integer cityStatId = areaStatIdMap.get(cityName);
map.computeIfPresent(v.getDeviceModel(), (k, value) -> value.reduce(v, cityName, cityStatId));
map.computeIfAbsent(v.getDeviceModel(), k -> {
map.computeIfPresent(v.getDeviceModel()+v.getDeviceName(), (k, value) -> value.reduce(v, cityName, cityStatId));
map.computeIfAbsent(v.getDeviceModel()+v.getDeviceName(), k -> {
v.getAreaStatList().forEach(area -> area.setAreaName(cityName));
return v;
});
......@@ -288,7 +288,7 @@ public class ConfirmCheckServiceImpl implements ConfirmCheckService, CommandLine
List<CheckDeviceStatVo> cityStatVo = new ArrayList<>();
statVoListCopy2.stream()
.filter(stat -> cityNames.contains(stat.getAreaStatList().get(0).getAreaName()))
.collect(Collectors.groupingBy(CheckDeviceStatVo::getDeviceModel, reducing(CheckDeviceStatVo::reduce)))
.collect(Collectors.groupingBy(d -> d.getDeviceModel()+d.getDeviceName(), reducing(CheckDeviceStatVo::reduce)))
.forEach((k, v) -> cityStatVo.add(v.get()));
csd.setStatInfo(JacksonUtil.toJSon(cityStatVo));
}
......@@ -487,8 +487,8 @@ public class ConfirmCheckServiceImpl implements ConfirmCheckService, CommandLine
@Override
public void run(String... args) throws Exception {
//开启计划任务
startAutoCheckCron();
log.info("[核查模块] 初始化开启任务成功");
// startAutoCheckCron();
// log.info("[核查模块] 初始化开启任务成功");
}
}
......@@ -149,6 +149,16 @@ public interface TaskService {
*/
boolean TaskTreeIsOver(int rootId);
/**
* 判断该任务节点下的所有节点是否任意一个都没有处于完结状态(即用来判断该任务树是否是初始状态)
* @param rootId task的根节点id
* @param currentIsOver 当前的child节点是否处于完结状态
* @return Task Tree 是否是初始状态
*/
boolean TaskTreeIsStart(int rootId,boolean currentIsOver);
/**
* @param oldUserId 旧专管员id
* @param newUserId 新交接专管员id
......
......@@ -286,7 +286,7 @@ public class TaskServiceImpl implements TaskService {
public TaskBto start(TaskBto taskBto) {
Task task = taskDao.save(taskBto.toDo());
myWebSocket.sendMessage1();
CompletableFuture.runAsync(() ->{
CompletableFuture.runAsync(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
......@@ -336,7 +336,7 @@ public class TaskServiceImpl implements TaskService {
public Task update(TaskBto taskBto) {
taskBto.setUserReadDetailList(new ArrayList<>());
Task task = taskDao.save(taskBto.toDo());
CompletableFuture.runAsync(() -> blockChainUtil.appendHash(JacksonUtil.toJSon(taskBto.toDo()), taskBto.getRecordId()),TaskBeanConfig.getThreadPoolTaskScheduler());
CompletableFuture.runAsync(() -> blockChainUtil.appendHash(JacksonUtil.toJSon(taskBto.toDo()), taskBto.getRecordId()), TaskBeanConfig.getThreadPoolTaskScheduler());
return task;
}
......@@ -365,7 +365,7 @@ public class TaskServiceImpl implements TaskService {
@Override
public List<TaskUserVo> getList(TaskSelectVo taskSelectVo) {
List<TaskUserVo> taskEntities = getTaskUserVoList(taskSelectVo);
if (taskSelectVo.getOrders().size()>0) {
if (taskSelectVo.getOrders().size() > 0) {
//根据vo待办和跟踪时间的查询顺序按顺序或降序排序输出
if (taskSelectVo.getSelectNum() == 2 && "trackingTime".equals(taskSelectVo.getOrders().get(0).getCoulmn())) {
if ("ASC".equals(taskSelectVo.getOrders().get(0).getDirection().toString())) {
......@@ -406,7 +406,7 @@ public class TaskServiceImpl implements TaskService {
.filter(taskUserVo -> find(taskUserVo.getId(), list) > -1)
.collect(Collectors.toList());
//判断是否需要按发起时间排序
if (taskSelectVo.getOrders().size()>0) {
if (taskSelectVo.getOrders().size() > 0) {
if ("createTime".equals(taskSelectVo.getOrders().get(0).getCoulmn())) {
if ("ASC".equals(taskSelectVo.getOrders().get(0).getDirection().toString())) {
return taskUtils.orderByCreateTimeAsc2(taskUserVos);
......@@ -446,25 +446,24 @@ public class TaskServiceImpl implements TaskService {
if (taskUserVo.getInvolveUserIdList() != null && taskUserVo.getInvolveUserIdList().size() > 0) {
//获取涉及人员当前指针
List<Integer> userIds = taskUserVo.getInvolveUserIdList();
if (userIds.size() > 0 && taskUserVo.getCurrentPoint()<userIds.size()) {
if (userIds.size() > 0 && taskUserVo.getCurrentPoint() < userIds.size()) {
Integer userId3 = userIds.get(taskUserVo.getCurrentPoint());
//当前指针userId大于0,待办人即当前id
if (userId3>0) {
if (userId3 > 0) {
taskUserVo.setProcessingUser(userCache.findById(userId3).getName());
}
//当前指针userId等于0,待办人为所属单位下所有用户
else if (userId3==0&&taskUserVo.getOwnUnit()!=null){
else if (userId3 == 0 && taskUserVo.getOwnUnit() != null) {
StringBuffer stringBuffer = new StringBuffer();
List<User> users = userCache.findAll();
users.stream().filter(user -> user.getUnitsId().equals(taskUserVo.getOwnUnit())).forEach(user -> {
stringBuffer.append(user.getName()).append(",");
});
if (stringBuffer.length()>0) {
if (stringBuffer.length() > 0) {
stringBuffer.deleteCharAt(stringBuffer.length() - 1);
}
taskUserVo.setProcessingUser(stringBuffer.toString());
}
else {
} else {
taskUserVo.setProcessingUser("");
}
}
......@@ -520,7 +519,6 @@ public class TaskServiceImpl implements TaskService {
@Override
public boolean TaskTreeIsOver(int rootId) {
List<Task> taskList = taskDao.findAllByParentTaskId(rootId);
if (CollectionUtils.isEmpty(taskList)) {
return true;
} else {
......@@ -529,6 +527,32 @@ public class TaskServiceImpl implements TaskService {
}
}
/**
* 判断该任务节点下的下一级节点是否任意一个都没有处于完结状态(即用来判断该任务树是否是初始状态)
*
* @param rootId task的根节点id
* @return Task Tree 是否是初始状态
*/
@Override
public boolean TaskTreeIsStart(int rootId, boolean currentIsOver) {
List<Task> taskList = taskDao.findAllByParentTaskId(rootId);
if (CollectionUtils.isEmpty(taskList)) {
return false;
} else {
long overJobCount = taskList.stream()
.filter(task -> task.getBillStatus().equals(StatusEnum.END.id))
.count();
//如果当前任务是完结的,那么完结数量等于1就证明是初始状态,否则必须为0
if (currentIsOver) {
return overJobCount == 1;
} else {
return overJobCount == 0;
}
}
}
/**
* @param oldUserId 旧专管员id
* @param newUserId 新交接专管员id
......@@ -639,7 +663,7 @@ public class TaskServiceImpl implements TaskService {
boolean userConfirm2 = taskBto.getInvolveUserIdList().get(taskBto.getCurrentPoint()) == -1;
boolean pointExists = taskBto.getCurrentPoint() < taskBto.getInvolveUserIdList().size();
boolean userConfirm = userId.equals(taskBto.getInvolveUserIdList().get(taskBto.getCurrentPoint()));
boolean isDraft = taskBto.getBillStatus()==201||taskBto.getBillStatus()==333||taskBto.getBillStatus()==810||taskBto.getBillStatus()==322||taskBto.getBillStatus()==722;
boolean isDraft = taskBto.getBillStatus() == 201 || taskBto.getBillStatus() == 333 || taskBto.getBillStatus() == 810 || taskBto.getBillStatus() == 322 || taskBto.getBillStatus() == 722;
boolean isCreateUser = userId.equals(taskBto.getCreateUserId());
return unitExists && pointExists && !userConfirm && !userConfirm2 && !isDraft && isCreateUser;
})
......@@ -652,7 +676,7 @@ public class TaskServiceImpl implements TaskService {
boolean userConfirm = taskBto.getInvolveUserIdList().get(taskBto.getCurrentPoint()) == -1;
boolean unitConfirm = taskBto.getOwnUnit().equals(unitId);
boolean isCreateUser = userId.equals(taskBto.getCreateUserId());
return pointExists && userConfirm && unitConfirm && isCreateUser;
return pointExists && userConfirm && unitConfirm && isCreateUser;
})
.collect(Collectors.toList());
taskBtoList.addAll(taskBtos1);
......@@ -696,25 +720,24 @@ public class TaskServiceImpl implements TaskService {
if (taskUserVo.getInvolveUserIdList() != null && taskUserVo.getInvolveUserIdList().size() > 0) {
//获取涉及人员当前指针
List<Integer> userIds = taskUserVo.getInvolveUserIdList();
if (userIds.size() > 0 && taskUserVo.getCurrentPoint()<userIds.size()) {
if (userIds.size() > 0 && taskUserVo.getCurrentPoint() < userIds.size()) {
Integer userId3 = userIds.get(taskUserVo.getCurrentPoint());
//当前指针userId大于0,待办人即当前id
if (userId3>0) {
if (userId3 > 0) {
taskUserVo.setProcessingUser(userCache.findById(userId3).getName());
}
//当前指针userId等于0,待办人为所属单位下所有用户
else if (userId3==0&&taskUserVo.getOwnUnit()!=null){
else if (userId3 == 0 && taskUserVo.getOwnUnit() != null) {
StringBuffer stringBuffer = new StringBuffer();
List<User> users = userCache.findAll();
users.stream().filter(user -> user.getUnitsId().equals(taskUserVo.getOwnUnit())).forEach(user -> {
stringBuffer.append(user.getName()).append(",");
});
if (stringBuffer.length()>0) {
if (stringBuffer.length() > 0) {
stringBuffer.deleteCharAt(stringBuffer.length() - 1);
}
taskUserVo.setProcessingUser(stringBuffer.toString());
}
else {
} else {
taskUserVo.setProcessingUser("");
}
}
......@@ -828,10 +851,10 @@ public class TaskServiceImpl implements TaskService {
* @param userIds 用户Id列表
* @return 返回存在这些用户的单位
*/
private Set<Integer> getUnitsByUsers(List<Integer> userIds){
private Set<Integer> getUnitsByUsers(List<Integer> userIds) {
Set<Integer> unitIds = new HashSet<>();
userIds.forEach(integer -> {
if (integer>0) {
if (integer > 0) {
unitIds.add(userCache.findById(integer).getUnitsId());
}
});
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论