提交 883b4363 authored 作者: Matrix's avatar Matrix

feat(核查模块): 完成了核查模块的回退功能

- 完成了核查模块的回退功能
上级 e70bc3b6
......@@ -107,23 +107,19 @@ public enum LogType {
TRAIN_1(46,TRAIN.id, ORIGIN_STATUS.id, TRAIN1000.id, "发起培训"),
CONFIRM_CHECK_DETAIL_NORMAL_0(401,CONFIRM_CHECK_DETAIL.id, ORIGIN_STATUS.id, CHECK_DETAIL_0.id, "核查详情任务开始"),
CONFIRM_CHECK_DETAIL_NORMAL_0(401,CONFIRM_CHECK_DETAIL.id, ORIGIN_STATUS.id, CHECK_DETAIL_REGION_0.id, "核查详情任务开始"),
CONFIRM_CHECK_DETAIL_NORMAL_1(402,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_0.id, CHECK_DETAIL_1.id, "A岗核查成功,等待专管员B操作"),
CONFIRM_CHECK_DETAIL_NORMAL_1(402,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_REGION_0.id, CHECK_DETAIL_REGION_1.id, "A岗核查成功,等待专管员B操作"),
CONFIRM_CHECK_DETAIL_NORMAL_2(403,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_1.id, CHECK_DETAIL_2.id, "B岗核查成功,等待核查组成员A审核"),
CONFIRM_CHECK_DETAIL_NORMAL_2(403,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_REGION_1.id, CHECK_DETAIL_REGION_2.id, "B岗核查成功,等待核查组成员A审核"),
CONFIRM_CHECK_DETAIL_NORMAL_3(404,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_2.id, CHECK_DETAIL_3.id, "核查组成员A核查成功,等待核查组成员B审核"),
CONFIRM_CHECK_DETAIL_NORMAL_3(404,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_REGION_2.id, END.id, "市专管员审核成功,该自查任务完结"),
CONFIRM_CHECK_DETAIL_NORMAL_4(405,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_3.id, END.id, "核查组成员B核查成功,任务结束,上传数据到统计信息"),
CONFIRM_CHECK_DETAIL_OTHER_1(406,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_REGION_1.id, END.id, "B岗核查成功,该任务没有核查组成员,任务结束,上传数据到统计信息"),
CONFIRM_CHECK_DETAIL_OTHER_1(406,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_1.id, END.id, "B岗核查成功,该任务没有核查组成员,任务结束,上传数据到统计信息"),
CONFIRM_CHECK_DETAIL_OTHER_2(407,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_REGION_1.id, CHECK_DETAIL_REGION_0.id, "B岗审核失败,跳回区A岗人员操作"),
CONFIRM_CHECK_DETAIL_OTHER_2(407,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_1.id, CHECK_DETAIL_0.id, "B岗审核失败,跳回A岗人员操作"),
CONFIRM_CHECK_DETAIL_OTHER_3(408,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_2.id, CHECK_DETAIL_0.id, "核查组成员A审核失败,跳回A岗人员操作"),
CONFIRM_CHECK_DETAIL_OTHER_4(409,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_3.id, CHECK_DETAIL_0.id, "核查组成员B审核失败,跳回A岗人员操作"),
CONFIRM_CHECK_DETAIL_OTHER_3(408,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_REGION_2.id, CHECK_DETAIL_REGION_0.id, "市专管员审核失败,跳回区A岗人员操作"),
CONFIRM_CHECK_DETAIL_STAT_0(410,CONFIRM_CHECK_STAT.id, ORIGIN_STATUS.id, CHECK_STAT_0.id, "核查统计任务开始"),
......@@ -137,20 +133,33 @@ public enum LogType {
CONFIRM_CHECK_EXAM_STAT_2(415, CONFIRM_CHECK_STAT.id, CHECK_EXAM_STAT_1.id, END.id, "检查统计任务数据已确认完毕,任务完结"),
CONFIRM_CHECK_EXAM_DETAIL_0(416, CONFIRM_CHECK_DETAIL.id, ORIGIN_STATUS.id, CHECK_EXAM_DETAIL_0.id, "检查详情任务开始"),
CONFIRM_CHECK_EXAM_DETAIL_0(416, CONFIRM_CHECK_DETAIL.id, ORIGIN_STATUS.id, CHECK_DETAIL_REGION_0.id, "检查详情任务开始"),
CONFIRM_CHECK_EXAM_DETAIL_1(417, CONFIRM_CHECK_DETAIL.id, CHECK_EXAM_DETAIL_0.id, CHECK_EXAM_DETAIL_1.id, "A岗核查成功,等待专管员B操作"),
CONFIRM_CHECK_EXAM_DETAIL_1(417, CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_REGION_0.id, CHECK_DETAIL_REGION_1.id, "A岗核查成功,等待专管员B操作"),
CONFIRM_CHECK_EXAM_DETAIL_2(418, CONFIRM_CHECK_DETAIL.id, CHECK_EXAM_DETAIL_1.id, END.id, "专管员B核查成功,该地区的检查任务结束了"),
CONFIRM_CHECK_EXAM_DETAIL_2(418, CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_REGION_1.id, END.id, "专管员B核查成功,该地区的检查任务结束了"),
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_DETAIL_3(419, CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_REGION_1.id, CHECK_DETAIL_REGION_0.id, "B岗审核失败,跳回A岗人员操作"),
CONFIRM_CHECK_EXAM_STAT_3(420, CONFIRM_CHECK_DETAIL.id, CHECK_EXAM_STAT_0.id, END.id, "检查统计任务数据已确认完毕,任务完结"),
CONFIRM_CHECK_SELF_ROLLBACK(421, CONFIRM_CHECK_DETAIL.id, END.id,CHECK_EXAM_DETAIL_0.id, "自查任务已退回至等待专管员A处理状态"),
CONFIRM_CHECK_SELF_ROLLBACK(421, CONFIRM_CHECK_DETAIL.id, END.id,CHECK_DETAIL_REGION_0.id, "自查任务已退回至等待专管员A处理状态"),
CONFIRM_CHECK_EXAM_ROLLBACK(422, CONFIRM_CHECK_DETAIL.id, END.id,CHECK_EXAM_STAT_1.id, "检查任务已退回至等待确认状态"),
CONFIRM_CHECK_EXAM_CITY_DETAIL_0(423, CONFIRM_CHECK_DETAIL.id, ORIGIN_STATUS.id, CHECK_DETAIL_CITY_0.id, "检查详情任务开始"),
CONFIRM_CHECK_EXAM_CITY_DETAIL_1(424, CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_CITY_0.id, CHECK_DETAIL_CITY_1.id, "专管员A操作成功,等待专管员B操作"),
CONFIRM_CHECK_EXAM_CITY_DETAIL_REDO(425, CONFIRM_CHECK_DETAIL.id, END.id, CHECK_DETAIL_CITY_0.id, "检查详情任务开始重做"),
CONFIRM_CHECK_EXAM_CITY_VERIFY_DONE(426, CONFIRM_CHECK_DETAIL.id, CONFIRM_STAT_0.id, END.id, "市统计数据确认完毕"),
CONFIRM_CHECK_EXAM_CITY_DETAIL_DONE(427, CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_CITY_1.id, END.id, "专管员B处理完毕"),
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.common;
import com.tykj.dev.config.Log;
import com.tykj.dev.misc.base.StatusEnum;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.util.HashMap;
import java.util.Map;
import static com.tykj.dev.misc.base.StatusEnum.*;
/**
* CheckChart. 里面用于存放核查模块要用到的一些对照表Map
*
* @author Matrix <xhyrzldf@gmail.com>
* @since 2021/8/19 at 3:14 下午
*/
@Data
@Slf4j
public class CheckChart {
/**
* key = 任务状态编号 , value = 核查情况 , 用于市区自核查页面
*/
public static Map<Integer, String> taskStatus2Situation = new HashMap<>();
static {
taskStatus2Situation.put(CHECK_DETAIL_CITY_0.id, "无");
taskStatus2Situation.put(CHECK_DETAIL_CITY_1.id, "进行中");
taskStatus2Situation.put(CHECK_DETAIL_REGION_0.id, "无");
taskStatus2Situation.put(CHECK_DETAIL_REGION_1.id, "进行中");
taskStatus2Situation.put(CHECK_DETAIL_REGION_2.id, "等待市审核");
taskStatus2Situation.put(END.id, "完成");
log.info("[核查模块] 初始化taskStatus2Situation 完毕 , size = {}",CheckChart.taskStatus2Situation.size());
}
}
......@@ -5,6 +5,7 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.tykj.dev.config.GlobalMap;
import com.tykj.dev.config.swagger.AutoDocument;
import com.tykj.dev.device.confirmcheck.common.CheckChart;
import com.tykj.dev.device.confirmcheck.common.CheckType;
import com.tykj.dev.device.confirmcheck.common.TaskPeriod;
import com.tykj.dev.device.confirmcheck.entity.domain.DeviceCheckDetail;
......@@ -18,6 +19,7 @@ import com.tykj.dev.device.confirmcheck.utils.ObjTransUtil;
import com.tykj.dev.device.file.entity.FileRet;
import com.tykj.dev.device.file.service.FilesUtil;
import com.tykj.dev.device.library.repository.DeviceLibraryDao;
import com.tykj.dev.device.library.service.DeviceLibraryCacheService;
import com.tykj.dev.device.library.subject.domin.DeviceLibrary;
import com.tykj.dev.device.selfcheck.controller.SelfCheckController;
import com.tykj.dev.device.task.repository.TaskDao;
......@@ -33,6 +35,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.UserService;
import com.tykj.dev.device.user.util.AuthenticationUtils;
import com.tykj.dev.misc.base.ResultObj;
import com.tykj.dev.misc.base.StatusEnum;
......@@ -44,11 +47,11 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
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;
......@@ -57,7 +60,6 @@ import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.function.Function;
import java.util.function.Predicate;
import static com.tykj.dev.misc.base.BusinessEnum.CONFIRM_CHECK_DETAIL;
import static com.tykj.dev.misc.base.BusinessEnum.CONFIRM_CHECK_STAT;
......@@ -71,7 +73,7 @@ import static java.util.stream.Collectors.*;
@RestController
@RequestMapping(value = "/check/confirm")
@AutoDocument
@Transactional(rollbackFor = Exception.class)
//@Transactional(rollbackFor = Exception.class)
@Slf4j
@Api(tags = "核查模块", description = "核查模块", position = 1)
public class DeviceCheckController {
......@@ -93,6 +95,8 @@ public class DeviceCheckController {
@Autowired
private DeviceCheckDetailDao detailRepo;
@Autowired
private DeviceLibraryCacheService dcService;
@Autowired
private ObjTransUtil transUtil;
@Autowired
private TaskDao taskRepo;
......@@ -107,7 +111,11 @@ public class DeviceCheckController {
@Autowired
private ConfirmCheckService ccService;
@Autowired
private UserService userService;
@Autowired
private MyWebSocket myWebSocket;
@Autowired
private SelfCheckController selfCheckController;
@GetMapping("/area/{fatherId}")
@ApiOperation(value = "查询指定区域下的所有区域信息")
......@@ -135,7 +143,6 @@ public class DeviceCheckController {
return statVoList;
}
@ApiOperation(value = "根据关键字分页查询核查统计数据")
@PostMapping("/stat")
public Page<CheckStatTableVo> findStatByKeyword(
......@@ -191,7 +198,6 @@ public class DeviceCheckController {
return ResponseEntity.ok(new ResultObj<>(cdVo));
}
/**
* 该接口负责处理以下跳转情况
* 1 - 统计跳转
......@@ -222,16 +228,30 @@ public class DeviceCheckController {
List<LinkCheckDetail> lcdList = new ArrayList<>();
List<LinkExamDetail> ledList = new ArrayList<>();
// if else 结果 1.核查页面(市检查and省直属单位自查) 2.检查页面 (均为单位自查)
// check type = 0 核查页面 看见的是市检查与省直属自查
if (ctVo.getCheckType() == 0) {
linkVo.setType(1);
// 根据tpye和billId找到父级节点 - 默认了最顶级的省核查节点应当为一个
Task rootTask = taskRepo.findAllByBillIdAndBusinessType(billId, type).get(0);
// 先检出所有类型为7或者8的Task集合 方便后续操作
Specification<Task> pred = Specifications.<Task>and()
.in("businessType", 7, 8)
.build();
List<Task> cacheTask = taskRepo.findAll(pred);
//key = parentId , value childList
Map<Integer, List<Task>> parentTaskMap = cacheTask.stream()
.collect(groupingBy(Task::getParentTaskId));
// 找到所有的子节点
List<Task> childTask = taskRepo.findAllByParentTaskId(rootTask.getId());
List<Task> childTask = parentTaskMap.get(rootTask.getId());
long startTime = System.currentTimeMillis();
long finalTime = System.currentTimeMillis();
for (Task child : childTask) {
// 将子节点任务中的 统计数据确认任务 给过滤掉
if (child.getTitle().contains("统计数据确认任务")) {
......@@ -251,8 +271,12 @@ public class DeviceCheckController {
DeviceCheckStat cdc = statRepo.findById(child.getBillId()).get();
CheckStatVo cdcVo = transUtil.checkStatDo2Vo(cdc);
//todo 这里更改从detail中去查看并求和
//找到chilid的子child detail 并求和
List<Task> cctask = taskRepo.findAllByParentTaskId(child.getId());
//找到chilid的子child detail 并求和 ccTask即为所有的自查任务集合
List<Task> cctask = parentTaskMap.get(child.getId());
if (Objects.isNull(cctask)){
cctask = new ArrayList<>();
}
List<CheckAreaStatVo> totalList = new ArrayList<>();
......@@ -266,11 +290,11 @@ public class DeviceCheckController {
.collect(toList());
totalList.addAll(casList);
}
//
String areaName = auService.findOne(AuExample.UnitId, child.getOwnUnit()).getName();
CheckAreaStatVo cas = combineCaList(totalList, areaName);
//
LinkCheckDetail lcd = cas2lcd(totalList, child, cctask, areaName);
LinkCheckDetail lcd = rev2lcd(child, endTime, updateTime,cas.reverse());
lcd.setCheckUnit(unitName);
if (child.getTitle().contains("统计确认待办任务")) {
lcd.setCheckSituation("统计确认待办任务");
......@@ -300,16 +324,13 @@ public class DeviceCheckController {
if (casList.isEmpty()) {
cas = new CheckAreaStatVo("默认地区", 0, 0, 0, 0, 0, 0);
} else {
cas = combineCaList(casList, unitName);
// cas = combineCaList(casList, unitName);
cas = casList.get(0);
}
// CheckAreaStatVo cas = parseStatString2Vo(child.parse2Bto(), childDetail).stream()
// .map(CheckDeviceStatVo::getAreaStatList)
// .flatMap(checkAreaStatVos -> checkAreaStatVos.stream())
// .reduce(CheckAreaStatVo::combine)
// .orElse(new CheckAreaStatVo("默认地区", 0, 0, 0, 0, 0, 0));
// LinkExamDetail led = rev2led(child, endTime, updateTime, cas.reverse());
LinkExamDetail led = cas2led(cas, child, endTime, updateTime);
LinkExamDetail led = rev2led(child, endTime, updateTime,cas.reverse());
led.setCheckUnit(unitName);
ledList.add(led);
......@@ -356,34 +377,7 @@ public class DeviceCheckController {
int i = 0;
for (Task child : childTask) {
Integer childBusType = child.getBusinessType();
Integer childBusId = child.getBillId();
DeviceCheckDetail childDetail = detailRepo.findById(childBusId).get();
String unitName = childDetail.getCheckUnit();
List<CheckAreaStatVo> casList = parseStatString2Vo(child.parse2Bto(), childDetail).stream()
.map(CheckDeviceStatVo::getAreaStatList)
.flatMap(checkAreaStatVos -> checkAreaStatVos.stream())
.collect(toList());
//自查的areaName要从detail里找
String areaName = childDetail.getCheckUnit();
CheckAreaStatVo cas;
if (casList.isEmpty()) {
cas = new CheckAreaStatVo("默认地区", 0, 0, 0, 0, 0, 0);
} else {
cas = combineCaList(casList, areaName);
}
//
// CheckAreaStatVo cas = parseStatString2Vo(child.parse2Bto(), childDetail).stream()
// .map(CheckDeviceStatVo::getAreaStatList)
// .flatMap(checkAreaStatVos -> checkAreaStatVos.stream())
// .reduce(CheckAreaStatVo::combine)
// .get();
LinkExamDetail led = rev2led(child, endTime, updateTime,cas.reverse());
led.setCheckUnit(unitName);
LinkExamDetail led = getLed(endTime, updateTime, child);
//设置名称
led.setExamName(groupNames.get(i));
......@@ -409,128 +403,207 @@ public class DeviceCheckController {
}
//进行了更新 使用修改时间去做是否逾期判断
private LinkCheckDetail rev2lcd(Task task, LocalDateTime endTime, LocalDateTime updateTime,RevAreaStat revAreaStat) {
@NotNull
private LinkExamDetail getLed(LocalDateTime endTime, LocalDateTime updateTime, Task child) {
Integer childBusType = child.getBusinessType();
Integer childBusId = child.getBillId();
DeviceCheckDetail childDetail = detailRepo.findById(childBusId).get();
String unitName = childDetail.getCheckUnit();
List<CheckAreaStatVo> casList = parseStatString2Vo(child.parse2Bto(), childDetail).stream()
.map(CheckDeviceStatVo::getAreaStatList)
.flatMap(checkAreaStatVos -> checkAreaStatVos.stream())
.collect(toList());
//自查的areaName要从detail里找
String areaName = childDetail.getCheckUnit();
CheckAreaStatVo cas;
if (casList.isEmpty()) {
cas = new CheckAreaStatVo("默认地区", 0, 0, 0, 0, 0, 0);
} else {
cas = casList.get(0);
}
LinkExamDetail led = cas2led(cas, child, endTime, updateTime);
led.setCheckUnit(unitName);
return led;
}
/**
* lcd 里的列表都为检查,因此是集合对
*
* @return
*/
private LinkCheckDetail cas2lcd(List<CheckAreaStatVo> casList, Task task, List<Task> detailTasks, String finalCityName) {
LinkCheckDetail lcd = new LinkCheckDetail();
lcd.setId(task.getBillId());
String finalSituation = "";
//核查情况 无误/有误/逾期
if (revAreaStat.getComSituation() == -1) {
lcd.setCheckSituation("重新检查");
} else if (revAreaStat.getComSituation() == 1) {
lcd.setCheckSituation("有误");
} else if (revAreaStat.getComSituation() == 0) {
if (revAreaStat.getComProgress() == 0) {
lcd.setCheckSituation("无");
} else {
lcd.setCheckSituation("无误");
// 核查结果的判断具体细节可以查看 docs/confirmCheck.md文档
List<String> situationList = detailTasks.stream()
.map(this::getDetailSituation)
.collect(toList());
// 如果 size = 0 或全都是 无 ,则无
if (situationList.size() == 0){
finalSituation = "无";
}else {
boolean allIsNothing = situationList.stream().allMatch(s -> s.equals("无"));
if (allIsNothing) {
finalSituation = "无";
}
//如果 有任意一个区状态是待审核
boolean anyIsAudit = situationList.stream().anyMatch(s -> s.equals("等待市审核"));
if (anyIsAudit) {
finalSituation = "等待市审核";
}
//如果 全都是 完成,那么是完成
boolean allIsFinish = situationList.stream().allMatch(s -> s.equals("完成"));
if (allIsFinish) {
finalSituation = "完成";
}
// 其他情况,则是进行中
if (StringUtils.isEmpty(finalSituation)) {
finalSituation = "进行中";
}
} else {
lcd.setCheckSituation("异常");
}
lcd.setCheckSituation(finalSituation);
//核查结果
// if (endTime.isBefore(LocalDateTime.now())) {
// if (revAreaStat.getComProgress() ==1){
// lcd.setCheckResult("逾期进行中");
// }else if (task.getBillStatus() != 9999 || revAreaStat.getComProgress() != 2) {
// lcd.setCheckResult("逾期");
// } else {
// lcd.setCheckResult("逾期完成");
// }
// } else {
if (task.getBillStatus() == 9999) {
// if (endTime.isBefore(LocalDateTime.now())) {
// lcd.setCheckResult("逾期完成");
// }
if (endTime.isBefore(updateTime)) {
lcd.setCheckResult("逾期完成");
} else {
lcd.setCheckResult("完成");
// 核查情况 所有子任务都是初始状态 = 无 10=未
String checkReuslt = "";
boolean allIsInit = detailTasks.stream()
.allMatch(t -> t.getBillStatus().equals(CHECK_DETAIL_CITY_0.id) || t.getBillStatus().equals(CHECK_DETAIL_REGION_0.id));
if (allIsInit) {
checkReuslt = "无";
} else {
// 任意一个是10则是待审核
boolean waitAudit = casList.stream()
.anyMatch(cas -> cas.getComSituation() == 10);
boolean notPassed = casList.stream()
.anyMatch(cas -> cas.getComSituation() == 13);
// 需要每一个城市都有无误(即12) 才算无误
Map<String, List<CheckAreaStatVo>> map = casList.stream()
.collect(groupingBy(CheckAreaStatVo::getAreaName));
long okCount = 0;
for (List<CheckAreaStatVo> vos : map.values()) {
boolean containsOk = vos.stream()
.anyMatch(checkAreaStatVo -> checkAreaStatVo.getComSituation() == 12);
if (containsOk){
okCount++;
}
}
} else if (revAreaStat.getComProgress() == 3) {
lcd.setCheckResult("已退回");
} else if (revAreaStat.getComProgress() == 0) {
lcd.setCheckResult("未开始");
} else if (revAreaStat.getComProgress() == 1) {
lcd.setCheckResult("进行中");
} else if (revAreaStat.getComProgress() == 2 && task.getBillStatus() % 10 == 0) {
lcd.setCheckResult("进行中");
} else if (revAreaStat.getComProgress() == 2 && task.getBillStatus() % 10 == 1) {
lcd.setCheckResult("进行中");
} else if (revAreaStat.getComProgress() == 2) {
// if (endTime.isBefore(LocalDateTime.now())) {
// lcd.setCheckResult("逾期完成");
// }
if (endTime.isBefore(updateTime)) {
lcd.setCheckResult("逾期完成");
boolean allOk = okCount >= map.size();
if (waitAudit) {
checkReuslt = "等待省审核";
} else if (allOk) {
checkReuslt = "无误";
} else if (notPassed) {
checkReuslt = "未通过";
} else {
lcd.setCheckResult("完成");
checkReuslt = "进行中";
}
}
lcd.setCheckResult(checkReuslt);
//核查单位名
lcd.setCheckUnit(revAreaStat.getAreaName() + "局");
//备注判断 新增缺失
lcd.setRemark(revAreaStat.getActualCount() - revAreaStat.getSupposeCount());
lcd.setCheckUnit(finalCityName + "局");
return lcd;
}
@GetMapping("/test/test")
private String justForTest() {
CheckChart.taskStatus2Situation.forEach((k, v) -> System.out.println(v));
return "test";
}
//修改
private LinkExamDetail rev2led(Task task, LocalDateTime endTime, LocalDateTime updateTime,RevAreaStat revAreaStat) {
/**
* 获得自查的核查情况
*/
private String getDetailSituation(Task task) {
Integer taskStatus = task.getBillStatus();
String situation = CheckChart.taskStatus2Situation.get(taskStatus);
// 无的情况要分两种 一种是初始的无 一种是重做导致的无 通过判断task的remark
String remark = task.getRemark();
if (situation.equals("无")) {
if (Objects.nonNull(remark) && remark.contains("ROLLBACK")) {
situation = "未通过";
}
}
return situation;
}
/**
* led 里的列表都为自查,因此都是单个对象
*
* @return
*/
private LinkExamDetail cas2led(CheckAreaStatVo cas, Task task, LocalDateTime endTime, LocalDateTime updateTime) {
LinkExamDetail led = new LinkExamDetail();
led.setId(task.getBillId());
int comProgress = cas.getComProgress();
int comSituation = cas.getComSituation();
//核查情况 重新检查/无误/有误/逾期
if (revAreaStat.getComSituation() == -1) {
led.setCheckSituation("重新检查");
} else if (revAreaStat.getComSituation() == 1) {
led.setCheckSituation("有误");
} else if (revAreaStat.getComSituation() == 0) {
if (revAreaStat.getComProgress() == 0) {
led.setCheckSituation("无");
} else {
led.setCheckSituation("无误");
}
} else {
led.setCheckSituation("异常");
// 核查情况依照 新的与task status来对应 详情可以查看docs/confirmcheck.md里的对应表 对照表
String situation = getDetailSituation(task);
// 逾期的处理,只在完成的那一步才判断
if (situation.equals("完成") && updateTime.isAfter(endTime)) {
situation = "逾期完成";
}
led.setCheckSituation(situation);
//核查结果
if (task.getBillStatus() == 9999) {
// if (endTime.isBefore(LocalDateTime.now())) {
// led.setCheckResult("逾期完成");
// }
if (endTime.isBefore(updateTime)) {
led.setCheckResult("逾期完成");
} else {
led.setCheckResult("完成");
}
} else if (revAreaStat.getComProgress() == 3) {
led.setCheckResult("已退回");
} else if (revAreaStat.getComProgress() == 0) {
led.setCheckResult("未开始");
} else if (revAreaStat.getComProgress() == 1) {
led.setCheckResult("进行中");
} else if (revAreaStat.getComProgress() == 2 && task.getBillStatus() % 10 == 0) {
led.setCheckResult("进行中");
} else if (revAreaStat.getComProgress() == 2 && task.getBillStatus() % 10 == 1) {
led.setCheckResult("进行中");
} else if (revAreaStat.getComProgress() == 2) {
if (endTime.isBefore(updateTime)) {
led.setCheckResult("逾期完成");
String checkResult = "";
String remark = task.getRemark();
// 核查结果
if (!situation.contains("完成")) {
checkResult = "无";
} else {
if (comSituation == 10) {
// 再判断一下 是2级结构还是3级结构
Integer rootId = taskService.findByTaskId(task.getParentTaskId()).getParentTaskId();
boolean isTwoLevel = rootId == null || rootId ==0;
// 2级结构 - 发起人单位是省单位 则不变, 发起人市市单位则变为无
if (isTwoLevel){
Integer startUnitId = userService.findById(task.getCreateUserId()).getUnitsId();
if (startUnitId !=1){
checkResult = "无";
}else {
checkResult = "等待省审核";
}
}else {
checkResult = "等待省审核";
}
} else if (comSituation == 12) {
checkResult = "无误";
} else if (comSituation == 13) {
int redoTime = 1;
if (Objects.nonNull(remark) && remark.contains("ROLLBACK")) {
redoTime = Integer.valueOf(remark.split("-")[1]);
}
checkResult = redoTime + "次未通过";
} else {
led.setCheckResult("完成");
checkResult = "状态异常";
}
}
led.setCheckResult(checkResult);
//核查单位名
led.setCheckUnit(revAreaStat.getAreaName() + "局");
//备注判断 新增缺失
led.setRemark(revAreaStat.getActualCount() - revAreaStat.getSupposeCount());
led.setCheckUnit(cas.getAreaName() + "局");
return led;
}
......@@ -587,7 +660,7 @@ public class DeviceCheckController {
Integer provId = taskService.get(examJobId).getParentTaskId();
// 检查的job id 找到 father 进而找到 father的billid 进而找到title Id
Integer statId = taskService.get(provId).getBillId();
DeviceCheckStat deviceCheckStat = statRepo.getOne(statId);
DeviceCheckStat deviceCheckStat = statRepo.findById(statId).get();
String title = deviceCheckStat.getTitle();
String remark = deviceCheckStat.getRemark();
return ResponseEntity.ok(new CheckTitleAndTimeVo(title, deviceCheckStat.getEndTime(), remark));
......@@ -617,8 +690,8 @@ public class DeviceCheckController {
@ApiOperation(value = "检查地区是否发起核查", notes = "检查地区是否发起核查")
@PostMapping("/checkPossible")
public ResponseEntity checkPossible(@RequestBody UnitIds uuid) {
List<String> unitNames = uuid.getIds().stream()
public ResponseEntity checkPossible(@RequestBody UnitIds unitIds) {
List<String> unitNames = unitIds.getIds().stream()
.map(id -> auService.findOne(AuExample.UnitId, id))
.map(AreaUnit::getUnitName)
.collect(toList());
......@@ -720,8 +793,23 @@ public class DeviceCheckController {
for (Units unit : selfCheckUnits) {
//核查组成员名称用当前登录用户
String names = loginUser.getName();
// 如果是市level=2 的话,father Id为市的检查id
Integer fatherId = 0;
Integer initStatusId = 0;
// level = 2 市级 否则 区级 ,市级的自查初始状态160,区级的自查初始状态140
if (unit.getLevel() == 2) {
fatherId = cityExamIdMap.get(unit.getUnitId());
initStatusId = CHECK_DETAIL_CITY_0.id;
} 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(), 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();
......@@ -735,13 +823,6 @@ public class DeviceCheckController {
}
// 3-2 构建被查单位的 自查任务 (根据被查单位的级别来区分是县级状态是市级状态) 这里的父级任务应该是省统计
// 如果是市level=2 的话,father Id为市的检查id
Integer fatherId = 0;
if (unit.getLevel() == 2) {
fatherId = cityExamIdMap.get(unit.getUnitId());
} else {
fatherId = provStatTask.getId();
}
//处理ownUnit的代码 - 用于处理没有账号的单位的可见性
Integer ownUnitId = 0;
......@@ -751,7 +832,7 @@ public class DeviceCheckController {
ownUnitId = unit.getUnitId();
}
TaskBto checkedTask = new TaskBto(CHECK_EXAM_DETAIL_0.id, unit.getName() + "自核查任务", fatherId, addNode(provStatTask.getNodeIdDetail(), provStatTask.getId()), CONFIRM_CHECK_DETAIL.id, detail.getId(), ownUnitId, 0);
TaskBto checkedTask = new TaskBto(initStatusId, unit.getName() + "自核查任务", fatherId, addNode(provStatTask.getNodeIdDetail(), provStatTask.getId()), CONFIRM_CHECK_DETAIL.id, detail.getId(), ownUnitId, 0);
checkedTask.setCustomInfo("manual");
taskService.start(checkedTask);
}
......@@ -786,12 +867,15 @@ public class DeviceCheckController {
}
List<String> tmpString = new ArrayList<>();
// 拼接检查组和检查组成员
for (CheckExamDetailVo vo : examDetailVos) {
tmpString.add(vo.getGroupName() + "," + vo.getUserNames().stream().collect(joining(",")));
for (Integer u : vo.getUnitIds()) {
tmpString.add(vo.getGroupName() + "," + vo.getUserNames().stream().collect(joining(",")));
}
}
String groupUserString = tmpString.stream().collect(joining("|"));
List<Integer> unitIds = examDetailVos.stream().map(CheckExamDetailVo::getUnitId).collect(toList());
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());
......@@ -824,7 +908,7 @@ public class DeviceCheckController {
if (ceVo.getExamStatId() == 0) {
cityStatTask = new Task(CHECK_EXAM_STAT_1.id, CHECK_EXAM_STAT_0.name, 0, ".0.", CONFIRM_CHECK_STAT.id, statId, startUnitId)
.parse2Bto();
cityStatTask.setRemark(String.valueOf(CHECK_EXAM_STAT_1.id));
// cityStatTask.setRemark(String.valueOf(CHECK_EXAM_STAT_1.id));
cityStatTask.setCustomInfo("exam");
cityStatTask.getInvolveUserIdList().add(currentUserId);
// 检查变为待办
......@@ -836,7 +920,7 @@ public class DeviceCheckController {
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.setRemark(String.valueOf(CHECK_EXAM_STAT_1.id));
cityStatTask.setCustomInfo("exam");
cityStatTask.setCurrentPoint(cityStatTask.getCurrentPoint() + 1);
cityStatTask.setCreateUserId(currentUserId);
......@@ -859,31 +943,56 @@ public class DeviceCheckController {
// 3. 构建被核查单位的详情账单与Task
// 对每个需要核查的单位构建其detail账单与task
boolean isProvUser = authenticationUtils.getAuthentication()
.getCurrentUserInfo().getUnitsId() == 1;
for (CheckExamDetailVo ed : examDetailVos) {
Units unit = unitsRepo.findById(ed.getUnitId()).get();
String names = ed.getUserNames().stream().collect(joining(","));
// 3-1 构建被查单位的 自查账单
DeviceCheckDetail unitDetailDoc = DeviceCheckDetail.EmptyWithChecker(names + "|" + ed.getRemark(), ceVo.getTitle() + "%^&" + ed.getRemark(), 0, 0, 0, 0, unit.getName(), devInLib.getOrDefault(unit.getName(), new ArrayList<>()), devNotInLib.getOrDefault(unit.getName(), new ArrayList<>()));
DeviceCheckDetail detail = detailRepo.save(unitDetailDoc);
detailIds.add(detail.getId());
// 将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());
List<Integer> uid = ed.getUnitIds();
for (Integer u : uid) {
Units unit = unitsRepo.findById(u).get();
String names = ed.getUserNames().stream().collect(joining(","));
// 根据发起人决定初始状态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(), 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();
for (CheckDeviceStatVo statVo : deviceStatVos) {
for (CheckAreaStatVo asv : statVo.getAreaStatList()) {
if (asv.getAreaName().equals(areaName)) {
asv.setAreaStatId(statId);
asv.setAreaDetailId(detail.getId());
}
}
}
// 3-2 构建被查单位的 自查任务 (根据被查单位的级别来区分是县级状态是市级状态)
TaskBto checkedTask = new TaskBto(initTaskStatusId, "自核查任务", 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());
}
// 3-2 构建被查单位的 自查任务 (根据被查单位的级别来区分是县级状态是市级状态)
TaskBto checkedTask = new TaskBto(CHECK_EXAM_DETAIL_0.id, "自核查任务", 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. 重新设置并保存统计账单
......@@ -917,7 +1026,6 @@ public class DeviceCheckController {
}
/**
* 根据taskId查询Remark
*/
......@@ -928,7 +1036,6 @@ public class DeviceCheckController {
return ResponseEntity.ok(desBillMap.get(billId));
}
private TaskBto selectProvTask(Integer taskId) {
TaskBto taskBto = taskService.get(taskId);
if (taskBto.getParentTaskId() == 0) {
......@@ -937,7 +1044,6 @@ public class DeviceCheckController {
return selectProvTask(taskBto.getParentTaskId());
}
/**
* 对于专员A来说的逻辑
* 1. 修改detailString
......@@ -1049,11 +1155,12 @@ public class DeviceCheckController {
// 审核通过与不通过的逻辑不同
TaskBto currentTask = taskService.get(id, CONFIRM_CHECK_DETAIL.id);
boolean CEDStep1 = currentTask.getBillStatus().equals(CHECK_DETAIL_1.id) || currentTask.getBillStatus().equals(CHECK_EXAM_DETAIL_1.id);
boolean CEDStep1 = currentTask.getBillStatus().equals(CHECK_DETAIL_REGION_1.id) || currentTask.getBillStatus().equals(CHECK_DETAIL_CITY_1.id);
if (!CEDStep1) {
return ResponseEntity.status(400).body(new ResultObj<>(String.format("当前任务的状态异常!当前任务状态为 %s , 任务状态应该为 %s", GlobalMap.getStatusEnumMap().get(currentTask.getBillStatus()), CHECK_DETAIL_1.name)));
return ResponseEntity.status(400).body(new ResultObj<>(String.format("当前任务的状态异常!当前任务状态为 %s , 任务状态应该为 %s", GlobalMap.getStatusEnumMap().get(currentTask.getBillStatus()), CHECK_DETAIL_REGION_1.name)));
}
DeviceCheckDetail currentDetail = detailRepo.findById(id).get();
if (checkStatus == 1) {
// 只要通过了,且更新了详情结果,那么这里就进行一次更新
if (isUpdate == 1) {
......@@ -1068,7 +1175,6 @@ public class DeviceCheckController {
//依据detail账单对应的checkUserId来判断是2流程还是多流程的
DeviceCheckDetail currentDetail = detailRepo.findById(id).get();
Integer userAId = currentDetail.getCheckUserAId();
Integer userBId = currentDetail.getCheckUserBId();
......@@ -1085,13 +1191,13 @@ public class DeviceCheckController {
taskService.moveToNext(currentTask, userAId);
} else {
// 如果是2流程的,则直接结束该任务
log.info("[核查模块] 该详情任务是一个2流程任务,结束任务并统计数据...");
taskService.moveToEnd(currentTask);
log.info("[核查模块] 详情任务推进到下个阶段...");
taskService.moveToNext(currentTask);
summaryDetail(currentTask, currentDetail);
}
} else {
//不通过则回到第一阶段
StatusEnum firstStatus = getFirstStatus(currentTask.getBillStatus());
StatusEnum firstStatus = getFirstStatus(currentTask.getBillStatus(), Integer.valueOf(currentDetail.getVar2()));
taskService.moveToSpecial(currentTask, firstStatus, currentTask.getFirstUserId());
}
log.info("[核查模块] 专管员B操作成功");
......@@ -1101,84 +1207,243 @@ public class DeviceCheckController {
}
/**
* 用于核查的回退接口
* 市人员审核区自查数据的接口
*
* @param id 办结的done接口id
* @param detailId
* @param pass 是否通过 true - 通过 ,false - 未通过
* @return
*/
@ApiOperation(value = "核查回退")
@PutMapping("/check/rollback/{id}")
@Transactional(rollbackFor = Exception.class)
public ResponseEntity checkRollback(@PathVariable Integer id) {
log.info("[核查模块] 将id = {} 的检查任务进行回退", id);
Specification<Task> donePred = Specifications.<Task>and()
.eq("billStatus", CONFIRM_STAT_0.id)
.eq("billId", id)
.eq("businessType", CONFIRM_CHECK_STAT.id)
.build();
TaskBto doneTask = taskRepo.findOne(donePred).get().parse2Bto();
@PutMapping("/city/audit/{id}")
@ApiOperation(value = "市专管人员审核区自查数据的接口")
public ResponseEntity cityAudit(
@PathVariable(name = "id") Integer detailId,
@RequestParam boolean pass) {
Specification<Task> checkPred = Specifications.<Task>and()
.eq("customInfo", "exam")
.eq("billId", id)
.eq("businessType", CONFIRM_CHECK_STAT.id)
.build();
Task checkTask = taskRepo.findOne(checkPred).get();
//1.将市检查的任务节点回退到等待办结的状态
taskService.moveToSpecial(checkTask.parse2Bto(), CHECK_EXAM_STAT_1);
TaskBto currentTask = taskService.get(detailId, CONFIRM_CHECK_DETAIL.id);
DeviceCheckDetail currentDetail = detailRepo.findById(detailId).get();
//2.删除掉省的办结任务
if (Objects.isNull(doneTask)) {
log.info("[核查模块] 没有找到对应的办结任务");
if (pass) {
// 通过的话就推进任务进度,合并数据
log.info("[核查模块] 市专管员审核通过,结束 {} 区的自查任务并汇总数据", currentDetail.getCheckUnit());
taskService.moveToNext(currentTask);
summaryDetail(currentTask, currentDetail);
return ResponseEntity.ok("市专管员审核通过,结束" + currentDetail.getCheckUnit() + " 区的自查任务并汇总数据");
} else {
log.info("[核查模块] 删除id = {}的办结任务", doneTask.getId());
taskRepo.deleteById(doneTask.getId());
log.info("[核查模块] 市专管员审核未通过,回滚该任务到初始状态,任务id = {}", currentTask.getId());
// 重置Task任务本身的任务状态,使其回滚到等待专管员A处理时的状态,并在Task里添加特殊的回滚标记,用来鉴别这是一个回滚任务
StatusEnum firstStatus = getFirstStatus(currentTask.getBillStatus(), Integer.valueOf(currentDetail.getVar2()));
currentTask.setRemark("ROLLBACK-0");
taskService.moveToSpecial(currentTask, firstStatus, currentTask.getFirstUserId());
//重置该自查详情里的各个装备的自查详情
currentDetail = setDetailCheckNumber(currentDetail, 119);
currentDetail = detailRepo.save(currentDetail);
//该detail对应的stat数据里相应的数据剔除(写一个通用的剔除方法), 否则在第二次审核通过的时候会重复计算一次数据
TaskBto fatherTask = taskService.get(currentTask.getParentTaskId());
DeviceCheckStat dcs = statRepo.findById(fatherTask.getBillId()).get();
removeDetailFromDcs(currentDetail, dcs);
return ResponseEntity.ok("回退成功!回滚该任务到初始状态,id = " + currentTask.getId());
}
return ResponseEntity.ok(new ResultObj<>("核查回退操作成功!"));
}
/**
* 省专管员审核自查数据的方法
*
* @param detailId 自查主键id
* @param pass 是否通过 true - 通过 ,false - 未通过
* @return
*/
@PutMapping("/prov/audit/{id}")
@ApiOperation(value = "省专管人员审核区自查数据的接口")
public ResponseEntity provAudit(
@PathVariable(name = "id") Integer detailId,
@RequestParam boolean pass) {
if (pass) {
log.info("[核查模块] 省专管员审查detailId = {} 的自查数据-审核通过", detailId);
return provAuditPass(detailId);
} else {
log.info("[核查模块] 省专管员审查detailId = {} 的自查数据-审核未通过", detailId);
return provAuitNotPassed(detailId);
}
}
/**
* 用于检查页面的回退接口
* 将detail里的detailString里的检查数字该为指定数值
*
* @param id 自查的detail id
* @param detail
* @param number
*/
private DeviceCheckDetail setDetailCheckNumber(DeviceCheckDetail detail, Integer number) {
String detailString = detail.getCheckDetail();
String updatedString = Arrays.stream(detailString.split(","))
.map(s -> s.split("-")[0] + "-" + number)
.collect(joining(","));
detail.setCheckDetail(updatedString);
return detail;
}
/**
* 省对区审查 未通过的 逻辑
*
* @param id detail Id
* @return
*/
@ApiOperation(value = " ")
@PutMapping("/exam/rollback/{id}")
@Transactional(rollbackFor = Exception.class)
public ResponseEntity examRollback(@PathVariable Integer id) {
log.info("[核查模块] 进行检查回退操作,要回退的检查detail id为 {}", id);
//1. 回退device-detail数据 包括 detail String,checkResult,userAId,userBid,checkedCount
// 将原来的checkDetail 的检查状态统一更改为 8 - 已退回
String detail = detailRepo.getOne(id).getCheckDetail();
String updateDetail = Arrays.stream(detail.split(","))
.map(s -> s.split("-")[0] + "-" + "8")
private ResponseEntity provAuitNotPassed(Integer id) {
//1. bill单的自查将百位数变为3
DeviceCheckDetail detail = detailRepo.findById(id).get();
String detailString = detail.getCheckDetail();
String initalDetail = Arrays.stream(detailString.split(","))
.map(s -> s.split("-")[0] + "-" + 119)
.collect(joining(","));
String updateDetail = changeHunds(detailString, 3);
detailRepo.updateCheckDetail(id, updateDetail, "", 0, 0, 0);
//2. 回退任务Task
//2. 当前任务结束,开启一个新的 退回任务(连带一个新的detail)
TaskBto currentTask = taskService.get(id, CONFIRM_CHECK_DETAIL.id);
StatusEnum firstStatus = GlobalMap.getStatusEnumMap().get(Integer.valueOf(currentTask.getRemark()));
taskService.moveToSpecial(currentTask, firstStatus, currentTask.getFirstUserId());
//3.如果父级任务状态已经到确认阶段,则同样回退一个阶段
String remark = currentTask.getRemark();
if (Objects.nonNull(remark) && remark.contains("ROLLBACK")) {
Integer times = Integer.valueOf(remark.split("-")[1]);
remark = "ROLLBACK-" + ++times;
} else {
remark = "ROLLBACK-1";
}
currentTask.setRemark(remark);
TaskBto newTask = currentTask.toDo().copy().parse2Bto();
currentTask.setCustomInfo(currentTask.getCustomInfo());
taskService.moveToEnd(currentTask);
// 创建新的detail 新的detail会在B的时候加入,所以老的stat要去除掉
DeviceCheckDetail cDetail = detail.copyWithoutId();
cDetail.setId(null);
cDetail.setCheckDetail(initalDetail);
cDetail = detailRepo.save(cDetail);
// 创建新的任务(被拒绝的自查单位如果是区则是140状态,否则是160状态)
String unitName = cDetail.getCheckUnit();
Integer level = unitsRepo.findByName(unitName).getLevel();
Integer initStatusId = 0;
if (level == 3) {
initStatusId = CHECK_DETAIL_REGION_0.id;
} else {
initStatusId = CHECK_DETAIL_CITY_0.id;
}
newTask.setBillStatus(initStatusId);
newTask.setBillId(cDetail.getId());
newTask.setId(0);
newTask.setCustomInfo(newTask.getCustomInfo());
newTask.getInvolveUserIdList().add(0);
newTask.setCurrentPoint(newTask.getInvolveUserIdList().size() - 1);
// 尝试从老任务中获取重做次数 - 新任务老任务都需要更新remark
newTask.setRemark(remark);
log.info("[核查模块] 省回退操作中... 任务remark = {}", remark);
newTask.setRemark(remark);
taskService.start(newTask);
//3. 在stat的remark中追加信息 - 找到currentTask在其中的顺位
TaskBto fatherTask = taskService.get(currentTask.getParentTaskId());
// log.info("[核查模块] 父级统计节点的task id = {} , bill id = {}", fatherTask.getId(), fatherTask.getBillId());
// if (fatherTask.getBillStatus().equals(CHECK_EXAM_STAT_1.id)) {
// log.info("[核查模块] 检测到父级节点已经进入确认阶段,回滚父级节点");
// taskService.moveToSpecial(fatherTask, CHECK_EXAM_STAT_0, fatherTask.getFirstUserId());
// }
//3. 回退合并上去的数据
String unitName = detailRepo.findById(id).get().getCheckUnit();
AreaUnit areaUnit = auService.findOne(AuExample.UnitName, unitName);
String cityName = areaUnit.getName();
List<Task> childTask = taskRepo.findAllByParentTaskId(fatherTask.getId());
int pos = 0;
for (int i = 0; i < childTask.size(); i++) {
if (childTask.get(i).getId().equals(currentTask.getId())) {
log.info("[核查模块] 记录remark的pos位置 = {}", i);
}
}
DeviceCheckStat dcs = statRepo.findById(fatherTask.getBillId()).get();
String[] groups = dcs.getRemark().split("\\|");
String pading = groups[pos];
dcs.setRemark(dcs.getRemark() + "|" + pading);
log.info("[核查模块] 补充remark = {}", pading);
// 老的stat要去除掉对应areaName的数据
removeDetailFromDcs(detail, dcs);
resetStatByCity(fatherTask.getBillId(), cityName);
//4.父级任务变为进行中
fatherTask.setBillStatus(CHECK_EXAM_STAT_1.id);
taskRepo.save(fatherTask.toDo());
return ResponseEntity.ok(new ResultObj<>("回退操作成功!"));
return ResponseEntity.ok(new ResultObj<>("检查回退操作成功!"));
}
/**
* 省对区审查通过的逻辑
*
* @param id detail Id
* @return
*/
private ResponseEntity provAuditPass(Integer id) {
//将自查的情况的百位数全部替换成2
DeviceCheckDetail detail = detailRepo.findById(id).get();
String updatedString = changeHunds(detail.getCheckDetail(), 2);
detail.setCheckDetail(updatedString);
log.info("[核查模块] 审核通过 - 更新后的detailString形如 {}", updatedString.split(",")[0]);
detailRepo.save(detail);
//将对应stat中地区的comProgress 改为 2 comsitution 改为12
String areaName = auService.findOne(AuExample.UnitName, detail.getCheckUnit()).getName();
TaskBto currentTask = taskService.get(id, CONFIRM_CHECK_DETAIL.id);
TaskBto fatherTask = taskService.get(currentTask.getParentTaskId());
DeviceCheckStat dcs = statRepo.findById(fatherTask.getBillId()).get();
CheckStatVo csv = transUtil.checkStatDo2Vo(dcs);
for (CheckDeviceStatVo vo : csv.getDeviceStatVoList()) {
for (CheckAreaStatVo av : vo.getAreaStatList()) {
if (av.getAreaName().equals(areaName)) {
log.info("[核查模块] 审核通过 - 地区 = {} 的统计数据在统计信息中被成功修改了", areaName);
av.auditPassed();
}
}
}
return ResponseEntity.ok(new ResultObj<>("审核通过!"));
}
private void removeDetailFromDcs(DeviceCheckDetail detail, DeviceCheckStat dcs) {
String areaName = auService.findOne(AuExample.UnitName, detail.getCheckUnit()).getName();
CheckStatVo csv = transUtil.checkStatDo2Vo(dcs);
for (CheckDeviceStatVo vo : csv.getDeviceStatVoList()) {
List<CheckAreaStatVo> filterList = vo.getAreaStatList().stream()
.filter(casv -> !casv.getAreaName().equals(areaName)).collect(toList());
if (filterList.size() != vo.getAreaStatList().size()) {
log.info("[核查模块] 回退操作-将退回的数据从统计中去除了.");
vo.setAreaStatList(filterList);
}
}
statRepo.save(csv.toDo());
}
/**
* 将detailString里的百位数改为指定数字
*
* @param detailString 要更改的自查详情字符串
* @param value 想要改成的数字
* @return
*/
private String changeHunds(String detailString, Integer value) {
String updateDetail = Arrays.stream(detailString.split(","))
.map(s -> {
Integer number = Integer.valueOf(s.split("-")[1]);
int digit = number % 10;
int tens = number / 10 % 10;
number = value * 100 + tens * 10 + digit;
return s.split("-")[0] + "-" + number;
})
.collect(joining(","));
return updateDetail;
}
/**
* 将统计数据中指定城市的统计数据重置
*
......@@ -1199,43 +1464,6 @@ public class DeviceCheckController {
statRepo.save(statVo.toDo());
}
@ApiOperation(value = "核查组A/B确认核查详情单")
@PutMapping("/detail/C/{id}")
public ResponseEntity<ResultObj> checkUserC(@PathVariable Integer id,
@RequestParam boolean pass) {
TaskBto currentTask = taskService.get(id, CONFIRM_CHECK_DETAIL.id);
DeviceCheckDetail currentDetail = detailRepo.findById(id).get();
if (pass) {
// 如果当前是第3步(利用余数来判断),则需要指定核查组B的人来接受任务
boolean stepC = currentTask.getBillStatus() % 10 == 2;
boolean stepD = currentTask.getBillStatus() % 10 == 3;
if (stepC) {
log.info("[核查模块] C 检查组成员A正在进行核查操作,核查详情账单id为 : {}", id);
if (!currentTask.getBillStatus().equals(CHECK_DETAIL_2.id)) {
return ResponseEntity.status(400).body(new ResultObj<>(String.format("当前任务的状态异常!当前任务状态为 %s , 任务状态应该为 %s", GlobalMap.getStatusEnumMap().get(currentTask.getBillStatus()), CHECK_DETAIL_2.name)));
}
taskService.moveToNext(currentTask, currentDetail.getCheckUserBId());
log.info("[核查模块] C 操作完毕");
}
if (stepD) {
if (!currentTask.getBillStatus().equals(CHECK_DETAIL_3.id)) {
return ResponseEntity.status(400).body(new ResultObj<>(String.format("当前任务的状态异常!当前任务状态为 %s , 任务状态应该为 %s", GlobalMap.getStatusEnumMap().get(currentTask.getBillStatus()), CHECK_DETAIL_3.name)));
}
// 如果当前是第4步,则直接结束任务,并且进行结果汇总
log.info("[核查模块] D 检查组成员A正在进行核查操作,核查详情账单id为 : {}", id);
summaryDetail(currentTask, currentDetail);
currentTask = taskService.moveToEnd(currentTask);
log.info("[核查模块] D 操作完毕");
}
} else {
// 如果没通过则返回第1步
StatusEnum firstStatus = getFirstStatus(currentTask.getBillStatus());
taskService.moveToSpecial(currentTask, firstStatus, currentTask.getFirstUserId());
}
return ResponseEntity.ok(new ResultObj<>("操作成功"));
}
/**
* @param taskId 待办任务id
* @param statId 市级统计的STAT ID
......@@ -1304,8 +1532,7 @@ public class DeviceCheckController {
log.info("[核查模块] 办结统计待办操作成功");
return ResponseEntity.ok(new ResultObj<>("办结统计待办确认完毕"));
}
@Autowired
private SelfCheckController selfCheckController;
/**
* @param statId 统计账单主键id
*/
......@@ -1320,6 +1547,22 @@ public class DeviceCheckController {
Integer parentTaskId = currentTask.getParentTaskId();
boolean hasParent = parentTaskId != 0;
//尝试寻找老的市办结任务,如果有的话就删除加END
//5.需要将上一次市的确认任务给清理掉
// 父级的父级,就是省的任务,然后子child里名字包含 统计数据确认任务 的任务给 END 吧
Task verifyTask = taskRepo.findAllByParentTaskId(parentTaskId)
.stream()
.filter(task -> task.getTitle().contains("统计数据确认任务"))
.sorted(Comparator.comparing(Task::getId))
.findFirst()
.orElse(null);
if (Objects.nonNull(verifyTask)) {
log.info("[核查模块] 发现了id = {}市的统计确认任务,将其完结并剔除整个树节点",verifyTask.getId());
verifyTask.setParentTaskId(0);
taskService.moveToEnd(verifyTask.parse2Bto());
}
if (hasParent) {
//市统计的办结 -> 开启对应市 数据确认任务for 省
String areaName = auService.findOne(AuExample.UnitId, currentTask.getOwnUnit()).getName();
......@@ -1345,7 +1588,11 @@ public class DeviceCheckController {
* @param currentDetail 需要汇总的详情核查数据对象
*/
private void summaryDetail(TaskBto currentTask, DeviceCheckDetail currentDetail) {
log.info("[核查模块] 正在进行数据汇总");
log.info("[核查模块] 正在尝试进行Task id = {} 的自查数据汇总...", currentTask.getId());
if (!currentTask.getBillStatus().equals(END.id)) {
log.info("[核查模块] 该自查任务还未完成,结束汇总,当前任务状态id = {}", currentTask.getBillStatus());
}
// 先找到汇总地区的账单id 查询当前detail task 的 父级TASK
Integer fatherTaskId = currentTask.getParentTaskId();
int statId = taskRepo.findBillId(fatherTaskId, CONFIRM_CHECK_STAT.id);
......@@ -1412,9 +1659,14 @@ public class DeviceCheckController {
*
* @param currentStatusId 任务状态id
*/
private StatusEnum getFirstStatus(Integer currentStatusId) {
private StatusEnum getFirstStatus(Integer currentStatusId, Integer defaultStatusId) {
int remainder = currentStatusId % 10;
return GlobalMap.getStatusEnumMap().get(currentStatusId - remainder);
StatusEnum resultEnum = GlobalMap.getStatusEnumMap().get(currentStatusId - remainder);
if (Objects.isNull(resultEnum)) {
return GlobalMap.getStatusEnumMap().get(defaultStatusId);
} else {
return resultEnum;
}
}
public List<CheckDeviceStatVo> parseStatString2Vo(TaskBto task, DeviceCheckDetail detail) {
......@@ -1441,8 +1693,10 @@ public class DeviceCheckController {
.collect(toList());
long start = System.currentTimeMillis();
Map<Integer, DeviceLibrary> deviceMap = deviceRepo.findAllByIdIn(idList)
.stream()
List<DeviceLibrary> allDevice = dcService.getAllDeviceLibraryList();
Map<Integer, DeviceLibrary> deviceMap = allDevice.stream()
.filter(d -> idList.contains(d.getId()))
.collect(toMap(DeviceLibrary::getId, Function.identity()));
long end = System.currentTimeMillis();
log.info("[核查TEST] 批量查询id集合耗时 {} ms ", end - start);
......@@ -1458,23 +1712,34 @@ public class DeviceCheckController {
DeviceLibrary checkDevice = deviceMap.get(deviceId);
CheckAreaStatVo checkAreaStatVo;
// 百位数 0/1 待审核 2 无误 3未通过
// 十位数 1 人工 2 自动
// 0缺失1无误2新增3不在库 8已退回 9未检查
int digits = proofResult % 10;
int tens = proofResult / 10 % 10;
int huns = proofResult / 100 % 10;
if (digits == 8) {
checkAreaStatVo = new CheckAreaStatVo(areaName, 1, 1, 3, -1, statId, detailId);
} else if (digits == 9) {
checkAreaStatVo = new CheckAreaStatVo(areaName, 1, 1, 0, 0, statId, detailId);
// 个位数判断自查结果
if (digits == 9) {
checkAreaStatVo = new CheckAreaStatVo(areaName, 1, 1, 0, 10, statId, detailId);
} else if (digits == 3) {
//跳过非在库的统计
continue;
} else if (digits == 1) {
checkAreaStatVo = new CheckAreaStatVo(areaName, 1, 1, 2, 0, statId, detailId);
checkAreaStatVo = new CheckAreaStatVo(areaName, 1, 1, 2, 10, statId, detailId);
} else if (digits == 0) {
checkAreaStatVo = new CheckAreaStatVo(areaName, 0, 1, 2, 1, statId, detailId);
checkAreaStatVo = new CheckAreaStatVo(areaName, 0, 1, 2, 10, statId, detailId);
} else {
checkAreaStatVo = new CheckAreaStatVo(areaName, 1, 1, 2, 1, statId, detailId);
checkAreaStatVo = new CheckAreaStatVo(areaName, 1, 1, 2, 10, statId, detailId);
}
// 百位数判断审核情况 0,1未检查 2是无误 3是未通过
if (huns == 0 || huns == 1) {
checkAreaStatVo.setComSituation(10);
} else if (huns == 2) {
checkAreaStatVo.setComSituation(12);
} else if (huns == 3) {
checkAreaStatVo.setComSituation(13);
}
List<CheckAreaStatVo> areaStatVoList = new ArrayList<>();
......@@ -1657,7 +1922,7 @@ public class DeviceCheckController {
return new CheckAreaStatVo(finalCityName, actualCount, supposeCount, finalProgress, finalSituation, 0, 0);
}
private void findBySystem(){
private void findBySystem() {
selfCheckController.findBySystem1();
}
......
......@@ -128,7 +128,7 @@ public class DeviceCheckDetail extends BaseEntity {
private String remark;
/**
* 预留字段2
* 预留字段2 现在用来记录该自查任务的初始状态号
*/
@ApiModelProperty(value = "预留字段2")
private String var2;
......
......@@ -6,6 +6,7 @@ import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Collections;
import java.util.List;
/**
......@@ -27,12 +28,12 @@ public class CheckExamDetailVo {
private List<String> userNames;
@ApiModelProperty(name = "需要被检查的区域id")
private Integer unitId;
private List<Integer> unitIds;
@ApiModelProperty(name = "备注")
private String remark;
public CheckExamDetailVo copy(Integer unitId,String remark) {
return new CheckExamDetailVo(this.groupName, this.userNames, unitId, remark);
return new CheckExamDetailVo(this.groupName, this.userNames, Collections.singletonList(unitId), remark);
}
}
......@@ -57,7 +57,7 @@ import java.util.stream.Collectors;
import static com.tykj.dev.misc.base.BusinessEnum.CONFIRM_CHECK_DETAIL;
import static com.tykj.dev.misc.base.BusinessEnum.CONFIRM_CHECK_STAT;
import static com.tykj.dev.misc.base.StatusEnum.CHECK_DETAIL_0;
import static com.tykj.dev.misc.base.StatusEnum.CHECK_DETAIL_REGION_0;
import static com.tykj.dev.misc.base.StatusEnum.CHECK_STAT_0;
import static java.util.stream.Collectors.*;
......@@ -210,7 +210,7 @@ public class ConfirmCheckServiceImpl implements ConfirmCheckService, CommandLine
.collect(toList());
statVoList.addAll(cityStatVoList);
// 构建市自查TASK
TaskBto cityDetailTask = new TaskBto(CHECK_DETAIL_0.id, cityUnit.getName() + "自动核查自查", cityStatTask.getId(), addNode(cityStatTask.getNodeIdDetail(), cityStatTask.getId()), CONFIRM_CHECK_DETAIL.id, cityDetail.getId(), cityUnit.getUnitId(), 0);
TaskBto cityDetailTask = new TaskBto(CHECK_DETAIL_REGION_0.id, cityUnit.getName() + "自动核查自查", cityStatTask.getId(), addNode(cityStatTask.getNodeIdDetail(), cityStatTask.getId()), CONFIRM_CHECK_DETAIL.id, cityDetail.getId(), cityUnit.getUnitId(), 0);
cityDetailTask.setCustomInfo("auto");
cityDetailTask = taskService.start(cityDetailTask);
resultIds.get("taskId").add(cityDetailTask.getId());
......@@ -236,7 +236,7 @@ public class ConfirmCheckServiceImpl implements ConfirmCheckService, CommandLine
statVoList.addAll(countyStatVoList);
//构建县自查TASK
TaskBto countyDetailTask = new TaskBto(CHECK_DETAIL_0.id, countyUnit.getName() + "自动核查自查", cityStatTask.getId(), addNode(cityStatTask.getNodeIdDetail(), cityStatTask.getId()), CONFIRM_CHECK_DETAIL.id, countyDetail.getId(), countyUnit.getUnitId(), 0);
TaskBto countyDetailTask = new TaskBto(CHECK_DETAIL_REGION_0.id, countyUnit.getName() + "自动核查自查", cityStatTask.getId(), addNode(cityStatTask.getNodeIdDetail(), cityStatTask.getId()), CONFIRM_CHECK_DETAIL.id, countyDetail.getId(), countyUnit.getUnitId(), 0);
countyDetailTask.setCustomInfo("auto");
countyDetailTask = taskService.start(countyDetailTask);
resultIds.get("taskId").add(countyDetailTask.getId());
......
......@@ -47,19 +47,23 @@ public enum StatusEnum {
CHECK_STAT_1(111, "统计数据等待确认"),
//以下为detail状态
//以下为 区自查detail状态
CHECK_DETAIL_0(120, "等待专管员A处理"),
CHECK_DETAIL_1(121, "等待专管员B处理"),
CHECK_DETAIL_2(122, "等待核查员A处理"),
CHECK_DETAIL_3(123, "等待核查员B处理"),
//以下为检查stat状态
CHECK_EXAM_STAT_0(130, "检查统计数据收集中"),
CHECK_EXAM_STAT_1(131, "检查统计数据等待确认"),
//以下为检查detail状态
CHECK_EXAM_DETAIL_0(140, "等待专管员A处理"),
CHECK_EXAM_DETAIL_1(141, "等待专管员B处理"),
CHECK_DETAIL_REGION_0(140, "等待区专管员A处理"),
CHECK_DETAIL_REGION_1(141, "等待区专管员B处理"),
CHECK_DETAIL_REGION_2(142, "等待市专管员审核"),
// 市本级自查detail状态
CHECK_DETAIL_CITY_0(160, "等待专管员A处理"),
CHECK_DETAIL_CITY_1(161, "等待专管员B处理"),
/**
* 清退任务
......
......@@ -1244,7 +1244,7 @@ public class TaskServiceImpl implements TaskService {
if (taskSelectVo.getSelectNum() == 3) {
//所有涉及人员所在单位包含当前用户所在单位且指针对应UserId不是当前用户
// List<Integer> status = Arrays.asList(201,333,810,322,722,788,1250,2223,8110,888,140,130,141,111,1002,150);
List<Integer> status = Arrays.asList(201,333,810,322,722,788,1250,2223,8110,888,140,130,141,111,1002,150,101);
List<Integer> status = Arrays.asList(201,333,810,322,722,788,1250,2223,8110,888,140,130,141,111,1002,150,101,142,160,161);
List<TaskBto> taskBtoList = taskBtos.stream()
.filter(taskBto -> {
// boolean unitExists = getUnitsByUsers(taskBto.getInvolveUserIdList()).contains(unitId);
......
## 任务Task的设定
**关于Involve_Users的设定**
- 0 是所有都能看见
- {id} 是该id的User可以看见
- -1 表明该任务不是待办,而是一个业务追踪
\ No newline at end of file
......@@ -27,11 +27,11 @@
如上图所示,核查情况与自查任务的状态有着对应的关系
| 核查情况 | 结果 |
| 任务状态 | 核查情况 |
| ----------------- | -------------------------------------- |
| 等待区专管员A处理 | 无 |
| 等待区专管员B处理 | 进行中 |
| 等待市专管员处理 | 审核 |
| 等待市专管员处理 | 等待市审核 |
| 完结 | 完成 |
| 等待区专管员A处理 | 未通过(可以通过Task里的特殊标记来实现) |
......@@ -41,9 +41,9 @@
| 核查情况 | 核查结果 |
| ---------------------------- | -------- |
| 在完成以前的状态 | 无 |
| 完成状态 | 审核 |
| 完成状态 | 等待省审核 |
| 完成且省审核通过 | 无误 |
| 完成且省审核未通过(点击回退按钮了) | 未通过 |
| 完成且省审核未通过(点击回退按钮了) | 等待重做 |
### 市本级自查流程
......@@ -61,7 +61,7 @@
如上图所示,核查情况与自查任务的状态有着对应的关系
| 核查情况 | 结果 |
| 任务状态 | 结果 |
| ----------------- | -------------------------------------- |
| 等待市专管员A处理 | 无 |
| 等待市专管员B处理 | 进行中 |
......@@ -73,7 +73,7 @@
| 核查情况 | 核查结果 |
| ---------------------------- | -------- |
| 在完成以前的状态 | 无 |
| 完成状态 | 审核 |
| 完成状态 | 等待省审核 |
| 完成且省审核通过 | 无误 |
| 完成且省审核未通过(点击回退按钮了) | 未通过 |
......@@ -126,9 +126,22 @@
| 核查结果 | 触发条件 |
| -------- | -------------------------------------- |
| 无 | 该市级下所有区的核查结果为无 |
| 待审核 | 该市级下有任意一个区核查结果为待审核 |
| 待省审核 | 该市级下有任意一个区核查结果为等待省审核 |
| 未通过 | 该市级下有任意一个区的核查结果为未通过 |
| 无误 | 该市级下所有区的核查结果都为无误 |
| 审核中 | 其他情况下为审核中 |
## 关于自查状态问题的说明
**发起人是省**
- 状态转换 专管员A - 专管员B - 结束
**发起人是市**
- 区自查 专管员A - 专管员B - 市审核 - 结束
- 市本级自查 专管员A - 专管员B - 结束
## 已经发起的老数据的维护
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论