yupeng
2025-04-03 2683772d398e33c1a151ff473376e7df0e40d036
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package com.ruoyi.system.service.impl;
 
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.importExcel.TBankFlowImportExcel;
import com.ruoyi.system.mapper.TBankFlowMapper;
import com.ruoyi.system.model.TBankFlow;
import com.ruoyi.system.model.TBill;
import com.ruoyi.system.model.TFlowManagement;
import com.ruoyi.system.query.TBankFlowQuery;
import com.ruoyi.system.query.TFlowManagementQuery;
import com.ruoyi.system.service.TBankFlowService;
import com.ruoyi.system.service.TFlowManagementService;
import com.ruoyi.system.vo.TBankFlowStatisticsVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.List;
 
/**
 * <p>
 * 流水管理 服务实现类
 * </p>
 *
 * @author xiaochen
 * @since 2025-02-07
 */
@Service
public class TBankFlowServiceImpl extends ServiceImpl<TBankFlowMapper, TBankFlow> implements TBankFlowService {
    @Autowired
    TFlowManagementService flowManagementService;
    @Override
    public PageInfo<TBankFlow> pageList(TBankFlowQuery query) {
        PageInfo<TBankFlow> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        LambdaQueryWrapper<TBankFlow> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(StringUtils.isNotEmpty(query.getBankSerialNumber()),TBankFlow::getBankSerialNumber,query.getBankSerialNumber())
                .like(StringUtils.isNotEmpty(query.getPayer()),TBankFlow::getPayer,query.getPayer())
                .ge(StringUtils.isNotEmpty(query.getPayStartTime()),TBankFlow::getPayTime,query.getPayStartTime())
                .lt(StringUtils.isNotEmpty(query.getPayEndTime()),TBankFlow::getPayTime,query.getPayEndTime())
                .eq(null != query.getFlowStatus(),TBankFlow::getFlowStatus,query.getFlowStatus())
                .eq(StringUtils.isNotEmpty(query.getBusinessDeptId())&& !"0".equals(query.getBusinessDeptId()),TBankFlow::getBusinessDeptId,query.getBusinessDeptId())
                .orderByDesc(TBankFlow::getCreateTime);
        return this.baseMapper.selectPage(pageInfo, queryWrapper);
    }
 
    @Override
    public TBankFlowStatisticsVo getPaymentStats(TBankFlowQuery query) {
        return this.baseMapper.getPaymentStats(query,SecurityUtils.getBusinessDeptId());
    }
 
    /**
     * 根据银行流水号模糊查询
     * @param bankSerialNumber
     * @return
     */
    @Override
    public List<TBankFlow> searchByBankSerialNumber(String bankSerialNumber) {
        String businessDeptId = SecurityUtils.getBusinessDeptId();
 
        LambdaQueryWrapper<TBankFlow> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.like(StringUtils.isNotEmpty(bankSerialNumber),TBankFlow::getBankSerialNumber,bankSerialNumber)
                .eq(StringUtils.isNotEmpty(bankSerialNumber) && !"0".equals(bankSerialNumber),TBankFlow::getBusinessDeptId,businessDeptId)
                .orderByDesc(TBankFlow::getPayTime);
        PageInfo<TBankFlow> pageInfo = new PageInfo<>(1, 20);
        pageInfo = this.baseMapper.selectPage(pageInfo, queryWrapper);
        return pageInfo.getRecords();
    }
 
    @Override
    public void saveImportBatch(List<TBankFlowImportExcel> list, List<TBankFlowImportExcel> failList) {
        String businessDeptId = SecurityUtils.getBusinessDeptId();
        for (TBankFlowImportExcel row : list) {
            try {
                TBankFlow preexist = findUniq(row.getBankSerialNumber());
                if (preexist != null){
                    row.setResult("流水号已存在"+row.getBankSerialNumber());
                    failList.add(row);
                    continue;
                }
                TBankFlow flow = new TBankFlow();
                BeanUtils.copyProperties(row,flow);
                flow.setBusinessDeptId(businessDeptId);
                try {
                    LocalDateTime parse = LocalDateTime.parse(row.getPayTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
                    flow.setPayTime(parse);
                }catch (DateTimeParseException e){
                    row.setResult("支付时间格式不正确"+row.getPayTime());
                    failList.add(row);
                    continue;
                }
                TFlowManagementQuery query = new TFlowManagementQuery();
                query.setBankSerialNumber(row.getBankSerialNumber());
                List<TFlowManagement> list1 = flowManagementService.findByBankSerialNumber(row.getBankSerialNumber());
                for (TFlowManagement tFlowManagement : list1) {
                    // 如果相同流水号金额相同 :抵扣金额为流水金额,剩余金额为0,状态为正常
                    if (row.getFlowMoney().compareTo(tFlowManagement.getFlowMoney()) == 0){
                        flow.setDeductionMoney(tFlowManagement.getFlowMoney());
                        flow.setRemainingMoney(BigDecimal.ZERO);
                        flow.setFlowStatus(1);
                        this.baseMapper.insert(flow);
                        break;
                    }else {
                        // 流水号相同,金额不同:已抵扣金额为系统流水金额,剩余金额 = 银行流水金额-系统流水金额,状态为异常
                        flow.setDeductionMoney(tFlowManagement.getFlowMoney());
                        flow.setRemainingMoney(row.getFlowMoney().divide(tFlowManagement.getFlowMoney(),2, RoundingMode.HALF_DOWN));
                        flow.setFlowStatus(2);
                        this.baseMapper.insert(flow);
                        break;
                    }
                }
                // 系统流水查找不到:抵扣金额为0,剩余金额为流水金额,状态为异常
                flow.setDeductionMoney(BigDecimal.ZERO);
                flow.setRemainingMoney(row.getFlowMoney());
                flow.setFlowStatus(2);
                this.baseMapper.insert(flow);
            }catch (Exception e){
                log.error("导入银行流水信息异常",e);
                row.setResult("导入异常:"+e.getMessage());
                failList.add(row);
            }
        }
    }
 
    /**
     * 根据流水号查找唯一流水
     * @param bankSerialNumber
     * @return
     */
 
    @Override
    public TBankFlow findUniq(String bankSerialNumber) {
        LambdaQueryWrapper<TBankFlow> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(StringUtils.isNotEmpty(bankSerialNumber),TBankFlow::getBankSerialNumber,bankSerialNumber);
        return this.baseMapper.selectOne(queryWrapper);
    }
}