Lius
2024-11-11 c659ff50dfce120d02fa906a33f7b4ab20ffddc2
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDeviceCalendarServiceImpl.java
@@ -2,30 +2,25 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.modules.mdc.entity.MdcDeviceCalendar;
import org.jeecg.modules.mdc.entity.MdcShiftSub;
import org.jeecg.modules.mdc.entity.*;
import org.jeecg.modules.mdc.mapper.MdcDeviceCalendarMapper;
import org.jeecg.modules.mdc.service.IMdcDeviceCalendarService;
import org.jeecg.modules.mdc.service.IMdcEquipmentService;
import org.jeecg.modules.mdc.service.IMdcShiftSubService;
import org.jeecg.modules.mdc.service.*;
import org.jeecg.modules.mdc.vo.EquipmentCalendarVo;
import org.jeecg.modules.mdc.vo.MdcDeviceCalendarQueryVo;
import org.jeecg.modules.mdc.vo.MdcDeviceCalendarVo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.time.DayOfWeek;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
 * @Description: 设备工作日历表
@@ -41,6 +36,12 @@
    @Resource
    private IMdcShiftSubService mdcShiftSubService;
    @Resource
    private IMdcVacationManagementService mdcVacationManagementService;
    @Resource
    private IMdcEquipmentOvertimeService mdcEquipmentOvertimeService;
    /**
     * 分页列表查询
     */
