hyingbo
2025-06-10 29dcac1a7bb5758b6f9a39fd0738f6ab367b5418
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
 
package org.jeecg.modules.mdc.service.impl;
 
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.beust.jcommander.internal.Lists;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.mdc.dto.MdcDowntimeDto;
import org.jeecg.modules.mdc.entity.MdcDowntime;
import org.jeecg.modules.mdc.mapper.MdcDowntimeOperatorMapper;
import org.jeecg.modules.mdc.service.IMdcDowntimeOperatorService;
import org.jeecg.modules.mdc.service.IMdcEquipmentService;
import org.jeecg.modules.mdc.util.DateUtils;
import org.jeecg.modules.mdc.vo.MdcDowntimeVo;
import org.jeecg.modules.mdc.vo.SplitDowntimeVo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import javax.annotation.Resource;
import java.util.*;
 
/**
 * @Description: 操作工待机停机表
 * @Author: lius
 * @Date: 2025-03-12
 */
@Service
public class MdcDowntimeServiceOperatorImpl extends ServiceImpl<MdcDowntimeOperatorMapper, MdcDowntime> implements IMdcDowntimeOperatorService {
 
    @Resource
    private IMdcEquipmentService mdcEquipmentService;
 
    @Override
    public IPage<MdcDowntimeDto> pageList(MdcDowntimeVo mdcDowntimeVo, Page<MdcDowntimeDto> page) {
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        String userId = user.getId();
        // 获取设备ID列表
        List<String> equipmentIds = Lists.newArrayList();
        if (StringUtils.isNotBlank(user.getEquipmentIds())) {
            equipmentIds = Arrays.asList(user.getEquipmentIds().split(StringPool.COMMA));
        }else {
            equipmentIds = getEquipmentIds(userId, mdcDowntimeVo);
        }
 
        // 如果设备ID列表为空,直接返回空分页
        if (equipmentIds == null || equipmentIds.isEmpty()) {
            return new Page<>(page.getCurrent(), page.getSize(), 0);
        }
 
        QueryWrapper<MdcDowntimeDto> queryWrapper = Wrappers.query();
        if (CollectionUtils.isNotEmpty(equipmentIds)) {
            queryWrapper.in("t1.equipment_id", equipmentIds);
        }
        if (StringUtils.isNotBlank(mdcDowntimeVo.getEquipmentId())) {
            queryWrapper.eq("t1.equipment_id", mdcDowntimeVo.getEquipmentId());
        }
        if (Objects.nonNull(mdcDowntimeVo.getStartDate())) {
            queryWrapper.ge("t1.start_date", mdcDowntimeVo.getStartDate());
        }
        if (Objects.nonNull(mdcDowntimeVo.getEndDate())) {
            queryWrapper.le("t1.end_date", mdcDowntimeVo.getEndDate());
        }
        if (StringUtils.isNotBlank(mdcDowntimeVo.getDowntimeDescription())) {
            queryWrapper.eq("t2.id", mdcDowntimeVo.getDowntimeDescription());
        }
 
        return this.baseMapper.page(page, queryWrapper);
    }
 
    @Override
    @Transactional(rollbackFor = {Exception.class})
    public void updateReason(MdcDowntimeVo mdcDowntimeVo) {
        if (StringUtils.isEmpty(mdcDowntimeVo.getDownTimeIds())) {
            throw new JeecgBootException("请选择需要维护停机的数据");
        }
 
        List<MdcDowntime> mdcDowntimeList = this.listByIds(Arrays.asList(mdcDowntimeVo.getDownTimeIds().split(StringPool.COMMA)));
        mdcDowntimeList.forEach(mdcDowntime -> {
            mdcDowntime.setReasonId(mdcDowntimeVo.getReasonId());
        });
        this.updateBatchById(mdcDowntimeList);
    }
 
