578efc8ae695e7e6afbf9159fe0f0262548c8fb8..c7cde6c8ec424453c7155735e6a429c57e77141b
7 天以前 wujianwei
新增配置
c7cde6 对比 | 目录
7 天以前 wujianwei
新增审核
f4af94 对比 | 目录
7 天以前 wujianwei
Merge remote-tracking branch 'origin/cwxt_master' into cwxt_master
5a4397 对比 | 目录
7 天以前 wujianwei
新增审核
156a53 对比 | 目录
2026-03-31 sen
修改生成环境配置
d98922 对比 | 目录
5个文件已添加
12个文件已修改
700 ■■■■■ 已修改文件
admin/config/prod/application-custom.yml 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/config/test/application-custom.yml 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/src/main/java/com/ruoyi/api/third/controller/ReceivableBillApiController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/ruoyi/cwgl/controller/PayableBillManagementController.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/ruoyi/cwgl/controller/ReceivableBillManagementController.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/ruoyi/cwgl/domain/PayableBillManagement.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/ruoyi/cwgl/domain/ReceivableBillManagement.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/ruoyi/cwgl/domain/dto/BillAuditDto.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/ruoyi/cwgl/domain/dto/PayableAuditLog.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/ruoyi/cwgl/domain/dto/PayableBillApiDto.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/ruoyi/cwgl/domain/dto/ReceivableAuditLog.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/ruoyi/cwgl/domain/dto/ReceivableBillApiDto.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/ruoyi/cwgl/service/ITmsAuditLogPushService.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/java/com/ruoyi/cwgl/service/impl/TmsAuditLogPushServiceImpl.java 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/resources/mapper/cwgl/PayableBillManagementMapper.xml 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/src/main/resources/mapper/cwgl/ReceivableBillManagementMapper.xml 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ui/admin-ui3/.env.production 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/config/prod/application-custom.yml
@@ -1,11 +1,11 @@
custom:
  rabbitmq:
    # 集群地址,用逗号分隔
    host: 61.143.42.70
    port: 7008
    virtual-host: GF_HOST_TEST
    username: user_test
    password: testuser_&
    host: 172.16.24.14
    port: 5672
    virtual-host: GF_HOST
    username: admin
    password:
  serialNumber:
    cache:
      enabled: true
@@ -39,10 +39,10 @@
  #数据库 相关配置
  datasource:
    master: #主数据库
      ip: 61.143.42.70 # IP
      port: 7006 #端口
      ip: 172.16.24.11 # IP
      port: 3306 #端口
      database: hc_cwxt #数据库名
      username:  #用户名
      username: root #用户名
      password:  #密码
    slave: #从数据库
      enabled: false  #是否开启从数据库 关闭时以下信息可以不用配置
@@ -66,7 +66,7 @@
      log-slow-sql: true  # 慢SQL记录
  #redis 相关配置
  redis:
    host: localhost #访问地址
    host: 172.16.24.13 #访问地址
    port: 6379 #端口
    password: #密码
    timeout: 10s #超时时间
@@ -127,4 +127,6 @@
    clerk: "钟文洋"
    salerAddress: "珠海市香洲区南屏镇通港一路120号"
    invoicingAddress: "http://localhost:6012/api/third/jyjy/common/invoicing"
    returnAddress: "http://172.16.24.19:6720/api/third/invoice"
    returnAddress: "http://172.16.24.19:6014/api/third/invoice"
  tms:
    url: "http://61.143.42.70:7000/tms-api/"
admin/config/test/application-custom.yml
@@ -127,4 +127,6 @@
    clerk: "钟文洋"
    salerAddress: "珠海市香洲区南屏镇通港一路120号"
    invoicingAddress: "http://localhost:6219/api/third/jyjy/common/invoicing"
    returnAddress: "http://127.0.0.1:6620/api/third/invoice"
    returnAddress: "http://127.0.0.1:6620/api/third/invoice"
  tms:
    url: "http://61.143.42.70:7010/cwgttest-api/"
api/src/main/java/com/ruoyi/api/third/controller/ReceivableBillApiController.java
@@ -2,12 +2,8 @@
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.cwgl.domain.PayableBillManagement;
import com.ruoyi.cwgl.domain.PayableFeeDetail;
import com.ruoyi.cwgl.domain.PayableFeeManagement;
import com.ruoyi.cwgl.domain.ReceivableBillManagement;
import com.ruoyi.cwgl.domain.ReceivableFeeDetail;
import com.ruoyi.cwgl.domain.ReceivableFeeManagement;
import com.ruoyi.cwgl.domain.*;
import com.ruoyi.cwgl.domain.dto.BillAuditDto;
import com.ruoyi.cwgl.domain.dto.PayableBillApiDto;
import com.ruoyi.cwgl.domain.dto.ReceivableBillApiDto;
import com.ruoyi.cwgl.service.IPayableBillManagementService;
@@ -185,6 +181,7 @@
        billManagement.setSettlementCategory(billDto.getSettlementCategory());
        billManagement.setSettlementPeriod(billDto.getSettlementPeriod());
        billManagement.setStatus(billDto.getStatus() != null ? billDto.getStatus() : "draft");
        billManagement.setAuditStatus(billDto.getAuditStatus() != null ? billDto.getAuditStatus() : 0);
        billManagement.setRemark(billDto.getRemark());
        billManagement.setCreateTime(DateUtils.getNowDate());
        billManagement.setCreateBy("api_system");
@@ -430,6 +427,7 @@
        
        // 设置其他信息
        billManagement.setStatus(billDto.getStatus() != null ? billDto.getStatus() : "draft");
        billManagement.setAuditStatus(billDto.getAuditStatus() != null ? billDto.getAuditStatus() : 0);
        billManagement.setRemark(billDto.getRemark());
        billManagement.setCreateTime(DateUtils.getNowDate());
        billManagement.setCreateBy("api_system");
