123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 |
- 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<TbBusiness> businessList,
- TbBusinessCar tbBusinessCar,
- IOrderPriceRes partMoneyRes, BigDecimal businessMoney, List<TbCarWeight> 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<PriceDetailItem> items = partMoneyRes.getFireResult().get(0).getPriceDetail();
- if (partMoneyRes.getTotalOrderPrice().intValue() > 0) {
- items = partMoneyRes.getFireResult().get(0).getPriceDetail();
- }
- PriceBO priceBO = new PriceBO();
- List<PriceBO> 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<TbFeeDetails> 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<TbBusinessItem> 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<IOrderItem> 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;
- }
- }
|