|
@@ -7,7 +7,9 @@ import cn.hutool.core.util.ObjectUtil;
|
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
|
|
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
|
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
|
|
+import cn.iocoder.yudao.module.pms.controller.admin.iotdevicerunlog.vo.IotDeviceRunLogRespVO;
|
|
import cn.iocoder.yudao.module.pms.controller.admin.iotlockstock.vo.IotLockStockPageReqVO;
|
|
import cn.iocoder.yudao.module.pms.controller.admin.iotlockstock.vo.IotLockStockPageReqVO;
|
|
|
|
+import cn.iocoder.yudao.module.pms.controller.admin.iotmaintenancebom.vo.IotMaintenanceBomPageReqVO;
|
|
import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderPageReqVO;
|
|
import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderPageReqVO;
|
|
import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderRespVO;
|
|
import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderRespVO;
|
|
import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderSaveReqVO;
|
|
import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderSaveReqVO;
|
|
@@ -18,24 +20,31 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbom.vo.IotMa
|
|
import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbommaterial.vo.IotMainWorkOrderBomMaterialSaveReqVO;
|
|
import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbommaterial.vo.IotMainWorkOrderBomMaterialSaveReqVO;
|
|
import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
|
|
import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotlockstock.IotLockStockDO;
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotlockstock.IotLockStockDO;
|
|
|
|
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotmaintenancebom.IotMaintenanceBomDO;
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorder.IotMainWorkOrderDO;
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorder.IotMainWorkOrderDO;
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbom.IotMainWorkOrderBomDO;
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbom.IotMainWorkOrderBomDO;
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbommaterial.IotMainWorkOrderBomMaterialDO;
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbommaterial.IotMainWorkOrderBomMaterialDO;
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotlockstock.IotLockStockMapper;
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotlockstock.IotLockStockMapper;
|
|
|
|
+import cn.iocoder.yudao.module.pms.dal.mysql.iotmaintenancebom.IotMaintenanceBomMapper;
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotmainworkorder.IotMainWorkOrderMapper;
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotmainworkorder.IotMainWorkOrderMapper;
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotmainworkorderbom.IotMainWorkOrderBomMapper;
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotmainworkorderbom.IotMainWorkOrderBomMapper;
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotmainworkorderbommaterial.IotMainWorkOrderBomMaterialMapper;
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotmainworkorderbommaterial.IotMainWorkOrderBomMaterialMapper;
|
|
import cn.iocoder.yudao.module.pms.dal.redis.BizNoRedisDAO;
|
|
import cn.iocoder.yudao.module.pms.dal.redis.BizNoRedisDAO;
|
|
import cn.iocoder.yudao.module.pms.service.IotDeviceService;
|
|
import cn.iocoder.yudao.module.pms.service.IotDeviceService;
|
|
|
|
+import cn.iocoder.yudao.module.pms.service.iotdevicerunlog.IotDeviceRunLogService;
|
|
|
|
+import cn.iocoder.yudao.module.pms.service.iotmaintenancebom.IotMaintenanceBomService;
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.validation.annotation.Validated;
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
import javax.annotation.Resource;
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
|
|
+import java.time.LocalDateTime;
|
|
import java.util.*;
|
|
import java.util.*;
|
|
|
|
+import java.util.concurrent.atomic.AtomicBoolean;
|
|
import java.util.stream.Stream;
|
|
import java.util.stream.Stream;
|
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
@@ -63,6 +72,12 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
|
|
private IotDeviceService iotDeviceService;
|
|
private IotDeviceService iotDeviceService;
|
|
@Resource
|
|
@Resource
|
|
private IotLockStockMapper iotLockStockMapper;
|
|
private IotLockStockMapper iotLockStockMapper;
|
|
|
|
+ @Autowired
|
|
|
|
+ private IotDeviceRunLogService iotDeviceRunLogService;
|
|
|
|
+ @Autowired
|
|
|
|
+ private IotMaintenanceBomService iotMaintenanceBomService;
|
|
|
|
+ @Autowired
|
|
|
|
+ private IotMaintenanceBomMapper iotMaintenanceBomMapper;
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public Long createIotMainWorkOrder(IotMainWorkOrderSaveReqVO createReqVO) {
|
|
public Long createIotMainWorkOrder(IotMainWorkOrderSaveReqVO createReqVO) {
|
|
@@ -139,21 +154,17 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
|
|
if (ObjectUtil.isEmpty(workOrderBOMs)) {
|
|
if (ObjectUtil.isEmpty(workOrderBOMs)) {
|
|
throw exception(IOT_MAIN_WORK_ORDER_NOT_EXISTS);
|
|
throw exception(IOT_MAIN_WORK_ORDER_NOT_EXISTS);
|
|
}
|
|
}
|
|
|
|
+ // 不是必填项:推迟保养;委外保养
|
|
List<IotMainWorkOrderBomMaterialSaveReqVO> workOrderMaterials = saveVO.getMainWorkOrderMaterials();
|
|
List<IotMainWorkOrderBomMaterialSaveReqVO> workOrderMaterials = saveVO.getMainWorkOrderMaterials();
|
|
- if (ObjectUtil.isEmpty(workOrderMaterials)) {
|
|
|
|
|
|
+ /* if (ObjectUtil.isEmpty(workOrderMaterials)) {
|
|
throw exception(IOT_MAIN_WORK_ORDER_NOT_EXISTS);
|
|
throw exception(IOT_MAIN_WORK_ORDER_NOT_EXISTS);
|
|
- }
|
|
|
|
|
|
+ } */
|
|
// 保养工单 主表 还有 保养费用 、人工费用 、其他费用
|
|
// 保养工单 主表 还有 保养费用 、人工费用 、其他费用
|
|
IotMainWorkOrderDO updateObj = BeanUtils.toBean(mainWorkOrder, IotMainWorkOrderDO.class);
|
|
IotMainWorkOrderDO updateObj = BeanUtils.toBean(mainWorkOrder, IotMainWorkOrderDO.class);
|
|
- updateObj.setResult(2);
|
|
|
|
- iotMainWorkOrderMapper.updateById(updateObj);
|
|
|
|
|
|
+
|
|
// 保养工单明细
|
|
// 保养工单明细
|
|
List<IotMainWorkOrderBomDO> workOrderBomDOS = new ArrayList<>();
|
|
List<IotMainWorkOrderBomDO> workOrderBomDOS = new ArrayList<>();
|
|
- workOrderBOMs.forEach(bom -> {
|
|
|
|
- IotMainWorkOrderBomDO tempBom = BeanUtils.toBean(bom, IotMainWorkOrderBomDO.class);
|
|
|
|
- workOrderBomDOS.add(tempBom);
|
|
|
|
- });
|
|
|
|
- iotMainWorkOrderBomMapper.updateBatch(workOrderBomDOS);
|
|
|
|
|
|
+
|
|
// 保养工单 bom 明细关联的物料消耗
|
|
// 保养工单 bom 明细关联的物料消耗
|
|
List<IotMainWorkOrderBomMaterialDO> workOrderBomMaterialDOS = new ArrayList<>();
|
|
List<IotMainWorkOrderBomMaterialDO> workOrderBomMaterialDOS = new ArrayList<>();
|
|
Set<Long> factoryIds = new HashSet<>();
|
|
Set<Long> factoryIds = new HashSet<>();
|
|
@@ -161,10 +172,16 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
|
|
Set<Long> storageLocationIds = new HashSet<>();
|
|
Set<Long> storageLocationIds = new HashSet<>();
|
|
Set<String> materialCodes = new HashSet<>();
|
|
Set<String> materialCodes = new HashSet<>();
|
|
Map<String, BigDecimal> lockStockPair = new HashMap<>();
|
|
Map<String, BigDecimal> lockStockPair = new HashMap<>();
|
|
|
|
+ // 标识保养项是否已经添加了物料
|
|
|
|
+ Set<Long> bomNodeIds = new HashSet<>();
|
|
|
|
+ AtomicBoolean mainCompleted = new AtomicBoolean(true);
|
|
|
|
+ // 已经完成保养的保养项关联的 设备id 集合
|
|
|
|
+ Set<Long> deviceIds = new HashSet<>();
|
|
workOrderMaterials.forEach(material -> {
|
|
workOrderMaterials.forEach(material -> {
|
|
IotMainWorkOrderBomMaterialDO tempMaterial = BeanUtils.toBean(material, IotMainWorkOrderBomMaterialDO.class);
|
|
IotMainWorkOrderBomMaterialDO tempMaterial = BeanUtils.toBean(material, IotMainWorkOrderBomMaterialDO.class);
|
|
tempMaterial.setWorkOrderId(mainWorkOrder.getId());
|
|
tempMaterial.setWorkOrderId(mainWorkOrder.getId());
|
|
workOrderBomMaterialDOS.add(tempMaterial);
|
|
workOrderBomMaterialDOS.add(tempMaterial);
|
|
|
|
+
|
|
if ("本地库存".equals(material.getMaterialSource())) {
|
|
if ("本地库存".equals(material.getMaterialSource())) {
|
|
if (ObjUtil.isNotEmpty(material.getFactoryId())) {
|
|
if (ObjUtil.isNotEmpty(material.getFactoryId())) {
|
|
factoryIds.add(material.getFactoryId());
|
|
factoryIds.add(material.getFactoryId());
|
|
@@ -191,6 +208,75 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
|
|
});
|
|
});
|
|
// 添加 工单消耗的物料记录
|
|
// 添加 工单消耗的物料记录
|
|
iotMainWorkOrderBomMaterialMapper.insertBatch(workOrderBomMaterialDOS);
|
|
iotMainWorkOrderBomMaterialMapper.insertBatch(workOrderBomMaterialDOS);
|
|
|
|
+ workOrderBOMs.forEach(bom -> {
|
|
|
|
+ IotMainWorkOrderBomDO tempBom = BeanUtils.toBean(bom, IotMainWorkOrderBomDO.class);
|
|
|
|
+ // 如果工单明细中任何一个保养项设置了 任何一种推迟保养规则 工单结果 不能设置为 已执行
|
|
|
|
+ if (bom.getDelayKilometers().compareTo(BigDecimal.ZERO)>0
|
|
|
|
+ || bom.getDelayDuration().compareTo(BigDecimal.ZERO)>0 || bom.getDelayNaturalDate().compareTo(BigDecimal.ZERO)>0) {
|
|
|
|
+ tempBom.setStatus(0);
|
|
|
|
+ mainCompleted.set(false);
|
|
|
|
+ }
|
|
|
|
+ if (bom.getDelayKilometers().compareTo(BigDecimal.ZERO)==0
|
|
|
|
+ || bom.getDelayDuration().compareTo(BigDecimal.ZERO)==0 || bom.getDelayNaturalDate().compareTo(BigDecimal.ZERO)==0) {
|
|
|
|
+ // 如果保养项没有设置延时保养 则查询当前设备的 累计运行公里数 累计运行时间 当前时间日期 赋值到 关联保养计划 明细 的 对应保养规则数据上
|
|
|
|
+ deviceIds.add(bom.getDeviceId());
|
|
|
|
+ // 保养项下如果已经添加了物料 说明该保养项已经保养完成
|
|
|
|
+ bomNodeIds.add(bom.getBomNodeId());
|
|
|
|
+ tempBom.setStatus(1);
|
|
|
|
+ }
|
|
|
|
+ workOrderBomDOS.add(tempBom);
|
|
|
|
+ });
|
|
|
|
+ iotMainWorkOrderBomMapper.updateBatch(workOrderBomDOS);
|
|
|
|
+ // 只有工单明细中所有保养项的物料都选择完成,才会将工单结果设置为 ‘已执行’
|
|
|
|
+ if (mainCompleted.get()) {
|
|
|
|
+ updateObj.setResult(2);
|
|
|
|
+ }
|
|
|
|
+ iotMainWorkOrderMapper.updateById(updateObj);
|
|
|
|
+ // 如果有保养项已经保养完成,根据保养项规则 实时更新 关联 的 保养计划 明细 保养项的 ‘上次保养运行时间、上次保养自然日期、上次保养公里数’
|
|
|
|
+ // 查询明细中所有设备的累计运行里程、累计运行时间
|
|
|
|
+ if (CollUtil.isNotEmpty(deviceIds)) {
|
|
|
|
+ Map<Long, IotDeviceRunLogRespVO> deviceRunLogMap = iotDeviceRunLogService.getDeviceRunLogMap(new ArrayList<>(deviceIds));
|
|
|
|
+ // 查询保养工单关联的保养计划 明细
|
|
|
|
+ IotMaintenanceBomPageReqVO reqVO = new IotMaintenanceBomPageReqVO();
|
|
|
|
+ reqVO.setPlanId(updateObj.getPlanId());
|
|
|
|
+ reqVO.setDeviceIds(new ArrayList<>(deviceIds));
|
|
|
|
+ reqVO.setBomNodeIds(new ArrayList<>(bomNodeIds));
|
|
|
|
+ List<IotMaintenanceBomDO> maintenanceBomS = iotMaintenanceBomService.getIotMainPlanBomList(reqVO);
|
|
|
|
+ // 根据保养工单 保养项 保养数据 更新对应的 保养计划 保养项 数据
|
|
|
|
+ if (CollUtil.isNotEmpty(maintenanceBomS)) {
|
|
|
|
+ List<IotMaintenanceBomDO> tobeUpdatedMainBomS = new ArrayList<>();
|
|
|
|
+ maintenanceBomS.forEach(bom -> {
|
|
|
|
+ if (0 == bom.getMileageRule()) {
|
|
|
|
+ // 设置了 运行里程 保养规则
|
|
|
|
+ if (deviceRunLogMap.containsKey(bom.getDeviceId())) {
|
|
|
|
+ IotDeviceRunLogRespVO deviceRunLog = deviceRunLogMap.get(bom.getDeviceId());
|
|
|
|
+ BigDecimal totalMileage = deviceRunLog.getTotalMileage();
|
|
|
|
+ if (ObjUtil.isNotEmpty(totalMileage) && totalMileage.compareTo(BigDecimal.ZERO)>0) {
|
|
|
|
+ bom.setLastRunningKilometers(totalMileage);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (0 == bom.getRunningTimeRule()) {
|
|
|
|
+ // 设置了 运行时间 保养规则
|
|
|
|
+ if (deviceRunLogMap.containsKey(bom.getDeviceId())) {
|
|
|
|
+ IotDeviceRunLogRespVO deviceRunLog = deviceRunLogMap.get(bom.getDeviceId());
|
|
|
|
+ BigDecimal totalRunTime = deviceRunLog.getTotalRunTime();
|
|
|
|
+ if (ObjUtil.isNotEmpty(totalRunTime) && totalRunTime.compareTo(BigDecimal.ZERO)>0) {
|
|
|
|
+ bom.setLastRunningTime(totalRunTime);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (0 == bom.getNaturalDateRule()) {
|
|
|
|
+ // 设置了 自然日期 保养规则
|
|
|
|
+ bom.setLastNaturalDate(LocalDateTime.now());
|
|
|
|
+ }
|
|
|
|
+ tobeUpdatedMainBomS.add(bom);
|
|
|
|
+ });
|
|
|
|
+ if (CollUtil.isNotEmpty(tobeUpdatedMainBomS)) {
|
|
|
|
+ iotMaintenanceBomMapper.updateBatch(tobeUpdatedMainBomS);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
// 只扣减本地库存 不处理SAP库存
|
|
// 只扣减本地库存 不处理SAP库存
|
|
if (CollUtil.isNotEmpty(factoryIds) && CollUtil.isNotEmpty(costCenterIds) && CollUtil.isNotEmpty(materialCodes)) {
|
|
if (CollUtil.isNotEmpty(factoryIds) && CollUtil.isNotEmpty(costCenterIds) && CollUtil.isNotEmpty(materialCodes)) {
|
|
IotLockStockPageReqVO reqVO = new IotLockStockPageReqVO();
|
|
IotLockStockPageReqVO reqVO = new IotLockStockPageReqVO();
|