RuleNumServiceImpl.java 5.18 KB
package com.ruoyi.num.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.pojo.dto.RuleNumDto;
import com.ruoyi.pojo.vo.RuleNumTemplateVo;
import com.ruoyi.pojo.vo.RuleNumVo;
import com.ruoyi.pojo.vo.SchedulingResponseVo;
import com.ruoyi.service.RuleNumSettingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.num.mapper.RuleNumMapper;
import com.ruoyi.num.domain.RuleNum;
import com.ruoyi.num.service.IRuleNumService;
import static com.ruoyi.common.RuleSchedulingProperties.*;

/**
 * 班次管理Service业务层处理
 * 
 * @author guzijian
 * @date 2023-08-03
 */
@Service
public class RuleNumServiceImpl implements IRuleNumService 
{
    @Autowired
    private RuleNumMapper ruleNumMapper;

    @Autowired
    private RuleNumSettingService ruleNumSettingService;

    /**
     * 查询班次管理
     * 
     * @param id 班次管理主键
     * @return 班次管理
     */
    @Override
    public RuleNum selectRuleNumById(Long id)
    {
        return ruleNumMapper.selectRuleNumById(id);
    }

    /**
     * 查询班次管理列表
     * 
     * @param ruleNum 班次管理
     * @return 班次管理
     */
    @Override
    public List<RuleNum> selectRuleNumList(RuleNum ruleNum)
    {
        return ruleNumMapper.selectRuleNumList(ruleNum);
    }

    /**
     * 新增班次管理
     * 
     * @param ruleNum 班次管理
     * @return 结果
     */
    @Override
    public int insertRuleNum(RuleNum ruleNum)
    {
        String username = SecurityUtils.getUsername();
        ruleNum.setCreateBy(username);
        ruleNum.setUpdateBy(username);
        ruleNum.setCreateTime(DateUtils.getNowDate());
        ruleNum.setUpdateTime(DateUtils.getNowDate());
        return ruleNumMapper.insertRuleNum(ruleNum);
    }

    /**
     * 修改班次管理
     * 
     * @param ruleNum 班次管理
     * @return 结果
     */
    @Override
    public int updateRuleNum(RuleNum ruleNum)
    {
        ruleNum.setUpdateTime(DateUtils.getNowDate());
        ruleNum.setUpdateBy(ruleNum.getUpdateBy());
        return ruleNumMapper.updateRuleNum(ruleNum);
    }

    /**
     * 批量删除班次管理
     * 
     * @param ids 需要删除的班次管理主键
     * @return 结果
     */
    @Override
    public int deleteRuleNumByIds(Long[] ids)
    {
        // TODO 检查改班次是被使用 使用后提示
        List<SchedulingResponseVo> list = ruleNumSettingService.getSchedulingListById(ids);
        if (CollectionUtil.isEmpty(list)){
            return ruleNumMapper.deleteRuleNumByIds(ids);
        }
        throw new RuntimeException("班次正在被使用,请在排班设置中解绑该班次!");
    }

    /**
     * 删除班次管理信息
     * 
     * @param id 班次管理主键
     * @return 结果
     */
    @Override
    public int deleteRuleNumById(Long id)
    {
        return ruleNumMapper.deleteRuleNumById(id);
    }

    @Override
    public RuleNumVo getRuleNumBySettingId(Integer settingId) {
        RuleNum ruleNum = ruleNumMapper.listNumBySettingId(settingId);
        RuleNumVo vo = new RuleNumVo();
        BeanUtil.copyProperties(ruleNum,vo);
        // 当为固定规则时
        if (RULE_TYPE_FIXED.equals(ruleNum.getRuleType())) {
            vo.setTemplateVos(handleFixedTemplate(ruleNum));
        }
        // 处理按星期
        else {
            vo.setTemplateVos(handleWeekTemplate(ruleNum));
        }
        // 模板
        return vo;
    }

    @Override
    public List<RuleNumDto> selectRuleNumBySettingId(List<Integer> settingList) {
        return ruleNumMapper.selectRuleNumBySettingId(settingList);
    }

    private List<RuleNumTemplateVo> handleWeekTemplate(RuleNum ruleNum) {
        String[] strings = ruleNum.getRuleWeek().split(",");
        Map<Integer, Integer> weeks = Stream.of(strings).collect(Collectors.toMap(s -> Integer.parseInt(s), s -> Integer.parseInt(s)));
        List<RuleNumTemplateVo> vos = new ArrayList<>(7);
        for (int i = 1; i <= 7; i++) {
            Integer integer = weeks.get(i);
            if (Objects.isNull(integer)) {
                vos.add(getRuleNumTemplateVo(i, false));
            } else {
                vos.add(getRuleNumTemplateVo(integer, true));
            }
        }
        return vos;
    }

    private RuleNumTemplateVo getRuleNumTemplateVo(Integer serialNumber, Boolean workFlag) {
        RuleNumTemplateVo vo = new RuleNumTemplateVo();
        vo.setSerialNumber(serialNumber);
        vo.setType(workFlag ? WORK_FLAG : FREE_FLAG);
        return vo;
    }


    private List<RuleNumTemplateVo> handleFixedTemplate(RuleNum ruleNum) {
        int countDay = ruleNum.getWorkDay() + ruleNum.getFreeDay();
        List<RuleNumTemplateVo> vos = new ArrayList<>(countDay);
        for (int i = 1; i <= countDay; i++) {
            vos.add(getRuleNumTemplateVo(i, i <= ruleNum.getWorkDay()));
        }
        return vos;
    }
}