k94314517
2024-06-19 625d5a9ec613dac0ef1d96e7ebfb90b9350ffa2f
git ch
已添加1个文件
已修改6个文件
207 ■■■■■ 文件已修改
server/service/src/main/java/com/doumee/core/utils/Constants.java 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/core/utils/DateUtil.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/business/model/ApplyChagneDetail.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/business/model/ApplyDetail.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/business/vo/ChangeDealTypeVO.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/ApplyChangeServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/core/utils/Constants.java
@@ -4,7 +4,9 @@
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.dao.business.dto.CountCyclePriceDTO;
import com.doumee.dao.business.model.ApplyDetail;
import com.doumee.dao.business.model.Solutions;
import com.doumee.dao.business.vo.ChangeDealTypeVO;
import com.doumee.dao.business.vo.CountCyclePriceVO;
import io.swagger.models.auth.In;
import org.apache.commons.collections4.CollectionUtils;
@@ -229,12 +231,124 @@
        return countCyclePriceVO;
    }
    //查询每个批改周期费用
    public static BigDecimal calculateSingleCycleFee(Solutions solutions,Date startTime){
        if(Constants.equalsInteger(solutions.getTimeUnit(),solutions.getInsureCycleUnit())){
            return solutions.getPrice();
        }
        CountCyclePriceVO countCyclePriceVO = Constants.countPriceVO(startTime,solutions);
        //单计费周期的费用
        BigDecimal singleFee = Constants.singleCycleFee(solutions,startTime,countCyclePriceVO.getEndDate());
        return singleFee;
    }
    /**
     * åŠ å‡ä¿ä¸šåŠ¡ä½¿ç”¨
     * æ ¹æ®æ–¹æ¡ˆã€å¼€å§‹/结束日期
     * åˆ¤æ–­æ˜¯å¦å¤„于 å‘¨æœŸèŠ‚ç‚¹
     * ç»“束日期 å…¥çš„æ—¥æœŸä¸ºæ‰¹å•日期 å‰ä¸€å¤© 23:59:59
     * @param solutions
     * @param startTime
     * @param endTime
     * @return 0=无周期费用;1=有周期费用;2无周期费用 ä¸” æ•°æ®æ ‡è®°æ— æ•ˆ
     */
    public void calculateRetreatCost(){
    public static ChangeDealTypeVO calculateRetreatCost(Solutions solutions , Date startTime , Date endTime){
        ChangeDealTypeVO changeDealTypeVO = new ChangeDealTypeVO();
        //查询每个周期的费用
        changeDealTypeVO.setSinglePrice(Constants.calculateSingleCycleFee(solutions,startTime));
        //批单日期为开始日期的第一天 åˆ™æ ‡è®°æ˜Žç»†è®°å½•为 æ— æ•ˆæ•°æ® æˆ–者 å¼€å§‹æ—¶é—´å¤§äºŽå½“前时间 ç›´æŽ¥è¿”回 æ•°æ®æ ‡è®°æ— æ•ˆ
        if(startTime.getTime()>endTime.getTime()
        || startTime.getTime() > System.currentTimeMillis()){
            changeDealTypeVO.setChangeStatus(Constants.TWO);
            return changeDealTypeVO;
        }
        //获取昨日日期结束  ä¸ºå®žé™…减保结束日期·
        Boolean isOver = true;
        if(solutions.getInsureCycleUnit().equals(InsureCycleUnit.DAY.getValue())){
            //方案 è®¡è´¹å‘¨æœŸå’Œæ‰¹æ”¹å‘¨æœŸ ç›¸åŒ ç›´æŽ¥è¿”回 æœ‰å‘¨æœŸè´¹ç”¨
            changeDealTypeVO.setChangeStatus(Constants.ONE);
            return changeDealTypeVO;
        }else if(solutions.getInsureCycleUnit().equals(InsureCycleUnit.HALF_MONTH.getValue())){
            //半月周期 ä»¥15.5计算 ç”±äºŽ15.5 æ— æ³•整除 æ‰€ä»¥éœ€è¦ç‰¹æ®Šå¤„理
            //奇数/偶数 ç”¨äºŽæ·»åŠ å¤©æ•° å¦‚果是奇数
            BigDecimal cycleHalfMonth = new BigDecimal(15.5);
            Integer cycle = 1;
            while(isOver){
                //获取周期后的结束时间 å¸¦æ—¶åˆ†ç§’ 23:59:59
                Date cycleEndTime =   DateUtil.getMontageDate(DateUtil.afterDateByType(startTime,0,  cycleHalfMonth.multiply(new BigDecimal(cycle)).setScale(2,RoundingMode.HALF_UP).intValue()
                ),2);
                if(cycleEndTime.getTime()>=endTime.getTime()){
                    isOver = false;
                    //当计费周期的结束日期 åˆšå¥½ ä¸Žæ‰¹å•日期的结束日期相等 åˆ™ ä¸éœ€è¦æ‰£é™¤æ‰¹å•周期费用
                    if(cycleEndTime.getTime()==endTime.getTime()){
                        changeDealTypeVO.setChangeStatus(Constants.ZERO);
                    }else{
                        changeDealTypeVO.setChangeStatus(Constants.ONE);
                    }
                    return changeDealTypeVO;
                }
                cycle = cycle + 1;
            }
        }else if(solutions.getInsureCycleUnit().equals(InsureCycleUnit.MONTH.getValue())){
            //扣费周期为月
            Integer cycle = 1;
            while(isOver){
                //获取周期后的结束时间 å¸¦æ—¶åˆ†ç§’ 23:59:59
                Date cycleEndTime =  DateUtil.getMontageDate(DateUtil.afterDateByType(startTime,1,cycle),2);
                //当前周期 å¤§äºŽç­‰äºŽ æ‰¹å•结束日期时 ï¼Œ åˆ™ç»“束流程
                if(cycleEndTime.getTime()>=endTime.getTime()){
                    isOver = false;
                    //当计费周期的结束日期 åˆšå¥½ ä¸Žæ‰¹å•日期的结束日期相等 åˆ™ ä¸éœ€è¦æ‰£é™¤æ‰¹å•周期费用
                    if(cycleEndTime.getTime()==endTime.getTime()){
                        changeDealTypeVO.setChangeStatus(Constants.ZERO);
                    }else{
                        changeDealTypeVO.setChangeStatus(Constants.ONE);
                    }
                    return changeDealTypeVO;
                }
                cycle = cycle + 1;
            }
        }else if(solutions.getTimeUnit().equals(TimeUnit.QUARTER.getValue())){
            //扣费周期为季度
            Integer cycle = 3;
            while(isOver){
                //获取周期后的结束时间 å¸¦æ—¶åˆ†ç§’ 23:59:59
                Date cycleEndTime =  DateUtil.getMontageDate(DateUtil.afterDateByType(startTime,1,cycle),2);
                //当前周期 å¤§äºŽç­‰äºŽ æ‰¹å•结束日期时 ï¼Œ åˆ™ç»“束流程
                if(cycleEndTime.getTime()>=endTime.getTime()){
                    isOver = false;
                    //当计费周期的结束日期 åˆšå¥½ ä¸Žæ‰¹å•日期的结束日期相等 åˆ™ ä¸éœ€è¦æ‰£é™¤æ‰¹å•周期费用
                    if(cycleEndTime.getTime()==endTime.getTime()){
                        changeDealTypeVO.setChangeStatus(Constants.ZERO);
                    }else{
                        changeDealTypeVO.setChangeStatus(Constants.ONE);
                    }
                    return changeDealTypeVO;
                }
                cycle = cycle + 3;
            }
        }else if(solutions.getTimeUnit().equals(TimeUnit.HALF_YEAR.getValue())){
            //扣费周期为半年
            Integer cycle = 3;
            while(isOver){
                //获取周期后的结束时间 å¸¦æ—¶åˆ†ç§’ 23:59:59
                Date cycleEndTime =  DateUtil.getMontageDate(DateUtil.afterDateByType(startTime,1,cycle),2);
                //当前周期 å¤§äºŽç­‰äºŽ æ‰¹å•结束日期时 ï¼Œ åˆ™ç»“束流程
                if(cycleEndTime.getTime()>=endTime.getTime()){
                    isOver = false;
                    //当计费周期的结束日期 åˆšå¥½ ä¸Žæ‰¹å•日期的结束日期相等 åˆ™ ä¸éœ€è¦æ‰£é™¤æ‰¹å•周期费用
                    if(cycleEndTime.getTime()==endTime.getTime()){
                        changeDealTypeVO.setChangeStatus(Constants.ZERO);
                    }else{
                        changeDealTypeVO.setChangeStatus(Constants.ONE);
                    }
                    return changeDealTypeVO;
                }
                cycle = cycle + 3;
            }
        }
        throw new BusinessException(ResponseStatus.DATA_ERRO.getCode(),"计算批单周期信息异常");
    }
@@ -2234,6 +2348,35 @@
        }
    }
    public static BigDecimal singleCycleFee(Solutions solutions,Date startTime ,Date endTime){
        Integer countDays = DateUtil.daysBetweenDates(endTime, startTime) + 1;
        Constants.TimeUnit timeUnit = Constants.TimeUnit.getTimeUnit(solutions.getTimeUnit());
        BigDecimal fee = solutions.getPrice();
        if(solutions.getTimeUnit().equals(solutions.getInsureCycleUnit())){
            return fee;
        }else{
            if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.DAY.getValue())){
                //天为批改单位
                return fee.divide(new BigDecimal(countDays),2, RoundingMode.HALF_UP);
            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.HALF_MONTH.getValue())) {
                //根据投保周期 å®šä¹‰çš„ æ¯ä¸ªå‘¨æœŸ = X个 åŠæœˆå‘¨æœŸ è¿›è¡Œè®¡ç®—
                // æ€»é‡‘额 / æŠ•保周期定义的 åŠæœˆå‘¨æœŸæ•°
                return fee.divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.MONTH.getValue())) {
                // æ€»é‡‘额 / æŠ•保周期定义的 åŠæœˆå‘¨æœŸæ•° * 2
                return fee.multiply(new BigDecimal(2)).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.QUARTER.getValue())) {
                //季度为批改单位
                // æ€»é‡‘额  / æŠ•保周期定义的 åŠæœˆå‘¨æœŸæ•° * 6
                return fee.multiply(new BigDecimal(6)).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.HALF_YEAR.getValue())) {
                //半年为批改单位
                // æ€»é‡‘额 * äº§ç”Ÿè´¹ç”¨çš„周期 / æŠ•保周期定义的 åŠæœˆå‘¨æœŸæ•° * 6
                return fee.multiply(new BigDecimal(12)).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
            }else {
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"方案配置错误");
            }
        }
    }
}
server/service/src/main/java/com/doumee/core/utils/DateUtil.java
@@ -3151,7 +3151,6 @@
    public static void main(String[] args) {
    }
    /**
server/service/src/main/java/com/doumee/dao/business/model/ApplyChagneDetail.java
@@ -103,6 +103,8 @@
    @ApiModelProperty(value = "单价(每日)", example = "1")
    private BigDecimal price;
    @ApiModelProperty(value = "替换业务:减保数据减少的金额", example = "1")
    private BigDecimal reduceMoney;
    @ApiModelProperty(value = "员工名称")
    @TableField(exist = false)
server/service/src/main/java/com/doumee/dao/business/model/ApplyDetail.java
@@ -116,7 +116,7 @@
//    @ExcelColumn(name="当前费用")
    private Integer reduceId;
    @ApiModelProperty(value = "加减保数据状态:0=正常;1=不可减保")
    @ApiModelProperty(value = "加减保数据状态:0=正常;1=不可减保;2=减保已取消")
//    @ExcelColumn(name="当前费用")
    private Integer changeStatus;
server/service/src/main/java/com/doumee/dao/business/vo/ChangeDealTypeVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.doumee.dao.business.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
 * åŠ å‡ä¿ä¸šåŠ¡ å¤„理减保数据使用
 * @author RenKang
 */
