yangkang
2023-09-12 a6d8cfbf89fae62167c99dab7ffddaeb6f2b7de5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package org.jeecg.modules.eam.service.impl;
 
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.jeecg.modules.eam.entity.MaintenanceOrderActualMaterial;
import org.jeecg.modules.eam.entity.PredictiveWorkOrder;
import org.jeecg.modules.eam.entity.PredictiveWorkPlan;
import org.jeecg.modules.eam.entity.PredictiveWorkPlanSparePart;
import org.jeecg.modules.eam.mapper.PredictiveWorkPlanSparePartMapper;
import org.jeecg.modules.eam.model.MdcEquipmentRunningSectionVo;
import org.jeecg.modules.eam.service.IPredictiveWorkOrderService;
import org.jeecg.modules.eam.service.IPredictiveWorkPlanService;
import org.jeecg.modules.eam.service.IPredictiveWorkPlanSparePartService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import sun.reflect.generics.tree.ArrayTypeSignature;
 
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
 
@Service
public class PredictiveWorkPlanSparePartServiceImpl extends ServiceImpl<PredictiveWorkPlanSparePartMapper, PredictiveWorkPlanSparePart> implements IPredictiveWorkPlanSparePartService {
 
    @Autowired
    private IPredictiveWorkPlanService predictiveWorkPlanService;
 
    @Autowired
    private IPredictiveWorkOrderService predictiveWorkOrderService;
 
    @Override
    public IPage<Map<String, Object>> pagePredictiveWorkPlanSparePart(Integer pageNo, Integer pageSize, Map<String, Object> params) {
        IPage<Map> pageData = new Page<Map>(pageNo, pageSize);
        return super.getBaseMapper().pagePredictiveWorkPlanSparePart(pageData, params);
    }
 
    //    1.查询配置的 备件触发条件
    //    2.获取备件的的实际寿命    设备开机时间 - 换件时间 (设备开机时间信息截止到昨日)
    //    3.判断实际寿命是否大于控制寿命,并生成维护工单
    @Override
    public void createSparePartWorkPlan() {
        List<PredictiveWorkPlan> predictiveWorkPlanList = predictiveWorkPlanService.listWorkPlan("bjkz");
        for (PredictiveWorkPlan predictiveWorkPlan : predictiveWorkPlanList) {
            List<PredictiveWorkPlanSparePart> predictiveWorkPlanSparePartList = listPredictiveWorkPlanSparePart(predictiveWorkPlan.getId());
            for (PredictiveWorkPlanSparePart predictiveWorkPlanSparePart : predictiveWorkPlanSparePartList) {
                Date replacementTime = findReplacementTime(predictiveWorkPlanSparePart.getEquipmentId(), predictiveWorkPlanSparePart.getSparePartId());
                predictiveWorkPlanSparePart.setReplacementTime(replacementTime);
                long actualLife = findActualLife(predictiveWorkPlanSparePart.getMdcEquipmentId(), replacementTime);
                predictiveWorkPlanSparePart.setActualLife(actualLife);
                if (actualLife > predictiveWorkPlanSparePart.getLifeWarning()) {
                    //1.判断是否生成维护工单, 2.生成维护工单
                    this.createOrder(predictiveWorkPlan.getId(), predictiveWorkPlan.getEquipmentId(), predictiveWorkPlanSparePart.getId());
                }
            }
        }
    }
 
    //没有对应的维护工单就生成工单
    private void createOrder(String workPlanId, String equipmentId, String itemId) {
        LambdaQueryChainWrapper<PredictiveWorkOrder> lambdaQuery = predictiveWorkOrderService.lambdaQuery();
        lambdaQuery.eq(PredictiveWorkOrder::getEquipmentId, equipmentId).eq(PredictiveWorkOrder::getItemId, itemId).eq(PredictiveWorkOrder::getWorkPlanId, workPlanId);
        //已创建 0     已下发    1     未开始    2     执行中    3
        lambdaQuery.in(PredictiveWorkOrder::getStatus, Arrays.asList(new String[]{"0", "1", "2", "3"}));
        lambdaQuery.eq(PredictiveWorkOrder::getDelFlag, 0);
        List<PredictiveWorkOrder> list = lambdaQuery.list();
        if (list == null || list.size() == 0) {
            PredictiveWorkOrder predictiveWorkOrder = new PredictiveWorkOrder();
            predictiveWorkOrder.setItemId(itemId);
            predictiveWorkOrder.setEquipmentId(equipmentId);
            predictiveWorkOrder.setWorkPlanId(workPlanId);
            predictiveWorkOrderService.add(predictiveWorkOrder);
        }
    }
 
    //查询配置的 备件触发条件
    public List<PredictiveWorkPlanSparePart> listPredictiveWorkPlanSparePart(String predictiveWorkPlanId) {
        return super.getBaseMapper().listPredictiveWorkPlanSparePart(predictiveWorkPlanId);
    }
 
    //最后换件时间
    public Date findReplacementTime(String equipmentId, String sparePartId) {
        List<MaintenanceOrderActualMaterial> maintenanceOrderActualMaterialList = super.getBaseMapper().listMaintenanceOrderActualMaterial(equipmentId, sparePartId);
        if (maintenanceOrderActualMaterialList.size() > 0) {
            return maintenanceOrderActualMaterialList.get(0).getCreateTime();
        }
        return new Date();
    }
 
    //实际寿命
    //1.倒序设备状态
    //2.累加设备非关机的时间 当设备状态的开始时间小于换件时间 或者 换件时间介于设备状态的开始时间和结束时间之间的数据后,停止累加
    //3.换算单位为小时
    public long findActualLife(String mdcEquipmentId, Date replacementTime) {
        long actualLife = 0l;
        long replacementTimeLong = replacementTime.getTime();
        List<MdcEquipmentRunningSectionVo> mdcEquipmentRunningSectionVoList = super.getBaseMapper().listMdcEquipmentRunningSectionVo(mdcEquipmentId);
        for (MdcEquipmentRunningSectionVo temp : mdcEquipmentRunningSectionVoList) {
            if (replacementTimeLong < temp.getStartLong()) {
                actualLife = actualLife + temp.getDuration();
            } else if (replacementTimeLong >= temp.getStartLong() && replacementTimeLong <= temp.getEndLong()) {
                actualLife = actualLife + (temp.getEndLong() - replacementTimeLong);
            } else {
                continue;
            }
        }
        return actualLife / 60 / 60;
    }
 
}