service/src/main/java/com/ruoyi/cwgl/controller/PayableBillManagementController.java
@@ -22,9 +22,12 @@
import com.ruoyi.cwgl.domain.InvoiceManage;
import com.ruoyi.cwgl.domain.PayableBillManagement;
import com.ruoyi.cwgl.domain.PayableInvoiceBusiness;
import com.ruoyi.cwgl.domain.dto.BillAuditDto;
import com.ruoyi.cwgl.domain.dto.PayableAuditLog;
import com.ruoyi.cwgl.service.IInvoiceManageService;
import com.ruoyi.cwgl.service.IPayableBillManagementService;
import com.ruoyi.cwgl.service.IPayableInvoiceBusinessService;
import com.ruoyi.cwgl.service.ITmsAuditLogPushService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
@@ -46,6 +49,9 @@
    @Autowired
    private IPayableInvoiceBusinessService payableInvoiceBusinessService;
    @Autowired
    private ITmsAuditLogPushService tmsAuditLogPushService;
@@ -167,4 +173,110 @@
        
        return AjaxResult.success(invoicedAmount);
    }
    /**
     * 应付账单审核接口
     * @param billAuditDto 审核数据传输对象
     * @return 审核结果
     */
    @PreAuthorize("@ss.hasPermi('cwgl:payableBillManagement:audit')")
    @Log(title = "应付账单管理", businessType = BusinessType.UPDATE)
    @PutMapping("/audit")
    public AjaxResult auditPayableBill(@RequestBody BillAuditDto billAuditDto) {
        try {
            // 1. 查询应付账单
            PayableBillManagement bill = payableBillManagementService.selectPayableBillManagementById(billAuditDto.getBillId());
            if (bill == null) {
                return AjaxResult.error("应付账单不存在,ID:" + billAuditDto.getBillId());
            }
            // 2. 记录审核前状态
            Integer beforeAuditStatus = bill.getAuditStatus();
            // 3. 更新审核状态
            bill.setAuditStatus(billAuditDto.getAuditResult());
            bill.setUpdateTime(new java.util.Date());
            bill.setUpdateBy(getUsername());
            // 4. 更新账单
            int rows = payableBillManagementService.updatePayableBillManagement(bill);
            if (rows <= 0) {
                return AjaxResult.error("更新应付账单审核状态失败");
            }
            // 5. 记录审核日志
            savePayableAuditLog(billAuditDto, bill, beforeAuditStatus);
            // 6. 如果来源系统是TMS,推送审核日志到TMS
            if (tmsAuditLogPushService.isPayableBillFromTms(bill.getSystemNo())) {
                try {
                    PayableAuditLog auditLog = createPayableAuditLog(billAuditDto, bill, beforeAuditStatus);
                    tmsAuditLogPushService.pushPayableAuditLog(auditLog);
                } catch (Exception e) {
                    logger.error("推送应付账单审核日志到TMS失败,账单ID:{}", bill.getId(), e);
                    // 推送失败不影响主流程,只记录日志
                }
            }
            return AjaxResult.success("应付账单审核成功");
        } catch (Exception e) {
            return AjaxResult.error("应付账单审核失败:" + e.getMessage());
        }
    }
    /**
     * 保存应付账单审核日志
     */
    private void savePayableAuditLog(BillAuditDto billAuditDto, PayableBillManagement bill, Integer beforeAuditStatus) {
        // 这里需要实现日志记录逻辑
        // 可以使用原有的日志服务或系统日志
        logger.info("应付账单审核日志 - 账单ID:{},账单编号:{},审核前状态:{},审核结果:{},审核意见:{}",
            bill.getId(), bill.getSystemNo(),
            getAuditStatusText(beforeAuditStatus),
            getAuditResultText(billAuditDto.getAuditResult()),
            billAuditDto.getAuditComment() != null ? billAuditDto.getAuditComment() : "无");
    }
    /**
     * 获取审核状态文本
     */
    private String getAuditStatusText(Integer auditStatus) {
        switch (auditStatus) {
            case 0: return "待审核";
            case 1: return "审核通过";
            case 2: return "审核驳回";
            default: return "未知状态";
        }
    }
    /**
     * 获取审核结果文本
     */
    private String getAuditResultText(Integer auditResult) {
        switch (auditResult) {
            case 1: return "通过";
            case 2: return "驳回";
            default: return "未知结果";
        }
    }
    /**
     * 创建应付账单审核日志对象
     */
    private PayableAuditLog createPayableAuditLog(BillAuditDto billAuditDto, PayableBillManagement bill, Integer beforeAuditStatus) {
        PayableAuditLog auditLog = new PayableAuditLog();
        auditLog.setBillId(bill.getId());
        auditLog.setBillNo(bill.getSystemNo());
        auditLog.setBillName(bill.getBillName());
        auditLog.setSupplierName(bill.getSupplierName());
        auditLog.setSourceSystem(tmsAuditLogPushService.getPayableBillSourceSystem(bill.getSystemNo()));
        auditLog.setBeforeAuditStatus(beforeAuditStatus);
        auditLog.setAuditResult(billAuditDto.getAuditResult());
        auditLog.setAuditComment(billAuditDto.getAuditComment());
        auditLog.setAuditUser(getUsername());
        auditLog.setAuditTime(new java.util.Date());
        auditLog.setTotalAmount(bill.getTotalAmount());
        return auditLog;
    }
}
service/src/main/java/com/ruoyi/cwgl/controller/ReceivableBillManagementController.java
@@ -26,9 +26,12 @@
import com.ruoyi.cwgl.domain.InvoiceManage;
import com.ruoyi.cwgl.domain.ReceivableBillManagement;
import com.ruoyi.cwgl.domain.ReceivableInvoiceBusiness;
import com.ruoyi.cwgl.domain.dto.BillAuditDto;
import com.ruoyi.cwgl.domain.dto.ReceivableAuditLog;
import com.ruoyi.cwgl.service.IInvoiceManageService;
import com.ruoyi.cwgl.service.IReceivableBillManagementService;
import com.ruoyi.cwgl.service.IReceivableInvoiceBusinessService;
import com.ruoyi.cwgl.service.ITmsAuditLogPushService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
@@ -50,6 +53,9 @@
    @Autowired
    private IReceivableInvoiceBusinessService receivableInvoiceBusinessService;
    @Autowired
    private ITmsAuditLogPushService tmsAuditLogPushService;
