From 606aab6bb47b6cd31735bab61a9071701902acae Mon Sep 17 00:00:00 2001
From: wkc <978997012@qq.com>
Date: Thu, 12 Mar 2026 16:08:30 +0800
Subject: [PATCH 1/2] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=91=98=E5=B7=A5?=
=?UTF-8?q?=E8=B5=84=E4=BA=A7=E4=BF=A1=E6=81=AF=E8=AE=BE=E8=AE=A1=E4=B8=8E?=
=?UTF-8?q?=E5=BB=BA=E8=A1=A8=E8=84=9A=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sql/2026-03-12_ccdi_asset_info.sql | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
create mode 100644 sql/2026-03-12_ccdi_asset_info.sql
diff --git a/sql/2026-03-12_ccdi_asset_info.sql b/sql/2026-03-12_ccdi_asset_info.sql
new file mode 100644
index 0000000..d4badda
--- /dev/null
+++ b/sql/2026-03-12_ccdi_asset_info.sql
@@ -0,0 +1,25 @@
+USE ccdi;
+
+CREATE TABLE IF NOT EXISTS `ccdi_asset_info` (
+ `asset_id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '资产ID',
+ `family_id` VARCHAR(18) NOT NULL COMMENT '归属员工身份证号',
+ `person_id` VARCHAR(18) NOT NULL COMMENT '资产实际持有人身份证号',
+ `asset_main_type` VARCHAR(20) NOT NULL COMMENT '资产大类',
+ `asset_sub_type` VARCHAR(50) NOT NULL COMMENT '资产小类',
+ `asset_name` VARCHAR(200) NOT NULL COMMENT '资产名称',
+ `ownership_ratio` DECIMAL(5,2) DEFAULT NULL COMMENT '产权占比',
+ `purchase_eval_date` DATE DEFAULT NULL COMMENT '购买/评估日期',
+ `original_value` DECIMAL(15,2) DEFAULT NULL COMMENT '资产原值',
+ `current_value` DECIMAL(15,2) NOT NULL COMMENT '当前估值',
+ `valuation_date` DATE DEFAULT NULL COMMENT '估值截止日期',
+ `asset_status` VARCHAR(10) NOT NULL COMMENT '资产状态',
+ `remarks` VARCHAR(500) DEFAULT NULL COMMENT '备注',
+ `create_by` VARCHAR(64) DEFAULT '' COMMENT '创建者',
+ `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `update_by` VARCHAR(64) DEFAULT '' COMMENT '更新者',
+ `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ PRIMARY KEY (`asset_id`),
+ KEY `idx_family_id` (`family_id`),
+ KEY `idx_person_id` (`person_id`),
+ KEY `idx_asset_main_type` (`asset_main_type`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工资产信息表';
From bac3cf094ee3ddf119edb4e79e035e6b4472d3fe Mon Sep 17 00:00:00 2001
From: wkc <978997012@qq.com>
Date: Thu, 12 Mar 2026 16:33:07 +0800
Subject: [PATCH 2/2] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=91=98=E5=B7=A5?=
=?UTF-8?q?=E8=B5=84=E4=BA=A7=E4=BF=A1=E6=81=AF=E5=90=8E=E7=AB=AF=E5=AE=9E?=
=?UTF-8?q?=E6=96=BD=E8=AE=A1=E5=88=92?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
ccdi-info-collection/pom.xml | 7 +
.../controller/CcdiAssetInfoController.java | 102 ++++++++
.../info/collection/domain/CcdiAssetInfo.java | 83 +++++++
.../domain/dto/CcdiAssetInfoDTO.java | 86 +++++++
.../domain/dto/CcdiBaseStaffAddDTO.java | 4 +
.../domain/dto/CcdiBaseStaffEditDTO.java | 4 +
.../domain/excel/CcdiAssetInfoExcel.java | 85 +++++++
.../domain/vo/AssetImportFailureVO.java | 49 ++++
.../collection/domain/vo/CcdiAssetInfoVO.java | 70 ++++++
.../collection/domain/vo/CcdiBaseStaffVO.java | 4 +
.../mapper/CcdiAssetInfoMapper.java | 73 ++++++
.../service/ICcdiAssetInfoImportService.java | 49 ++++
.../service/ICcdiAssetInfoService.java | 47 ++++
.../impl/CcdiAssetInfoImportServiceImpl.java | 227 ++++++++++++++++++
.../impl/CcdiAssetInfoServiceImpl.java | 84 +++++++
.../impl/CcdiBaseStaffServiceImpl.java | 34 ++-
.../info/collection/CcdiAssetInfoMapper.xml | 96 ++++++++
.../mapper/CcdiAssetInfoMapperTest.java | 175 ++++++++++++++
.../CcdiAssetInfoImportServiceImplTest.java | 213 ++++++++++++++++
.../service/CcdiAssetInfoServiceImplTest.java | 105 ++++++++
...iBaseStaffServiceAssetAggregationTest.java | 45 ++++
.../service/CcdiBaseStaffServiceImplTest.java | 185 ++++++++++++++
22 files changed, 1825 insertions(+), 2 deletions(-)
create mode 100644 ccdi-info-collection/src/main/java/com/ruoyi/info/collection/controller/CcdiAssetInfoController.java
create mode 100644 ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/CcdiAssetInfo.java
create mode 100644 ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/dto/CcdiAssetInfoDTO.java
create mode 100644 ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/excel/CcdiAssetInfoExcel.java
create mode 100644 ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/vo/AssetImportFailureVO.java
create mode 100644 ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/vo/CcdiAssetInfoVO.java
create mode 100644 ccdi-info-collection/src/main/java/com/ruoyi/info/collection/mapper/CcdiAssetInfoMapper.java
create mode 100644 ccdi-info-collection/src/main/java/com/ruoyi/info/collection/service/ICcdiAssetInfoImportService.java
create mode 100644 ccdi-info-collection/src/main/java/com/ruoyi/info/collection/service/ICcdiAssetInfoService.java
create mode 100644 ccdi-info-collection/src/main/java/com/ruoyi/info/collection/service/impl/CcdiAssetInfoImportServiceImpl.java
create mode 100644 ccdi-info-collection/src/main/java/com/ruoyi/info/collection/service/impl/CcdiAssetInfoServiceImpl.java
create mode 100644 ccdi-info-collection/src/main/resources/mapper/info/collection/CcdiAssetInfoMapper.xml
create mode 100644 ccdi-info-collection/src/test/java/com/ruoyi/info/collection/mapper/CcdiAssetInfoMapperTest.java
create mode 100644 ccdi-info-collection/src/test/java/com/ruoyi/info/collection/service/CcdiAssetInfoImportServiceImplTest.java
create mode 100644 ccdi-info-collection/src/test/java/com/ruoyi/info/collection/service/CcdiAssetInfoServiceImplTest.java
create mode 100644 ccdi-info-collection/src/test/java/com/ruoyi/info/collection/service/CcdiBaseStaffServiceAssetAggregationTest.java
create mode 100644 ccdi-info-collection/src/test/java/com/ruoyi/info/collection/service/CcdiBaseStaffServiceImplTest.java
diff --git a/ccdi-info-collection/pom.xml b/ccdi-info-collection/pom.xml
index df57343..34473cc 100644
--- a/ccdi-info-collection/pom.xml
+++ b/ccdi-info-collection/pom.xml
@@ -45,6 +45,13 @@
springdoc-openapi-starter-webmvc-ui
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
diff --git a/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/controller/CcdiAssetInfoController.java b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/controller/CcdiAssetInfoController.java
new file mode 100644
index 0000000..3f58e33
--- /dev/null
+++ b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/controller/CcdiAssetInfoController.java
@@ -0,0 +1,102 @@
+package com.ruoyi.info.collection.controller;
+
+import com.ruoyi.info.collection.domain.excel.CcdiAssetInfoExcel;
+import com.ruoyi.info.collection.domain.vo.AssetImportFailureVO;
+import com.ruoyi.info.collection.domain.vo.ImportResultVO;
+import com.ruoyi.info.collection.domain.vo.ImportStatusVO;
+import com.ruoyi.info.collection.service.ICcdiAssetInfoImportService;
+import com.ruoyi.info.collection.utils.EasyExcelUtil;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 员工资产信息Controller
+ *
+ * @author ruoyi
+ * @date 2026-03-12
+ */
+@Tag(name = "员工资产信息管理")
+@RestController
+@RequestMapping("/ccdi/assetInfo")
+public class CcdiAssetInfoController extends BaseController {
+
+ @Resource
+ private ICcdiAssetInfoImportService assetInfoImportService;
+
+ /**
+ * 下载导入模板
+ */
+ @Operation(summary = "下载资产导入模板")
+ @PostMapping("/importTemplate")
+ public void importTemplate(HttpServletResponse response) {
+ EasyExcelUtil.importTemplateWithDictDropdown(response, CcdiAssetInfoExcel.class, "员工资产信息");
+ }
+
+ /**
+ * 导入员工资产信息
+ */
+ @Operation(summary = "导入员工资产信息")
+ @PreAuthorize("@ss.hasPermi('ccdi:baseStaff:import')")
+ @Log(title = "员工资产信息", businessType = BusinessType.IMPORT)
+ @PostMapping("/importData")
+ public AjaxResult importData(MultipartFile file) throws Exception {
+ List list = EasyExcelUtil.importExcel(file.getInputStream(), CcdiAssetInfoExcel.class);
+ if (list == null || list.isEmpty()) {
+ return error("至少需要一条数据");
+ }
+
+ String taskId = assetInfoImportService.importAssetInfo(list);
+ ImportResultVO result = new ImportResultVO();
+ result.setTaskId(taskId);
+ result.setStatus("PROCESSING");
+ result.setMessage("导入任务已提交,正在后台处理");
+ return AjaxResult.success("导入任务已提交,正在后台处理", result);
+ }
+
+ /**
+ * 查询导入状态
+ */
+ @Operation(summary = "查询员工资产导入状态")
+ @PreAuthorize("@ss.hasPermi('ccdi:baseStaff:import')")
+ @GetMapping("/importStatus/{taskId}")
+ public AjaxResult getImportStatus(@PathVariable String taskId) {
+ return success(assetInfoImportService.getImportStatus(taskId));
+ }
+
+ /**
+ * 查询导入失败记录
+ */
+ @Operation(summary = "查询员工资产导入失败记录")
+ @PreAuthorize("@ss.hasPermi('ccdi:baseStaff:import')")
+ @GetMapping("/importFailures/{taskId}")
+ public TableDataInfo getImportFailures(
+ @PathVariable String taskId,
+ @RequestParam(defaultValue = "1") Integer pageNum,
+ @RequestParam(defaultValue = "10") Integer pageSize) {
+ List failures = assetInfoImportService.getImportFailures(taskId);
+ int fromIndex = (pageNum - 1) * pageSize;
+ int toIndex = Math.min(fromIndex + pageSize, failures.size());
+ if (fromIndex >= failures.size()) {
+ return getDataTable(new ArrayList<>(), failures.size());
+ }
+ return getDataTable(failures.subList(fromIndex, toIndex), failures.size());
+ }
+}
diff --git a/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/CcdiAssetInfo.java b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/CcdiAssetInfo.java
new file mode 100644
index 0000000..4370429
--- /dev/null
+++ b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/CcdiAssetInfo.java
@@ -0,0 +1,83 @@
+package com.ruoyi.info.collection.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 员工资产信息对象 ccdi_asset_info
+ *
+ * @author ruoyi
+ * @date 2026-03-12
+ */
+@Data
+@TableName("ccdi_asset_info")
+public class CcdiAssetInfo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /** 资产ID */
+ @TableId(type = IdType.AUTO)
+ private Long assetId;
+
+ /** 归属员工身份证号 */
+ private String familyId;
+
+ /** 资产实际持有人身份证号 */
+ private String personId;
+
+ /** 资产大类 */
+ private String assetMainType;
+
+ /** 资产小类 */
+ private String assetSubType;
+
+ /** 资产名称 */
+ private String assetName;
+
+ /** 产权占比 */
+ private BigDecimal ownershipRatio;
+
+ /** 购买/评估日期 */
+ private Date purchaseEvalDate;
+
+ /** 资产原值 */
+ private BigDecimal originalValue;
+
+ /** 当前估值 */
+ private BigDecimal currentValue;
+
+ /** 估值截止日期 */
+ private Date valuationDate;
+
+ /** 资产状态 */
+ private String assetStatus;
+
+ /** 备注 */
+ private String remarks;
+
+ /** 创建者 */
+ @TableField(fill = FieldFill.INSERT)
+ private String createBy;
+
+ /** 创建时间 */
+ @TableField(fill = FieldFill.INSERT)
+ private Date createTime;
+
+ /** 更新者 */
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private String updateBy;
+
+ /** 更新时间 */
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private Date updateTime;
+}
diff --git a/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/dto/CcdiAssetInfoDTO.java b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/dto/CcdiAssetInfoDTO.java
new file mode 100644
index 0000000..03b2fa5
--- /dev/null
+++ b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/dto/CcdiAssetInfoDTO.java
@@ -0,0 +1,86 @@
+package com.ruoyi.info.collection.domain.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Pattern;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 员工资产信息DTO
+ *
+ * @author ruoyi
+ * @date 2026-03-12
+ */
+@Data
+@Schema(description = "员工资产信息")
+public class CcdiAssetInfoDTO implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /** 资产实际持有人身份证号 */
+ @NotBlank(message = "资产实际持有人身份证号不能为空")
+ @Pattern(regexp = "^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[0-9Xx]$", message = "资产实际持有人身份证号格式不正确")
+ @Schema(description = "资产实际持有人身份证号")
+ private String personId;
+
+ /** 资产大类 */
+ @NotBlank(message = "资产大类不能为空")
+ @Size(max = 20, message = "资产大类长度不能超过20个字符")
+ @Schema(description = "资产大类")
+ private String assetMainType;
+
+ /** 资产小类 */
+ @NotBlank(message = "资产小类不能为空")
+ @Size(max = 50, message = "资产小类长度不能超过50个字符")
+ @Schema(description = "资产小类")
+ private String assetSubType;
+
+ /** 资产名称 */
+ @NotBlank(message = "资产名称不能为空")
+ @Size(max = 200, message = "资产名称长度不能超过200个字符")
+ @Schema(description = "资产名称")
+ private String assetName;
+
+ /** 产权占比 */
+ @Schema(description = "产权占比")
+ private BigDecimal ownershipRatio;
+
+ /** 购买/评估日期 */
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ @Schema(description = "购买/评估日期")
+ private Date purchaseEvalDate;
+
+ /** 资产原值 */
+ @Schema(description = "资产原值")
+ private BigDecimal originalValue;
+
+ /** 当前估值 */
+ @NotNull(message = "当前估值不能为空")
+ @Schema(description = "当前估值")
+ private BigDecimal currentValue;
+
+ /** 估值截止日期 */
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ @Schema(description = "估值截止日期")
+ private Date valuationDate;
+
+ /** 资产状态 */
+ @NotBlank(message = "资产状态不能为空")
+ @Size(max = 10, message = "资产状态长度不能超过10个字符")
+ @Schema(description = "资产状态")
+ private String assetStatus;
+
+ /** 备注 */
+ @Size(max = 500, message = "备注长度不能超过500个字符")
+ @Schema(description = "备注")
+ private String remarks;
+}
diff --git a/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/dto/CcdiBaseStaffAddDTO.java b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/dto/CcdiBaseStaffAddDTO.java
index 73517c6..eb34a0f 100644
--- a/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/dto/CcdiBaseStaffAddDTO.java
+++ b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/dto/CcdiBaseStaffAddDTO.java
@@ -9,6 +9,7 @@ import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
+import java.util.List;
/**
* 员工信息新增 DTO
@@ -51,4 +52,7 @@ public class CcdiBaseStaffAddDTO implements Serializable {
/** 状态 */
@NotBlank(message = "状态不能为空")
private String status;
+
+ /** 资产信息列表 */
+ private List assetInfoList;
}
diff --git a/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/dto/CcdiBaseStaffEditDTO.java b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/dto/CcdiBaseStaffEditDTO.java
index 688eadc..a2c4c61 100644
--- a/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/dto/CcdiBaseStaffEditDTO.java
+++ b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/dto/CcdiBaseStaffEditDTO.java
@@ -9,6 +9,7 @@ import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
+import java.util.List;
/**
* 员工信息编辑 DTO
@@ -49,4 +50,7 @@ public class CcdiBaseStaffEditDTO implements Serializable {
/** 状态 */
private String status;
+
+ /** 资产信息列表 */
+ private List assetInfoList;
}
diff --git a/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/excel/CcdiAssetInfoExcel.java b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/excel/CcdiAssetInfoExcel.java
new file mode 100644
index 0000000..1091983
--- /dev/null
+++ b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/excel/CcdiAssetInfoExcel.java
@@ -0,0 +1,85 @@
+package com.ruoyi.info.collection.domain.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.ruoyi.common.annotation.Required;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 员工资产信息Excel导入导出对象
+ *
+ * @author ruoyi
+ * @date 2026-03-12
+ */
+@Data
+public class CcdiAssetInfoExcel implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /** 资产实际持有人身份证号 */
+ @ExcelProperty(value = "资产实际持有人身份证号*", index = 0)
+ @ColumnWidth(22)
+ @Required
+ private String personId;
+
+ /** 资产大类 */
+ @ExcelProperty(value = "资产大类*", index = 1)
+ @ColumnWidth(16)
+ @Required
+ private String assetMainType;
+
+ /** 资产小类 */
+ @ExcelProperty(value = "资产小类*", index = 2)
+ @ColumnWidth(18)
+ @Required
+ private String assetSubType;
+
+ /** 资产名称 */
+ @ExcelProperty(value = "资产名称*", index = 3)
+ @ColumnWidth(24)
+ @Required
+ private String assetName;
+
+ /** 产权占比 */
+ @ExcelProperty(value = "产权占比", index = 4)
+ @ColumnWidth(12)
+ private BigDecimal ownershipRatio;
+
+ /** 购买/评估日期 */
+ @ExcelProperty(value = "购买/评估日期", index = 5)
+ @ColumnWidth(16)
+ private Date purchaseEvalDate;
+
+ /** 资产原值 */
+ @ExcelProperty(value = "资产原值", index = 6)
+ @ColumnWidth(16)
+ private BigDecimal originalValue;
+
+ /** 当前估值 */
+ @ExcelProperty(value = "当前估值*", index = 7)
+ @ColumnWidth(16)
+ @Required
+ private BigDecimal currentValue;
+
+ /** 估值截止日期 */
+ @ExcelProperty(value = "估值截止日期", index = 8)
+ @ColumnWidth(16)
+ private Date valuationDate;
+
+ /** 资产状态 */
+ @ExcelProperty(value = "资产状态*", index = 9)
+ @ColumnWidth(14)
+ @Required
+ private String assetStatus;
+
+ /** 备注 */
+ @ExcelProperty(value = "备注", index = 10)
+ @ColumnWidth(28)
+ private String remarks;
+}
diff --git a/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/vo/AssetImportFailureVO.java b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/vo/AssetImportFailureVO.java
new file mode 100644
index 0000000..6347c6b
--- /dev/null
+++ b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/vo/AssetImportFailureVO.java
@@ -0,0 +1,49 @@
+package com.ruoyi.info.collection.domain.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 员工资产信息导入失败记录VO
+ *
+ * @author ruoyi
+ * @date 2026-03-12
+ */
+@Data
+@Schema(description = "员工资产信息导入失败记录")
+public class AssetImportFailureVO {
+
+ /** 资产实际持有人身份证号 */
+ @Schema(description = "资产实际持有人身份证号")
+ private String personId;
+
+ /** 资产大类 */
+ @Schema(description = "资产大类")
+ private String assetMainType;
+
+ /** 资产小类 */
+ @Schema(description = "资产小类")
+ private String assetSubType;
+
+ /** 资产名称 */
+ @Schema(description = "资产名称")
+ private String assetName;
+
+ /** 产权占比 */
+ @Schema(description = "产权占比")
+ private BigDecimal ownershipRatio;
+
+ /** 当前估值 */
+ @Schema(description = "当前估值")
+ private BigDecimal currentValue;
+
+ /** 资产状态 */
+ @Schema(description = "资产状态")
+ private String assetStatus;
+
+ /** 错误信息 */
+ @Schema(description = "错误信息")
+ private String errorMessage;
+}
diff --git a/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/vo/CcdiAssetInfoVO.java b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/vo/CcdiAssetInfoVO.java
new file mode 100644
index 0000000..5ca36f5
--- /dev/null
+++ b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/vo/CcdiAssetInfoVO.java
@@ -0,0 +1,70 @@
+package com.ruoyi.info.collection.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+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;
+
+/**
+ * 员工资产信息VO
+ *
+ * @author ruoyi
+ * @date 2026-03-12
+ */
+@Data
+@Schema(description = "员工资产信息")
+public class CcdiAssetInfoVO implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /** 资产实际持有人身份证号 */
+ @Schema(description = "资产实际持有人身份证号")
+ private String personId;
+
+ /** 资产大类 */
+ @Schema(description = "资产大类")
+ private String assetMainType;
+
+ /** 资产小类 */
+ @Schema(description = "资产小类")
+ private String assetSubType;
+
+ /** 资产名称 */
+ @Schema(description = "资产名称")
+ private String assetName;
+
+ /** 产权占比 */
+ @Schema(description = "产权占比")
+ private BigDecimal ownershipRatio;
+
+ /** 购买/评估日期 */
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ @Schema(description = "购买/评估日期")
+ private Date purchaseEvalDate;
+
+ /** 资产原值 */
+ @Schema(description = "资产原值")
+ private BigDecimal originalValue;
+
+ /** 当前估值 */
+ @Schema(description = "当前估值")
+ private BigDecimal currentValue;
+
+ /** 估值截止日期 */
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ @Schema(description = "估值截止日期")
+ private Date valuationDate;
+
+ /** 资产状态 */
+ @Schema(description = "资产状态")
+ private String assetStatus;
+
+ /** 备注 */
+ @Schema(description = "备注")
+ private String remarks;
+}
diff --git a/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/vo/CcdiBaseStaffVO.java b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/vo/CcdiBaseStaffVO.java
index 18a9ad2..abfa2b2 100644
--- a/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/vo/CcdiBaseStaffVO.java
+++ b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/domain/vo/CcdiBaseStaffVO.java
@@ -5,6 +5,7 @@ import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
+import java.util.List;
/**
* 员工信息 VO
@@ -56,4 +57,7 @@ public class CcdiBaseStaffVO implements Serializable {
/** 更新者 */
private String updateBy;
+
+ /** 资产信息列表 */
+ private List assetInfoList;
}
diff --git a/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/mapper/CcdiAssetInfoMapper.java b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/mapper/CcdiAssetInfoMapper.java
new file mode 100644
index 0000000..ccd4098
--- /dev/null
+++ b/ccdi-info-collection/src/main/java/com/ruoyi/info/collection/mapper/CcdiAssetInfoMapper.java
@@ -0,0 +1,73 @@
+package com.ruoyi.info.collection.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.info.collection.domain.CcdiAssetInfo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 员工资产信息 数据层
+ *
+ * @author ruoyi
+ * @date 2026-03-12
+ */
+public interface CcdiAssetInfoMapper extends BaseMapper {
+
+ /**
+ * 按归属员工身份证号查询资产列表
+ *
+ * @param familyId 归属员工身份证号
+ * @return 资产列表
+ */
+ List selectByFamilyId(@Param("familyId") String familyId);
+
+ /**
+ * 按归属员工身份证号删除资产
+ *
+ * @param familyId 归属员工身份证号
+ * @return 影响行数
+ */
+ int deleteByFamilyId(@Param("familyId") String familyId);
+
+ /**
+ * 批量删除归属员工资产
+ *
+ * @param familyIds 归属员工身份证号列表
+ * @return 影响行数
+ */
+ int deleteByFamilyIds(@Param("familyIds") List familyIds);
+
+ /**
+ * 按资产实际持有人身份证号查询资产列表
+ *
+ * @param personId 资产实际持有人身份证号
+ * @return 资产列表
+ */
+ List selectByPersonId(@Param("personId") String personId);
+
+ /**
+ * 批量插入资产数据
+ *
+ * @param list 资产列表
+ * @return 影响行数
+ */
+ int insertBatch(@Param("list") List list);
+
+ /**
+ * 按员工身份证号查询归属信息
+ *
+ * @param personIds 资产实际持有人身份证号列表
+ * @return 归属映射
+ */
+ List