提交 7c654f0d authored 作者: ljj234's avatar ljj234

refactor: 修改核查模块(重构)

上级 83606bac
......@@ -145,6 +145,61 @@ public class DeviceCheckController {
@Autowired
private CheckUnitService checkUnitService;
@GetMapping("/msg")
@ApiOperation(value = "添加阅知信息:终止检查/核查任务")
public ResponseEntity sendMsg(@RequestParam Integer billId,@RequestParam Integer type) {
Optional<Task> taskOpt = taskRepo.findByBillIdAndBusinessType(billId, type);
Task node = taskOpt.orElseThrow(() -> new ApiException("查询的任务不存在"));
// 生成终止任务的信息
String billCunstom = "check".equals(node.getCustomInfo())? "核查" : "检查";
String title = node.getTitle().split("]")[1];
String adminUser = authenticationUtils.getAuthentication().getCurrentUserInfo().getName();
String shutDownMsg = adminUser + "终止" + billCunstom + "任务:【" + title + "】";
List<Integer> rsUserIds = new ArrayList<>();
List<Task> rsTask = new ArrayList<>();
// 二级任务对象
List<Task> secondNode = taskRepo.findAllByParentTaskId(node.getId());
// 三级任务对象
if (secondNode!= null && !secondNode.isEmpty()) {
List<Task> thridNode = taskRepo.findAllByParentTaskIdIn(secondNode.stream().map(Task::getId).collect(toList()));
if (thridNode != null && !thridNode.isEmpty()) {
// 这里处理市终止区检查任务的情况
rsTask.addAll(thridNode);
}
}
rsTask.add(node);
rsTask.addAll(secondNode);
// 构建所有阅知对象
for (Task task : rsTask) {
// 查询应该发阅知的人员列表
List<Integer> involveUserIds = task.parse2Bto().getInvolveUserIdList();
int lastUserId = involveUserIds.get(involveUserIds.size() - 1) == null ? 0 : involveUserIds.get(involveUserIds.size() - 1);
List<Integer> msgUserIds = new ArrayList<>();
if (lastUserId == 0) {
msgUserIds = userService.findByUniteId(task.getOwnUnit()).stream()
.map(UserShenRe::getUserId)
.collect(toList());
} else {
msgUserIds = new ArrayList<>();
msgUserIds.add(lastUserId);
}
rsUserIds.addAll(msgUserIds);
}
// 发送阅知
MessageBto msgBto = new MessageBto(node.getId(), node.getBusinessType(), shutDownMsg, rsUserIds.stream().distinct().collect(toList()));
messageService.add(msgBto);
return ResponseEntity.ok("ok");
}
@GetMapping("/area/{fatherId}")
@ApiOperation(value = "查询指定区域下的所有区域信息")
public ResponseEntity<ResultObj<List<Area>>> findAreaUnderId(@PathVariable Integer fatherId) {
......@@ -364,22 +419,6 @@ public class DeviceCheckController {
}
}
// todo
// 代管 - 如果当前自查为省本级自查,则需要将被代管的装备加入到省本级
// Units unit = unitsRepo.findByName(checkUnit);
// boolean isProv = unit.getLevel() == 1 && unit.getType() == 1;
// if (isProv) {
// //获得所有的需要被代管的单位的在库与非在库装备,添加到省本级的在库与非在库中去
// List<Units> escrowUnits = unitsRepo.findByTypeAndEscrow(2, 1);
// for (Units eu : escrowUnits) {
// log.info("[核查模块] 正在将 {} 单位的装备托管代理到 {} 单位", checkUnit, eu.getName());
// Map<Boolean, List<DeviceLibrary>> libMap = getDevLibMap(eu.getName(), allDevices);
// devInLib.addAll(libMap.get(true));
// devNotInLib.addAll(libMap.get(false));
// }
//
// }
detail.updateDevice(devInLib, devNotInLib);
//更新应查装备数量
......@@ -679,362 +718,6 @@ public class DeviceCheckController {
return ResponseEntity.ok(unitsList);
}
@ApiOperation(value = "检查地区是否可以发起核查", notes = "检查地区是否可以发起核查")
@PostMapping("/checkPossible/bak")
public ResponseEntity checkPossible(@RequestBody UnitIds unitIds) {
List<String> unitNames = unitIds.getIds().stream()
.map(id -> auService.findOne(AuExample.UnitId, id))
.map(AreaUnit::getUnitName)
.collect(toList());
boolean findEmpty = false;
String alertString = "[";
for (String unitName : unitNames) {
List<DeviceLibrary> devices = deviceRepo.findAllByOwnUnit(unitName);
if (devices.size() == 0) {
findEmpty = true;
alertString += unitName + " ";
}
}
alertString += "]";
alertString += "单位没有装备数据,请重新勾选!";
return ResponseEntity.ok(ImmutableMap.of("empty", findEmpty, "msg", alertString));
}
@ApiOperation(value = "发起核查", notes = "对指定单位发起核查任务")
@PostMapping("/startCheck/bak")
public ResponseEntity startCheck(@RequestBody CheckCheckVo ccVO) {
// 代管单位id
List<Integer> esIds = checkUnitService.findAllEscrow().stream().map(Units::getUnitId).collect(toList());
esIds.retainAll(ccVO.getUnitRange());
// 构建省的统计账单
Integer startUnitId = ccVO.getUnitId();
Units startUnit = unitsRepo.findById(startUnitId).get();
List<Units> checkedUnits = unitsRepo.findAllById(ccVO.getUnitRange());
// 1.发起自己的自查 (市,tpye=2,省 level = 0,1,2)
// 2.发起自己的检查(只是市级别的 level=2)
List<String> checkedUnitNames = checkedUnits.stream().map(Units::getName).collect(toList());
log.info("[核查模块]发起核查,发起单位为{},被查单位为{}", startUnit.getName(), checkedUnitNames);
// 构建省的统计账单,所有的checkedUnits都要被包含到统计中去
DeviceCheckStat provinceCheckStat = initStatData(ccVO.getTitle(), ccVO.getRemark(), 0, 0, startUnit.getName(), checkedUnits, ccVO.getEndTime().atStartOfDay());
provinceCheckStat.setCheckType(CheckType.CT_CHECK);
Integer statId = statRepo.save(provinceCheckStat).getId();
List<CheckDeviceStatVo> deviceStatVos = Arrays.stream(
Objects.requireNonNull(JacksonUtil.readValue(provinceCheckStat.getStatInfo(), CheckDeviceStatVo[].class)))
.collect(toList());
// 构建省的统计任务
TaskBto provStatTask = new Task(CHECK_STAT_1.id, getUnitDateString(startUnit, ccVO.getTitle()), 0, ".0.", CONFIRM_CHECK_STAT.id, statId, startUnitId)
.parse2Bto();
provStatTask.getInvolveUserIdList().add(authenticationUtils.getAuthentication().getCurrentUserInfo().getUserId());
provStatTask.getInvolveUserIdList().add(0);
provStatTask.setCurrentPoint(1);
provStatTask.setCustomInfo("check");
provStatTask = taskService.start(provStatTask);
desMap.put(provStatTask.getId(), ccVO.getRemark());
//构建市的检查任务(level=2)
List<Units> examCheckUnits = checkedUnits.stream()
.filter(units -> Arrays.asList(2).contains(units.getLevel()))
.collect(toList());
Map<Integer, Integer> cityExamIdMap = new HashMap<>();
// 获取哪些市建立了统计任务
List<Integer> citys = new ArrayList<>();
for (Units unit : examCheckUnits) {
//构建市的统计账单
String cityTitle = unit.getName() + "检查统计";
DeviceCheckStat cityCheckStat = initStatData(cityTitle, ccVO.getRemark(), 0, 0, unit.getName(), Collections.emptyList(), ccVO.getEndTime().atStartOfDay());
cityCheckStat.setCheckType(CheckType.CT_EXAM);
Integer cityStatId = statRepo.save(cityCheckStat).getId();
log.info("[核查模块] {} 检查统计账单构建完毕,id 为 {}", unit.getName(), cityStatId);
// 构建市的统计任务
TaskBto cityStatTask = new TaskBto(CHECK_EXAM_STAT_0.id, getUnitDateString(unit, ccVO.getTitle()), provStatTask.getId(), addNode(provStatTask.getNodeIdDetail(), provStatTask.getId()), CONFIRM_CHECK_STAT.id, cityStatId, unit.getUnitId(), 0);
cityStatTask.getInvolveUserIdList().add(0);
cityStatTask.setCurrentPoint(1);
cityStatTask.setCustomInfo("exam");
cityStatTask = taskService.start(cityStatTask);
//将市的检查id记录下,以便设置市的自查任务的父级节点
cityExamIdMap.put(unit.getUnitId(), cityStatTask.getId());
// 自动创建市里的任务
List<Units> inCitys = unitsCache.findByIdSubordinateAndOneself(unit.getUnitId());
CheckExamVo checkExamVo = new CheckExamVo();
checkExamVo.setDetail(Collections.singletonList(
CheckExamDetailVo.builder().
unitIds(
checkUnitService.findExistDevice(
inCitys.stream()
.filter(units -> units.getUnitId() != unit.getUnitId())
.map(Units::getUnitId)
.collect(toList())
)
)
.remark(ccVO.getRemark())
.build())
);
checkExamVo.setTitle(ccVO.getTitle());
checkExamVo.setUnitId(unit.getUnitId());
checkExamVo.setExamStatId(cityStatId);
checkExamVo.setEndTime(ccVO.getEndTime());
startExam(checkExamVo);
}
// 构建自核查任务(levl = 0,1) tpye = 2
List<Units> selfCheckUnits = checkedUnits.stream()
.filter(units -> Arrays.asList(0, 1).contains(units.getLevel()) || units.getType() == 2)
.collect(toList());
// 获取所有在库装备 lifeStatus ==2 or 14
Map<String, List<DeviceLibrary>> devInLib = dcService.getAllDeviceLibraryList().stream()
// .filter(device -> device.getOwnUnit().equals(device.getLocationUnit()))
.filter(d -> d.getLifeStatus() == 2 || d.getLifeStatus() == 14)
.collect(groupingBy(DeviceLibrary::getOwnUnit));
// 获取所有非在库装备 ls != 2 and != 14
Map<String, List<DeviceLibrary>> devNotInLib = dcService.getAllDeviceLibraryList().stream()
// .filter(device -> !device.getOwnUnit().equals(device.getLocationUnit()))
.filter(d -> d.getLifeStatus() != 2 && d.getLifeStatus() != 14)
.collect(groupingBy(DeviceLibrary::getOwnUnit));
User loginUser = authenticationUtils.getAuthentication().getCurrentUserInfo();
for (Units unit : selfCheckUnits) {
//核查组成员名称用当前登录用户
String names = "默认检查组";
// 如果是市level=2 的话,father Id为市的检查id
Integer fatherId = 0;
Integer initStatusId = 0;
// level = 1 或者2 市省级 否则 就是区级 ,市省级的自查初始状态160,区级的自查初始状态140
// type = 2 160 ,tpye = 1 && level = 1 || level = 2 160
boolean directProv = unit.getType() == 2;
boolean normalProv = unit.getType() == 1 && (unit.getLevel() == 1 || unit.getLevel() == 2);
if (directProv || normalProv) {
fatherId = cityExamIdMap.get(unit.getUnitId());
initStatusId = CHECK_DETAIL_CITY_0.id;
if (fatherId == null) {
fatherId = provStatTask.getId();
}
} else {
fatherId = provStatTask.getId();
initStatusId = CHECK_DETAIL_REGION_0.id;
}
// 3-1 构建被查单位的 自核查账单
DeviceCheckDetail unitDetailDoc = DeviceCheckDetail
.EmptyWithChecker(names + "|" + "默认备注", ccVO.getRemark(),
0, 0, 0, 0, unit.getName(),
unitsRepo.findByName(unit.getName()).getUnitId(),
devInLib.getOrDefault(unit.getName(), new ArrayList<>()),
devNotInLib.getOrDefault(unit.getName(), new ArrayList<>()));
unitDetailDoc.setVar2(String.valueOf(initStatusId));
DeviceCheckDetail detail = detailRepo.save(unitDetailDoc);
// 将id放入统计中去 model -> areaName -> detailId
String areaName = auService.findOne(AuExample.UnitId, unit.getUnitId()).getName();
for (CheckDeviceStatVo statVo : deviceStatVos) {
for (CheckAreaStatVo asv : statVo.getAreaStatList()) {
if (asv.getAreaName().equals(areaName)) {
asv.setAreaStatId(statId);
asv.setAreaDetailId(detail.getId());
}
}
}
// 3-2 构建被查单位的 自查任务 (根据被查单位的级别来区分是县级状态是市级状态) 这里的父级任务应该是省统计
//处理ownUnit的代码 - 如果省直属有账号发给省直属的,没有账号就发给省做 用于处理没有账号的单位的可见性
Integer ownUnitId = 0;
boolean notHasAccount = unit.getEscrow() == 1;
if (notHasAccount) {
ownUnitId = 1;
} else {
ownUnitId = unit.getUnitId();
}
TaskBto checkedTask = new TaskBto(initStatusId, getUnitDateString(unit, ccVO.getTitle()), fatherId, addNode(provStatTask.getNodeIdDetail(), provStatTask.getId()), CONFIRM_CHECK_DETAIL.id, detail.getId(), ownUnitId, 0);
checkedTask.setCustomInfo("manual");
taskService.start(checkedTask);
}
return ResponseEntity.ok(ImmutableMap.of("msg", "发起核查成功"));
}
/**
* 发起检查
* <li>1. 添加发起核查bill记录</>
* <li>2. 构建发起单位的统计账单与Task</>
* <li>3. 构建被核查单位的详情账单与Task</li>
*
* @param ceVo 核查发起对象
*/
@ApiOperation(value = "发起检查", notes = "手动发起核查,需要指定参数")
@PostMapping("/startExam/old")
public ResponseEntity<ResultObj> startExam(@RequestBody CheckExamVo ceVo) {
// 获取需要处理的代管单位集合
List<Integer> esIds = checkUnitService.findAllEscrow().stream().map(Units::getUnitId).collect(toList());
esIds.retainAll(ceVo.getDetail().get(0).getUnitIds());
//设置截止时间
ceVo.setEndTime(LocalDateTime.of(ceVo.getEndTime(), LocalTime.MAX).toLocalDate());
//初始化数据结构
List<Integer> detailIds = new ArrayList<>();
Integer startUnitId = ceVo.getUnitId();
Units startUnit = unitsRepo.findById(startUnitId).get();
List<CheckExamDetailVo> examDetailVos = new ArrayList<>(ceVo.getDetail());
//如果是create检查,那么不需要添加自己单位的自查,如果是update检查,那么需要添加单位的自查
if (ceVo.getExamStatId() != 0) {
//update
log.info("[核查模块] update核查,自动添加id = {}市的自核查任务", startUnitId);
examDetailVos.add(examDetailVos.get(0).copy(startUnitId, "由省核查发起的自检查"));
}
// 拼接检查组和检查组成员
String groupUserString = "默认检查组,默认人员";
List<Integer> unitIds = examDetailVos.stream().flatMap(cv -> cv.getUnitIds().stream()).collect(toList());
List<Units> checkedUnits = unitsRepo.findAllById(unitIds);
List<String> checkedUnitNames = checkedUnits.stream().map(Units::getName).collect(toList());
// 2-1 构建发起单位的 统计账单
DeviceCheckStat provinceCheckStat;
//根据examStatId来判断是update还是create 此时初始化的为指定检查区域的数据
DeviceCheckStat initCheckStat = initStatData(checkedUnitNames, 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());
oriCheckStat.setStatInfo(initCheckStat.getStatInfo());
provinceCheckStat = oriCheckStat;
} else {
provinceCheckStat = initCheckStat;
}
log.info("[核查模块]发起手动检查,发起单位为{},被查单位为{}", startUnit.getName(), checkedUnitNames);
provinceCheckStat.setCheckType(CheckType.CT_EXAM);
Integer statId = statRepo.save(provinceCheckStat).getId();
// 2-2 构建发起单位的 统计任务
// 根据examStatId来判断要不要重新创建任务
Integer currentUserId = authenticationUtils.getAuthentication().getCurrentUserInfo().getUserId();
TaskBto cityStatTask;
if (ceVo.getExamStatId() == 0) {
cityStatTask = new Task(CHECK_EXAM_STAT_1.id, getUnitDateString(startUnit, ceVo.getTitle()), 0, ".0.", CONFIRM_CHECK_STAT.id, statId, startUnitId)
.parse2Bto();
cityStatTask.setCustomInfo("exam");
cityStatTask.getInvolveUserIdList().add(currentUserId);
// 检查变为待办
cityStatTask.getInvolveUserIdList().add(0);
cityStatTask.setCurrentPoint(1);
cityStatTask = taskService.start(cityStatTask);
} else {
// 将原来的待办改为跟踪
cityStatTask = taskRepo.findByBillIdAndBusinessType(ceVo.getExamStatId(), CONFIRM_CHECK_STAT.id).get().parse2Bto();
//检查变为待办
cityStatTask.getInvolveUserIdList().add(0);
// cityStatTask.setRemark(String.valueOf(CHECK_EXAM_STAT_1.id));
cityStatTask.setCustomInfo("exam");
cityStatTask.setCurrentPoint(cityStatTask.getCurrentPoint() + 1);
cityStatTask.setCreateUserId(currentUserId);
cityStatTask.setBillStatus(CHECK_EXAM_STAT_1.id);
taskService.update(cityStatTask);
}
// 3 构建被查单位的 自查账单 与 自查任务
// 获取所有在库装备 ls == 2 or ls == 14
Map<String, List<DeviceLibrary>> devInLib = dcService.getAllDeviceLibraryList().stream()
.filter(d -> d.getLifeStatus() == 2 || d.getLifeStatus() == 14)
.collect(groupingBy(DeviceLibrary::getOwnUnit));
// 非在库装备 ls !=2 and ls !=14
Map<String, List<DeviceLibrary>> devNotInLib = dcService.getAllDeviceLibraryList().stream()
.filter(d -> d.getLifeStatus() != 2 && d.getLifeStatus() != 14)
.collect(groupingBy(DeviceLibrary::getOwnUnit));
// 3. 构建被核查单位的详情账单与Task
// 对每个需要核查的单位构建其detail账单与task
boolean isProvUser = authenticationUtils.getAuthentication()
.getCurrentUserInfo().getUnitsId() == 1;
for (CheckExamDetailVo ed : examDetailVos) {
List<Integer> uid = ed.getUnitIds();
for (Integer u : uid) {
Units unit = unitsRepo.findById(u).get();
String names = "默认名称";
// 根据发起人决定初始状态id 省发起人- 160 其他发起人 被查的市160 被查的是区140
int initTaskStatusId = 0;
if (isProvUser) {
initTaskStatusId = CHECK_DETAIL_CITY_0.id;
} else {
//再根据被查单位的级别 level = 3 区140 level =2市 160
if (unit.getLevel() == 3) {
initTaskStatusId = CHECK_DETAIL_REGION_0.id;
} else {
initTaskStatusId = CHECK_DETAIL_CITY_0.id;
}
}
;
// 3-1 构建被查单位的 自查账单
DeviceCheckDetail unitDetailDoc = DeviceCheckDetail.EmptyWithChecker(
names + "|" + ed.getRemark(),
ceVo.getTitle() + "%^&" + ed.getRemark(),
0, 0, 0, 0,
unit.getName(),
unitsRepo.findByName(unit.getName()).getUnitId(),
devInLib.getOrDefault(unit.getName(), new ArrayList<>()),
devNotInLib.getOrDefault(unit.getName(), new ArrayList<>()));
unitDetailDoc.setVar2(String.valueOf(initTaskStatusId));
DeviceCheckDetail detail = detailRepo.save(unitDetailDoc);
detailIds.add(detail.getId());
// 将id放入统计中去 model -> areaName -> detailId
String areaName = auService.findOne(AuExample.UnitId, unit.getUnitId()).getName();
// 3-2 构建被查单位的 自查任务 (根据被查单位的级别来区分是县级状态是市级状态)
TaskBto checkedTask = new TaskBto(initTaskStatusId, getUnitDateString(unit, ceVo.getTitle()), cityStatTask.getId(), addNode(cityStatTask.getNodeIdDetail(), cityStatTask.getId()), CONFIRM_CHECK_DETAIL.id, detail.getId(), unit.getUnitId(), 0);
// checkedTask.setRemark(String.valueOf(CHECK_EXAM_DETAIL_0.id));
checkedTask.setCustomInfo("manual");
checkedTask = taskService.start(checkedTask);
desBillMap.put(detail.getId(), ed.getRemark());
desMap.put(checkedTask.getId(), ed.getRemark());
}
}
// 4. 重新设置并保存统计账单
statRepo.save(provinceCheckStat);
log.info("[核查模块] {}单位成功发起对 {} 单位的检查任务分发", startUnit.getName(), checkedUnitNames);
return ResponseEntity.ok(new ResultObj<>(
ImmutableMap.of("statIds", statId, "detailIds", detailIds),
String.format("[核查模块] [%s]单位成功发起对 [%s] 单位的检查任务分发", startUnit.getName(), checkedUnitNames)
));
}
/**
* 根据taskId查询Remark
......@@ -1879,19 +1562,19 @@ public class DeviceCheckController {
TaskLogBto taskLog = new TaskLogBto(node.getId(), shutDownMsg);
taskLogService.addLog(taskLog);
// 添加阅知信息
List<Integer> involveUserIds = node.parse2Bto().getInvolveUserIdList();
int lastUserId = involveUserIds.get(involveUserIds.size() - 1) == null ? 0 : involveUserIds.get(involveUserIds.size() - 1);
List<Integer> msgUserIds = new ArrayList<>();
if (lastUserId == 0) {
msgUserIds = userService.findByUniteId(node.getOwnUnit()).stream()
.map(UserShenRe::getUserId)
.collect(toList());
} else {
msgUserIds = new ArrayList<>();
msgUserIds.add(lastUserId);
}
MessageBto msgBto = new MessageBto(node.getId(), node.getBusinessType(), shutDownMsg, msgUserIds);
messageService.add(msgBto);
// List<Integer> involveUserIds = node.parse2Bto().getInvolveUserIdList();
// int lastUserId = involveUserIds.get(involveUserIds.size() - 1) == null ? 0 : involveUserIds.get(involveUserIds.size() - 1);
// List<Integer> msgUserIds = new ArrayList<>();
// if (lastUserId == 0) {
// msgUserIds = userService.findByUniteId(node.getOwnUnit()).stream()
// .map(UserShenRe::getUserId)
// .collect(toList());
// } else {
// msgUserIds = new ArrayList<>();
// msgUserIds.add(lastUserId);
// }
// MessageBto msgBto = new MessageBto(node.getId(), node.getBusinessType(), shutDownMsg, msgUserIds);
// messageService.add(msgBto);
}
private void supplyLogMsg2(Task node) {
......
......@@ -76,6 +76,13 @@ public interface TaskDao extends JpaRepository<Task, Integer>, JpaSpecificationE
List<Task> findTaskEntitiesByParentTaskIdAndAndBusinessType(Integer parentTaskId,Integer businessType);
List<Task> findAllByParentTaskId(Integer parentTaskId);
/**
* 根绝parentid 查task
* @param ids parentid
* @return tasks
*/
List<Task> findAllByParentTaskIdIn(List<Integer> ids);
Task findByBusinessTypeAndOwnUnitAndBillStatus(Integer type, Integer ownUnit, Integer billStatus);
Task findByParentTaskIdAndAndTitle(Integer parentId, String title);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论