@@ -245,5 +251,111 @@
        receivableBillManagementService.accountAnalysisExport(receivableBillManagement,exportKey);
        return AjaxResult.success("导出请求成功,请稍后点击下载...!");
    }
    /**
     * 应收账单审核接口
     * @param billAuditDto 审核数据传输对象
     * @return 审核结果
     */
    @PreAuthorize("@ss.hasPermi('cwgl:receivableBillManagement:audit')")
    @Log(title = "应收账单管理", businessType = BusinessType.UPDATE)
    @PutMapping("/audit")
    public AjaxResult auditReceivableBill(@RequestBody BillAuditDto billAuditDto) {
        try {
            // 1. 查询应收账单
            ReceivableBillManagement bill = receivableBillManagementService.selectReceivableBillManagementById(billAuditDto.getBillId());
            if (bill == null) {
                return AjaxResult.error("应收账单不存在,ID:" + billAuditDto.getBillId());
            }
            // 2. 记录审核前状态
            Integer beforeAuditStatus = bill.getAuditStatus();
            // 3. 更新审核状态
            bill.setAuditStatus(billAuditDto.getAuditResult());
            bill.setUpdateTime(new java.util.Date());
            bill.setUpdateBy(getUsername());
            // 4. 更新账单
            int rows = receivableBillManagementService.updateReceivableBillManagement(bill);
            if (rows <= 0) {
                return AjaxResult.error("更新应收账单审核状态失败");
            }
            // 5. 记录审核日志
            saveReceivableAuditLog(billAuditDto, bill, beforeAuditStatus);
            // 6. 如果来源系统是TMS,推送审核日志到TMS
            if (tmsAuditLogPushService.isReceivableBillFromTms(bill.getSystemNo())) {
                try {
                    ReceivableAuditLog auditLog = createReceivableAuditLog(billAuditDto, bill, beforeAuditStatus);
                    tmsAuditLogPushService.pushReceivableAuditLog(auditLog);
                } catch (Exception e) {
                    logger.error("推送应收账单审核日志到TMS失败,账单ID:{}", bill.getId(), e);
                    // 推送失败不影响主流程,只记录日志
                }
            }
            return AjaxResult.success("应收账单审核成功");
        } catch (Exception e) {
            return AjaxResult.error("应收账单审核失败:" + e.getMessage());
        }
    }
    /**
     * 保存应收账单审核日志
     */
    private void saveReceivableAuditLog(BillAuditDto billAuditDto, ReceivableBillManagement bill, Integer beforeAuditStatus) {
        // 这里需要实现日志记录逻辑
        // 可以使用原有的日志服务或系统日志
        logger.info("应收账单审核日志 - 账单ID:{},账单编号:{},审核前状态:{},审核结果:{},审核意见:{}",
            bill.getId(), bill.getSystemNo(),
            getAuditStatusText(beforeAuditStatus),
            getAuditResultText(billAuditDto.getAuditResult()),
            billAuditDto.getAuditComment() != null ? billAuditDto.getAuditComment() : "无");
    }
    /**
     * 获取审核状态文本
     */
    private String getAuditStatusText(Integer auditStatus) {
        switch (auditStatus) {
            case 0: return "待审核";
            case 1: return "审核通过";
            case 2: return "审核驳回";
            default: return "未知状态";
        }
    }
    /**
     * 获取审核结果文本
     */
    private String getAuditResultText(Integer auditResult) {
        switch (auditResult) {
            case 1: return "通过";
            case 2: return "驳回";
            default: return "未知结果";
        }
    }
    /**
     * 创建应收账单审核日志对象
     */
    private ReceivableAuditLog createReceivableAuditLog(BillAuditDto billAuditDto, ReceivableBillManagement bill, Integer beforeAuditStatus) {
        ReceivableAuditLog auditLog = new ReceivableAuditLog();
        auditLog.setBillId(bill.getId());
        auditLog.setBillNo(bill.getSystemNo());
        auditLog.setBillName(bill.getBillName());
        auditLog.setCustomerName(bill.getCustomerName());
        auditLog.setSourceSystem(tmsAuditLogPushService.getReceivableBillSourceSystem(bill.getSystemNo()));
        auditLog.setBeforeAuditStatus(beforeAuditStatus);
        auditLog.setAuditResult(billAuditDto.getAuditResult());
        auditLog.setAuditComment(billAuditDto.getAuditComment());
        auditLog.setAuditUser(getUsername());
        auditLog.setAuditTime(new java.util.Date());
        auditLog.setTotalAmount(bill.getTotalAmount());
        return auditLog;
    }
    
}
service/src/main/java/com/ruoyi/cwgl/domain/PayableBillManagement.java
@@ -184,6 +184,13 @@
    private String status;
    /** 审核状态(0:未审核;1:审核通过;2:审核不通过) */
    @Excel(name = "审核状态")
        @TableField("audit_status")
    private Integer auditStatus;
    /** 备注 */
    @Excel(name = "备注")