@Data
public class ChangeDealTypeVO {
    @ApiModelProperty(value = "单周期费用", example = "1")
    private BigDecimal singlePrice;
    @ApiModelProperty(value = "减保数据状态:0=正常;1=不可减保;2=减保已取消")
    private Integer changeStatus;
}
server/service/src/main/java/com/doumee/service/business/impl/ApplyChangeServiceImpl.java
@@ -17,6 +17,7 @@
import com.doumee.dao.business.dto.*;
import com.doumee.dao.business.join.*;
import com.doumee.dao.business.model.*;
import com.doumee.dao.business.vo.ChangeDealTypeVO;
import com.doumee.dao.business.vo.CountCyclePriceVO;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.service.business.ApplyChangeService;
@@ -685,6 +686,7 @@
                            .set(ApplyDetail::getEndTime, delValidTime)
                            .set(ApplyDetail::getEditor, update.getEditor())
                            .set(ApplyDetail::getEditDate, update.getEditDate())
                            .eq(ApplyDetail::getId, oldModel.getId())
                    );
                    totalFee = totalFee.add(updateFee).subtract(oldModel.getFee());
@@ -703,12 +705,6 @@
                            .set( ApplyChagneDetail::getEndTime, delValidTime)
                            .eq(ApplyChagneDetail::getId,detail.getId())
                    );
