package com.pj.project.tb_account; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.log.StaticLog; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.pj.api.wx.bo.PriceBO; import com.pj.constants.business.CarEnum; import com.pj.constants.business.FeeTypeEnum; import com.pj.constants.business.GoodsEnum; import com.pj.constants.business.PayEnum; import com.pj.current.config.SystemObject; import com.pj.project.sync.SyncService; import com.pj.project.sync.request.item.IOrderItem; import com.pj.project.sync.response.IOrderPriceRes; import com.pj.project.sync.response.item.OrderPriceResultItem; import com.pj.project.sync.response.item.PriceDetailItem; import com.pj.project.tb_business.TbBusiness; import com.pj.project.tb_business.TbBusinessService; import com.pj.project.tb_business_car.TbBusinessCar; import com.pj.project.tb_business_car.TbBusinessCarService; import com.pj.project.tb_business_item.TbBusinessItem; import com.pj.project.tb_business_item.TbBusinessItemService; import com.pj.project.tb_car_weight.TbCarWeight; import com.pj.project.tb_car_weight.TbCarWeightService; import com.pj.project.tb_costomer.TbCostomer; import com.pj.project.tb_costomer.TbCostomerService; import com.pj.project.tb_deduction_bind.TbDeductionBind; import com.pj.project.tb_deduction_bind.TbDeductionBindService; import com.pj.project.tb_deduction_record.TbDeductionRecord; import com.pj.project.tb_fee_details.TbFeeDetails; import com.pj.project.tb_fee_details.TbFeeDetailsService; import com.pj.project.tb_fee_statistics.TbFeeStatisticsService; import com.pj.project.tb_goods.TbGoods; import com.pj.project.tb_goods.TbGoodsService; import com.pj.project.tb_invoice_order.TbInvoiceOrder; import com.pj.project.tb_invoice_order.TbInvoiceOrderService; import com.pj.project.tb_item.TbItem; import com.pj.project.tb_item.TbItemService; import com.pj.utils.AesUtil; import com.pj.utils.cache.RedisUtil; import com.pj.utils.sg.NbUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.stream.Collectors; /** * 预充值自动缴费 */ @Component @Transactional(rollbackFor = Exception.class) @Slf4j public class AutomaticPay { @Resource TbBusinessCarService tbBusinessCarService; @Resource TbBusinessService tbBusinessService; @Resource TbBusinessItemService tbBusinessItemService; @Resource TbFeeDetailsService tbFeeDetailsService; @Resource TbAccountService tbAccountService; @Resource TbInvoiceOrderService invoiceOrderService; @Resource private TbFeeStatisticsService tbFeeStatisticsService; @Resource private SyncService syncService; @Resource private TbCostomerService tbCostomerService; @Resource private TbItemService tbItemService; @Resource private TbCarWeightService tbCarWeightService; /** * 生成扣费记录 */ public TbDeductionRecord createTbDeductionRecord(TbFeeDetails feeDetails, BigDecimal originalMoney, BigDecimal balance, String customerId, String customerName, String plate, String businessCarId, FeeTypeEnum feeTypeEnum) { TbDeductionRecord deductionRecord = BeanUtil.toBean(feeDetails, TbDeductionRecord.class); BigDecimal itemPrice = feeDetails.getItemPrice(); String no = feeDetails.getBusinessNo(); String preNo = DateUtil.format(new Date(), "yyyyMMddHHmm") + RandomUtil.randomString(5); deductionRecord .setPreOrderNum(preNo) .setCustomerId(customerId) .setCustomerName(customerName) .setDeductMoney(itemPrice) .setBusinessNo(no).setWeight(feeDetails.getWeight()) .setOriginalMoney(originalMoney).setBusinessId(feeDetails.getBusinessId()) .setTotalMoney(originalMoney.subtract(itemPrice)).setBusinessCarId(businessCarId) .setFeeDetailsId(feeDetails.getId()).setItemName(feeDetails.getItemName()) .setItemTypeId(feeDetails.getItemTypeId()).setItemTypeName(feeDetails.getItemTypeName()) .setReviewStatus(0).setFeeType(feeTypeEnum.getCode()).setFeeTypeName(feeTypeEnum.getDesc()) .setCarNo(plate).setBusinessItemId(feeDetails.getBusinessItemId()) .setFeeDetailsId(feeDetails.getId()); deductionRecord.insert(); feeDetails.setPreOrderNum(preNo); tbFeeDetailsService.updateById(feeDetails); return deductionRecord; } /** * 支付停车费和业务费 * * @param businessList * @return */ public boolean payBusinessAndPartMoney(List businessList, TbBusinessCar tbBusinessCar, IOrderPriceRes partMoneyRes, BigDecimal businessMoney, List carWeights) { Date now = new Date(); String customerId = tbBusinessCar.getCustomerId(); if (StrUtil.isEmpty(customerId)) { return false; } TbAccount tbAccount = tbAccountService.getAccountByCustomerId(customerId); //原金额 BigDecimal originalMoney = tbAccount.getTotalMoney(); //停车费扣除 BigDecimal partMoney = partMoneyRes.getTotalOrderPrice(); //业务费用 // BigDecimal businessMoney = businessRes.getTotalOrderPrice(); //过磅费 BigDecimal weightMoney = BigDecimal.ZERO; for (TbCarWeight carWeight : carWeights) { weightMoney = weightMoney.add(carWeight.getWeightPrice()); } //总费用 BigDecimal totalMoney = partMoney.add(businessMoney).add(weightMoney); if (totalMoney.compareTo(originalMoney) > 0) { return false;//不够交 } log.info("payment============:{}",partMoney); log.info("businessMoney=========:{}",businessMoney); log.info("totalMoney==========:{}",totalMoney); //余额 BigDecimal balance = originalMoney.subtract(totalMoney); log.info("Balance: " + balance); tbAccount.setTotalMoney(balance); //更新账户余额 tbAccountService.updateById(tbAccount); TbCostomer tbCostomer = tbCostomerService.getById(customerId); String customerName = tbCostomer.getName(); //地磅费统计 if (weightMoney.doubleValue() > 0) { tbBusinessCar.setNetweightMoney(weightMoney).setPayNetweightMoney(1); TbItem tbItem = tbItemService.findByAliasName(SystemObject.config.getWeighbridge()); for (TbCarWeight carWeight : carWeights) { TbFeeDetails details = tbFeeDetailsService.saveCarWeightDetails("",carWeight.getWeightPrice(), carWeight.getCalculateId(), carWeight.getNo(), tbBusinessCar, customerName, customerName, tbItem, PayEnum.PayType.PER_PAY); createTbDeductionRecord(details, originalMoney, BigDecimal.ZERO, customerId, customerName, tbBusinessCar.getCarNo(), tbBusinessCar.getId(), FeeTypeEnum.WEIGHT_FEE); carWeight.setPayStatus(1).setPayTime(now).setPayType(PayEnum.PayType.PER_PAY.getCode()); tbCarWeightService.updateById(carWeight); originalMoney=originalMoney.subtract(carWeight.getWeightPrice()); } } //需要交停车费且未交的话 if (partMoney.compareTo(BigDecimal.ZERO) > 0) { String businessIds = businessList.stream().filter(tbBusiness -> tbBusiness.getGoodsName().contains("停车")) .map(TbBusiness::getId).collect(Collectors.joining(",")); String uniqExpenseId = partMoneyRes.getUniqueExpenseId(); String calculateId = partMoneyRes.getCalculateId(); String carDesc = partMoneyRes.getCarDesc(); String hourDesc = partMoneyRes.getHourDesc(); List items = partMoneyRes.getFireResult().get(0).getPriceDetail(); if (partMoneyRes.getTotalOrderPrice().intValue() > 0) { items = partMoneyRes.getFireResult().get(0).getPriceDetail(); } PriceBO priceBO = new PriceBO(); List priceBOList = new ArrayList<>(); priceBO.setId(tbBusinessCar.getId()).setP(partMoney).setCalculateId(calculateId) .setCarDesc(carDesc).setHourDesc(hourDesc).setBusinessId(businessIds) .setUniqExpenseId(uniqExpenseId); priceBOList.add(priceBO); for (PriceDetailItem item : items) { if (item.getKey().toLowerCase().trim().equals("standard")) { priceBO.setStandard(new BigDecimal(item.getValue())); } else if (item.getKey().trim().equals("extraPrice")) { priceBO.setExtraPrice(new BigDecimal(item.getValue())); } } String plate = tbBusinessCar.getCarNo(); tbBusinessCar.setPay(1).setPayType(CarEnum.PayTypeEnum.HAS_PAY_TYPE.getType()) .setPayTime(now).setMoney(partMoney.add(tbBusinessCar.getMoney())); tbBusinessCarService.updateById(tbBusinessCar); TbBusiness tbBusiness = businessList.get(0); String businessNo = tbBusiness.getNo(); List parkFeeDetailsList = tbFeeDetailsService.chargeParkFee(priceBOList, null, null, now, PayEnum.PayType.PER_PAY); //停车费明细 for (TbFeeDetails tbFeeDetails : parkFeeDetailsList) { tbFeeDetails.setBusinessNo(businessNo); TbDeductionRecord record = this.createTbDeductionRecord(tbFeeDetails, originalMoney, BigDecimal.ZERO, customerId, customerName, plate, tbBusinessCar.getId(), FeeTypeEnum.PARK_FEE); invoiceOrderService.addInvoiceOrder("停车业务", businessNo, tbBusinessCar.getCarNo(), tbBusiness.getId(), tbBusinessCar.getCustomerId(), tbBusiness.getCustomerName(), tbBusiness.getCustomerName(), tbFeeDetails.getItemPrice(), tbFeeDetails, record); originalMoney = originalMoney.subtract(tbFeeDetails.getItemPrice()); } } //业务费用 for (TbBusiness tbBusiness : businessList) { List items = tbBusinessItemService.findByBusinessId(tbBusiness.getId()); items = items.stream().filter(item -> item.getPayStatus() == 0).collect(Collectors.toList()); for (TbBusinessItem item : items) { if (item.getPayStatus() == 1) {//已支付的 continue; } //支付金额累加 if (!StrUtil.equals(item.getItemAlias(), SystemObject.config.getPartItemAlias())) { List orderItems = new ArrayList<>(); tbBusinessItemService.buildExpenses(Collections.singletonList(item), orderItems); if (orderItems.isEmpty()) { continue; } IOrderPriceRes res = syncService.orderPriceCal(orderItems); BigDecimal price = res.getTotalOrderPrice(); item.setTotal(price); tbBusiness.setPayMoney(tbBusiness.getPayMoney().add(price)); int feeType = item.getPayType(); FeeTypeEnum feeTypeEnum = FeeTypeEnum.getEnum(feeType); TbFeeDetails details = tbFeeDetailsService.savePrePayDetails(res, item, tbBusinessCar, tbBusiness, tbBusiness.getCustomerName(), tbBusiness.getPickCustomerName(), feeTypeEnum); log.info("originalMoney:{}",originalMoney); TbDeductionRecord record = createTbDeductionRecord(details, originalMoney, BigDecimal.ZERO, customerId, tbBusiness.getCustomerName(), tbBusinessCar.getCarNo(), tbBusinessCar.getId(), feeTypeEnum); invoiceOrderService.addInvoiceOrder(tbBusiness.getGoodsName(), tbBusiness.getNo(), tbBusiness.getCarNoStr(), tbBusiness.getId(), tbBusiness.getCustomerId(), tbBusiness.getCustomerName(), tbBusiness.getCustomerName(), res.getTotalOrderPrice(), details, record); originalMoney=originalMoney.subtract(details.getItemPrice()); log.info("after originalMoney:{}",originalMoney); } else { tbBusiness.setPayMoney(tbBusiness.getPayMoney().add(partMoney)).setItemPrice(BigDecimal.ZERO); } item.setPayStatus(1).setPayTime(now); if (StrUtil.equals(SystemObject.config.getWeighbridge(), item.getItemAlias())) { tbBusinessCar.setPayNetweightMoney(1); } tbBusinessItemService.updateById(item); double itemPrice = items.stream().collect(Collectors.summarizingDouble(t -> t.getTotal().doubleValue())).getSum(); tbBusiness.setPayStatus(PayEnum.PayStatusEnum.HAS_PAY_CONFIRM.getCode()).setPayTime(now); BigDecimal totalPrice = tbBusiness.getItemPrice(); if (totalPrice.doubleValue() > 0.6) { tbBusiness.setItemPrice(tbBusiness.getItemPrice().add(BigDecimal.valueOf(itemPrice))); } else { tbBusiness.setItemPrice(BigDecimal.valueOf(itemPrice)); } tbBusinessService.updateById(tbBusiness); if (StrUtil.equals(item.getItemAlias(), SystemObject.config.getWeighbridge())) { tbBusinessCar.setNetweightMoney(item.getTotal()); tbBusinessCarService.updateById(tbBusinessCar); } } } //todo 构造统计数据 tbFeeStatisticsService.addOrUpdateStatistic(now, PayEnum.PayType.PER_PAY.getCode());//更新当前日期的日统计 return true; } }