service/src/main/java/com/ruoyi/cwgl/domain/ReceivableBillManagement.java
@@ -337,7 +337,7 @@
    /**
     * 状态(draft:草稿;generated:已生成;sent:已发送;partial_paid:部分收款;paid:已收款;cancelled:已取消)
     * 状态(draft:草稿;generated:已生成;sent:已发送;pending_review:待审核;partial_paid:部分收款;paid:已收款;cancelled:已取消)
     */
    @Excel(name = "状态")
@@ -345,6 +345,13 @@
    private String status;
    /** 审核状态(0:未审核;1:审核通过;2:审核不通过) */
    @Excel(name = "审核状态")
        @TableField("audit_status")
    private Integer auditStatus;
    /** 备注 */
    @Excel(name = "备注")
service/src/main/java/com/ruoyi/cwgl/domain/dto/BillAuditDto.java
New file
@@ -0,0 +1,35 @@
package com.ruoyi.cwgl.domain.dto;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
 * 账单审核数据传输对象
 */
@Data
public class BillAuditDto {
    /**
     * 账单ID
     */
    @NotNull(message = "账单ID不能为空")
    private Integer billId;
    /**
     * 账单类型 (0:应收, 1:应付)
     */
    @NotBlank(message = "账单类型不能为空")
    private Integer billType;
    /**
     * 审核结果 (1:通过, 2:驳回)
     */
    @NotNull(message = "审核结果不能为空")
    private Integer auditResult;
    /**
     * 审核意见
     */
    private String auditComment;
}
service/src/main/java/com/ruoyi/cwgl/domain/dto/PayableAuditLog.java
New file
@@ -0,0 +1,66 @@
package com.ruoyi.cwgl.domain.dto;
import lombok.Data;
import java.util.Date;
/**
 * 应付账单审核日志数据传输对象
 */
@Data
public class PayableAuditLog {
    /**
     * 账单ID
     */
    private Integer billId;
    /**
     * 账单编号
     */
    private String billNo;
    /**
     * 账单名称
     */
    private String billName;
    /**
     * 供应商名称
     */
    private String supplierName;
    /**
     * 来源系统
     */
    private String sourceSystem;
    /**
     * 审核前状态
     */
    private Integer beforeAuditStatus;
    /**
     * 审核结果
     */
    private Integer auditResult;
    /**
     * 审核意见
     */
    private String auditComment;
    /**
     * 审核人
     */
    private String auditUser;
    /**
     * 审核时间
     */
    private Date auditTime;
    /**
     * 总金额
     */
    private java.math.BigDecimal totalAmount;
}
service/src/main/java/com/ruoyi/cwgl/domain/dto/PayableBillApiDto.java
@@ -104,9 +104,12 @@
        @JsonFormat(pattern = "yyyy-MM-dd")
        private Date billDueDate;
        /** 状态(draft:草稿;generated:已生成;sent:已发送;partial_paid:部分付款;paid:已付款;cancelled:已取消) */
        /** 状态(draft:草稿;generated:已生成;sent:已发送;pending_review:待审核;partial_paid:部分付款;paid:已付款;cancelled:已取消) */
        private String status;
        /** 审核状态(0:未审核;1:审核通过;2:审核不通过) */
        private Integer auditStatus;
        /** 备注 */
        private String remark;
    }
service/src/main/java/com/ruoyi/cwgl/domain/dto/ReceivableAuditLog.java
New file
@@ -0,0 +1,66 @@
package com.ruoyi.cwgl.domain.dto;
import lombok.Data;
import java.util.Date;
/**
 * 应收账单审核日志数据传输对象
 */
@Data
public class ReceivableAuditLog {
    /**
     * 账单ID
     */
    private Integer billId;
    /**
     * 账单编号
     */
    private String billNo;
    /**
     * 账单名称
     */
    private String billName;
    /**
     * 客户名称
     */
    private String customerName;
    /**
     * 来源系统
     */
    private String sourceSystem;
    /**
     * 审核前状态
     */
    private Integer beforeAuditStatus;
    /**
     * 审核结果
     */
    private Integer auditResult;
    /**
     * 审核意见
     */
    private String auditComment;
    /**
     * 审核人
     */
    private String auditUser;
    /**
     * 审核时间
     */
    private Date auditTime;
    /**
     * 总金额
     */
    private java.math.BigDecimal totalAmount;
}
service/src/main/java/com/ruoyi/cwgl/domain/dto/ReceivableBillApiDto.java
@@ -128,9 +128,12 @@
        /** 结算期 */
        private String settlementPeriod;
        /** 状态(draft:草稿;generated:已生成;sent:已发送;partial_paid:部分收款;paid:已收款;cancelled:已取消) */
        /** 状态(draft:草稿;generated:已生成;sent:已发送;pending_review:待审核;partial_paid:部分收款;paid:已收款;cancelled:已取消) */
        private String status;
        /** 审核状态(0:未审核;1:审核通过;2:审核不通过) */
        private Integer auditStatus;
        /** 备注 */
        private String remark;
    }
service/src/main/java/com/ruoyi/cwgl/service/ITmsAuditLogPushService.java
New file
@@ -0,0 +1,52 @@
package com.ruoyi.cwgl.service;
import com.ruoyi.cwgl.domain.dto.PayableAuditLog;
import com.ruoyi.cwgl.domain.dto.ReceivableAuditLog;
/**
 * TMS审核日志推送服务接口
 */
