|
@@ -1,11 +1,26 @@
|
|
|
package com.rongwei.bscommon.sys.service.impl;
|
|
|
|
|
|
+import cn.hutool.core.date.DateTime;
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
+import cn.hutool.core.date.Week;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.rongwei.bsentity.domain.ZhcxCommissionCheckParameterSetDetalDo;
|
|
|
import com.rongwei.bscommon.sys.dao.ZhcxCommissionCheckParameterSetDetalDao;
|
|
|
import com.rongwei.bscommon.sys.service.ZhcxCommissionCheckParameterSetDetalService;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.rongwei.rwcommon.base.R;
|
|
|
+import com.rongwei.rwcommon.base.exception.CustomException;
|
|
|
+import com.rongwei.rwcommon.utils.StringUtils;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+import java.util.StringJoiner;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
/**
|
|
|
* <p>
|
|
|
* 试车检查参数设置子表 服务实现类
|
|
@@ -14,7 +29,120 @@ import org.springframework.stereotype.Service;
|
|
|
* @author xuan
|
|
|
* @since 2024-09-24
|
|
|
*/
|
|
|
+@Slf4j
|
|
|
@Service
|
|
|
public class ZhcxCommissionCheckParameterSetDetalServiceImpl extends ServiceImpl<ZhcxCommissionCheckParameterSetDetalDao, ZhcxCommissionCheckParameterSetDetalDo> implements ZhcxCommissionCheckParameterSetDetalService {
|
|
|
|
|
|
+ @Override
|
|
|
+ public R computeCheckParameterSetDetalEstimatedenddate(String masterId) {
|
|
|
+ if(StringUtils.isEmpty(masterId)){
|
|
|
+ return R.error("试车主表ID不能为空");
|
|
|
+ }
|
|
|
+ LambdaQueryWrapper<ZhcxCommissionCheckParameterSetDetalDo> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ queryWrapper.eq(ZhcxCommissionCheckParameterSetDetalDo::getDeleted,"0")
|
|
|
+ .eq(ZhcxCommissionCheckParameterSetDetalDo::getCheckid,masterId);
|
|
|
+ List<ZhcxCommissionCheckParameterSetDetalDo> list = this.list(queryWrapper);
|
|
|
+ if (list.size() != 1){
|
|
|
+ return R.error("试车参数数据异常");
|
|
|
+ }
|
|
|
+ ZhcxCommissionCheckParameterSetDetalDo parameterSetDetalDo = list.get(0);
|
|
|
+ // 剩余天数 = 难度系数*预估剩余天数
|
|
|
+ if(StringUtils.isEmpty(parameterSetDetalDo.getDifficultyfactor())){
|
|
|
+ parameterSetDetalDo.setDifficultyfactor("1");
|
|
|
+ }
|
|
|
+ if(StringUtils.isEmpty(parameterSetDetalDo.getEstimateddaynum())){
|
|
|
+ return R.ok("预估剩余天数为空");
|
|
|
+ }
|
|
|
+ int dayNum = 0;
|
|
|
+ try {
|
|
|
+ double difficultyFactor = Double.parseDouble(parameterSetDetalDo.getDifficultyfactor());
|
|
|
+ double estimatedDayNum = Double.parseDouble(parameterSetDetalDo.getEstimateddaynum());
|
|
|
+ dayNum = (int) Math.ceil(difficultyFactor * estimatedDayNum);
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
+ // 处理异常,记录日志
|
|
|
+ e.printStackTrace();
|
|
|
+ return R.error("计算剩余天数异常");
|
|
|
+ }
|
|
|
+ // 选择的加班日期 (周日,周六,节假日)
|
|
|
+ String selectdate = parameterSetDetalDo.getSelectdate();
|
|
|
+ // 计算预估试车结束日期
|
|
|
+ String actualDate = computeEstimatedenddate(dayNum, selectdate);
|
|
|
+ // 更新操作
|
|
|
+ parameterSetDetalDo.setEstimatedenddate(DateUtil.parse(actualDate));
|
|
|
+ this.updateById(parameterSetDetalDo);
|
|
|
+ return R.ok(actualDate);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 计算实际偏转日期
|
|
|
+ private String computeEstimatedenddate(int dayNum,String selectdate){
|
|
|
+ // 是否周六上班 (周日,周六,节假日)
|
|
|
+ boolean workInSaturDays = selectdate.contains("周六");
|
|
|
+ // 是否周日上班
|
|
|
+ boolean workInSunDays = selectdate.contains("周日");
|
|
|
+ // 是否节假日上班
|
|
|
+ boolean workInHoliday = selectdate.contains("节假日");
|
|
|
+ // 实际偏转天数
|
|
|
+ int actualDayNum = 0;
|
|
|
+ // 实际上班的日期
|
|
|
+ List<String> actualDayList = new ArrayList<>();
|
|
|
+ // 拿到放假的日期
|
|
|
+ String selectholidaydetail = baseMapper.selectholidaydetail();
|
|
|
+ // 拿到上班的日期
|
|
|
+ String selectNotholidaydetail = baseMapper.selectNotholidaydetail();
|
|
|
+ Date baseDate = new Date();
|
|
|
+ while (actualDayList.size() != dayNum){
|
|
|
+ // 拿到第一次偏转的日期
|
|
|
+ DateTime dateTime = DateUtil.offsetDay(baseDate, actualDayNum);
|
|
|
+ String dateString = new SimpleDateFormat("yyyy-MM-dd").format(dateTime);
|
|
|
+ // 判断是否为节假日 并且节假日不上班
|
|
|
+ if(selectholidaydetail.contains(dateString) && workInHoliday){
|
|
|
+ actualDayList.add(dateString);
|
|
|
+ actualDayNum++;
|
|
|
+ continue;
|
|
|
+ }else if(selectholidaydetail.contains(dateString) && !workInHoliday){
|
|
|
+ actualDayNum++;
|
|
|
+ continue;
|
|
|
+ } else if(isSATURDAY(dateTime) && workInSaturDays){
|
|
|
+ actualDayList.add(dateString);
|
|
|
+ actualDayNum++;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 判断是否为周日 并且周日不上班
|
|
|
+ else if(isSUNDAY(dateTime) && workInSunDays){
|
|
|
+ actualDayList.add(dateString);
|
|
|
+ actualDayNum++;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 判断该天是否因为调休去上班
|
|
|
+ else if(selectNotholidaydetail.contains(dateString)){
|
|
|
+ actualDayList.add(dateString);
|
|
|
+ actualDayNum++;
|
|
|
+ continue;
|
|
|
+ } else if(!isSATURDAY(dateTime) && !isSUNDAY(dateTime)){
|
|
|
+ actualDayList.add(dateString);
|
|
|
+ actualDayNum++;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ actualDayNum++;
|
|
|
+ }
|
|
|
+ if(actualDayList.isEmpty()){
|
|
|
+ // 抛出异常
|
|
|
+ throw new CustomException("计算实际偏转日期异常");
|
|
|
+ }
|
|
|
+ log.info("实际上要上班的日期为:{}",actualDayList.stream().collect(Collectors.joining(", ")));
|
|
|
+ // 返回最后一个日期
|
|
|
+ return actualDayList.get(actualDayList.size()-1);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 是否为周六
|
|
|
+ private static boolean isSATURDAY(Date date) {
|
|
|
+ final Week week = DateUtil.dayOfWeekEnum(date);
|
|
|
+ return Week.SATURDAY == week;
|
|
|
+ }
|
|
|
+ // 是否为周日
|
|
|
+ private static boolean isSUNDAY(Date date) {
|
|
|
+ final Week week = DateUtil.dayOfWeekEnum(date);
|
|
|
+ return Week.SUNDAY == week;
|
|
|
+ }
|
|
|
+
|
|
|
}
|