@@ -50,17 +51,17 @@
        List<String> equipmentIds = new ArrayList<>();
        if (StringUtils.isNotEmpty(mdcDeviceCalendarQueryVo.getParentId()) && StringUtils.isEmpty(mdcDeviceCalendarQueryVo.getEquipmentId())) {
            if ("2".equals(mdcDeviceCalendarQueryVo.getTypeTree())) {
                //部门层级
                // 部门层级
                equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, mdcDeviceCalendarQueryVo.getParentId());
            } else {
                //产线层级
                // 产线层级
                equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, mdcDeviceCalendarQueryVo.getParentId());
            }
        } else if (StringUtils.isNotEmpty(mdcDeviceCalendarQueryVo.getEquipmentId())) {
            //单台设备信息
            // 单台设备信息
            mdcDeviceCalendarQueryVo.setEquipmentIdList(Collections.singletonList(mdcDeviceCalendarQueryVo.getEquipmentId()));
        } else {
            //查询用户拥有的所有设备信息
            // 查询用户拥有的所有设备信息
            if ("2".equals(mdcDeviceCalendarQueryVo.getTypeTree())) {
                //部门层级
                equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, null);
@@ -73,99 +74,152 @@
            mdcDeviceCalendarQueryVo.setEquipmentIdList(equipmentIds);
        }
        if (mdcDeviceCalendarQueryVo.getEquipmentIdList() == null || mdcDeviceCalendarQueryVo.getEquipmentIdList().isEmpty()) {
            return null;
        }
        return this.baseMapper.pageList(pageData, mdcDeviceCalendarQueryVo);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean saveCalendar(EquipmentCalendarVo calendarVo) {
        String[] equipmentIdList = calendarVo.getEquipmentId().split(",");
        //生效时间
        LocalDate takeEffectDate = calendarVo.getTakeEffectDate();
        //失效时间
        LocalDate invalidDate = calendarVo.getInvalidDate();
        //处理星期
        Map<String, String> map = new HashMap<>();
        if (org.apache.commons.lang.StringUtils.isNotBlank(calendarVo.getMonShiftId())) {
            map.put("1", calendarVo.getMonShiftId());
        }
        if (org.apache.commons.lang.StringUtils.isNotBlank(calendarVo.getTueShiftId())) {
            map.put("2", calendarVo.getTueShiftId());
        }
        if (org.apache.commons.lang.StringUtils.isNotBlank(calendarVo.getWedShiftId())) {
            map.put("3", calendarVo.getWedShiftId());
        }
        if (org.apache.commons.lang.StringUtils.isNotBlank(calendarVo.getThuShiftId())) {
            map.put("4", calendarVo.getThuShiftId());
        }
        if (org.apache.commons.lang.StringUtils.isNotBlank(calendarVo.getFriShiftId())) {
            map.put("5", calendarVo.getFriShiftId());
        }
        if (org.apache.commons.lang.StringUtils.isNotBlank(calendarVo.getSatShiftId())) {
            map.put("6", calendarVo.getSatShiftId());
        }
        if (org.apache.commons.lang.StringUtils.isNotBlank(calendarVo.getSunShiftId())) {
            map.put("7", calendarVo.getSunShiftId());
        }
        if (map.isEmpty()) {
            return false;
        }
        List<String> dateList = calendarVo.getDateList();
        List<MdcShiftSub> mdcShiftSubList = mdcShiftSubService.list(new LambdaQueryWrapper<MdcShiftSub>().eq(MdcShiftSub::getShiftId, calendarVo.getShiftId()).eq(MdcShiftSub::getShiftSubStatus, "1"));
        List<MdcDeviceCalendar> calendarList = new ArrayList<>();
        map.forEach((key, value) -> {
            List<MdcShiftSub> mdcShiftSubList = mdcShiftSubService.list(new LambdaQueryWrapper
                    <MdcShiftSub>().eq(MdcShiftSub::getShiftId, value).eq(MdcShiftSub::getShiftSubStatus, "1"));
            List<LocalDate> meetDayOfWeekLocalDates = getMeetDayOfWeekLocalDates(takeEffectDate, invalidDate, key);
            if (!meetDayOfWeekLocalDates.isEmpty()) {
                List<String> dates = meetDayOfWeekLocalDates.stream().map(localDate -> localDate.format(DateTimeFormatter.BASIC_ISO_DATE)).collect(Collectors.toList());
                LambdaUpdateChainWrapper<MdcDeviceCalendar> lambdaUpdate = this.lambdaUpdate();
                lambdaUpdate.in(MdcDeviceCalendar::getEffectiveDate, dates).in(MdcDeviceCalendar::getEqumentId, Arrays.asList(equipmentIdList));
                lambdaUpdate.remove();
                List<MdcDeviceCalendar> calendars = handleMdcDeviceCalendar(dates, equipmentIdList, mdcShiftSubList, key);
                calendarList.addAll(calendars);
        for (String equipmentId : equipmentIdList) {
            for (String date : dateList) {
                for (MdcShiftSub mdcShiftSub : mdcShiftSubList) {
                    this.baseMapper.delete(new LambdaQueryWrapper<MdcDeviceCalendar>().eq(MdcDeviceCalendar::getEquipmentId, equipmentId).eq(MdcDeviceCalendar::getEffectiveDate, date));
                    MdcDeviceCalendar mdcDeviceCalendar = new MdcDeviceCalendar();
                    mdcDeviceCalendar.setEffectiveDate(date);
                    mdcDeviceCalendar.setEquipmentId(equipmentId);
                    mdcDeviceCalendar.setShiftId(mdcShiftSub.getShiftId());
                    mdcDeviceCalendar.setShiftSubId(mdcShiftSub.getId());
                    calendarList.add(mdcDeviceCalendar);
                }
            }
        });
        }
        this.saveBatch(calendarList);
        return true;
    }
    /**
     * 获取一段时间范围内符合星期几的日期集合
     * 查询班制数据
     *
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @param workDate  周几 1,2,3,4
     * @param equipmentId
     * @param stringDates
     * @return
     */
    public static List<LocalDate> getMeetDayOfWeekLocalDates(LocalDate startDate, LocalDate endDate, String workDate) {
        List<DayOfWeek> dayOfWeeks = Stream.of(workDate.split(","))
                .map(Integer::valueOf)
                .map(DayOfWeek::of)
                .collect(Collectors.toList());
        long distance = ChronoUnit.DAYS.between(startDate, endDate);
        return Stream.iterate(startDate, d -> d.plusDays(1))
                .limit(distance + 1)
                .filter(localDate -> dayOfWeeks.contains(localDate.getDayOfWeek()))
                .collect(Collectors.toList());
    @Override
    public List<MdcDeviceCalendarVo> listByEquipmentAndDate(String equipmentId, List<String> stringDates) {
        try {
            List<MdcDeviceCalendarVo> mdcDeviceCalendarVos = this.baseMapper.listByEquipmentAndDates(equipmentId, stringDates);
            if (mdcDeviceCalendarVos != null && !mdcDeviceCalendarVos.isEmpty()) {
                return mdcDeviceCalendarVos;
            } else {
                return null;
            }
        } catch (Exception e) {
            return null;
        }
    }
    public List<MdcDeviceCalendar> handleMdcDeviceCalendar(List<String> dates, String[] equipment, List<MdcShiftSub> mdcShiftSubList, String weekNumber) {
        List<MdcDeviceCalendar> ds = new ArrayList<>();
        for (String date : dates) {
            for (String equipmentId : equipment) {
                for (MdcShiftSub temp : mdcShiftSubList) {
                    MdcDeviceCalendar mdcDeviceCalendar = new MdcDeviceCalendar();
                    if (org.apache.commons.lang.StringUtils.isNotEmpty(equipmentId)) {
                        mdcDeviceCalendar.setEqumentId(equipmentId);
    /**
     * 计算实际班产天数
     *
     * @param equipmentId
     * @param validDate
     * @return
     */
    @Override
    public BigDecimal computeActualWorkDayCount(String equipmentId, String validDate) {
        validDate = validDate.replaceAll("-", "");
        List<String> validDateList = this.baseMapper.computeActualWorkDayCount(equipmentId, validDate);
        return new BigDecimal(validDateList.size());
    }
    /**
     * 查询班次分类
     *
     * @param equipmentId
     * @param validDate
     * @return
     */
    @Override
    public List<String> findShiftSort(String equipmentId, String validDate) {
        validDate = validDate.replaceAll("-", "");
        return this.baseMapper.findShiftSort(equipmentId, validDate);
    }
    /**
     * 计算班次时间
     *
     * @param equipmentId
     * @param validDate
     * @return
     */
    @Override
    public BigDecimal computeShiftTimeCount(String equipmentId, String validDate) {
        validDate = validDate.replaceAll("-", "");
        Integer shiftCount = this.baseMapper.computeShiftTimeCount(equipmentId, validDate);
        return new BigDecimal(shiftCount);
    }
    /**
     * 自动生成设备工作日历
     */
    @Override
    public void generateDeviceCalendar() {
        // 暂定每天晚上11点执行
        //查询默认班制
        List<MdcDeviceCalendarVo> acquiesceShift = this.baseMapper.findAcquiesceShift();
        // 获取明日日期
        String localDate = LocalDate.now().plusDays(1).toString();
        // 获取设备列表
        List<MdcEquipment> equipmentList = mdcEquipmentService.list();
        List<MdcDeviceCalendar> result = new ArrayList<>();
        for (MdcEquipment mdcEquipment : equipmentList) {
            List<MdcDeviceCalendar> list = super.list(new LambdaQueryWrapper<MdcDeviceCalendar>().eq(MdcDeviceCalendar::getEquipmentId, mdcEquipment.getEquipmentId()).eq(MdcDeviceCalendar::getEffectiveDate, localDate.replaceAll("-", "")));
            if (list == null || list.isEmpty()) {
                List<MdcVacationManagement> vacationManagementList = mdcVacationManagementService.list(new LambdaQueryWrapper<MdcVacationManagement>().eq(MdcVacationManagement::getEquipmentId, mdcEquipment.getEquipmentId()).eq(MdcVacationManagement::getVacationDate, localDate));
                if (vacationManagementList == null || vacationManagementList.isEmpty()) {
                    String effectiveDate = localDate.replaceAll("-", "");
                    for (MdcDeviceCalendarVo mdcDeviceCalendarVo : acquiesceShift) {
                        MdcDeviceCalendar mdcDeviceCalendar = new MdcDeviceCalendar();
                        mdcDeviceCalendar.setEquipmentId(mdcEquipment.getEquipmentId());
                        mdcDeviceCalendar.setEffectiveDate(effectiveDate);
                        mdcDeviceCalendar.setShiftId(mdcDeviceCalendarVo.getShiftId());
                        mdcDeviceCalendar.setShiftSubId(mdcDeviceCalendarVo.getShiftSubId());
                        result.add(mdcDeviceCalendar);
                    }
                    mdcDeviceCalendar.setShiftId(temp.getShiftId());
                    mdcDeviceCalendar.setShiftSubId(temp.getId());
                    mdcDeviceCalendar.setEffectiveDate(date);
                    mdcDeviceCalendar.setWeekNumber(weekNumber);
                    ds.add(mdcDeviceCalendar);
                }
            }
        }
        return ds;
        if (!result.isEmpty()) {
            super.saveBatch(result);
        }
    }
    @Override
    public MdcDeviceCalendar getFirstData(String equipmentId) {
        return this.baseMapper.getFirstData(equipmentId);
    }
    @Override
    public List<MdcDeviceCalendarVo> listByEquipmentIdAndDate(String equipmentId, String date) {
        List<MdcDeviceCalendarVo> mdcDeviceCalendarVos = this.baseMapper.listByEquipmentAndDate(equipmentId, date);
        if (mdcDeviceCalendarVos != null && !mdcDeviceCalendarVos.isEmpty()) {
            for (MdcDeviceCalendarVo mdcDeviceCalendarVo : mdcDeviceCalendarVos) {
                List<MdcEquipmentOvertime> list = mdcEquipmentOvertimeService.list(new LambdaQueryWrapper<MdcEquipmentOvertime>().eq(MdcEquipmentOvertime::getEquipmentId, mdcDeviceCalendarVo.getEquipmentId()).eq(MdcEquipmentOvertime::getTheDate, mdcDeviceCalendarVo.getEndDate()));
                if (list != null && !list.isEmpty()) {
                    mdcDeviceCalendarVo.setOvertimeStartTime(list.get(0).getStartTime());
                    mdcDeviceCalendarVo.setOvertimeEndTime(list.get(0).getEndTime());
                }
            }
        }
        return mdcDeviceCalendarVos;
    }
}