//                if(1==1){
//                    throw new BusinessException(ResponseStatus.SERVER_ERROR);
//                }
            }
            member.setApplyId(update.getApplyId());
@@ -1219,6 +1215,7 @@
            applyChagneDetail.setApplyDetailId(applyDetail.getId());
            applyChagneDetail.setStartTime(applyDetail.getStartTime());
            applyChagneDetail.setEndTime(endTime);
            applyChagneDetail.setReduceMoney(BigDecimal.ZERO);
            member.setApplyId(insuranceApply.getId());
            member.setDuId(applyChagneDetail.getDuId());
@@ -1229,6 +1226,7 @@
            //查询减保日期
//            Integer delDays = DateUtil.daysBetweenDates(applyDetail.getEndTime(),endTime);
//            ;
            //查询周期数量
            applyChagneDetail.setFee(
                    Constants.reduceFee(solutions,
@@ -1239,6 +1237,11 @@
                                    applyDetail.getStartTime(),endTime)
                            .subtract(applyDetail.getFee()
            ));
            //如果是减保业务为仅替换 ä¸” æ–¹æ¡ˆçš„æ‰£è´¹å‘¨æœŸå’Œæ€»å‘¨æœŸç›¸ç­‰ åˆ™å¤„理减保费用
            if(Constants.equalsInteger(solutions.getDelOnlyReplace(),Constants.ONE)
             && Constants.equalsInteger(solutions.getTimeUnit(),solutions.getInsureCycleUnit())){
                applyChagneDetail.setReduceMoney(solutions.getPrice().multiply(new BigDecimal(-1)));
            }
            applyChagneDetailJoinMapper.insert(applyChagneDetail);
        }
    }
