🔀 合并 origin/master 到 dev

This commit is contained in:
2026-10-19 19:03:06 +08:00
124 changed files with 7909 additions and 803 deletions
@@ -309,12 +309,13 @@ public interface ISysClient {
R<Region> getRegion(@RequestParam("code") String code);
/**
* 获取启用的费用项
* 获取费用项。默认仅返回启用档案;includeDisabled 为 true 时同时返回停用档案。
*
* @param includeDisabled 是否包含停用费用项
* @return 费用项集合
*/
@GetMapping(FEE_ITEMS)
R<List<FeeItem>> getFeeItems();
R<List<FeeItem>> getFeeItems(@RequestParam(value = "includeDisabled", required = false) Boolean includeDisabled);
@GetMapping(CARGO_TYPES)
R<List<CargoType>> getCargoTypes();
@@ -165,7 +165,7 @@ public class ISysClientFallback implements ISysClient {
}
@Override
public R<List<FeeItem>> getFeeItems() {
public R<List<FeeItem>> getFeeItems(Boolean includeDisabled) {
return R.fail("获取数据失败");
}
@@ -72,4 +72,19 @@ public class OaOrgSyncPageVO implements Serializable {
@Schema(description = "全量同步结束后原始数据层级 JSON 文件路径")
private String dumpFilePath;
@Schema(description = "当前同步的公司 OA 主键(部门阶段按公司轮询时使用)")
private String companyOaId;
@Schema(description = "当前公司序号,从 1 开始")
private Integer companyIndex;
@Schema(description = "待同步公司总数")
private Integer companyTotal;
@Schema(description = "当前公司的部门是否已同步完")
private Boolean companyFinished;
@Schema(description = "下一公司 OA 主键;当前公司完成后回传,前端据此切换并重置页码")
private String nextCompanyOaId;
}
@@ -35,6 +35,7 @@ public class PaymentApplicationSaveRequest implements Serializable {
private Long settlementId;
private List<Long> settlementIds;
private Long preSettlementId;
private List<Long> preSettlementIds;
private Long projectId;
private String projectName;
private Long deptId;
@@ -60,4 +61,6 @@ public class PaymentApplicationSaveRequest implements Serializable {
private String remark;
private List<PaymentApplicationInvoiceRequest> invoices;
private List<PaymentApplicationRecordRequest> paymentRecords;
/** 多张结算单时按行提交的付款金额 */
private List<PaymentApplicationSettlementLineRequest> settlementLines;
}
@@ -0,0 +1,43 @@
/**
* BladeX Commercial License Agreement
* Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
* <p>
* Use of this software is governed by the Commercial License Agreement
* obtained after purchasing a license from BladeX.
* <p>
* 1. This software is for development use only under a valid license
* from BladeX.
* <p>
* 2. Redistribution of this software's source code to any third party
* without a commercial license is strictly prohibited.
* <p>
* 3. Licensees may copyright their own code but cannot use segments
* from this software for such purposes. Copyright of this software
* remains with BladeX.
* <p>
* Using this software signifies agreement to this License, and the software
* must not be used for illegal purposes.
* <p>
* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
* not liable for any claims arising from secondary or illegal development.
* <p>
* Author: Chill Zhuang (bladejava@qq.com)
*/
package org.springblade.transport.pojo.dto;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
/** 付款申请多结算单付款明细。 @author Chill */
@Data
public class PaymentApplicationSettlementLineRequest implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private Long formalSettlementId;
private Long preSettlementId;
private BigDecimal paymentRatio;
private BigDecimal appliedAmount;
}
@@ -33,7 +33,7 @@ public class PreSettlementDetailAdjustRequest implements Serializable {
@Schema(description = "预结算明细ID")
private Long detailId;
@Schema(description = "调整原因")
@Schema(description = "备注(写入结算明细备注,非必填)")
private String changeReason;
@Schema(description = "明细费用行")
@@ -63,4 +63,10 @@ public class ReceivablePayableFeeCalculateRequest implements Serializable {
@Schema(description = "动态费用项目")
private Map<String, BigDecimal> feeItems;
@Schema(description = "运输单价")
private BigDecimal unitPrice;
@Schema(description = "本次调整字段:transportQuantity、mileage、unitPrice 或费用项名称")
private String changedField;
}
@@ -172,4 +172,12 @@ public class FormalSettlement extends TenantEntity {
* 作废原因,驳回时记录驳回原因
*/
private String voidReason;
/**
* 来源原正式结算单号:结算调整重推生成的新单,指向被调整的原单
*/
private String originFormalSettlementNo;
/**
* 调整状态:adjusted-已被结算调整(原单标记)
*/
private String adjustStatus;
}
@@ -25,6 +25,10 @@ public class FormalSettlementChangeRecord extends TenantEntity {
private Integer lineNo;
private String operationType;
private String changeContent;
/** 变更前数据JSON */
private String beforeData;
/** 变更后数据JSON */
private String afterData;
private String changeReason;
private String operatorName;
private LocalDateTime changeTime;
@@ -8,7 +8,9 @@
*/
package org.springblade.transport.pojo.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.tenant.mp.TenantEntity;
@@ -123,6 +125,12 @@ public class FormalSettlementDetail extends TenantEntity {
* 批次号
*/
private String batchNo;
/**
* 计费方式(来源应收应付货物费用计费类型,非本表字段)
*/
@TableField(exist = false)
@Schema(description = "计费方式")
private String billingType;
/**
* 运输单价
*/
@@ -8,7 +8,9 @@
*/
package org.springblade.transport.pojo.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.tenant.mp.TenantEntity;
@@ -70,6 +72,12 @@ public class FormalSettlementDetailFee extends TenantEntity {
* 费用项JSON
*/
private String feeItemsJson;
/**
* 命中计费规则JSON(来源费用带回,非本表字段)
*/
@TableField(exist = false)
@Schema(description = "命中计费规则JSON")
private String billingRulesJson;
/**
* 原金额
*/
@@ -1,5 +1,6 @@
package org.springblade.transport.pojo.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -17,7 +18,12 @@ public class PaymentApplicationSettlement extends TenantEntity {
private Long paymentApplicationId;
private Long formalSettlementId;
private String formalSettlementNo;
private Long preSettlementId;
private String preSettlementNo;
private BigDecimal settlementAmount;
private BigDecimal appliedAmount;
private BigDecimal paidAmount;
/** 查看时回填的可付款金额,不落库 */
@TableField(exist = false)
private BigDecimal payableAmount;
}
@@ -9,6 +9,7 @@
*/
package org.springblade.transport.pojo.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -99,6 +100,10 @@ public class PreSettlementDetail extends TenantEntity {
@Schema(description = "批次号")
private String batchNo;
@TableField(exist = false)
@Schema(description = "计费方式")
private String billingType;
@Schema(description = "运输单价")
private BigDecimal unitPrice;
@@ -30,6 +30,10 @@ public class SettlementAdjustment extends TenantEntity {
private String currentNode;
private String currentProcessor;
private String kingdeeSyncStatus;
/**
* 金蝶单据号(未推送场景回填原结算单金蝶单号;重推场景回填新单金蝶单号)
*/
private String kingdeeBillNo;
private String attachmentsJson;
private String remark;
private LocalDateTime approvedTime;
@@ -107,6 +107,9 @@ public class SettlementImportBatch extends TenantEntity {
@Schema(description = "动态费用列名JSON")
private String feeItemNamesJson;
@Schema(description = "导入明细行JSON")
private String rowsJson;
@Schema(description = "备注")
private String remark;
@@ -6,6 +6,8 @@
*/
package org.springblade.transport.pojo.entity;
import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -41,6 +43,7 @@ public class TransportReconciliationExternal extends TenantEntity {
private BigDecimal freightAmount;
private String feeItemsJson;
private BigDecimal settlementAmount;
@TableField(updateStrategy = FieldStrategy.ALWAYS)
private Boolean suspectedDuplicate;
private String matchStatus;
private Long matchedInternalId;
@@ -58,6 +58,8 @@ public class FormalSettlementVO extends FormalSettlement implements KingdeeUnloc
private String kingdeeUnlockOperator;
@TableField(exist = false) @Schema(description = "解锁动作名称:金蝶删单/金蝶锁单")
private String kingdeeUnlockOperationName;
@TableField(exist = false) @Schema(description = "调整状态名称:adjusted-已调整")
private String adjustStatusName;
@TableField(exist = false) private String preSettlementNos;
@TableField(exist = false) private String preSettlementNo;
@TableField(exist = false) private List<FormalSettlementSource> sources;
@@ -70,6 +72,7 @@ public class FormalSettlementVO extends FormalSettlement implements KingdeeUnloc
@TableField(exist = false) @Schema(description = "开票申请经金蝶回写的发票结果(含文件地址,只读展示)")
private List<InvoiceApplicationInvoice> issuedInvoices;
@TableField(exist = false) private List<PaymentApplicationVO> paymentApplications;
@TableField(exist = false) private List<SettlementAdvancePaymentVO> advancePayments;
@TableField(exist = false) private List<SettlementAdjustmentVO> adjustments;
@TableField(exist = false) private List<FormalSettlementChangeRecord> changeRecords;
}
@@ -27,4 +27,6 @@ public class PaymentApplicationReferenceAmountVO implements Serializable {
@Schema(description = "结算金额") private BigDecimal settlementAmount;
@Schema(description = "累计申请付款金额") private BigDecimal cumulativeAppliedAmount;
@Schema(description = "可付款金额") private BigDecimal payableAmount;
/** 该结算单当前为第几次付款(含本次,已作废不计) */
@Schema(description = "付款次序") private Integer paymentSequence;
}
@@ -39,6 +39,7 @@ import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* 收款流水视图实体类
@@ -91,4 +92,9 @@ public class ReceiptFlowVO extends KingdeeReceiptFlow {
private BigDecimal receiptAmountEnd;
@TableField(exist = false)
private List<ReceiptFlowRecord> claimRecords = new ArrayList<>();
/**
* 本流水历史关联且仍有剩余可认领金额的应收正式结算单(继续认领时预填)
*/
@TableField(exist = false)
private List<Map<String, Object>> relatedSettlements = new ArrayList<>();
}
@@ -73,6 +73,10 @@ public class ReceivablePayableDetailVO extends ReceivablePayableDetail {
@Schema(description = "状态名称")
private String settlementStatusName;
@TableField(exist = false)
@Schema(description = "计费方式")
private String billingType;
@TableField(exist = false)
@Schema(description = "费用项目")
private Map<String, Object> feeItems;
@@ -17,7 +17,6 @@ public class SettlementAdjustmentVO extends SettlementAdjustment {
private String approvalStatusName;
private String settlementTypeName;
private String createUserName;
private String kingdeeBillNo;
private List<SettlementAdjustmentDetail> details;
private List<FormalSettlementDetail> formalDetails;
}
@@ -0,0 +1,72 @@
/**
* BladeX Commercial License Agreement
* Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
* <p>
* Use of this software is governed by the Commercial License Agreement
* obtained after purchasing a license from BladeX.
* <p>
* 1. This software is for development use only under a valid license
* from BladeX.
* <p>
* 2. Redistribution of this software's source code to any third party
* without a commercial license is strictly prohibited.
* <p>
* 3. Licensees may copyright their own code but cannot use segments
* from this software for such purposes. Copyright of this software
* remains with BladeX.
* <p>
* Using this software signifies agreement to this License, and the software
* must not be used for illegal purposes.
* <p>
* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
* not liable for any claims arising from secondary or illegal development.
* <p>
* Author: Chill Zhuang (bladejava@qq.com)
*/
package org.springblade.transport.pojo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 结算单统一预付付款记录(进度预付 / 项目预付核销,供付款记录合并展示)
*
* @author Chill
*/
@Data
@Schema(description = "结算单统一预付付款记录")
public class SettlementAdvancePaymentVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "记录类型:progress_advance 进度预付 / project_advance 项目预付核销")
private String recordType;
@Schema(description = "付款单号")
private String paymentNo;
@Schema(description = "申请金额(进度预付为申请预付金额,项目预付为本次核销金额)")
private BigDecimal appliedAmount;
@Schema(description = "已付款金额(底层付款申请实付)")
private BigDecimal paidAmount;
@Schema(description = "单据状态")
private String billStatus;
@Schema(description = "金蝶单据号")
private String kingdeeBillNo;
@Schema(description = "创建人姓名")
private String createUserName;
@Schema(description = "创建时间(统一取底层付款申请创建时间)")
private Date createTime;
}
@@ -32,6 +32,7 @@ import org.springblade.transport.pojo.entity.SettlementImportBatch;
import java.io.Serial;
import java.util.List;
import java.util.Map;
/**
* 导入结算单批次视图
@@ -66,4 +67,7 @@ public class SettlementImportBatchVO extends SettlementImportBatch {
@Schema(description = "动态费用列名")
private List<String> feeItemNames;
@Schema(description = "导入明细行")
private List<Map<String, Object>> rows;
}
@@ -17,7 +17,40 @@ public interface ISettlementAdjustmentService {
Long saveDraft(SettlementAdjustmentSaveRequest request);
void removeDraft(Long id);
void submit(SettlementAdjustmentStatusRequest request);
void approve(SettlementAdjustmentStatusRequest request);
/**
* 审批通过:未推送场景回写原单并发布金蝶自动推送事件;已推送场景原单零改动仅追加变更记录。
*
* @param request 审批请求
* @return 已推送场景的手工冲销提示文案,未推送场景返回 null
*/
String approve(SettlementAdjustmentStatusRequest request);
void returnBill(SettlementAdjustmentStatusRequest request);
String repush(Long adjustmentId);
/**
* 选单后金蝶冲销预检(软提示,不阻断建单):未推送 / 已推送已冲销 / 已推送未冲销;
* 金蝶查询异常降级返回「未校验」,由审批分流与重推闸门兜底
*
* @param formalSettlementId 选定正式结算单id
* @return syncStatus / writtenOff / message
*/
Map<String, Object> kingdeeWriteOffPrecheck(Long formalSettlementId);
/**
* 推送金蝶(未推送/生成失败场景):推送关联正式结算单,成功后由正式结算单回填调整单金蝶单号与同步状态
*
* @param adjustmentId 结算调整单id
* @return 金蝶单据编号
*/
String syncKingdee(Long adjustmentId);
/**
* 重推克隆+应用(独立事务,由 repush 经自代理调用):克隆原单为新正式结算单并应用调整,
* 供推送失败重试时幂等复用
*
* @param originalSettlementId 原正式结算单id
* @param adjustmentId 结算调整单id
* @return 新正式结算单id
*/
Long cloneAndApplyForRepush(Long originalSettlementId, Long adjustmentId);
}
@@ -132,6 +132,10 @@ public class User extends TenantEntity implements IPhone {
* 是否是oa的账号
*/
private Integer isOa;
/**
* OA登录名
*/
private String oaLoginId;
/**
* OA上次更新时间(OA 的 modified 字段),仅同步比对使用
*/