diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ProjectChange.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ProjectChange.java
new file mode 100644
index 00000000..ad3776a1
--- /dev/null
+++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ProjectChange.java
@@ -0,0 +1,206 @@
+/**
+ * BladeX Commercial License Agreement
+ * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
+ *
+ * Use of this software is governed by the Commercial License Agreement
+ * obtained after purchasing a license from BladeX.
+ *
+ * 1. This software is for development use only under a valid license
+ * from BladeX.
+ *
+ * 2. Redistribution of this software's source code to any third party
+ * without a commercial license is strictly prohibited.
+ *
+ * 3. Licensees may copyright their own code but cannot use segments
+ * from this software for such purposes. Copyright of this software
+ * remains with BladeX.
+ *
+ * Using this software signifies agreement to this License, and the software
+ * must not be used for illegal purposes.
+ *
+ * Author: Chill Zhuang (bladejava@qq.com)
+ */
+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 io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tenant.mp.TenantEntity;
+
+import java.io.Serial;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * 项目变更实体类
+ *
+ * @author Chill
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("blade_project_change")
+@Schema(description = "项目变更")
+public class ProjectChange extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ @Schema(description = "原项目ID")
+ private Long projectId;
+
+ @Schema(description = "变更编号")
+ private String changeNo;
+
+ @Schema(description = "变更类型")
+ private String changeType;
+
+ @Schema(description = "变更日期")
+ private LocalDate changeDate;
+
+ @Schema(description = "变更内容")
+ private String changeContent;
+
+ @Schema(description = "变更原因")
+ private String changeReason;
+
+ @Schema(description = "变更前快照JSON")
+ private String beforeDataJson;
+
+ @Schema(description = "项目编号")
+ private String projectCode;
+
+ @Schema(description = "项目名称")
+ private String projectName;
+
+ @Schema(description = "项目简称")
+ private String projectShortName;
+
+ @Schema(description = "项目类型")
+ private String projectType;
+
+ @Schema(description = "业务部门ID")
+ private Long businessDeptId;
+
+ @Schema(description = "业务部门")
+ private String businessDeptName;
+
+ @Schema(description = "承办部门/平台公司ID,多个逗号分隔")
+ private String undertakeDeptId;
+
+ @Schema(description = "承办部门/平台公司,多个顿号分隔")
+ private String undertakeDeptName;
+
+ @Schema(description = "项目由来")
+ private String projectSource;
+
+ @Schema(description = "项目由来说明")
+ private String sourceRemark;
+
+ @Schema(description = "项目资金使用额度(万元)")
+ private BigDecimal fundLimit;
+
+ @Schema(description = "项目应收账款额度(万元)")
+ private BigDecimal receivableLimit;
+
+ @Schema(description = "应收账款回款期限(天)")
+ @TableField(insertStrategy = FieldStrategy.ALWAYS, updateStrategy = FieldStrategy.ALWAYS)
+ private Integer receivableDays;
+
+ @Schema(description = "回款账期(天)")
+ @TableField(insertStrategy = FieldStrategy.ALWAYS, updateStrategy = FieldStrategy.ALWAYS)
+ private Integer paymentDays;
+
+ @Schema(description = "货物类型")
+ private String cargoType;
+
+ @Schema(description = "预估货物数量")
+ @TableField(insertStrategy = FieldStrategy.ALWAYS, updateStrategy = FieldStrategy.ALWAYS)
+ private String cargoQuantity;
+
+ @Schema(description = "业务周期开始日期")
+ private LocalDate businessStartDate;
+
+ @Schema(description = "业务周期结束日期")
+ private LocalDate businessEndDate;
+
+ @Schema(description = "运输线路")
+ private String transportRoute;
+
+ @Schema(description = "运输类型")
+ private String transportType;
+
+ @Schema(description = "业务类型")
+ private String businessType;
+
+ @Schema(description = "业务模式")
+ private String businessMode;
+
+ @Schema(description = "项目规模(万元)")
+ @TableField(insertStrategy = FieldStrategy.ALWAYS, updateStrategy = FieldStrategy.ALWAYS)
+ private BigDecimal projectScale;
+
+ @Schema(description = "预计利润(万元)")
+ @TableField(insertStrategy = FieldStrategy.ALWAYS, updateStrategy = FieldStrategy.ALWAYS)
+ private BigDecimal estimatedProfit;
+
+ @Schema(description = "利润率(%)")
+ @TableField(insertStrategy = FieldStrategy.ALWAYS, updateStrategy = FieldStrategy.ALWAYS)
+ private BigDecimal profitRate;
+
+ @Schema(description = "资金需求(万元)")
+ @TableField(insertStrategy = FieldStrategy.ALWAYS, updateStrategy = FieldStrategy.ALWAYS)
+ private BigDecimal fundDemand;
+
+ @Schema(description = "结算方式")
+ private String settlementMode;
+
+ @Schema(description = "项目经办人ID")
+ private Long handlerUserId;
+
+ @Schema(description = "项目经办人")
+ private String handlerUserName;
+
+ @Schema(description = "项目负责人ID")
+ private Long principalUserId;
+
+ @Schema(description = "项目负责人")
+ private String principalUserName;
+
+ @Schema(description = "客户名称")
+ private String customerNames;
+
+ @Schema(description = "下游承运商")
+ private String carrierNames;
+
+ @Schema(description = "客户信息JSON")
+ private String customerJson;
+
+ @Schema(description = "承运商信息JSON")
+ private String carrierJson;
+
+ @Schema(description = "项目情况说明")
+ private String situationRemark;
+
+ @Schema(description = "项目附件JSON")
+ private String attachmentsJson;
+
+ @Schema(description = "审批状态")
+ private String approvalStatus;
+
+ @Schema(description = "当前节点")
+ private String currentNode;
+
+ @Schema(description = "当前处理人")
+ private String currentProcessor;
+
+ @Schema(description = "审核通过时间")
+ private LocalDateTime approvedTime;
+
+ @Schema(description = "同步状态")
+ private String syncStatus;
+
+}
diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ProjectChangeVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ProjectChangeVO.java
new file mode 100644
index 00000000..efe5a566
--- /dev/null
+++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ProjectChangeVO.java
@@ -0,0 +1,84 @@
+/**
+ * BladeX Commercial License Agreement
+ * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
+ *
+ * Use of this software is governed by the Commercial License Agreement
+ * obtained after purchasing a license from BladeX.
+ *
+ * 1. This software is for development use only under a valid license
+ * from BladeX.
+ *
+ * 2. Redistribution of this software's source code to any third party
+ * without a commercial license is strictly prohibited.
+ *
+ * 3. Licensees may copyright their own code but cannot use segments
+ * from this software for such purposes. Copyright of this software
+ * remains with BladeX.
+ *
+ * Using this software signifies agreement to this License, and the software
+ * must not be used for illegal purposes.
+ *
+ * Author: Chill Zhuang (bladejava@qq.com)
+ */
+package org.springblade.transport.pojo.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.transport.pojo.entity.ProjectChange;
+
+import java.io.Serial;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 项目变更视图实体类
+ *
+ * @author Chill
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Schema(description = "项目变更")
+public class ProjectChangeVO extends ProjectChange {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ @TableField(exist = false)
+ @Schema(description = "是否查看全部组织")
+ private Integer allDept;
+
+ @TableField(exist = false)
+ @Schema(description = "是否只读")
+ private Boolean readonly;
+
+ @TableField(exist = false)
+ @Schema(description = "创建人姓名")
+ private String createUserName;
+
+ @TableField(exist = false)
+ @Schema(description = "更新人姓名")
+ private String updateUserName;
+
+ @TableField(exist = false)
+ @Schema(description = "审批状态名称")
+ private String approvalStatusName;
+
+ @TableField(exist = false)
+ @Schema(description = "同步状态名称")
+ private String syncStatusName;
+
+ @TableField(exist = false)
+ @Schema(description = "货物类型字典,公开页回显使用")
+ private List