ソースを参照

试车检查新增接口 -> 计算计算试车检查参数设置子表预估试车结束日期

wangxuan 9 ヶ月 前
コミット
a4fa96fb1e

+ 10 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/dao/ZhcxCommissionCheckParameterSetDetalDao.java

@@ -12,5 +12,15 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  * @since 2024-09-24
  */
 public interface ZhcxCommissionCheckParameterSetDetalDao extends BaseMapper<ZhcxCommissionCheckParameterSetDetalDo> {
+    /**
+     * 获取节假日管理中所有放假日期
+     * @return
+     */
+    String selectholidaydetail();
 
+    /**
+     * 获取节假日管理中所有不放假日期
+     * @return
+     */
+    String selectNotholidaydetail();
 }

+ 7 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/service/ZhcxCommissionCheckParameterSetDetalService.java

@@ -2,6 +2,7 @@ package com.rongwei.bscommon.sys.service;
 
 import com.rongwei.bsentity.domain.ZhcxCommissionCheckParameterSetDetalDo;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.rongwei.rwcommon.base.R;
 
 /**
  * <p>
@@ -13,4 +14,10 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface ZhcxCommissionCheckParameterSetDetalService extends IService<ZhcxCommissionCheckParameterSetDetalDo> {
 
+    /**
+     * 计算试车检查参数设置子表预估试车结束日期
+     * @param masterId 试车主表id
+     * @return
+     */
+    R computeCheckParameterSetDetalEstimatedenddate(String masterId);
 }

+ 128 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ZhcxCommissionCheckParameterSetDetalServiceImpl.java

@@ -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;
+    }
+
 }

+ 17 - 0
business-common/src/main/resources/mybatis/business/ZhcxCommissionCheckParameterSetDetalDao.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.rongwei.bscommon.sys.dao.ZhcxCommissionCheckParameterSetDetalDao">
+
+
+    <select id="selectholidaydetail" resultType="java.lang.String">
+        SELECT LISTAGG(REALDAYS, ',') WITHIN GROUP (ORDER BY REALDAYS) AS COMBINED_DAYS
+        FROM ZHCX_COMMISSION_HOLIDAY_DETAIL detail
+        WHERE DELETED = '0' AND "TYPE" = 'n'
+    </select>
+    <select id="selectNotholidaydetail" resultType="java.lang.String">
+        SELECT LISTAGG(REALDAYS, ',') WITHIN GROUP (ORDER BY REALDAYS) AS COMBINED_DAYS
+        FROM ZHCX_COMMISSION_HOLIDAY_DETAIL detail
+        WHERE DELETED = '0' AND "TYPE" = 'y'
+    </select>
+</mapper>

+ 20 - 0
business-server/src/main/java/com/rongwei/bsserver/controller/ZhcxCommissionCheckBaseInfoDetailController.java

@@ -2,9 +2,13 @@ package com.rongwei.bsserver.controller;
 
 
 import com.rongwei.bscommon.sys.service.ZhcxCommissionCheckBaseInfoDetailService;
+import com.rongwei.bscommon.sys.service.ZhcxCommissionCheckParameterSetDetalService;
 import com.rongwei.bsentity.domain.ZhcxCommissionCheckBaseInfoDetailDo;
+import com.rongwei.bsentity.dto.CheckDetailDTO;
 import com.rongwei.bsentity.dto.CommissionCheckChapterNoPulsDTO;
 import com.rongwei.rwcommon.base.R;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -21,6 +25,7 @@ import java.util.List;
  * @author wm
  * @since 2024-10-11
  */
+@Slf4j
 @RestController
 @RequestMapping("/zhcxCommissionCheckBaseInfoDetail")
 public class ZhcxCommissionCheckBaseInfoDetailController {
@@ -28,6 +33,9 @@ public class ZhcxCommissionCheckBaseInfoDetailController {
     @Autowired
     private ZhcxCommissionCheckBaseInfoDetailService service;
 
+    @Autowired
+    private ZhcxCommissionCheckParameterSetDetalService checkParameterSetDetalService;
+
     @PostMapping("/updateChapterNo")
     public R updateChapterNo(@RequestBody List<ZhcxCommissionCheckBaseInfoDetailDo> list){
         service.batchUpdate(list);
@@ -44,5 +52,17 @@ public class ZhcxCommissionCheckBaseInfoDetailController {
         service.batchUpdateChapterNoPuls(list);
         return R.ok();
     }
+
+    @PostMapping("computeCheckParameterSetDetalEstimatedenddate")
+    @ApiOperation("计算试车检查参数设置子表预估试车结束日期")
+    public R computeCheckParameterSetDetalEstimatedenddate(@RequestBody CheckDetailDTO detailDTO){
+        try {
+            log.info("进入接口:/zhcxCommissionCheck/computeCheckParameterSetDetalEstimatedenddate,入参:{}", detailDTO.getMasterId());
+            return checkParameterSetDetalService.computeCheckParameterSetDetalEstimatedenddate(detailDTO.getMasterId());
+        } catch (Exception e) {
+            log.info(String.valueOf(e));
+            return R.error("计算试车检查参数设置子表预估试车结束日期异常");
+        }
+    }
 }