zhangback
2026-03-30 0bafa6aa253c9ef6f5cb24e9a24c5282860e4c59
tms/src/main/java/com/ruoyi/tms/service/impl/TmsFinanceDetailServiceImpl.java
@@ -1,19 +1,26 @@
package com.ruoyi.tms.service.impl;
import java.util.Collections;
import java.util.List;
import java.math.BigDecimal;
import java.util.*;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.SystemDataNoEnum;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import javax.annotation.Resource;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.system.service.ISystemDataNoService;
import com.ruoyi.tms.domain.TmsDispatchOrder;
import com.ruoyi.tms.domain.TmsFinance;
import com.ruoyi.tms.domain.vo.FinanceDetailItem;
import com.ruoyi.tms.domain.vo.FinanceDetailRow;
import com.ruoyi.tms.mapper.TmsDispatchOrderMapper;
import com.ruoyi.tms.mapper.TmsFinanceMapper;
import org.springframework.beans.factory.annotation.Autowired;
@@ -102,7 +109,6 @@
            return null;
        }
        LambdaQueryWrapper<TmsFinanceDetail> eq = new LambdaQueryWrapper<TmsFinanceDetail>()
                .eq(TmsFinanceDetail::getFinanceType, 2)
                .eq(TmsFinanceDetail::getCreateId, SecurityUtils.getUserId());
        if (dispatchId !=null){
@@ -110,15 +116,80 @@
        }
        List<TmsFinanceDetail> tmsFinanceDetails = tmsFinanceDetailMapper.selectList(eq);
        if (tmsFinanceDetails != null && !tmsFinanceDetails.isEmpty()){
            tmsFinanceDetails.forEach(tmsFinanceDetail -> {
                TmsDispatchOrder tmsDispatchOrder = tmsDispatchOrderMapper.selectById(tmsFinanceDetail.getDispatchOrderId());
                if (tmsDispatchOrder != null){
                    tmsFinanceDetail.setDispatchNo(tmsDispatchOrder.getDispatchNo());
                    tmsFinanceDetail.setCustomerName(tmsDispatchOrder.getCustomerName());
                }
            });
            enrichDispatchInfo(tmsFinanceDetails);
        }
        return tmsFinanceDetails;
    }
    @Override
    public Map<String, Object> getTmsFinanceDetailListPage(Integer dispatchId, Integer pageNum, Integer pageSize) {
        Integer deviceId = userService.getDeviceId(SecurityUtils.getUserId());
        if (deviceId == null) {
            Map<String, Object> empty = new HashMap<>();
            empty.put("rows", Collections.emptyList());
            empty.put("total", 0);
            empty.put("totalAmount", BigDecimal.ZERO);
            return empty;
        }
        LambdaQueryWrapper<TmsFinanceDetail> wrapper = new LambdaQueryWrapper<TmsFinanceDetail>()
                .eq(TmsFinanceDetail::getFinanceType, 2)
                .eq(TmsFinanceDetail::getCreateId, SecurityUtils.getUserId());
        if (dispatchId != null) {
            wrapper.eq(TmsFinanceDetail::getDispatchOrderId, dispatchId);
        }
        // 按创建时间倒序
        wrapper.orderByDesc(TmsFinanceDetail::getFeeCreateTime);
        // 查总金额(不分页)
        List<TmsFinanceDetail> allRecords = tmsFinanceDetailMapper.selectList(
                new LambdaQueryWrapper<TmsFinanceDetail>()
                        .select(TmsFinanceDetail::getActualFeeAmount)
                        .eq(TmsFinanceDetail::getFinanceType, 2)
                        .eq(TmsFinanceDetail::getCreateId, SecurityUtils.getUserId())
                        .eq(dispatchId != null, TmsFinanceDetail::getDispatchOrderId, dispatchId)
        );
        BigDecimal totalAmount = allRecords.stream()
                .map(TmsFinanceDetail::getActualFeeAmount)
                .filter(Objects::nonNull)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        // 分页查询
        Page<TmsFinanceDetail> page = new Page<>(pageNum, pageSize);
        Page<TmsFinanceDetail> result = tmsFinanceDetailMapper.selectPage(page, wrapper);
        List<TmsFinanceDetail> rows = result.getRecords();
        if (rows != null && !rows.isEmpty()) {
            enrichDispatchInfo(rows);
        }
        Map<String, Object> map = new HashMap<>();
        map.put("rows", rows);
        map.put("total", result.getTotal());
        map.put("totalAmount", totalAmount);
        return map;
    }
    /**
     * 填充调度单信息(调度单号、客户名称)
     */
    private void enrichDispatchInfo(List<TmsFinanceDetail> list) {
        // 批量查询调度单,避免 N+1
        Set<Integer> orderIds = new HashSet<>();
        list.forEach(d -> { if (d.getDispatchOrderId() != null) orderIds.add(d.getDispatchOrderId()); });
        if (orderIds.isEmpty()) return;
        List<TmsDispatchOrder> orders = tmsDispatchOrderMapper.selectBatchIds(orderIds);
        Map<Integer, TmsDispatchOrder> orderMap = new HashMap<>();
        orders.forEach(o -> orderMap.put(o.getId(), o));
        list.forEach(d -> {
            TmsDispatchOrder order = orderMap.get(d.getDispatchOrderId());
            if (order != null) {
                d.setDispatchNo(order.getDispatchNo());
                d.setCustomerName(order.getCustomerName());
            }
        });
    }
    /**
@@ -149,42 +220,114 @@
    @Override
    public int insertTmsFinanceDetail(TmsFinanceDetail tmsFinanceDetail)
    {
        TmsFinance tmsFinance = tmsFinanceMapper.selectOne(new LambdaQueryWrapper<TmsFinance>()
                .eq(TmsFinance::getType, tmsFinanceDetail.getFinanceType())
                .eq(TmsFinance::getDispatchId, tmsFinanceDetail.getDispatchOrderId())
                .ne(TmsFinance::getStatus, 2)
                .last("limit 1")
        );
        if (tmsFinance == null){
//        TmsFinance tmsFinance = tmsFinanceMapper.selectOne(new LambdaQueryWrapper<TmsFinance>()
//                .eq(TmsFinance::getType, tmsFinanceDetail.getFinanceType())
//                .eq(TmsFinance::getDispatchId, tmsFinanceDetail.getDispatchOrderId())
//                .ne(TmsFinance::getStatus, 2)
//                .last("limit 1")
//        );
            TmsDispatchOrder tmsDispatchOrder = tmsDispatchOrderMapper.selectTmsDispatchOrderById(tmsFinanceDetail.getDispatchOrderId());
            if (tmsDispatchOrder == null){
                throw new RuntimeException("未找到对应的调度单");
            }
            tmsFinance = BeanUtil.copyProperties(tmsDispatchOrder,TmsFinance.class);
            tmsFinance.setSystemCode(systemDataNoService.getNoByKey(SystemDataNoEnum.OF));
            tmsFinance.setDispatchId(tmsFinanceDetail.getDispatchOrderId());
            tmsFinance.setType(tmsFinanceDetail.getFinanceType());
            tmsFinance.setStatus(0);
            tmsFinance.setTotalAmount(tmsFinanceDetail.getActualFeeAmount());
            tmsFinance.setCreateBy(SecurityUtils.getUsername());
            tmsFinance.setUpdateBy(SecurityUtils.getUsername());
            tmsFinance.setCreateTime(DateUtils.getNowDate());
            tmsFinance.setUpdateTime(DateUtils.getNowDate());
            // 添加费用主表
            tmsFinanceMapper.insertTmsFinance(tmsFinance);
        }else{
            tmsFinance.setTotalAmount(tmsFinance.
                    getTotalAmount().add(tmsFinanceDetail.getActualFeeAmount()));
            tmsFinanceMapper.updateTmsFinance(tmsFinance);
        //if (StringUtils.isNotEmpty(tmsFinanceDetail.getFeeType())){
            addItem(tmsFinanceDetail);
       // }
        // 1、查询当前调度单对应的费用
//        List<FinanceDetailItem> items = tmsFinanceDetail.getItems();
//
//        if (items != null && !items.isEmpty()){
//            items.forEach(item->{
//                TmsFinanceDetail tmsFinanceDetailNew = BeanUtil.copyProperties(tmsFinanceDetail, TmsFinanceDetail.class);
//                BeanUtil.copyProperties(item, tmsFinanceDetailNew);
//                tmsFinanceDetailNew.setActualFeeAmount(item.getPrice().multiply(BigDecimal.valueOf(item.getCount())));
//                addItem(tmsFinance, tmsFinanceDetailNew);
//            });
//        }
        return 1;
    }
    @Override
    public int saveTmsFinanceDetail(TmsFinanceDetail tmsFinanceDetail) {
        if (StringUtils.isNotEmpty(tmsFinanceDetail.getFeeType() ) &&
                tmsFinanceDetail.getActualFeeAmount() != null){
            insertTmsFinanceDetail(tmsFinanceDetail);
        }
        tmsFinanceDetail.setFinanceId(tmsFinance.getId());
        List<FinanceDetailRow> rowItems = tmsFinanceDetail.getRowItems();
        if (rowItems != null && !rowItems.isEmpty()){
            for (FinanceDetailRow rowItem : rowItems){
                if (rowItem.getIsYF() != null && rowItem.getIsYF() == 0){
                    rowItem.setYfPrice(null);
                    rowItem.setYfCurrency(null);
                    rowItem.setYfServiceProviderId(null);
                    rowItem.setYfServiceProviderType(null);
                    rowItem.setYfServiceProviderIdType(null);
                    rowItem.setYfServiceProviderName(null);
                }
                TmsFinanceDetail tmsFinanceDetailNew = BeanUtil.copyProperties(rowItem, TmsFinanceDetail.class);
                tmsFinanceDetailMapper.updateTmsFinanceDetail(tmsFinanceDetailNew);
            }
        }
        return 1;
    }
    @Override
    public int saveTmsFinanceDetail2(List<TmsFinanceDetail> tmsFinanceDetails) {
        String username = SecurityUtils.getUsername();
        Long userId = SecurityUtils.getUserId();
        Date nowDate = DateUtils.getNowDate();
        for (TmsFinanceDetail tmsFinanceDetail : tmsFinanceDetails) {
            if (StringUtils.isNotEmpty(tmsFinanceDetail.getFeeType() ) &&
                    tmsFinanceDetail.getActualFeeAmount() != null) {
                tmsFinanceDetail.setCreateBy(username);
                tmsFinanceDetail.setInitialFeeAmount(tmsFinanceDetail.getActualFeeAmount());
                tmsFinanceDetail.setCreateId(userId);
                tmsFinanceDetail.setFeeCreateTime(nowDate);
                tmsFinanceDetail.setCreateTime(nowDate);
            }else {
                throw new ServiceException("金额或者费用类型不能为空");
            }
        }
        return tmsFinanceDetailMapper.insertTmsFinanceDetailBatch(tmsFinanceDetails);
    }
    public void addItem (TmsFinanceDetail tmsFinanceDetail){
//        if (tmsFinance == null){
//
//            TmsDispatchOrder tmsDispatchOrder = tmsDispatchOrderMapper.selectTmsDispatchOrderById(tmsFinanceDetail.getDispatchOrderId());
//            if (tmsDispatchOrder == null){
//                throw new RuntimeException("未找到对应的调度单");
//            }
//            tmsFinance = BeanUtil.copyProperties(tmsDispatchOrder,TmsFinance.class);
//            SystemDataNoEnum systemDataNoEnum = tmsFinanceDetail.getFinanceType() == 0 ? SystemDataNoEnum.YFD :
//                    tmsFinanceDetail.getFinanceType() == 1 ? SystemDataNoEnum.YSD : SystemDataNoEnum.OF;
//            tmsFinance.setSystemCode(systemDataNoService.getNoByKey(systemDataNoEnum));
//            tmsFinance.setDispatchId(tmsFinanceDetail.getDispatchOrderId());
//            tmsFinance.setType(tmsFinanceDetail.getFinanceType());
//            tmsFinance.setStatus(0);
//            tmsFinance.setTotalAmount(tmsFinanceDetail.getActualFeeAmount());
//            tmsFinance.setCreateBy(SecurityUtils.getUsername());
//            tmsFinance.setUpdateBy(SecurityUtils.getUsername());
//            tmsFinance.setCreateTime(DateUtils.getNowDate());
//            tmsFinance.setUpdateTime(DateUtils.getNowDate());
//            // 添加费用主表
//            tmsFinanceMapper.insertTmsFinance(tmsFinance);
//        }else{
//            tmsFinance.setTotalAmount(tmsFinance.
//                    getTotalAmount().add(tmsFinanceDetail.getActualFeeAmount()));
//            tmsFinanceMapper.updateTmsFinance(tmsFinance);
//        }
       // tmsFinanceDetail.setFinanceId(tmsFinance.getId());
        tmsFinanceDetail.setCreateBy(SecurityUtils.getUsername());
        tmsFinanceDetail.setInitialFeeAmount(tmsFinanceDetail.getActualFeeAmount());
        tmsFinanceDetail.setCreateId(SecurityUtils.getUserId());
        tmsFinanceDetail.setFeeCreateTime(DateUtils.getNowDate());
        tmsFinanceDetail.setCreateTime(DateUtils.getNowDate());
        return tmsFinanceDetailMapper.insertTmsFinanceDetail(tmsFinanceDetail);
        tmsFinanceDetailMapper.insertTmsFinanceDetail(tmsFinanceDetail);
    }
    /**
@@ -209,8 +352,61 @@
    @Override
    public int updateTmsFinanceDetail(TmsFinanceDetail tmsFinanceDetail)
    {
        Integer financeId = tmsFinanceDetail.getFinanceId();
        TmsFinance tmsFinance = tmsFinanceMapper.selectTmsFinanceById(financeId);
        if (tmsFinance == null){
            throw new RuntimeException("未找到对应的费用单");
        }
        tmsFinanceDetail.setUpdateBy(SecurityUtils.getUsername());
        tmsFinanceDetail.setUpdateTime(DateUtils.getNowDate());
        return tmsFinanceDetailMapper.updateTmsFinanceDetail(tmsFinanceDetail);
        tmsFinanceDetailMapper.updateTmsFinanceDetail(tmsFinanceDetail);
        // 查询该费用单下所有状态为0的费用明细的实际费用金额总和
        List<TmsFinanceDetail> detailList = tmsFinanceDetailMapper.selectList(new LambdaQueryWrapper<TmsFinanceDetail>()
                .eq(TmsFinanceDetail::getFinanceId, financeId)
                .eq(TmsFinanceDetail::getStatus, 0)
        );
        // 计算总和
        // 计算总和
        double totalAmount = detailList.stream()
                .mapToDouble(detail -> detail.getActualFeeAmount().doubleValue())
                .sum();
        TmsFinance tmsFinance1 = new TmsFinance() {{
            setId(financeId);
            setTotalAmount(new BigDecimal(totalAmount));
        }};
        return tmsFinanceMapper.updateTmsFinance(tmsFinance1);
    }
    @Override
    public AjaxResult cancelFinanceDetail(Integer id) {
        TmsFinanceDetail tmsFinanceDetail = tmsFinanceDetailMapper.selectById(id);
        if (tmsFinanceDetail == null){
            return AjaxResult.error("未找到对应的费用明细");
        }
        tmsFinanceDetail.setStatus(1);
        tmsFinanceDetail.setUpdateBy(SecurityUtils.getUsername());
        tmsFinanceDetailMapper.updateTmsFinanceDetail(tmsFinanceDetail);
        // 查询该费用单下所有状态为0的费用明细的实际费用金额总和
        List<TmsFinanceDetail> detailList = tmsFinanceDetailMapper.selectList(new LambdaQueryWrapper<TmsFinanceDetail>()
                .eq(TmsFinanceDetail::getFinanceId, tmsFinanceDetail.getFinanceId())
                .eq(TmsFinanceDetail::getStatus, 0)
        );
        // 计算总和
        // 计算总和
        double totalAmount = detailList.stream()
                .mapToDouble(detail -> detail.getActualFeeAmount().doubleValue())
                .sum();
        TmsFinance tmsFinance1 = new TmsFinance() {{
            setId( tmsFinanceDetail.getFinanceId());
            setTotalAmount(new BigDecimal(totalAmount));
        }};
         tmsFinanceMapper.updateTmsFinance(tmsFinance1);
        return AjaxResult.success("取消成功");
    }
    /**