public interface ITmsAuditLogPushService {
    /**
     * 推送应付账单审核日志到TMS
     * @param auditLog 应付账单审核日志
     * @return 推送是否成功
     */
    boolean pushPayableAuditLog(PayableAuditLog auditLog);
    /**
     * 推送应收账单审核日志到TMS
     * @param auditLog 应收账单审核日志
     * @return 推送是否成功
     */
    boolean pushReceivableAuditLog(ReceivableAuditLog auditLog);
    /**
     * 判断应付账单是否来自TMS系统
     * @param billNo 账单编号
     * @return 是否来自TMS系统
     */
    boolean isPayableBillFromTms(String billNo);
    /**
     * 判断应收账单是否来自TMS系统
     * @param billNo 账单编号
     * @return 是否来自TMS系统
     */
    boolean isReceivableBillFromTms(String billNo);
    /**
     * 获取应付账单的来源系统
     * @param billNo 账单编号
     * @return 来源系统
     */
    String getPayableBillSourceSystem(String billNo);
    /**
     * 获取应收账单的来源系统
     * @param billNo 账单编号
     * @return 来源系统
     */
    String getReceivableBillSourceSystem(String billNo);
}
service/src/main/java/com/ruoyi/cwgl/service/impl/TmsAuditLogPushServiceImpl.java
New file
@@ -0,0 +1,169 @@
package com.ruoyi.cwgl.service.impl;
import com.alibaba.fastjson2.JSON;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.cwgl.domain.PayableFeeManagement;
import com.ruoyi.cwgl.domain.ReceivableFeeManagement;
import com.ruoyi.cwgl.domain.dto.PayableAuditLog;
import com.ruoyi.cwgl.domain.dto.ReceivableAuditLog;
import com.ruoyi.cwgl.service.IPayableFeeManagementService;
import com.ruoyi.cwgl.service.IReceivableFeeManagementService;
import com.ruoyi.cwgl.service.ITmsAuditLogPushService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * TMS审核日志推送服务实现类
 */
@Service
public class TmsAuditLogPushServiceImpl implements ITmsAuditLogPushService {
    private static final Logger log = LoggerFactory.getLogger(TmsAuditLogPushServiceImpl.class);
    @Value("${custom.tms.url}")
    private String tmsBaseUrl;
    @Autowired
    private IPayableFeeManagementService payableFeeManagementService;
    @Autowired
    private IReceivableFeeManagementService receivableFeeManagementService;
    @Override
    public boolean pushPayableAuditLog(PayableAuditLog auditLog) {
        try {
            String url = tmsBaseUrl + "/api/third/audit/ap-bill";
            String jsonBody = JSON.toJSONString(auditLog);
            log.info("推送应付账单审核日志到TMS: {}", jsonBody);
            String response = HttpUtils.sendPost(url, jsonBody);
            log.info("TMS应付账单审核日志推送响应: {}", response);
            return true;
        } catch (Exception e) {
            log.error("推送应付账单审核日志到TMS失败", e);
            return false;
        }
    }
    @Override
    public boolean pushReceivableAuditLog(ReceivableAuditLog auditLog) {
        try {
            String url = tmsBaseUrl + "/api/third/audit/ar-bill";
            String jsonBody = JSON.toJSONString(auditLog);
            log.info("推送应收账单审核日志到TMS: {}", jsonBody);
            String response = HttpUtils.sendPost(url, jsonBody);
            log.info("TMS应收账单审核日志推送响应: {}", response);
            return true;
        } catch (Exception e) {
            log.error("推送应收账单审核日志到TMS失败", e);
            return false;
        }
    }
    /**
     * 判断应付账单是否来自TMS系统
     * @param billNo 账单编号
     * @return 是否来自TMS系统
     */
    public boolean isPayableBillFromTms(String billNo) {
        try {
            PayableFeeManagement query = new PayableFeeManagement();
            query.setRelatedBillNo(billNo);
            List<PayableFeeManagement> fees = payableFeeManagementService.selectPayableFeeManagementList(query);
            if (fees != null && !fees.isEmpty()) {
                // 检查是否有费用来自TMS系统
                return fees.stream()
                        .anyMatch(fee -> "TMS".equalsIgnoreCase(fee.getSourceSystem()));
            }
            return false;
        } catch (Exception e) {
            log.error("判断应付账单来源系统失败", e);
            return false;
        }
    }
    /**
     * 判断应收账单是否来自TMS系统
     * @param billNo 账单编号
     * @return 是否来自TMS系统
     */
    public boolean isReceivableBillFromTms(String billNo) {
        try {
            ReceivableFeeManagement query = new ReceivableFeeManagement();
            query.setRelatedBillNo(billNo);
            List<ReceivableFeeManagement> fees = receivableFeeManagementService.selectReceivableFeeManagementList(query);
            if (fees != null && !fees.isEmpty()) {
                // 检查是否有费用来自TMS系统
                return fees.stream()
                        .anyMatch(fee -> "tms".equalsIgnoreCase(fee.getSourceSystem()));
            }
            return false;
        } catch (Exception e) {
            log.error("判断应收账单来源系统失败", e);
            return false;
        }
    }
    /**
     * 获取应付账单的来源系统
     * @param billNo 账单编号
     * @return 来源系统,如果多个来源系统则返回第一个TMS系统,否则返回第一个非空系统
     */
    public String getPayableBillSourceSystem(String billNo) {
        try {
            PayableFeeManagement query = new PayableFeeManagement();
            query.setRelatedBillNo(billNo);
            List<PayableFeeManagement> fees = payableFeeManagementService.selectPayableFeeManagementList(query);
            if (fees != null && !fees.isEmpty()) {
                // 优先返回TMS系统
                return fees.stream()
                        .map(PayableFeeManagement::getSourceSystem)
                        .filter(source -> source != null && !source.trim().isEmpty())
                        .findFirst()
                        .orElse(null);
            }
            return null;
        } catch (Exception e) {
            log.error("获取应付账单来源系统失败", e);
            return null;
        }
    }
    /**
     * 获取应收账单的来源系统
     * @param billNo 账单编号
     * @return 来源系统,如果多个来源系统则返回第一个TMS系统,否则返回第一个非空系统
     */
    public String getReceivableBillSourceSystem(String billNo) {
        try {
            ReceivableFeeManagement query = new ReceivableFeeManagement();
            query.setRelatedBillNo(billNo);
            List<ReceivableFeeManagement> fees = receivableFeeManagementService.selectReceivableFeeManagementList(query);
            if (fees != null && !fees.isEmpty()) {
                // 优先返回TMS系统
                return fees.stream()
                        .map(ReceivableFeeManagement::getSourceSystem)
                        .filter(source -> source != null && !source.trim().isEmpty())
                        .findFirst()
                        .orElse(null);
            }
            return null;
        } catch (Exception e) {
            log.error("获取应收账单来源系统失败", e);
            return null;
        }
    }
}
service/src/main/resources/mapper/cwgl/PayableBillManagementMapper.xml
@@ -28,6 +28,7 @@
        <result property="billSendDate"    column="bill_send_date"    />
        <result property="billDueDate"    column="bill_due_date"    />
        <result property="status"    column="status"    />
        <result property="auditStatus"    column="audit_status"    />
        <result property="remark"    column="remark"    />
        <result property="createBy"    column="create_by"    />
        <result property="createTime"    column="create_time"    />
