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

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

import cn.hutool.core.collection.CollectionUtil;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.pojo.dto.RuleSchedulingDto;
import com.ruoyi.pojo.vo.RuleSchedulingResponseVo;
import com.ruoyi.pojo.vo.RuleSchedulingVo;
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;

    /**
     * 查询排版规则
     *
     * @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);
        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());
        return ruleSchedulingMapper.updateRuleScheduling(ruleScheduling);
    }

    /**
     * 批量删除排版规则
     *
     * @param ids 需要删除的排版规则主键
     * @return 结果
     */
    @Override
    public int deleteRuleSchedulingByIds(Long[] ids) {
        return ruleSchedulingMapper.deleteRuleSchedulingByIds(ids);
    }

    /**
     * 删除排版规则信息
     *
     * @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);
    }

    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);
    }
}