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

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

上级 1c8a5e4f
......@@ -150,6 +150,8 @@ public enum LogType {
CONFIRM_CHECK_EXAM_DETAIL_3(419, CONFIRM_CHECK_DETAIL.id, CHECK_EXAM_DETAIL_1.id, CHECK_EXAM_DETAIL_0.id, "B岗审核失败,跳回A岗人员操作"),
CONFIRM_CHECK_EXAM_STAT_3(420, CONFIRM_CHECK_DETAIL.id, CHECK_EXAM_STAT_0.id, END.id, "检查统计任务数据已确认完毕,任务完结"),
ALLOT_BACK_1(57, ALLOT_BACK.id, ORIGIN_STATUS.id, ALLOT_BACKING.id, "发起装备退回"),
ALLOT_BACK_2(58,ALLOT_BACK.id, ALLOT_BACKING.id, END.id, "退回装备接收成功"),
......
......@@ -102,12 +102,12 @@ public class DeviceCheckStat extends BaseEntity {
this.remark = remark;
}
public DeviceCheckStat(CheckType checkType, String title, String subtitle, String statInfo, Integer checkUserAId, Integer checkUserBId, String remark) {
public DeviceCheckStat(CheckType checkType, String title, String subtitle, String statInfo, Integer checkUserAId, Integer checkUserBId, String remark,LocalDateTime endTime) {
this.checkType = checkType;
this.title = title;
this.subtitle = subtitle;
this.startTime = LocalDateTime.now();
this.endTime = LocalDateTime.now().plusMonths(1);
this.endTime = endTime;
this.statInfo = statInfo;
this.checkUserAId = checkUserAId;
this.checkUserBId = checkUserBId;
......
......@@ -70,7 +70,7 @@ public class CheckDeviceStatVo implements Cloneable {
}
/**
* 累加装备统计数据(相同型号),并将其下面各个地区的统计信息合并(次级地区会强制更改为{cityName})
* 累加装备统计数据(相同型号&名字),并将其下面各个地区的统计信息合并(次级地区会强制更改为{cityName})
* 多用于装备统计数据中既附带区又附带市的统计信息,想全部合并为市的操作(为了统一给省级单位查看统计数据)
* <li>将所有地区全部改名为市级地区</li>
* <li>合并所有数据</li>
......@@ -80,8 +80,9 @@ public class CheckDeviceStatVo implements Cloneable {
* @return 合并后的装备统计对象,基于深拷贝的新对象
*/
public CheckDeviceStatVo reduce(CheckDeviceStatVo other, String cityName, Integer cityStatId) {
if (!deviceModel.equals(other.deviceModel)) {
throw new IllegalArgumentException("累加的统计信息对象必须是相同型号的装备");
boolean flag = deviceModel.equals(other.deviceModel) && deviceName.equals(other.deviceName);
if (!flag) {
throw new IllegalArgumentException("累加的统计信息对象必须是相同型号与名字的装备");
}
CheckDeviceStatVo mergeVo = new CheckDeviceStatVo(this);
mergeVo.deviceCount += other.deviceCount;
......@@ -95,11 +96,12 @@ public class CheckDeviceStatVo implements Cloneable {
*
* @param other 要合并的装备统计信息
* @return 合并后的装备统计信息对相关,基于深拷贝
* @throws IllegalArgumentException 累加的统计信息对象必须是相同型号的装备
* @throws IllegalArgumentException 累加的统计信息对象必须是相同型号与名字的装备
*/
public CheckDeviceStatVo reduce(CheckDeviceStatVo other) {
if (!deviceModel.equals(other.getDeviceModel())) {
throw new IllegalArgumentException("累加的统计信息对象必须是相同型号的装备");
boolean flag = deviceModel.equals(other.getDeviceModel()) && deviceName.equals(other.getDeviceName());
if (!flag) {
throw new IllegalArgumentException("累加的统计信息对象必须是相同型号与名字的装备");
}
CheckDeviceStatVo mergeVo = new CheckDeviceStatVo(this);
......@@ -130,11 +132,12 @@ public class CheckDeviceStatVo implements Cloneable {
*
* @param other 要合并的装备统计信息
* @return 合并后的装备统计信息对相关,基于深拷贝
* @throws IllegalArgumentException 累加的统计信息对象必须是相同型号的装备
* @throws IllegalArgumentException 累加的统计信息对象必须是相同型号与名字的装备
*/
public CheckDeviceStatVo cleanReduce(CheckDeviceStatVo other) {
if (!deviceModel.equals(other.getDeviceModel())) {
throw new IllegalArgumentException("累加的统计信息对象必须是相同型号的装备");
boolean flag = deviceModel.equals(other.getDeviceModel()) && deviceName.equals(other.getDeviceName());
if (!flag) {
throw new IllegalArgumentException("累加的统计信息对象必须是相同型号且名称相同的装备");
}
CheckDeviceStatVo mergeVo = new CheckDeviceStatVo(this);
......
......@@ -110,13 +110,14 @@ public class CheckStatVo {
return this;
}
//map key deviceModel+deviceName
Map<String, CheckDeviceStatVo> oriModelMap = deviceStatVoList.stream()
.collect(Collectors.toMap(CheckDeviceStatVo::getDeviceModel, Function.identity()));
.collect(Collectors.toMap(d -> d.getDeviceModel()+d.getDeviceName(), Function.identity()));
//遍历要加入的LIST 如果在源数据map中寻找到了则累加,否则添加进去
for (CheckDeviceStatVo vo : otherList) {
oriModelMap.computeIfPresent(vo.getDeviceModel(), (k, v) -> v.cleanReduce(vo));
oriModelMap.putIfAbsent(vo.getDeviceModel(), vo);
oriModelMap.computeIfPresent(vo.getDeviceModel()+vo.getDeviceName(), (k, v) -> v.cleanReduce(vo));
oriModelMap.putIfAbsent(vo.getDeviceModel()+vo.getDeviceName(), vo);
}
deviceStatVoList = new ArrayList<>(oriModelMap.values());
......
......@@ -251,17 +251,17 @@ public class ConfirmCheckServiceImpl implements ConfirmCheckService, CommandLine
List<CheckDeviceStatVo> countyVo = regionMap.get(true);
// 市级数据
Map<String, CheckDeviceStatVo> map = regionMap.get(false).stream()
.collect(toMap(CheckDeviceStatVo::getDeviceModel, Function.identity()));
.collect(toMap(d -> d.getDeviceModel()+d.getDeviceName(), Function.identity()));
//查找区域数据内的父级地区(即市),将数据count数据add进去(通过两次get),将areaList数据也加进去
for (CheckDeviceStatVo v : countyVo) {
String couName = v.getAreaStatList().get(0).getAreaName();
String cityName = areaCache.findFatherByName(couName).getName();
//把相同型号的区级的数据merge到市级即可,没有的话改个名加进去
//把相同型号与名字的的区级的数据merge到市级即可,没有的话改个名加进去
Integer cityStatId = areaStatIdMap.get(cityName);
map.computeIfPresent(v.getDeviceModel(), (k, value) -> value.reduce(v, cityName, cityStatId));
map.computeIfAbsent(v.getDeviceModel(), k -> {
map.computeIfPresent(v.getDeviceModel()+v.getDeviceName(), (k, value) -> value.reduce(v, cityName, cityStatId));
map.computeIfAbsent(v.getDeviceModel()+v.getDeviceName(), k -> {
v.getAreaStatList().forEach(area -> area.setAreaName(cityName));
return v;
});
......@@ -288,7 +288,7 @@ public class ConfirmCheckServiceImpl implements ConfirmCheckService, CommandLine
List<CheckDeviceStatVo> cityStatVo = new ArrayList<>();
statVoListCopy2.stream()
.filter(stat -> cityNames.contains(stat.getAreaStatList().get(0).getAreaName()))
.collect(Collectors.groupingBy(CheckDeviceStatVo::getDeviceModel, reducing(CheckDeviceStatVo::reduce)))
.collect(Collectors.groupingBy(d -> d.getDeviceModel()+d.getDeviceName(), reducing(CheckDeviceStatVo::reduce)))
.forEach((k, v) -> cityStatVo.add(v.get()));
csd.setStatInfo(JacksonUtil.toJSon(cityStatVo));
}
......@@ -487,8 +487,8 @@ public class ConfirmCheckServiceImpl implements ConfirmCheckService, CommandLine
@Override
public void run(String... args) throws Exception {
//开启计划任务
startAutoCheckCron();
log.info("[核查模块] 初始化开启任务成功");
// startAutoCheckCron();
// log.info("[核查模块] 初始化开启任务成功");
}
}
......@@ -149,6 +149,16 @@ public interface TaskService {
*/
boolean TaskTreeIsOver(int rootId);
/**
* 判断该任务节点下的所有节点是否任意一个都没有处于完结状态(即用来判断该任务树是否是初始状态)
* @param rootId task的根节点id
* @param currentIsOver 当前的child节点是否处于完结状态
* @return Task Tree 是否是初始状态
*/
boolean TaskTreeIsStart(int rootId,boolean currentIsOver);
/**
* @param oldUserId 旧专管员id
* @param newUserId 新交接专管员id
......
......@@ -286,7 +286,7 @@ public class TaskServiceImpl implements TaskService {
public TaskBto start(TaskBto taskBto) {
Task task = taskDao.save(taskBto.toDo());
myWebSocket.sendMessage1();
CompletableFuture.runAsync(() ->{
CompletableFuture.runAsync(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
......@@ -336,7 +336,7 @@ public class TaskServiceImpl implements TaskService {
public Task update(TaskBto taskBto) {
taskBto.setUserReadDetailList(new ArrayList<>());
Task task = taskDao.save(taskBto.toDo());
CompletableFuture.runAsync(() -> blockChainUtil.appendHash(JacksonUtil.toJSon(taskBto.toDo()), taskBto.getRecordId()),TaskBeanConfig.getThreadPoolTaskScheduler());
CompletableFuture.runAsync(() -> blockChainUtil.appendHash(JacksonUtil.toJSon(taskBto.toDo()), taskBto.getRecordId()), TaskBeanConfig.getThreadPoolTaskScheduler());
return task;
}
......@@ -365,7 +365,7 @@ public class TaskServiceImpl implements TaskService {
@Override
public List<TaskUserVo> getList(TaskSelectVo taskSelectVo) {
List<TaskUserVo> taskEntities = getTaskUserVoList(taskSelectVo);
if (taskSelectVo.getOrders().size()>0) {
if (taskSelectVo.getOrders().size() > 0) {
//根据vo待办和跟踪时间的查询顺序按顺序或降序排序输出
if (taskSelectVo.getSelectNum() == 2 && "trackingTime".equals(taskSelectVo.getOrders().get(0).getCoulmn())) {
if ("ASC".equals(taskSelectVo.getOrders().get(0).getDirection().toString())) {
......@@ -406,7 +406,7 @@ public class TaskServiceImpl implements TaskService {
.filter(taskUserVo -> find(taskUserVo.getId(), list) > -1)
.collect(Collectors.toList());
//判断是否需要按发起时间排序
if (taskSelectVo.getOrders().size()>0) {
if (taskSelectVo.getOrders().size() > 0) {
if ("createTime".equals(taskSelectVo.getOrders().get(0).getCoulmn())) {
if ("ASC".equals(taskSelectVo.getOrders().get(0).getDirection().toString())) {
return taskUtils.orderByCreateTimeAsc2(taskUserVos);
......@@ -446,25 +446,24 @@ public class TaskServiceImpl implements TaskService {
if (taskUserVo.getInvolveUserIdList() != null && taskUserVo.getInvolveUserIdList().size() > 0) {
//获取涉及人员当前指针
List<Integer> userIds = taskUserVo.getInvolveUserIdList();
if (userIds.size() > 0 && taskUserVo.getCurrentPoint()<userIds.size()) {
if (userIds.size() > 0 && taskUserVo.getCurrentPoint() < userIds.size()) {
Integer userId3 = userIds.get(taskUserVo.getCurrentPoint());
//当前指针userId大于0,待办人即当前id
if (userId3>0) {
if (userId3 > 0) {
taskUserVo.setProcessingUser(userCache.findById(userId3).getName());
}
//当前指针userId等于0,待办人为所属单位下所有用户
else if (userId3==0&&taskUserVo.getOwnUnit()!=null){
else if (userId3 == 0 && taskUserVo.getOwnUnit() != null) {
StringBuffer stringBuffer = new StringBuffer();
List<User> users = userCache.findAll();
users.stream().filter(user -> user.getUnitsId().equals(taskUserVo.getOwnUnit())).forEach(user -> {
stringBuffer.append(user.getName()).append(",");
});
if (stringBuffer.length()>0) {
if (stringBuffer.length() > 0) {
stringBuffer.deleteCharAt(stringBuffer.length() - 1);
}
taskUserVo.setProcessingUser(stringBuffer.toString());
}
else {
} else {
taskUserVo.setProcessingUser("");
}
}
......@@ -520,7 +519,6 @@ public class TaskServiceImpl implements TaskService {
@Override
public boolean TaskTreeIsOver(int rootId) {
List<Task> taskList = taskDao.findAllByParentTaskId(rootId);
if (CollectionUtils.isEmpty(taskList)) {
return true;
} else {
......@@ -529,6 +527,32 @@ public class TaskServiceImpl implements TaskService {
}
}
/**
* 判断该任务节点下的下一级节点是否任意一个都没有处于完结状态(即用来判断该任务树是否是初始状态)
*
* @param rootId task的根节点id
* @return Task Tree 是否是初始状态
*/
@Override
public boolean TaskTreeIsStart(int rootId, boolean currentIsOver) {
List<Task> taskList = taskDao.findAllByParentTaskId(rootId);
if (CollectionUtils.isEmpty(taskList)) {
return false;
} else {
long overJobCount = taskList.stream()
.filter(task -> task.getBillStatus().equals(StatusEnum.END.id))
.count();
//如果当前任务是完结的,那么完结数量等于1就证明是初始状态,否则必须为0
if (currentIsOver) {
return overJobCount == 1;
} else {
return overJobCount == 0;
}
}
}
/**
* @param oldUserId 旧专管员id
* @param newUserId 新交接专管员id
......@@ -639,7 +663,7 @@ public class TaskServiceImpl implements TaskService {
boolean userConfirm2 = taskBto.getInvolveUserIdList().get(taskBto.getCurrentPoint()) == -1;
boolean pointExists = taskBto.getCurrentPoint() < taskBto.getInvolveUserIdList().size();
boolean userConfirm = userId.equals(taskBto.getInvolveUserIdList().get(taskBto.getCurrentPoint()));
boolean isDraft = taskBto.getBillStatus()==201||taskBto.getBillStatus()==333||taskBto.getBillStatus()==810||taskBto.getBillStatus()==322||taskBto.getBillStatus()==722;
boolean isDraft = taskBto.getBillStatus() == 201 || taskBto.getBillStatus() == 333 || taskBto.getBillStatus() == 810 || taskBto.getBillStatus() == 322 || taskBto.getBillStatus() == 722;
boolean isCreateUser = userId.equals(taskBto.getCreateUserId());
return unitExists && pointExists && !userConfirm && !userConfirm2 && !isDraft && isCreateUser;
})
......@@ -652,7 +676,7 @@ public class TaskServiceImpl implements TaskService {
boolean userConfirm = taskBto.getInvolveUserIdList().get(taskBto.getCurrentPoint()) == -1;
boolean unitConfirm = taskBto.getOwnUnit().equals(unitId);
boolean isCreateUser = userId.equals(taskBto.getCreateUserId());
return pointExists && userConfirm && unitConfirm && isCreateUser;
return pointExists && userConfirm && unitConfirm && isCreateUser;
})
.collect(Collectors.toList());
taskBtoList.addAll(taskBtos1);
......@@ -696,25 +720,24 @@ public class TaskServiceImpl implements TaskService {
if (taskUserVo.getInvolveUserIdList() != null && taskUserVo.getInvolveUserIdList().size() > 0) {
//获取涉及人员当前指针
List<Integer> userIds = taskUserVo.getInvolveUserIdList();
if (userIds.size() > 0 && taskUserVo.getCurrentPoint()<userIds.size()) {
if (userIds.size() > 0 && taskUserVo.getCurrentPoint() < userIds.size()) {
Integer userId3 = userIds.get(taskUserVo.getCurrentPoint());
//当前指针userId大于0,待办人即当前id
if (userId3>0) {
if (userId3 > 0) {
taskUserVo.setProcessingUser(userCache.findById(userId3).getName());
}
//当前指针userId等于0,待办人为所属单位下所有用户
else if (userId3==0&&taskUserVo.getOwnUnit()!=null){
else if (userId3 == 0 && taskUserVo.getOwnUnit() != null) {
StringBuffer stringBuffer = new StringBuffer();
List<User> users = userCache.findAll();
users.stream().filter(user -> user.getUnitsId().equals(taskUserVo.getOwnUnit())).forEach(user -> {
stringBuffer.append(user.getName()).append(",");
});
if (stringBuffer.length()>0) {
if (stringBuffer.length() > 0) {
stringBuffer.deleteCharAt(stringBuffer.length() - 1);
}
taskUserVo.setProcessingUser(stringBuffer.toString());
}
else {
} else {
taskUserVo.setProcessingUser("");
}
}
......@@ -828,10 +851,10 @@ public class TaskServiceImpl implements TaskService {
* @param userIds 用户Id列表
* @return 返回存在这些用户的单位
*/
private Set<Integer> getUnitsByUsers(List<Integer> userIds){
private Set<Integer> getUnitsByUsers(List<Integer> userIds) {
Set<Integer> unitIds = new HashSet<>();
userIds.forEach(integer -> {
if (integer>0) {
if (integer > 0) {
unitIds.add(userCache.findById(integer).getUnitsId());
}
});
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论