| | |
| | | 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; |
| | |
| | | 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(),"è®¡ç®æ¹åå¨æä¿¡æ¯å¼å¸¸"); |
| | | |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | 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(),"æ¹æ¡é
ç½®é误"); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |