提交 b99865e2 authored 作者: Matrix's avatar Matrix

[核查模块] 修复了一些自动核查相关的BUG

[测试模块] 增加了出现异常后的自动回滚
上级 992e22e5
package com.tykj.dev.device.confirmcheck.controller;
import com.google.common.collect.Lists;
import com.tykj.dev.config.swagger.AutoDocument;
import com.tykj.dev.device.confirmcheck.entity.domain.DeviceCheckBillEntity;
import com.tykj.dev.device.confirmcheck.entity.domain.DeviceCheckDetailEntity;
......@@ -38,10 +39,7 @@ import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.*;
import static com.tykj.dev.misc.base.BusinessEnum.CONFIRM_CHECK_DETAIL;
import static com.tykj.dev.misc.base.BusinessEnum.CONFIRM_CHECK_STAT;
......@@ -112,17 +110,25 @@ public class DeviceCheckController {
@ApiOperation(value = "发起自动核查", notes = "发起自动核查")
@PostMapping("/check/auto")
public ResponseEntity startAutoCheck() {
// 构建返回数据对象
Map<String, List<Integer>> resultIds = new HashMap<>();
resultIds.put("statId", new ArrayList<>());
resultIds.put("detailId", new ArrayList<>());
resultIds.put("taskId", new ArrayList<>());
// 发起省级的统计 - 获得所有的市级单位
List<Units> cityUnits = unitsRepo.findAllByLevel(2);
Units provUnit = unitsRepo.findById(1).get();
String baseTitle = LocalDate.now().getYear() + "年" + (LocalDate.now().getMonthValue() + 1) + "月";
// 构建省的统计账单
DeviceCheckStat provinceStat = initStatData("自动核查",
DeviceCheckStat provinceStatDo = initStatData("自动核查",
0,
0,
baseTitle + "浙江省自动核查",
provUnit.getName(),
cityUnits);
DeviceCheckStat provStat = statRepo.save(provinceStatDo);
resultIds.get("statId").add(provStat.getId());
List<DeviceLibrary> deviceList = deviceRepo.findAll();
Map<String, List<DeviceLibrary>> devInLib = deviceList.stream()
.filter(device -> device.getOwnUnit().equals(device.getLocationUnit()))
......@@ -133,9 +139,11 @@ public class DeviceCheckController {
.collect(groupingBy(DeviceLibrary::getOwnUnit));
// 构建省统Task
TaskBto provStatTask = new Task(CHECK_STAT_0.id, "省自动核查", 0, ".0.", CONFIRM_CHECK_STAT.id, provinceStat.getId(), provUnit.getUnitId())
TaskBto provStatTask = new Task(CHECK_STAT_0.id, "省自动核查", 0, ".0.", CONFIRM_CHECK_STAT.id, provStat.getId(), provUnit.getUnitId())
.parse2Bto();
taskService.start(provStatTask);
provStatTask.setInvolveUserIdList(Lists.newArrayList(-1));
provStatTask = taskService.start(provStatTask).parse2Bto();
resultIds.get("taskId").add(provStatTask.getId());
List<CheckDeviceStatVo> statVoList = new ArrayList<>();
List<DeviceCheckStat> cityStatList = new ArrayList<>();
......@@ -155,10 +163,13 @@ public class DeviceCheckController {
DeviceCheckStat cityStat = statRepo.save(cityStatDo);
cityStatList.add(cityStat);
resultIds.get("statId").add(cityStat.getId());
// 构建市统task 获得id
TaskBto cityStatTask = new Task(CHECK_STAT_0.id, city.getName() + "自动核查统计", provStatTask.getId(), addNode(provStatTask.getNodeIdDetail(), provinceStat.getId()), CONFIRM_CHECK_STAT.id, cityStat.getId(), city.getUnitId())
TaskBto cityStatTask = new Task(CHECK_STAT_0.id, city.getName() + "自动核查统计", provStatTask.getId(), addNode(provStatTask.getNodeIdDetail(), provinceStatDo.getId()), CONFIRM_CHECK_STAT.id, cityStat.getId(), city.getUnitId())
.parse2Bto();
taskService.start(cityStatTask);
cityStatTask.setInvolveUserIdList(Lists.newArrayList(-1));
cityStatTask = taskService.start(cityStatTask).parse2Bto();
resultIds.get("taskId").add(cityStatTask.getId());
// 构建市自查账单
DeviceCheckDetailEntity cityDetailDo = DeviceCheckDetailEntity.EmptyWithChecker(
......@@ -169,6 +180,7 @@ public class DeviceCheckController {
devInLib.getOrDefault(city.getName(), new ArrayList<>()),
devNotInLib.getOrDefault(city.getName(), new ArrayList<>()));
DeviceCheckDetailEntity cityDetail = detailRepo.save(cityDetailDo);
resultIds.get("detailId").add(cityDetail.getId());
List<CheckDeviceStatVo> cityStatVoList = deviceList.stream()
.filter(d -> d.getOwnUnit().equals(city.getName()))
......@@ -176,9 +188,9 @@ public class DeviceCheckController {
.collect(toList());
statVoList.addAll(cityStatVoList);
// 构建市自查TASK
TaskBto cityDetailTask = new Task(CHECK_DETAIL_0.id, city.getName() + "自动核查自查", cityStatTask.getId(), addNode(cityStatTask.getNodeIdDetail(), cityStatTask.getId()), CONFIRM_CHECK_DETAIL.id, cityDetail.getId(), city.getUnitId())
.parse2Bto();
taskService.start(cityDetailTask);
TaskBto cityDetailTask = new TaskBto(CHECK_DETAIL_0.id, city.getName() + "自动核查自查", cityStatTask.getId(), addNode(cityStatTask.getNodeIdDetail(), cityStatTask.getId()), CONFIRM_CHECK_DETAIL.id, cityDetail.getId(), city.getUnitId(), 0);
cityDetailTask = taskService.start(cityDetailTask).parse2Bto();
resultIds.get("taskId").add(cityDetailTask.getId());
// 构建县任务
for (Units county : countyUnits) {
......@@ -192,6 +204,7 @@ public class DeviceCheckController {
devInLib.getOrDefault(city.getName(), new ArrayList<>()),
devNotInLib.getOrDefault(city.getName(), new ArrayList<>()));
DeviceCheckDetailEntity countyDetail = detailRepo.save(countyDetailDo);
resultIds.get("detailId").add(countyDetail.getId());
List<CheckDeviceStatVo> countyStatVoList = deviceList.stream()
.filter(d -> d.getOwnUnit().equals(city.getName()))
.map(d -> transUtil.device2InitStatVo(d, city.getName(), cityStat.getId(), countyDetail.getId()))
......@@ -199,9 +212,9 @@ public class DeviceCheckController {
statVoList.addAll(countyStatVoList);
//构建县自查TASK
TaskBto countyDetailTask = new Task(CHECK_DETAIL_0.id, county.getName() + "自动核查自查", cityStatTask.getId(), addNode(cityStatTask.getNodeIdDetail(), cityStatTask.getId()), CONFIRM_CHECK_DETAIL.id, countyDetail.getId(), county.getUnitId())
.parse2Bto();
taskService.start(countyDetailTask);
TaskBto countyDetailTask = new TaskBto(CHECK_DETAIL_0.id, county.getName() + "自动核查自查", cityStatTask.getId(), addNode(cityStatTask.getNodeIdDetail(), cityStatTask.getId()), CONFIRM_CHECK_DETAIL.id, countyDetail.getId(), county.getUnitId(), 0);
countyDetailTask = taskService.start(countyDetailTask).parse2Bto();
resultIds.get("taskId").add(countyDetailTask.getId());
}
// 处理JSON INFO 数据
......@@ -210,8 +223,8 @@ public class DeviceCheckController {
.filter(stat -> !countyNames.contains(stat.getAreaStatList().get(0).getAreaName()))
.reduce(CheckDeviceStatVo::add)
.get();
provinceStat.setStatInfo(JacksonUtil.toJSon(provStatVo));
statRepo.save(provinceStat);
provStat.setStatInfo(JacksonUtil.toJSon(provStatVo));
statRepo.save(provStat);
// 对于市统计来说,只需要自己本市以及其下地区的数据
for (DeviceCheckStat csd : cityStatList) {
List<String> cityNames = new ArrayList<>();
......@@ -234,7 +247,7 @@ public class DeviceCheckController {
statRepo.saveAll(cityStatList);
}
return ResponseEntity.ok("自动发起任务成功");
return ResponseEntity.ok(new ResultObj(resultIds, "自动核查任务发起成功"));
}
/**
......@@ -317,7 +330,7 @@ public class DeviceCheckController {
long count = devLibVo.getDevInLibrary().stream()
.filter(deviceInLibVo -> deviceInLibVo.getProofResult() == 1)
.count();
detailRepo.updateCheckDetail(id, detailString, checkResult, currentUser.getUserId(), assignUserId, count);
detailRepo.updateCheckDetail(id, detailString, checkResult, currentUser.getUserId(), assignUserId, (int) count);
//2. 推进TASK 状态
TaskBto currentTask = taskService.get(id, CONFIRM_CHECK_DETAIL.id);
currentTask.getInvolveUserIdList().set(0, AuthenticationUtils.getAuthentication().getCurrentUserInfo().getUserId());
......@@ -425,7 +438,9 @@ public class DeviceCheckController {
// 如果汇总完毕则将父级的统计任务推进
if (over) {
TaskBto fatherTask = taskService.get(fatherTaskId);
TaskBto statTask = taskService.moveToNext(fatherTask, fatherTask.getLastUserId());
//如果上一个id是-1 则证明是所有人的跟踪统计,即自动核查,那么下一步推进到所有人的待办
Integer lastUserId = fatherTask.getLastUserId() == -1 ? 0 : fatherTask.getLastUserId();
TaskBto statTask = taskService.moveToNext(fatherTask, lastUserId);
logService.addLog(new TaskLogBto(statTask.getId(), "地区数据已统计完毕,等待确认", new ArrayList<>(), fatherTask.getFirstUserId()));
}
log.info("[核查模块] D 操作完毕");
......@@ -468,8 +483,9 @@ public class DeviceCheckController {
// 如果所有子地区统计任务都已经完结,则推进父地区统计任务进度
boolean allOver = taskService.TaskTreeIsOver(parentTaskId);
if (allOver) {
TaskBto statTask = taskService.moveToEnd(parentTask);
logService.addLog(new TaskLogBto(statTask.getId(), "统计数据确认操作"));
log.info("[核查任务] 所有市的核查统计任务已经完毕,推进省级的核查统计任务");
TaskBto statTask = taskService.moveToNext(parentTask, 0);
logService.addLog(new TaskLogBto(statTask.getId(), "省级统计任务状态推进"));
}
}
......
......@@ -21,7 +21,7 @@ public interface DeviceCheckDetailDao extends JpaRepository<DeviceCheckDetailEnt
*/
@Modifying
@Query("update DeviceCheckDetailEntity o set o.checkDetail=?2,o.checkResult = ?3,o.userAId =?4,o.userBId=?5,o.checkedCount=?6 where o.id=?1")
void updateCheckDetail(Integer id, String checkDetail, String checkResult, int userAId, int userBId, long checkedCount);
void updateCheckDetail(Integer id, String checkDetail, String checkResult, int userAId, int userBId, Integer checkedCount);
@Modifying
@Query("update DeviceCheckDetailEntity o set o.checkStatus=?2 where o.id=?1")
......
package com.tykj.dev.confirmcheck;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.wenhao.jpa.Specifications;
import com.google.common.collect.Lists;
import com.tykj.dev.device.confirmcheck.entity.vo.CheckBillVo;
......@@ -20,9 +22,11 @@ import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.RequestBuilder;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.StringJoiner;
import java.util.stream.StreamSupport;
import static com.tykj.dev.misc.utils.JacksonUtil.toJSon;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
......@@ -63,9 +67,41 @@ class DeviceCheckControllerTest extends BaseTest {
request = post("/check/confirm/check/auto")
.header("Origin", "*");
mockMvc.perform(request)
.andExpect(status().isOk())
.andDo(mvcResult1 -> System.out.println("[测试结果] 自动发起核查任务测试通过"));
.andDo(result -> {
String resultString = result.getResponse().getContentAsString();
System.out.println("[测试结果] 自动发起核查任务测试通过,返回结果为 : " +
resultString);
deleteAutoCheckData(resultString);
});
}
private void deleteAutoCheckData(String resultString) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(resultString);
StreamSupport
.stream(jsonNode.get("data").get("statId").spliterator(), false)
.map(JsonNode::asInt)
.forEach(statId -> {
System.out.printf("[数据清理-统计] 删除id为 %d 的统计数据 %n", statId);
statRepo.deleteById(statId);
});
StreamSupport
.stream(jsonNode.get("data").get("detailId").spliterator(), false)
.map(JsonNode::asInt)
.forEach(detailId -> {
System.out.printf("[数据清理-自查] 删除id为 %d 的自查数据 %n", detailId);
detailRepo.deleteById(detailId);
});
StreamSupport
.stream(jsonNode.get("data").get("taskId").spliterator(), false)
.map(JsonNode::asInt)
.forEach(taskId -> {
System.out.printf("[数据清理-任务] 删除id为 %d 的任务数据 %n", taskId);
taskRepo.deleteById(taskId);
});
}
@Test
......
......@@ -4,6 +4,7 @@ import org.junit.runner.RunWith;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
/**
* BaseTest.
......@@ -14,5 +15,6 @@ import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = UnionApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
@Transactional
public class BaseTest {
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论