From 7a488e4a100646b65dce0493bd417e68284e0179 Mon Sep 17 00:00:00 2001 From: haozq <1611483981@qq.com> Date: Wed, 11 Feb 2026 10:25:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=BD=A6=E8=BE=86=E7=BB=93?= =?UTF-8?q?=E7=AE=97=E9=87=91=E9=A2=9D=20=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CarBalanceController.java | 1 - .../controller/CarPlanAuditController.java | 2 +- .../backstage/entity/CarBalancePlanVo.java | 7 + .../entity/CarSltApplyDetailsVo.java | 8 + .../service/CarBalanceServiceImpl.java | 2 +- .../config/DataConfigScheduleConfig.java | 232 +++++++++++++++++- 6 files changed, 248 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/bonus/gzcar/business/backstage/controller/CarBalanceController.java b/src/main/java/com/bonus/gzcar/business/backstage/controller/CarBalanceController.java index c7a48fd..6b7b740 100644 --- a/src/main/java/com/bonus/gzcar/business/backstage/controller/CarBalanceController.java +++ b/src/main/java/com/bonus/gzcar/business/backstage/controller/CarBalanceController.java @@ -90,7 +90,6 @@ public class CarBalanceController { @DecryptAndVerify(decryptedClass = CarPlanOutVoDetailsVo.class) public ServerResponse> getPayCarDetails(EncryptedReq dto) { List list = service.getPayCarDetails(dto.getData()); - ; return ServerResponse.createSuccess(list); } diff --git a/src/main/java/com/bonus/gzcar/business/backstage/controller/CarPlanAuditController.java b/src/main/java/com/bonus/gzcar/business/backstage/controller/CarPlanAuditController.java index 8af7ae8..64cce77 100644 --- a/src/main/java/com/bonus/gzcar/business/backstage/controller/CarPlanAuditController.java +++ b/src/main/java/com/bonus/gzcar/business/backstage/controller/CarPlanAuditController.java @@ -69,7 +69,7 @@ public class CarPlanAuditController { CarNeedPlanExportVo copy = new CarNeedPlanExportVo(); BeanUtils.copyProperties(vo, copy); copy.setSubTime(vo.getCreateTime()); - vo.setXh(num[0]); + copy.setXh(num[0]); num[0]++; exportVos.add(copy); }); diff --git a/src/main/java/com/bonus/gzcar/business/backstage/entity/CarBalancePlanVo.java b/src/main/java/com/bonus/gzcar/business/backstage/entity/CarBalancePlanVo.java index 18f3d9b..12f3199 100644 --- a/src/main/java/com/bonus/gzcar/business/backstage/entity/CarBalancePlanVo.java +++ b/src/main/java/com/bonus/gzcar/business/backstage/entity/CarBalancePlanVo.java @@ -3,6 +3,7 @@ package com.bonus.gzcar.business.backstage.entity; import com.bonus.gzcar.business.system.entity.ParentVo; import lombok.Data; +import org.apache.poi.hpsf.Decimal; import java.lang.ref.PhantomReference; @@ -77,4 +78,10 @@ public class CarBalancePlanVo extends ParentVo { private String auditType; + private String contractId; + /** + * 重新计算金额 + */ + private Decimal newMoney; + } diff --git a/src/main/java/com/bonus/gzcar/business/backstage/entity/CarSltApplyDetailsVo.java b/src/main/java/com/bonus/gzcar/business/backstage/entity/CarSltApplyDetailsVo.java index f62e897..b5f69ea 100644 --- a/src/main/java/com/bonus/gzcar/business/backstage/entity/CarSltApplyDetailsVo.java +++ b/src/main/java/com/bonus/gzcar/business/backstage/entity/CarSltApplyDetailsVo.java @@ -66,6 +66,14 @@ public class CarSltApplyDetailsVo { * 实际天数 */ private int exeDay; + /** + * 公里数 + */ + private String gls; + /** + * 天数 + */ + private int useDay; /** * 实际公里数 */ diff --git a/src/main/java/com/bonus/gzcar/business/backstage/service/CarBalanceServiceImpl.java b/src/main/java/com/bonus/gzcar/business/backstage/service/CarBalanceServiceImpl.java index 1bcc70b..f413419 100644 --- a/src/main/java/com/bonus/gzcar/business/backstage/service/CarBalanceServiceImpl.java +++ b/src/main/java/com/bonus/gzcar/business/backstage/service/CarBalanceServiceImpl.java @@ -812,7 +812,7 @@ public class CarBalanceServiceImpl implements CarBalanceService { return BigDecimal.ZERO; // 或者 return null,看业务 } try { - return new BigDecimal(value.trim()).setScale(2, RoundingMode.HALF_UP); + return new BigDecimal(value.trim()).setScale(3, RoundingMode.HALF_UP); } catch (NumberFormatException e) { throw new IllegalArgumentException("非法数字格式:" + value, e); } diff --git a/src/main/java/com/bonus/gzcar/business/config/DataConfigScheduleConfig.java b/src/main/java/com/bonus/gzcar/business/config/DataConfigScheduleConfig.java index 9ee9d14..014a474 100644 --- a/src/main/java/com/bonus/gzcar/business/config/DataConfigScheduleConfig.java +++ b/src/main/java/com/bonus/gzcar/business/config/DataConfigScheduleConfig.java @@ -1,9 +1,13 @@ package com.bonus.gzcar.business.config; -import com.bonus.gzcar.business.backstage.entity.CarNeedPlanVo; +import com.bonus.gzcar.business.backstage.entity.*; +import com.bonus.gzcar.business.backstage.mapper.CarBalanceMapper; import com.bonus.gzcar.business.backstage.mapper.DispatchCarMapper; import com.bonus.gzcar.business.backstage.mapper.SupDispatchCarMapper; +import com.bonus.gzcar.business.utils.ListHelpUtil; +import com.bonus.gzcar.manager.common.util.StringHelper; +import com.bonus.gzcar.manager.webResult.StringUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; @@ -11,7 +15,11 @@ import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.List; +import java.util.Map; +import java.util.Optional; /** * 数据矫正 @@ -24,6 +32,12 @@ public class DataConfigScheduleConfig { @Autowired private SupDispatchCarMapper mapper; + @Autowired + private CarBalanceMapper carBalanceMapper; + + @Autowired + private SupDispatchCarMapper supDispatchCarMapper; + @Autowired @@ -49,4 +63,220 @@ public class DataConfigScheduleConfig { log.error(e.getMessage(),e); } } + + @Scheduled(cron = "0 0 */6 * * ?") + public void updateMoney(){ + try{ + List list= mapper.getOutPlanList(); + //单个数据金额 + + for (CarPlanOutVo listVo : list) { + List detailsList=mapper.getOutDetailsList(listVo); + getContractMoney(detailsList,listVo.getPlanType(),listVo); + mapper.updateMoney(listVo); + } + }catch(Exception e){ + log.error(e.getMessage(),e); + } + } + + + /** + * 计算金额 + * @param list + * @param planType + * @param outVo + */ + private void getContractMoney(List list, int planType, CarPlanOutVo outVo) { + BigDecimal allMoney = new BigDecimal(0); + for (CarSltApplyDetailsVo vo : list) { + StringBuilder sb = new StringBuilder(); + BigDecimal cost = new BigDecimal(0); + vo.setType(planType+""); + //合同id + if (StringHelper.isEmpty(vo.getContractId())) { + vo.setContractId(outVo.getContractId()); + } + if (StringHelper.isEmpty(vo.getSupId())) { + vo.setSupId(outVo.getSupId()); + } + //车辆 + if (planType == 1) { + //实际公里数 + String gls = vo.getGls(); + String tonType; + // 1. 先获取值并做 null 防护,避免 NPE + BigDecimal tonValue = Optional.ofNullable(vo.getTon()) + .map(BigDecimal::new) + .orElse(BigDecimal.ZERO); + // 2. BigDecimal 必须用 compareTo 比较,不能直接用 < > == + if (tonValue.compareTo(new BigDecimal("2")) < 0) { // tonValue < 2(包含 null/0/1 等) + tonType = "1"; + } else if (tonValue.compareTo(new BigDecimal("5")) < 0) { // 2 ≤ tonValue < 5 + tonType = "2"; + } else { + tonType = "3"; + } + log.info("车辆派车计算 - 公里数:{}, 吨位:{}, 吨位类型:{}, 合同ID:{}, 供应商ID:{}", + gls, vo.getTon(), tonType, vo.getContractId(), vo.getSupId()); + //获取单公里价格 + PriceVo priceVo = getMoney(vo.getContractId(), null, vo.getSupId(), gls, tonType); + if(priceVo==null){ + throw new RuntimeException("公里数不在范围内"); + } + sb.append("依据:").append(priceVo.getGlsStart()).append("-").append(priceVo.getGlsEnd()); + sb.append("公里:").append(priceVo.getPrice()).append("元"); + vo.setRemark(sb.toString()); + vo.setPriceId(priceVo.getId()); + vo.setGlsPrice(toBigDecimal(priceVo.getPrice())); + BigDecimal ton = new BigDecimal(vo.getTon()); + BigDecimal nowGls = new BigDecimal(gls); + BigDecimal price = new BigDecimal(priceVo.getPrice()); + // 公里*每公里*吨位 + BigDecimal glsMoney = nowGls.multiply(price).multiply(ton); + allMoney = allMoney.add(glsMoney); + vo.setCost(glsMoney.toString()); + vo.setGlsMoney(glsMoney); + + } else { + //实际天数 + int day = vo.getUseDay(); + String inMoneyData=vo.getInMoney(); + //入场费用 + if(StringUtils.isEmpty(inMoneyData)){ + inMoneyData="0"; + } + BigDecimal inMoney = new BigDecimal(inMoneyData); + int isOutSet =1; + + log.info("吊车派车计算 - 计划天数:{}, 是否收取进出场费:{}, 合同ID:{}, 车型ID:{}, 供应商ID:{}", + day, isOutSet, vo.getContractId(), vo.getModelId(), vo.getSupId()); + BigDecimal days = new BigDecimal(day); + BigDecimal dcMoney = new BigDecimal("0"); + BigDecimal month = new BigDecimal("30"); + PriceVo priceVo = getMoney(vo.getContractId(), vo.getModelId(), vo.getSupId(), null, null); + if(priceVo==null){ + throw new RuntimeException("公里数不在范围内"); + } + sb.append("依据:").append(priceVo.getName()).append("-").append(priceVo.getModel()); + vo.setPriceId(priceVo.getId()); + vo.setGlsPrice(toBigDecimal(priceVo.getPrice())); + int dayToMonth = priceVo.getDayToMonth(); + if (day >= dayToMonth) { + sb.append("、作业天数>=").append(dayToMonth); + vo.setDcUnit("元/月/台"); + vo.setIsDayOrMonth("2"); + BigDecimal monthPrice = new BigDecimal(priceVo.getMonthPrice()); + if (day > 60) { + vo.setDcPrice(monthPrice.divide(month, RoundingMode.CEILING).toString()); + dcMoney = monthPrice.divide(month, RoundingMode.CEILING).multiply(days); + vo.setDcMoney(dcMoney.toString()); + allMoney = allMoney.add(dcMoney); + cost = cost.add(dcMoney); + } else { + if(day>30){ + BigDecimal dayMoney=monthPrice.divide(month, RoundingMode.CEILING); + //超过三十天的 但是比60天少的 + sb.append("、超过三十天的单价:(").append(dayMoney).append("元/天/台)"); + int lastDay=day-30; + BigDecimal lastDays = new BigDecimal(lastDay); + //剩余的金额 + BigDecimal daysMoney= monthPrice.divide(month, RoundingMode.CEILING).multiply(lastDays); + vo.setDcPrice(priceVo.getMonthPrice()); + vo.setDcMoney(priceVo.getMonthPrice()); + allMoney = allMoney.add(monthPrice); + allMoney =allMoney.add(daysMoney); + //分别蒋金额计算 + cost=cost.add(monthPrice); + cost= cost.add(daysMoney); + }else{ + vo.setDcPrice(priceVo.getMonthPrice()); + vo.setDcMoney(priceVo.getMonthPrice()); + allMoney = allMoney.add(monthPrice); + cost = cost.add(monthPrice); + + } + } + //入场费用添加 + cost=cost.add(inMoney); + allMoney = allMoney.add(inMoney); + vo.setCost(cost.toString()); + } else { + sb.append("、作业天数<").append(dayToMonth); + vo.setIsDayOrMonth("1"); + vo.setDcPrice(priceVo.getDayPrice()); + vo.setDcUnit("元/天/台"); + BigDecimal dayPrice = new BigDecimal(priceVo.getDayPrice()); + dcMoney = dayPrice.multiply(days); + vo.setDcMoney(dcMoney.toString()); + allMoney = allMoney.add(dcMoney); + cost = cost.add(dcMoney); + cost=cost.add(inMoney); + allMoney = allMoney.add(inMoney); + vo.setCost(cost.toString()); + } + if(!"0".equals(inMoneyData)){ + sb.append("@"); + sb.append(priceVo.getName()).append("-").append(priceVo.getModel() + "收取进出场费用"); + sb.append("、入场费用(").append(inMoneyData).append(")"); + } + vo.setDayPrice(priceVo.getDayPrice()); + vo.setMonthPrice(priceVo.getMonthPrice()); + vo.setRemark(sb.toString()); + } + mapper.updatePlanOutDetails(vo); + } + allMoney = allMoney.setScale(3, BigDecimal.ROUND_HALF_UP); + outVo.setMoney(allMoney.toString()); + } + public static BigDecimal toBigDecimal(String value) { + if (value == null || value.trim().isEmpty()) { + return BigDecimal.ZERO; // 或者 return null,看业务 + } + try { + return new BigDecimal(value.trim()).setScale(3, RoundingMode.HALF_UP); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("非法数字格式:" + value, e); + } + } + + /** + * 计算 车辆 公里数价格 + * + * @param gls + * @return + */ + private PriceVo getMoney(String contractId, String modelId, String supId, String gls, String ton) { + List list = supDispatchCarMapper.getContractPriceList(contractId, modelId, supId, ton); + if(ListHelpUtil.isEmpty(list)){ + list = supDispatchCarMapper.getContractPriceList(contractId, modelId, supId, null); + } + //车辆 + if (StringHelper.isEmpty(modelId)) { + BigDecimal nowGls = new BigDecimal(gls); + for (PriceVo priceVo : list) { + if(isNumberByRegex(priceVo.getGlsEnd()) && isNumberByRegex(priceVo.getGlsStart())){ + BigDecimal glsEnd = new BigDecimal(priceVo.getGlsEnd()); + BigDecimal glsStart = new BigDecimal(priceVo.getGlsStart()); + if (nowGls.compareTo(glsEnd) <= 0 && nowGls.compareTo(glsStart) >= 0) { + return priceVo; + } + } + + + } + return null; + } else { + return list.get(0); + } + } + public static boolean isNumberByRegex(String str) { + // 先判空/空白串,避免正则匹配空值报错 + if (str == null || str.trim().isEmpty()) { + return false; + } + // 正则表达式:匹配正负整数、合法小数(小数点后必须有数字) + String regex = "^[-+]?[0-9]+(\\.[0-9]+)?$"; + return str.trim().matches(regex); + } }