    @Transactional(rollbackFor = {Exception.class})
    @Override
    public void splitDowntime(SplitDowntimeVo splitDowntimeVo) {
        if (StringUtils.isBlank(splitDowntimeVo.getId())) {
            throw new JeecgBootException("请选择需要拆分停机的数据");
        }
 
        MdcDowntime mdcDowntime = this.getById(splitDowntimeVo.getId());
 
        if (StringUtils.isNotBlank(mdcDowntime.getReasonId())) {
            throw new JeecgBootException("已设置停机原因,无法拆分停机");
        }
 
        //比较拆分一段的日期是否再区间范围内(开始时间:startTime 结束时间:入无二段时间,则取endTime)
        if (Objects.nonNull(splitDowntimeVo.getFirstMiddleTime())) {
 
            //校验一段日期是否大于startTime,否,抛出异常
            if (Objects.isNull(splitDowntimeVo.getSecondMiddleTime())) {
                if (splitDowntimeVo.getStartDate().compareTo(splitDowntimeVo.getFirstMiddleTime()) != -1 || splitDowntimeVo.getFirstMiddleTime().compareTo(splitDowntimeVo.getEndDate()) != -1) {
                    throw new JeecgBootException("拆分一段时间未在开始时间和结束时间之内,请检查!");
                }
            }else {
                if (splitDowntimeVo.getStartDate().compareTo(splitDowntimeVo.getFirstMiddleTime()) != -1 || splitDowntimeVo.getFirstMiddleTime().compareTo(splitDowntimeVo.getSecondMiddleTime()) != -1) {
                    throw new JeecgBootException("拆分一段时间未在开始时间和拆分二段结束时间之内,请检查!");
                }
            }
 
        }else {
            throw new JeecgBootException("请维护拆分一段结束时间");
        }
 
        if (Objects.nonNull(splitDowntimeVo.getSecondMiddleTime())) {
            //校验二段日期是否存在于一段日期和endTime之间
 
            if (splitDowntimeVo.getFirstMiddleTime().compareTo(splitDowntimeVo.getSecondMiddleTime()) != -1 || splitDowntimeVo.getSecondMiddleTime().compareTo(splitDowntimeVo.getEndDate()) != -1) {
                throw new JeecgBootException("拆分二段时间未在拆分一段结束时间和结束时间之内,请检查!");
            }
        }
 
        List<MdcDowntime> list = Lists.newArrayList();
 
        //设置拆分1段
        if (Objects.nonNull(splitDowntimeVo.getFirstMiddleTime())) {
            list.add(checkMdcDowntime(mdcDowntime, splitDowntimeVo.getStartDate(), splitDowntimeVo.getFirstMiddleTime(), splitDowntimeVo.getFirstDowntimeDescription()));
        }
 
        //设置拆分2段,二段不存在则将endDate作为拆分二段
        if (Objects.nonNull(splitDowntimeVo.getSecondMiddleTime())) {
            list.add(checkMdcDowntime(mdcDowntime, splitDowntimeVo.getFirstMiddleTime(), splitDowntimeVo.getSecondMiddleTime(), splitDowntimeVo.getSecondDowntimeDescription()));
            list.add(checkMdcDowntime(mdcDowntime, splitDowntimeVo.getSecondMiddleTime(), splitDowntimeVo.getEndDate(), splitDowntimeVo.getThirdDowntimeDescription()));
        }else {
            list.add(checkMdcDowntime(mdcDowntime, splitDowntimeVo.getFirstMiddleTime(), splitDowntimeVo.getEndDate(), splitDowntimeVo.getThirdDowntimeDescription()));
        }
        //保存拆分数据并删除原有数据
        if (this.saveBatch(list)) {
            this.removeById(mdcDowntime);
        }
    }
 
    private MdcDowntime checkMdcDowntime(MdcDowntime mdcDowntime, Date startDate, Date endDate, String downtimeDescription) {
        MdcDowntime mdcDowntimeInfo = new MdcDowntime();
        BeanUtil.copyProperties(mdcDowntime, mdcDowntimeInfo);
        mdcDowntimeInfo.setId(IdWorker.getIdStr());
        mdcDowntimeInfo.setStartDate(startDate);
        mdcDowntimeInfo.setEndDate(endDate);
        mdcDowntimeInfo.setShutdownDuration(DateUtils.differentMinutes(startDate, endDate));
        mdcDowntimeInfo.setEnterType(2);
        mdcDowntimeInfo.setReasonId(StringUtils.isNotBlank(downtimeDescription) ? downtimeDescription : StringPool.EMPTY);
        return mdcDowntimeInfo;
    }
 
    private List<String> getEquipmentIds(String userId, MdcDowntimeVo mdcDowntimeVo) {
        if (StringUtils.isNotEmpty(mdcDowntimeVo.getEquipmentId())) {
            return Collections.singletonList(mdcDowntimeVo.getEquipmentId());
        }
        return mdcEquipmentService.getEquipmentIdsProduction(userId, null);
    }
}