@@ -37,7 +38,7 @@
    </resultMap>
    <sql id="selectPayableBillManagementVo">
        select thisTab.id, thisTab.system_no, thisTab.bill_name, thisTab.supplier_name, thisTab.is_internal_settlement, thisTab.internal_settlement_unit, thisTab.document_count, thisTab.total_amount, thisTab.currency, thisTab.discount_amount, thisTab.paid_amount, thisTab.pending_amount, thisTab.exchange_rate, thisTab.cny_amount, thisTab.period_type, thisTab.business_start_date, thisTab.business_end_date, thisTab.billing_start_date, thisTab.billing_end_date, thisTab.bill_generate_date, thisTab.bill_send_date, thisTab.bill_due_date, thisTab.status, thisTab.remark, thisTab.create_by, thisTab.create_time, thisTab.update_by, thisTab.update_time, thisTab.deleted from payable_bill_management AS thisTab
        select thisTab.id, thisTab.system_no, thisTab.bill_name, thisTab.supplier_name, thisTab.is_internal_settlement, thisTab.internal_settlement_unit, thisTab.document_count, thisTab.total_amount, thisTab.currency, thisTab.discount_amount, thisTab.paid_amount, thisTab.pending_amount, thisTab.exchange_rate, thisTab.cny_amount, thisTab.period_type, thisTab.business_start_date, thisTab.business_end_date, thisTab.billing_start_date, thisTab.billing_end_date, thisTab.bill_generate_date, thisTab.bill_send_date, thisTab.bill_due_date, thisTab.status, thisTab.audit_status, thisTab.remark, thisTab.create_by, thisTab.create_time, thisTab.update_by, thisTab.update_time, thisTab.deleted from payable_bill_management AS thisTab
    </sql>
    <sql id="selectPayableBillManagementVoCount">
        select count(0) from payable_bill_management as thisTab
@@ -130,6 +131,7 @@
            <if test="billSendDate != null">bill_send_date,</if>
            <if test="billDueDate != null">bill_due_date,</if>
            <if test="status != null">status,</if>
            <if test="auditStatus != null">audit_status,</if>
            <if test="remark != null">remark,</if>
            <if test="createBy != null">create_by,</if>
            <if test="createTime != null">create_time,</if>
@@ -160,6 +162,7 @@
            <if test="billSendDate != null">#{billSendDate},</if>
            <if test="billDueDate != null">#{billDueDate},</if>
            <if test="status != null">#{status},</if>
            <if test="auditStatus != null">#{auditStatus},</if>
            <if test="remark != null">#{remark},</if>
            <if test="createBy != null">#{createBy},</if>
            <if test="createTime != null">#{createTime},</if>
@@ -172,11 +175,11 @@
    <insert id="insertPayableBillManagementBatch" parameterType="java.util.List"  useGeneratedKeys="true" keyProperty="id">
        insert into payable_bill_management
        <trim prefix="(" suffix=") values" suffixOverrides=",">
            id,system_no,bill_name,supplier_name,is_internal_settlement,internal_settlement_unit,document_count,total_amount,currency,discount_amount,paid_amount,pending_amount,exchange_rate,cny_amount,period_type,business_start_date,business_end_date,billing_start_date,billing_end_date,bill_generate_date,bill_send_date,bill_due_date,status,remark,create_by,create_time,update_by,update_time,deleted,
            id,system_no,bill_name,supplier_name,is_internal_settlement,internal_settlement_unit,document_count,total_amount,currency,discount_amount,paid_amount,pending_amount,exchange_rate,cny_amount,period_type,business_start_date,business_end_date,billing_start_date,billing_end_date,bill_generate_date,bill_send_date,bill_due_date,status,audit_status,remark,create_by,create_time,update_by,update_time,deleted,
        </trim>
        <foreach item="item" index="index" collection="list" separator=",">
            <trim prefix="(" suffix=") " suffixOverrides=",">
                #{item.id},#{item.systemNo},#{item.billName},#{item.supplierName},#{item.isInternalSettlement},#{item.internalSettlementUnit},#{item.documentCount},#{item.totalAmount},#{item.currency},#{item.discountAmount},#{item.paidAmount},#{item.pendingAmount},#{item.exchangeRate},#{item.cnyAmount},#{item.periodType},#{item.businessStartDate},#{item.businessEndDate},#{item.billingStartDate},#{item.billingEndDate},#{item.billGenerateDate},#{item.billSendDate},#{item.billDueDate},#{item.status},#{item.remark},#{item.createBy},#{item.createTime},#{item.updateBy},#{item.updateTime},#{item.deleted},
                #{item.id},#{item.systemNo},#{item.billName},#{item.supplierName},#{item.isInternalSettlement},#{item.internalSettlementUnit},#{item.documentCount},#{item.totalAmount},#{item.currency},#{item.discountAmount},#{item.paidAmount},#{item.pendingAmount},#{item.exchangeRate},#{item.cnyAmount},#{item.periodType},#{item.businessStartDate},#{item.businessEndDate},#{item.billingStartDate},#{item.billingEndDate},#{item.billGenerateDate},#{item.billSendDate},#{item.billDueDate},#{item.status},#{item.auditStatus},#{item.remark},#{item.createBy},#{item.createTime},#{item.updateBy},#{item.updateTime},#{item.deleted},
            </trim>
        </foreach>
    </insert>