server/service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -385,11 +385,11 @@
        if(dataList == null || dataList.size() ==0){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,录入数据为空!");
        }
        List<String> idCardList = dataList.stream().map(m->m.getIdCard()).collect(Collectors.toList());
        Set<String> set = new HashSet<>(idCardList);
        if(idCardList.size() != set.size()){
            throw new BusinessException(ResponseStatus.DATA_ERRO.getCode(),"对不起,录入数据存在身份证号相同数据!");
        }
//        List<String> idCardList = dataList.stream().map(m->m.getIdCard()).collect(Collectors.toList());
//        Set<String> set = new HashSet<>(idCardList);
//        if(idCardList.size() != set.size()){
//            throw new BusinessException(ResponseStatus.DATA_ERRO.getCode(),"对不起,录入数据存在身份证号相同数据!");
//        }
        List<DispatchUnit> dispatchUnitList = new ArrayList<>();
        if(!Objects.isNull(solutionId)){
            dispatchUnitList  = dispatchUnitJoinMapper.selectJoinList(DispatchUnit.class,
@@ -416,6 +416,7 @@
            }
        }
        long index = Constants.TWO;
        Map<String,String> idCardMap = new HashMap<>();
        for(MemberImport model : dataList){
            if(StringUtils.isBlank(model.getIdCard())||model.getIdCard().length()!=18){
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第"+index+"行数据身份证信息异常!");
@@ -426,6 +427,10 @@
            if(StringUtils.isBlank(model.getName())){
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第"+index+"行数据姓名信息异常!");
            }
            if(Objects.nonNull(idCardMap.get(model.getIdCard()))){
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第"+index+"行数据身份证号【"+model.getIdCard()+"】存在相同数据!");
            }
            idCardMap.put(model.getIdCard(), model.getIdCard());
            index = index + Constants.ONE;
            if(CollectionUtils.isNotEmpty(list)){
                Optional<Member>  memberOptional= list.stream().filter(m->m.getIdcardNo().equals(model.getIdCard())).findFirst();