sen
2 天以前 5abcde36961125cbf436f91b8c17610a6b5f8308
tms/src/main/java/com/ruoyi/tms/service/impl/TmsApBillServiceImpl.java
@@ -2,6 +2,7 @@
import java.util.List;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.utils.DateUtils;
import javax.annotation.Resource;
@@ -23,6 +24,23 @@
import com.ruoyi.tms.domain.TmsApBill;
import com.ruoyi.tms.service.ITmsApBillService;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.tms.mapper.TmsPayableFeeMapper;
import com.ruoyi.tms.domain.TmsPayableFee;
import com.ruoyi.tms.domain.TmsPayableFeeItem;
import com.ruoyi.tms.mapper.TmsPayableFeeItemMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.task.AsyncTaskExecutor;
import org.springframework.core.task.SimpleAsyncTaskExecutor;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import com.alibaba.fastjson2.JSON;
import com.ruoyi.tms.domain.PayableAuditLog;
import com.ruoyi.tms.service.IPayableAuditLogService;
/**
 * 应付账单Service业务层处理
@@ -40,6 +58,21 @@
    @Resource
    private TmsApBillItemMapper tmsApBillItemMapper;
    @Resource
    private TmsPayableFeeMapper tmsPayableFeeMapper;
    @Resource
    private TmsPayableFeeItemMapper tmsPayableFeeItemMapper;
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private IPayableAuditLogService payableAuditLogService;
    @Value("${custom.cwxtApi.url}")
    private String url;
    /**
     * 查询应付账单
@@ -187,4 +220,262 @@
    {
        return tmsApBillMapper.deleteTmsApBillById(id);
    }
    /**
     * 手动推送应付账单到外部系统
     *
     * @param id 应付账单ID
     * @return 结果
     */
    @Override
    public void manualPushToExternalSystem(Integer id) {
        TmsApBill tmsApBill = tmsApBillMapper.selectTmsApBillById(id);
        if (tmsApBill == null) {
            throw new RuntimeException("应付账单不存在");
        }
        // 查询关联的应付费用列表
        List<TmsPayableFee> tmsPayableFeeList = tmsPayableFeeMapper.selectList(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<TmsPayableFee>()
                .eq(TmsPayableFee::getBillPayableId, id)
        );
        // 为每个应付费用加载明细
        for (TmsPayableFee fee : tmsPayableFeeList) {
            List<TmsPayableFeeItem> payableFeeItems = tmsPayableFeeItemMapper.selectTmsPayableFeeItemList(new TmsPayableFeeItem() {
                {
                    setHeadId(fee.getId());
                }
            });
            fee.setPayableFeeItems(payableFeeItems);
        }
        // 异步推送
        AsyncTaskExecutor executor = new SimpleAsyncTaskExecutor();
        executor.execute(() -> pushPayableToExternalSystem(tmsApBill, tmsPayableFeeList));
    }
    @Override
    public void cancelPushToExternalSystem(Integer id) {
        TmsApBill tmsApBill = tmsApBillMapper.selectTmsApBillById(id);
        if (tmsApBill == null) {
            throw new RuntimeException("应付账单不存在");
        }
        // 异步推送作废请求
        AsyncTaskExecutor executor = new SimpleAsyncTaskExecutor();
        executor.execute(() -> pushCancelToExternalSystem(tmsApBill));
    }
    /**
     * 向外部系统推送应付数据作废
     * @param tmsApBill 应付账单
     */
    @Async
    protected void pushCancelToExternalSystem(TmsApBill tmsApBill) {
        java.util.Map<String, Object> requestBody = new java.util.HashMap<>();
        try {
            // 构建请求体
            String apiUrl = url+"/cancelPayableBill";
            // 构建请求体,只需要sourceSystemId
            requestBody.put("sourceSystemId", tmsApBill.getSourceSystemId());
            // 设置HTTP头
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            HttpEntity<String> entity = new HttpEntity<>(JSON.toJSONString(requestBody), headers);
            // 发送API请求
            ResponseEntity<String> response = restTemplate.exchange(apiUrl, HttpMethod.POST, entity, String.class);
            logger.info("推送应付数据作废到外部系统成功,响应: {}", response.getBody());
            // 更新推送状态为成功
            tmsApBill.setPushStatus(2);
            tmsApBill.setStatus(3); // 设置账单状态为作废
            tmsApBill.setPushTime(DateUtils.getNowDate());
            tmsApBillMapper.updateTmsApBill(tmsApBill);
            // 重置关联的应付费用状态为待确认
            tmsPayableFeeMapper.update(new com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<TmsPayableFee>()
                    .set(TmsPayableFee::getStatus, 0)
                    .set(TmsPayableFee::getBillPayableId, null)
                    .set(TmsPayableFee::getBillPayableNo, null)
                    .eq(TmsPayableFee::getBillPayableId, tmsApBill.getId())
            );
            logger.info("重置应付费用状态成功,账单ID: {}", tmsApBill.getId());
        } catch (Exception e) {
            logger.error("推送应付数据作废到外部系统失败,账单ID: {}, 供应商: {}",
                tmsApBill.getId(), tmsApBill.getServiceProviderName(), e);
            logger.debug("推送失败的请求数据: {}", JSON.toJSONString(requestBody));
            // 更新推送状态为失败
            tmsApBill.setPushStatus(3);
            tmsApBill.setPushTime(DateUtils.getNowDate());
            tmsApBillMapper.updateTmsApBill(tmsApBill);
        }
    }
    /**
     * 更新推送状态
     *
     * @param id 应付账单ID
     * @param pushStatus 推送状态
     * @return 结果
     */
    @Override
    public int updatePushStatus(Integer id, Integer pushStatus) {
        TmsApBill tmsApBill = new TmsApBill();
        tmsApBill.setId(id);
        tmsApBill.setPushStatus(pushStatus);
        tmsApBill.setPushTime(DateUtils.getNowDate());
        return tmsApBillMapper.updateTmsApBill(tmsApBill);
    }
    /**
     * 添加应付账单审核日志
     *
     * @param auditLog 审核日志
     * @return 结果
     */
    public int addApBillAuditLog(PayableAuditLog auditLog) {
        return payableAuditLogService.insertPayableAuditLog(auditLog);
    }
    /**
     * 向外部系统推送应付数据
     * @param tmsApBill 应付账单
     * @param tmsPayableFeeList 应付费用列表
     */
    @Async
    protected void pushPayableToExternalSystem(TmsApBill tmsApBill, List<TmsPayableFee> tmsPayableFeeList) {
        java.util.Map<String, Object> requestBody = new java.util.HashMap<>();
        try {
            // 构建请求体
            String apiUrl = url+"/addPayableBill";
            // 构建bill部分
            java.util.Map<String, Object> billMap = new java.util.HashMap<>();
            billMap.put("billName", tmsApBill.getBillName());
            billMap.put("supplierName", tmsApBill.getServiceProviderName());
            billMap.put("totalAmount", tmsApBill.getSettleAmount());
            billMap.put("currency", "RMB");
            billMap.put("status", "0");
            billMap.put("isInternalSettlement", "0");
            billMap.put("internalSettlementUnit", tmsApBill.getServiceProviderName());
            billMap.put("documentCount", tmsPayableFeeList.size());
            billMap.put("discountAmount", 0.00);
            billMap.put("paidAmount", 0.00);
            billMap.put("pendingAmount", tmsApBill.getSettleAmount());
            billMap.put("exchangeRate", tmsApBill.getSettleRate());
            billMap.put("cnyAmount", tmsApBill.getSettleAmount());
            billMap.put("periodType", "");
            billMap.put("businessStartDate", "");
            billMap.put("businessEndDate", "");
            billMap.put("billingStartDate", "");
            billMap.put("billingEndDate", "");
            billMap.put("billGenerateDate", "");
            billMap.put("billSendDate", "");
            billMap.put("billDueDate", "");
            billMap.put("remark", "");
            billMap.put("sourceSystemId", tmsApBill.getId());
            // 构建fees部分
            List<java.util.Map<String, Object>> feesList = new java.util.ArrayList<>();
            for (int i = 0; i < tmsPayableFeeList.size(); i++) {
                TmsPayableFee fee = tmsPayableFeeList.get(i);
                java.util.Map<String, Object> feeMap = new java.util.HashMap<>();
                feeMap.put("sourceSystem", "TMS");
                feeMap.put("documentNo", fee.getDispatchNo() != null ? fee.getDispatchNo() : "");
                feeMap.put("supplierName", tmsApBill.getServiceProviderName());
                feeMap.put("payableAmount", fee.getPayableRmbAmount().add(fee.getPayableHkbAmount()));
                java.math.BigDecimal rmbAmount = fee.getPayableRmbAmount();
                java.math.BigDecimal hkbAmount = fee.getPayableHkbAmount();
                StringBuilder amountStr = new StringBuilder();
                if (rmbAmount.compareTo(java.math.BigDecimal.ZERO) > 0) {
                    amountStr.append(rmbAmount).append("人民币");
                }
                if (hkbAmount.compareTo(java.math.BigDecimal.ZERO) > 0) {
                    if (amountStr.length() > 0) {
                        amountStr.append(" ");
                    }
                    amountStr.append(hkbAmount).append("港币");
                }
                feeMap.put("payableAmountStr", amountStr.toString());
                feeMap.put("serialNumber", String.format("%03d", i + 1));
                feeMap.put("relatedBillNo", "");
                feeMap.put("businessSector", "0");
                feeMap.put("documentType", "0");
                feeMap.put("isInternalSettlement", "0");
                feeMap.put("internalSettlementUnit", "");
                feeMap.put("projectName", fee.getProjectName() != null ? fee.getProjectName() : "");
                feeMap.put("businessTime", fee.getDispatchConfirmTime());
                feeMap.put("payableConfirmTime", fee.getDispatchConfirmTime());
                feeMap.put("status", "1");
                feeMap.put("remark", "");
                // 构建feeDetails部分
                List<java.util.Map<String, Object>> feeDetailsList = new java.util.ArrayList<>();
                List<TmsPayableFeeItem> payableFeeItems = fee.getPayableFeeItems();
                for (TmsPayableFeeItem payableFeeItem : payableFeeItems) {
                    java.util.Map<String, Object> feeDetailMap = new java.util.HashMap<>();
                    feeDetailMap.put("feeType", payableFeeItem.getFeeType());
                    feeDetailMap.put("feeName", payableFeeItem.getFeeName());
                    feeDetailMap.put("unitPrice", payableFeeItem.getRegisterAmount());
                    feeDetailMap.put("billingQuantity", payableFeeItem.getRegisterAmount());
                    feeDetailMap.put("billingAmount", payableFeeItem.getRegisterAmount());
                    feeDetailMap.put("billingUnit", "次");
                    feeDetailMap.put("actualAmount", payableFeeItem.getRegisterAmount());
                    feeDetailMap.put("currency", payableFeeItem.getCurrency());
                    feeDetailMap.put("feeRegTime", payableFeeItem.getRegisterTime());
                    feeDetailMap.put("remark", "");
                    feeDetailsList.add(feeDetailMap);
                }
                feeMap.put("feeDetails", feeDetailsList);
                feesList.add(feeMap);
            }
            // 构建完整请求体
            requestBody.put("bill", billMap);
            requestBody.put("fees", feesList);
            // 设置HTTP头
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            HttpEntity<String> entity = new HttpEntity<>(JSON.toJSONString(requestBody), headers);
            // 发送API请求
            ResponseEntity<String> response = restTemplate.exchange(apiUrl, HttpMethod.POST, entity, String.class);
            logger.info("推送应付数据到外部系统成功,响应: {}", response.getBody());
            // 解析响应,获取sourceSystemId
            try {
                JSONObject result = JSONObject.parseObject(response.getBody());
                String sourceSystemId = result.getString("sourceSystemId");
                if (sourceSystemId != null) {
                    tmsApBill.setSourceSystemId(Integer.parseInt(sourceSystemId));
                }
            } catch (Exception e) {
                logger.error("解析外部系统响应失败: {}", e.getMessage());
            }
            // 更新推送状态为成功
            tmsApBill.setPushStatus(2);
            tmsApBill.setPushTime(DateUtils.getNowDate());
            tmsApBillMapper.updateTmsApBill(tmsApBill);
        } catch (Exception e) {
            logger.error("推送应付数据到外部系统失败,账单ID: {}, 供应商: {}",
                tmsApBill.getId(), tmsApBill.getServiceProviderName(), e);
            logger.debug("推送失败的请求数据: {}", JSON.toJSONString(requestBody));
            // 更新推送状态为失败
            tmsApBill.setPushStatus(3);
            tmsApBill.setPushTime(DateUtils.getNowDate());
            tmsApBillMapper.updateTmsApBill(tmsApBill);
        }
    }
}