@@ -207,6 +210,7 @@
            <if test="billSendDate != null">bill_send_date = #{billSendDate},</if>
            <if test="billDueDate != null">bill_due_date = #{billDueDate},</if>
            <if test="status != null">status = #{status},</if>
            <if test="auditStatus != null">audit_status = #{auditStatus},</if>
            <if test="remark != null">remark = #{remark},</if>
            <if test="createBy != null">create_by = #{createBy},</if>
            <if test="createTime != null">create_time = #{createTime},</if>
service/src/main/resources/mapper/cwgl/ReceivableBillManagementMapper.xml
@@ -40,6 +40,7 @@
        <result property="accountRemark"    column="account_remark"    />
        <result property="overdueInterest"    column="overdue_interest"    />
        <result property="status"    column="status"    />
        <result property="auditStatus"    column="audit_status"    />
        <result property="remark"    column="remark"    />
        <result property="createBy"    column="create_by"    />
        <result property="createTime"    column="create_time"    />
@@ -82,7 +83,7 @@
    </resultMap>
    <sql id="selectReceivableBillManagementVo">
        select thisTab.id, thisTab.system_no, thisTab.bill_name, thisTab.customer_name, thisTab.payee, thisTab.responsible_person, thisTab.responsible_leader, thisTab.settlement_method, thisTab.business_type, thisTab.promotion_requirement, thisTab.is_internal_settlement, thisTab.internal_settlement_unit, thisTab.document_count, thisTab.total_amount, thisTab.currency, thisTab.discount_amount, thisTab.received_amount, thisTab.pending_amount, thisTab.exchange_rate, thisTab.cny_amount, thisTab.period_type, thisTab.business_start_date, thisTab.business_end_date, thisTab.billing_start_date, thisTab.billing_end_date, thisTab.bill_generate_date, thisTab.bill_send_date, thisTab.bill_due_date, thisTab.due_in_30_days, thisTab.overdue_amount, thisTab.overdue_1_to_30_days, thisTab.overdue_31_to_60_days, thisTab.overdue_61_to_90_days, thisTab.overdue_91_to_180_days, thisTab.overdue_181_to_365_days, thisTab.overdue_over_1_year, thisTab.overdue_days, thisTab.settlement_category, thisTab.settlement_period, thisTab.nc_settlement_date, thisTab.nc_settlement_amount, thisTab.account_remark, thisTab.overdue_interest, thisTab.status, thisTab.remark, thisTab.create_by, thisTab.create_time, thisTab.update_by, thisTab.update_time, thisTab.deleted from receivable_bill_management AS thisTab
        select thisTab.id, thisTab.system_no, thisTab.bill_name, thisTab.customer_name, thisTab.payee, thisTab.responsible_person, thisTab.responsible_leader, thisTab.settlement_method, thisTab.business_type, thisTab.promotion_requirement, thisTab.is_internal_settlement, thisTab.internal_settlement_unit, thisTab.document_count, thisTab.total_amount, thisTab.currency, thisTab.discount_amount, thisTab.received_amount, thisTab.pending_amount, thisTab.exchange_rate, thisTab.cny_amount, thisTab.period_type, thisTab.business_start_date, thisTab.business_end_date, thisTab.billing_start_date, thisTab.billing_end_date, thisTab.bill_generate_date, thisTab.bill_send_date, thisTab.bill_due_date, thisTab.due_in_30_days, thisTab.overdue_amount, thisTab.overdue_1_to_30_days, thisTab.overdue_31_to_60_days, thisTab.overdue_61_to_90_days, thisTab.overdue_91_to_180_days, thisTab.overdue_181_to_365_days, thisTab.overdue_over_1_year, thisTab.overdue_days, thisTab.settlement_category, thisTab.settlement_period, thisTab.nc_settlement_date, thisTab.nc_settlement_amount, thisTab.account_remark, thisTab.overdue_interest, thisTab.status, thisTab.audit_status, thisTab.remark, thisTab.create_by, thisTab.create_time, thisTab.update_by, thisTab.update_time, thisTab.deleted from receivable_bill_management AS thisTab
    </sql>
    <sql id="selectReceivableBillManagementVoCount">
        select count(0) from receivable_bill_management as thisTab
@@ -199,6 +200,7 @@
            <if test="accountRemark != null and accountRemark != ''">account_remark,</if>
            <if test="overdueInterest != null">overdue_interest,</if>
            <if test="status != null">status,</if>
            <if test="auditStatus != null">audit_status,</if>
            <if test="remark != null">remark,</if>
            <if test="createBy != null">create_by,</if>
            <if test="createTime != null">create_time,</if>
