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

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

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