|
@@ -48,6 +48,7 @@ import java.time.LocalDateTime;
|
|
import java.time.temporal.ChronoUnit;
|
|
import java.time.temporal.ChronoUnit;
|
|
import java.util.*;
|
|
import java.util.*;
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
|
|
+import java.util.concurrent.atomic.AtomicReference;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Stream;
|
|
import java.util.stream.Stream;
|
|
|
|
|
|
@@ -895,6 +896,97 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
|
|
return workOrderResp;
|
|
return workOrderResp;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ @Override
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
|
+ public void syncWorkOrderData(List<Long> deviceIds, Long deptId, List<Long> personIds) {
|
|
|
|
+ if (CollUtil.isEmpty(deviceIds) || CollUtil.isEmpty(personIds)) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ // 查询当前设备对应的 责任人 前端页面已经统一设置了相同的责任人(有可能多个 多个责任人时随机取1个)
|
|
|
|
+ Long personId = personIds.get(0);
|
|
|
|
+ // 查询当前设备集合的所有历史保养工单 如果历史工单明细中包含2个设备A,B,但是只调拨了1个设备A,此时 只复制设备A明细生成一个 执行完成的保养工单
|
|
|
|
+ IotMainWorkOrderBomPageReqVO reqVO = new IotMainWorkOrderBomPageReqVO();
|
|
|
|
+ reqVO.setDeviceIds(deviceIds);
|
|
|
|
+ reqVO.setStatus(1); // 查询已经保养完成的工单
|
|
|
|
+ List<IotMainWorkOrderBomDO> workOrderBomS = iotMainWorkOrderBomMapper.selectList(reqVO);
|
|
|
|
+ // 以 工单id+设备id+设备负责人 为维度组成 工单BOM集合
|
|
|
|
+ Map<Long, List<IotMainWorkOrderBomDO>> workOrderBomPair = new HashMap<>();
|
|
|
|
+ Map<Long, IotMainWorkOrderDO> workOrderPair = new HashMap<>();
|
|
|
|
+ Set<Long> workOrderIds = new HashSet<>();
|
|
|
|
+ // 需要新增的保养工单集合 (历史工单)
|
|
|
|
+ List<IotMainWorkOrderDO> tobeAddedOrders = new ArrayList<>();
|
|
|
|
+ // 需要新增的保养工单明细集合 (历史工单)
|
|
|
|
+ List<IotMainWorkOrderBomDO> tobeAddedOrderBomS = new ArrayList<>();
|
|
|
|
+ // 需要新增的保养工单物料明细集合 (历史工单)
|
|
|
|
+ List<IotMainWorkOrderBomMaterialDO> tobeAddedOrderBomMaterialS = new ArrayList<>();
|
|
|
|
+ if (CollUtil.isNotEmpty(workOrderBomS)) {
|
|
|
|
+ workOrderBomS.forEach(bom -> {
|
|
|
|
+ if (workOrderBomPair.containsKey(bom.getWorkOrderId())) {
|
|
|
|
+ List<IotMainWorkOrderBomDO> tempBomS = workOrderBomPair.get(bom.getWorkOrderId());
|
|
|
|
+ tempBomS.add(bom);
|
|
|
|
+ workOrderBomPair.put(bom.getWorkOrderId(), tempBomS);
|
|
|
|
+ } else {
|
|
|
|
+ List<IotMainWorkOrderBomDO> tempBomS = new ArrayList<>();
|
|
|
|
+ tempBomS.add(bom);
|
|
|
|
+ workOrderBomPair.put(bom.getWorkOrderId(), tempBomS);
|
|
|
|
+ }
|
|
|
|
+ workOrderIds.add(bom.getWorkOrderId());
|
|
|
|
+ });
|
|
|
|
+ // 查询所有保养工单明细对应的保养工单主表集合
|
|
|
|
+ IotMainWorkOrderPageReqVO orderReqVO = new IotMainWorkOrderPageReqVO();
|
|
|
|
+ orderReqVO.setWorkOrderIds(new ArrayList<>(workOrderIds));
|
|
|
|
+ orderReqVO.setResult(2); // 查询已经执行完成的工单
|
|
|
|
+ List<IotMainWorkOrderDO> workOrders = iotMainWorkOrderMapper.selectList(orderReqVO);
|
|
|
|
+ if (CollUtil.isNotEmpty(workOrders)) {
|
|
|
|
+ workOrders.forEach(order -> {
|
|
|
|
+ workOrderPair.put(order.getId(), order);
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ // 根据历史工单 拷贝生成 新的历史工单
|
|
|
|
+ // 查询最新的保养工单id
|
|
|
|
+ AtomicReference<Long> theMaxId = new AtomicReference<>(theMaxId());
|
|
|
|
+ workOrderBomPair.forEach((k, v) -> {
|
|
|
|
+ // k保养工单id v工单明细集合
|
|
|
|
+ IotMainWorkOrderDO workOrder = new IotMainWorkOrderDO();
|
|
|
|
+ theMaxId.getAndSet(theMaxId.get() + 1);
|
|
|
|
+ workOrder.setId(theMaxId.get());
|
|
|
|
+ workOrder.setDeptId(deptId);
|
|
|
|
+ if (workOrderPair.containsKey(k)) {
|
|
|
|
+ workOrder.setName(workOrderPair.get(k).getName());
|
|
|
|
+ workOrder.setPlanId(workOrderPair.get(k).getPlanId());
|
|
|
|
+ workOrder.setType(workOrderPair.get(k).getType());
|
|
|
|
+ workOrder.setCost(workOrderPair.get(k).getCost());
|
|
|
|
+ workOrder.setOtherCost(workOrderPair.get(k).getOtherCost());
|
|
|
|
+ workOrder.setLaborCost(workOrderPair.get(k).getLaborCost());
|
|
|
|
+ workOrder.setActualStartTime(workOrderPair.get(k).getActualStartTime());
|
|
|
|
+ workOrder.setActualEndTime(workOrderPair.get(k).getActualEndTime());
|
|
|
|
+ workOrder.setRemark(workOrderPair.get(k).getRemark());
|
|
|
|
+ }
|
|
|
|
+ workOrder.setOrderNumber(createWorkOrderNumber());
|
|
|
|
+ workOrder.setResult(2);
|
|
|
|
+ workOrder.setResponsiblePerson(String.valueOf(personId));
|
|
|
|
+ workOrder.setCreator(String.valueOf(personId));
|
|
|
|
+ tobeAddedOrders.add(workOrder);
|
|
|
|
+ // 2. 处理关联的BOM明细
|
|
|
|
+ final long workOrderId = workOrder.getId(); // 获取当前工单ID
|
|
|
|
+ v.forEach(bom -> {
|
|
|
|
+ IotMainWorkOrderBomDO tempBom = new IotMainWorkOrderBomDO();
|
|
|
|
+ BeanUtils.copyProperties(bom,tempBom);
|
|
|
|
+ tempBom.setId(null);
|
|
|
|
+ tempBom.setWorkOrderId(workOrderId);
|
|
|
|
+ tobeAddedOrderBomS.add(tempBom);
|
|
|
|
+ System.out.println("当前保养明细名称:" + bom.getName());
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ // todo 还要处理保养项已经关联的物料
|
|
|
|
+ if (CollUtil.isNotEmpty(tobeAddedOrders) && CollUtil.isNotEmpty(tobeAddedOrderBomS)) {
|
|
|
|
+ iotMainWorkOrderMapper.insertBatch(tobeAddedOrders);
|
|
|
|
+ iotMainWorkOrderBomMapper.insertBatch(tobeAddedOrderBomS);
|
|
|
|
+ System.out.println("保养工单明细集合数量:" + tobeAddedOrderBomS.size());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
private static class Triple<A, B, C> {
|
|
private static class Triple<A, B, C> {
|
|
private final A first;
|
|
private final A first;
|
|
private final B second;
|
|
private final B second;
|