@@ -241,6 +243,7 @@
            <if test="accountRemark != null and accountRemark != ''">#{accountRemark},</if>
            <if test="overdueInterest != null">#{overdueInterest},</if>
            <if test="status != null">#{status},</if>
            <if test="auditStatus != null">#{auditStatus},</if>
            <if test="remark != null">#{remark},</if>
            <if test="createBy != null">#{createBy},</if>
            <if test="createTime != null">#{createTime},</if>
@@ -253,11 +256,11 @@
    <insert id="insertReceivableBillManagementBatch" parameterType="java.util.List"  useGeneratedKeys="true" keyProperty="id">
        insert into receivable_bill_management
        <trim prefix="(" suffix=") values" suffixOverrides=",">
            system_no,bill_name,customer_name,payee,responsible_person,responsible_leader,settlement_method,business_type,promotion_requirement,is_internal_settlement,internal_settlement_unit,document_count,total_amount,currency,discount_amount,received_amount,pending_amount,exchange_rate,cny_amount,period_type,business_start_date,business_end_date,billing_start_date,billing_end_date,bill_generate_date,bill_send_date,bill_due_date,settlement_category,settlement_period,nc_settlement_date,nc_settlement_amount,account_remark,overdue_interest,status,remark,create_by,create_time,update_by,update_time,deleted,
            system_no,bill_name,customer_name,payee,responsible_person,responsible_leader,settlement_method,business_type,promotion_requirement,is_internal_settlement,internal_settlement_unit,document_count,total_amount,currency,discount_amount,received_amount,pending_amount,exchange_rate,cny_amount,period_type,business_start_date,business_end_date,billing_start_date,billing_end_date,bill_generate_date,bill_send_date,bill_due_date,settlement_category,settlement_period,nc_settlement_date,nc_settlement_amount,account_remark,overdue_interest,status,audit_status,remark,create_by,create_time,update_by,update_time,deleted,
        </trim>
        <foreach item="item" index="index" collection="list" separator=",">
            <trim prefix="(" suffix=") " suffixOverrides=",">
                #{item.systemNo},#{item.billName},#{item.customerName},#{item.payee},#{item.responsiblePerson},#{item.responsibleLeader},#{item.settlementMethod},#{item.businessType},#{item.promotionRequirement},#{item.isInternalSettlement},#{item.internalSettlementUnit},#{item.documentCount},#{item.totalAmount},#{item.currency},#{item.discountAmount},#{item.receivedAmount},#{item.pendingAmount},#{item.exchangeRate},#{item.cnyAmount},#{item.periodType},#{item.businessStartDate},#{item.businessEndDate},#{item.billingStartDate},#{item.billingEndDate},#{item.billGenerateDate},#{item.billSendDate},#{item.billDueDate},#{item.settlementCategory},#{item.settlementPeriod},#{item.ncSettlementDate},#{item.ncSettlementAmount},#{item.accountRemark},#{item.overdueInterest},#{item.status},#{item.remark},#{item.createBy},#{item.createTime},#{item.updateBy},#{item.updateTime},#{item.deleted},
                #{item.systemNo},#{item.billName},#{item.customerName},#{item.payee},#{item.responsiblePerson},#{item.responsibleLeader},#{item.settlementMethod},#{item.businessType},#{item.promotionRequirement},#{item.isInternalSettlement},#{item.internalSettlementUnit},#{item.documentCount},#{item.totalAmount},#{item.currency},#{item.discountAmount},#{item.receivedAmount},#{item.pendingAmount},#{item.exchangeRate},#{item.cnyAmount},#{item.periodType},#{item.businessStartDate},#{item.businessEndDate},#{item.billingStartDate},#{item.billingEndDate},#{item.billGenerateDate},#{item.billSendDate},#{item.billDueDate},#{item.settlementCategory},#{item.settlementPeriod},#{item.ncSettlementDate},#{item.ncSettlementAmount},#{item.accountRemark},#{item.overdueInterest},#{item.status},#{item.auditStatus},#{item.remark},#{item.createBy},#{item.createTime},#{item.updateBy},#{item.updateTime},#{item.deleted},
            </trim>
        </foreach>
    </insert>
@@ -300,6 +303,7 @@
            <if test="accountRemark != null and accountRemark != ''">account_remark = #{accountRemark},</if>
            <if test="overdueInterest != null">overdue_interest = #{overdueInterest},</if>
            <if test="status != null">status = #{status},</if>
            <if test="auditStatus != null">audit_status = #{auditStatus},</if>
            <if test="remark != null">remark = #{remark},</if>
            <if test="createBy != null">create_by = #{createBy},</if>
            <if test="createTime != null">create_time = #{createTime},</if>
@@ -348,6 +352,7 @@
                <if test="item.accountRemark != null and item.accountRemark != ''">account_remark = #{item.accountRemark},</if>
                <if test="item.overdueInterest != null">overdue_interest = #{item.overdueInterest},</if>
                <if test="item.status != null">status = #{item.status},</if>
                <if test="item.auditStatus != null">audit_status = #{item.auditStatus},</if>
                <if test="item.remark != null">remark = #{item.remark},</if>
                <if test="item.createBy != null">create_by = #{item.createBy},</if>
                <if test="item.createTime != null">create_time = #{item.createTime},</if>
ui/admin-ui3/.env.production
@@ -5,9 +5,10 @@
VITE_APP_ENV = 'production'
VITE_APP_KEY = 'RUOYI-BASE'
# 管理系统/生产环境
VITE_APP_BASE_API = '/prod-api'
VITE_APP_BASE_API = '/cwxt-api'
# 列表操作按钮展示位置 left/right
VITE_APP_listOptFixed = 'left'
# 上下文
VITE_APP_BASE_URL = '/cwxt/'
# 是否在打包时开启压缩,支持 gzip 和 brotli
VITE_BUILD_COMPRESS = gzip