RuleSchedulingServiceImpl.java 9.5 KB
package com.ruoyi.scheduling.service.impl;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.domain.RuleNumSetting;
import com.ruoyi.domain.RuleSettingScheduling;
import com.ruoyi.pojo.dto.AttendanceDto;
import com.ruoyi.pojo.dto.RuleSchedulingDto;
import com.ruoyi.pojo.vo.RuleSchedulingResponseVo;
import com.ruoyi.pojo.vo.RuleSchedulingVo;
import com.ruoyi.service.RuleNumSettingService;
import com.ruoyi.service.RuleSettingSchedulingService;
import com.ruoyi.utils.ToolUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.scheduling.mapper.RuleSchedulingMapper;
import com.ruoyi.scheduling.domain.RuleScheduling;
import com.ruoyi.scheduling.service.IRuleSchedulingService;

import static com.ruoyi.common.RuleSchedulingProperties.*;
import static com.ruoyi.common.WeekEnum.FREE;

/**
 * 排班规则Service业务层处理
 *
 * @author guzijian
 * @date 2023-08-04
 */
@Service
public class RuleSchedulingServiceImpl implements IRuleSchedulingService {
    @Autowired
    private RuleSchedulingMapper ruleSchedulingMapper;

    @Autowired
    private RuleSettingSchedulingService ruleSettingSchedulingService;

    @Autowired
    private RuleNumSettingService ruleNumSettingService;

    /**
     * 查询排班规则
     *
     * @param id 排班规则主键
     * @return 排班规则
     */
    @Override
    public RuleScheduling selectRuleSchedulingById(Long id) {
        return ruleSchedulingMapper.selectRuleSchedulingById(id);
    }

    /**
     * 查询排班规则列表
     *
     * @param ruleScheduling 排班规则
     * @return 排班规则
     */
    @Override
    public List<RuleScheduling> selectRuleSchedulingList(RuleScheduling ruleScheduling) {
        return ruleSchedulingMapper.selectRuleSchedulingList(ruleScheduling);
    }

    /**
     * 新增排班规则
     *
     * @param ruleScheduling 排班规则
     * @return 结果
     */
    @Override
    public int insertRuleScheduling(RuleScheduling ruleScheduling) {
        handleNewAddScheduling(ruleScheduling);
        String username = SecurityUtils.getUsername();
        ruleScheduling.setCreateBy(username);
        ruleScheduling.setUpdateBy(username);
        Date date = DateUtils.getNowDate();
        ruleScheduling.setCreateTime(date);
        ruleScheduling.setUpdateTime(date);
        ToolUtils.handleRuleScheduling(ruleScheduling);
        return ruleSchedulingMapper.insertRuleScheduling(ruleScheduling);
    }

    private void handleNewAddScheduling(RuleScheduling ruleScheduling) {
        // 如果没有分班则重置第一段后的规则
        if (NO_SEGMENTATION.equals(ruleScheduling.getSecondFlag())) {
            ruleScheduling.setSecondSignDayTomorrow(null);
            ruleScheduling.setSecondSignInWorkingRange(null);
            ruleScheduling.setSecondWorkSignInTime(null);
            ruleScheduling.setSecondQuittingSignInTime(null);
            ruleScheduling.setSecondSignInQuittingRange(null);
        }
    }

    /**
     * 修改排班规则
     *
     * @param ruleScheduling 排班规则
     * @return 结果
     */
    @Override
    public int updateRuleScheduling(RuleScheduling ruleScheduling) {
        handleNewAddScheduling(ruleScheduling);
        ruleScheduling.setUpdateTime(DateUtils.getNowDate());
        ruleScheduling.setUpdateBy(SecurityUtils.getUsername());
        ToolUtils.handleRuleScheduling(ruleScheduling);
        return ruleSchedulingMapper.updateRuleScheduling(ruleScheduling);
    }

    /**
     * 批量删除排班规则
     *
     * @param ids 需要删除的排班规则主键
     * @return 结果
     */
    @Override
    public int deleteRuleSchedulingByIds(Long[] ids) {
        // TODO 检查是否有做绑定
        LambdaQueryWrapper<RuleSettingScheduling> qw = new LambdaQueryWrapper<>();
        qw.in(RuleSettingScheduling::getRuleSchedulingId, Arrays.asList(ids));
        List<RuleSettingScheduling> list = ruleSettingSchedulingService.list(qw);
        if (CollectionUtil.isEmpty(list)) {
            return ruleSchedulingMapper.deleteRuleSchedulingByIds(ids);
        }
        String prompt = "";
        List<Integer> settingIds = list.stream().map(RuleSettingScheduling::getSettingId).distinct().collect(Collectors.toList());
        List<RuleNumSetting> settingList = ruleNumSettingService.listByIds(settingIds);
        for (RuleNumSetting setting : settingList) {
            prompt = prompt + setting.getRuleDictName()+ "、";
        }
        throw new RuntimeException("排班规则已班次名称为:" + prompt.replaceFirst("、$", "") + "等班次绑定,请在排班设置中解绑后删除!");
    }

