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 implements IMdcDowntimeOperatorService { @Resource private IMdcEquipmentService mdcEquipmentService; @Override public IPage pageList(MdcDowntimeVo mdcDowntimeVo, Page page) { LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String userId = user.getId(); // 获取设备ID列表 List 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 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 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 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 getEquipmentIds(String userId, MdcDowntimeVo mdcDowntimeVo) { if (StringUtils.isNotEmpty(mdcDowntimeVo.getEquipmentId())) { return Collections.singletonList(mdcDowntimeVo.getEquipmentId()); } return mdcEquipmentService.getEquipmentIdsProduction(userId, null); } }