    /**
     * 删除排班规则信息
     *
     * @param id 排班规则主键
     * @return 结果
     */
    @Override
    public int deleteRuleSchedulingById(Long id) {
        return ruleSchedulingMapper.deleteRuleSchedulingById(id);
    }

    @Override
    public List<RuleSchedulingVo> selectRuleSchedulingListVo(RuleScheduling ruleScheduling) {
        List<RuleScheduling> list = ruleSchedulingMapper.selectRuleSchedulingList(ruleScheduling);
        return handleRuleScheduling(list);
    }

    @Override
    public List<RuleSchedulingResponseVo> handleResponseRuleSchedulingList(List<RuleScheduling> list) {
        return list.stream()
                .map(item -> {
                    RuleSchedulingResponseVo vo = new RuleSchedulingResponseVo();
                    BeanUtils.copyProperties(item, vo);
                    vo.setRangeTime(handleRuleSchedulingRangeTime(item));
                    return vo;
                })
                .collect(Collectors.toList());
    }

    @Override
    public List<RuleSchedulingVo> selectRuleSchedulingListVoBySettingId(Integer settingId) {
        List<RuleScheduling> list = ruleSchedulingMapper.selectRuleSchedulingListVoBySettingId(settingId);
        return handleRuleScheduling(list);
    }

    @Override
    public List<RuleSchedulingDto> selectRuleSchedulingListVoBySettingIds(List<Integer> settingList) {
        if (CollectionUtil.isEmpty(settingList)) {
            return new ArrayList<>();
        }
        return ruleSchedulingMapper.selectRuleSchedulingListVoBySettingIds(settingList);
    }

    @Override
    public void deletePeopleSchedule(String startDate, String endDate, List<String> jobCode) {
        ruleSchedulingMapper.deletePeopleSchedule(startDate, endDate, jobCode);
    }

    @Override
    public List<AttendanceDto> getPeopleListByJobCodes(List<String> jobCode) {
        return ruleSchedulingMapper.getPeopleListByJobCodes(jobCode);
    }

    public static List<RuleSchedulingVo> handleRuleScheduling(List<RuleScheduling> list) {
        if (CollectionUtil.isEmpty(list)) {
            return null;
        }

        // 处理返回数据
        return list
                .stream()
                .map(item -> {
                    RuleSchedulingVo vo = new RuleSchedulingVo();
                    vo.setRuleName(item.getRuleName());
                    vo.setId(item.getId());
                    if (item.getRuleName().equals(FREE.getDescription())) {
                        return vo;
                    }
                    vo.setRangeTime(handleRuleSchedulingRangeTime(item));
                    return vo;
                })
                .collect(Collectors.toList());

    }

    public static String handleRuleSchedulingRangeTime(RuleScheduling item) {
        // 处理存在分段的数据
        if (HAVE_SEGMENTATION.equals(item.getSecondFlag())) {
            return handleSegmentation(item);
        }
        // 处理不存在分段的数据
        else {
            return handleNoSegmentation(item);
        }
    }

    private static String handleNoSegmentation(RuleScheduling item) {
        // 处理不隔天的情况
        if (TOMORROW_NO.equals(item.getFirstSignInDayTomorrow())) {
            return transformTimeType(item.getFirstWorkSignInTime()) + TOMORROW_NO_STRING + transformTimeType(item.getFirstQuittingSignInTime());
        }
        // 隔天
        else {
            return transformTimeType(item.getFirstWorkSignInTime()) + TOMORROW_YES_STRING + transformTimeType(item.getFirstQuittingSignInTime());
        }
    }

    private static String handleSegmentation(RuleScheduling item) {
        // 隔天
        String firstRangeTimeString = handleNoSegmentation(item);
        String secondRangeTimeString = handleHaveSegmentation(item);
        return firstRangeTimeString + ";" + secondRangeTimeString;
    }

    private static String handleHaveSegmentation(RuleScheduling item) {
        // 处理不隔天的情况
        if (TOMORROW_NO.equals(item.getSecondSignDayTomorrow())) {
            return transformTimeType(item.getSecondWorkSignInTime()) + TOMORROW_NO_STRING + transformTimeType(item.getSecondQuittingSignInTime());
        }
        // 隔天
        else {
            return transformTimeType(item.getSecondWorkSignInTime()) + TOMORROW_YES_STRING + transformTimeType(item.getSecondQuittingSignInTime());
        }
    }

    private static String transformTimeType(Date time) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");
        return simpleDateFormat.format(time);
    }
}