拆分员工与亲属资产导入前端链路

This commit is contained in:
wkc
2026-03-13 16:49:27 +08:00
parent 109b5220b2
commit d6a791f59f
7 changed files with 114 additions and 17 deletions

View File

@@ -246,3 +246,8 @@
- 已新增员工资产独立导入接口 `/ccdi/baseStaff/asset/*` - 已新增员工资产独立导入接口 `/ccdi/baseStaff/asset/*`
- 已将 `/ccdi/assetInfo/*` 收敛为亲属资产专用接口 - 已将 `/ccdi/assetInfo/*` 收敛为亲属资产专用接口
- 已通过后端定向测试验证员工与亲属两套导入链路、模板名称和失败文案拆分生效 - 已通过后端定向测试验证员工与亲属两套导入链路、模板名称和失败文案拆分生效
- 2026-03-13 已完成前端拆分实现
- 员工页已切换为员工资产专用前端 API `ruoyi-ui/src/api/ccdiBaseStaffAsset.js`
- 员工页上传地址、模板下载、状态轮询与失败记录查询已全部改为 `/ccdi/baseStaff/asset/*`
- 亲属页继续保持 `/ccdi/assetInfo/*` 导入链路与“亲属资产”提示文案
- 已通过 4 个前端静态契约测试验证员工页与亲属页导入交互隔离生效

View File

@@ -0,0 +1,35 @@
import request from '@/utils/request'
// 下载员工资产导入模板
export function importBaseStaffAssetTemplate() {
return request({
url: '/ccdi/baseStaff/asset/importTemplate',
method: 'post'
})
}
// 导入员工资产数据
export function importBaseStaffAssetData(data) {
return request({
url: '/ccdi/baseStaff/asset/importData',
method: 'post',
data: data
})
}
// 查询员工资产导入状态
export function getBaseStaffAssetImportStatus(taskId) {
return request({
url: '/ccdi/baseStaff/asset/importStatus/' + taskId,
method: 'get'
})
}
// 查询员工资产导入失败记录
export function getBaseStaffAssetImportFailures(taskId, pageNum, pageSize) {
return request({
url: '/ccdi/baseStaff/asset/importFailures/' + taskId,
method: 'get',
params: { pageNum, pageSize }
})
}

View File

@@ -417,7 +417,7 @@
<el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline;" @click="importAssetTemplate">下载员工资产模板</el-link> <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline;" @click="importAssetTemplate">下载员工资产模板</el-link>
</div> </div>
<div class="el-upload__tip" slot="tip"> <div class="el-upload__tip" slot="tip">
<span>允许导入"xls""xlsx"格式文件系统将根据 personId/person_id 自动识别归属员工</span> <span>支持导入员工本人资产数据文件需为"xls""xlsx"格式系统将根据 personId/person_id 自动识别归属员工</span>
</div> </div>
</el-upload> </el-upload>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
@@ -520,9 +520,9 @@ import {
updateBaseStaff updateBaseStaff
} from "@/api/ccdiBaseStaff"; } from "@/api/ccdiBaseStaff";
import { import {
getAssetImportFailures, getBaseStaffAssetImportFailures,
getAssetImportStatus getBaseStaffAssetImportStatus
} from "@/api/ccdiAssetInfo"; } from "@/api/ccdiBaseStaffAsset";
import {deptTreeSelect} from "@/api/system/user"; import {deptTreeSelect} from "@/api/system/user";
import {getToken} from "@/utils/auth"; import {getToken} from "@/utils/auth";
import Treeselect from "@riophae/vue-treeselect"; import Treeselect from "@riophae/vue-treeselect";
@@ -653,7 +653,7 @@ export default {
title: "", title: "",
isUploading: false, isUploading: false,
headers: { Authorization: "Bearer " + getToken() }, headers: { Authorization: "Bearer " + getToken() },
url: process.env.VUE_APP_BASE_API + "/ccdi/assetInfo/importData" url: process.env.VUE_APP_BASE_API + "/ccdi/baseStaff/asset/importData"
}, },
assetFailureDialogVisible: false, assetFailureDialogVisible: false,
assetFailureList: [], assetFailureList: [],
@@ -1182,7 +1182,7 @@ export default {
this.download('ccdi/baseStaff/importTemplate', {}, `员工信息模板_${new Date().getTime()}.xlsx`) this.download('ccdi/baseStaff/importTemplate', {}, `员工信息模板_${new Date().getTime()}.xlsx`)
}, },
importAssetTemplate() { importAssetTemplate() {
this.download('ccdi/assetInfo/importTemplate', {}, `员工资产信息模板_${new Date().getTime()}.xlsx`) this.download('ccdi/baseStaff/asset/importTemplate', {}, `员工资产信息模板_${new Date().getTime()}.xlsx`)
}, },
// 文件上传中处理 // 文件上传中处理
handleFileUploadProgress(event, file, fileList) { handleFileUploadProgress(event, file, fileList) {
@@ -1336,7 +1336,7 @@ export default {
return; return;
} }
const response = await getAssetImportStatus(taskId); const response = await getBaseStaffAssetImportStatus(taskId);
if (response.data && response.data.status !== 'PROCESSING') { if (response.data && response.data.status !== 'PROCESSING') {
clearInterval(this.assetPollingTimer); clearInterval(this.assetPollingTimer);
@@ -1466,7 +1466,7 @@ export default {
}, },
getAssetFailureList() { getAssetFailureList() {
this.assetFailureLoading = true; this.assetFailureLoading = true;
getAssetImportFailures( getBaseStaffAssetImportFailures(
this.assetCurrentTaskId, this.assetCurrentTaskId,
this.assetFailureQueryParams.pageNum, this.assetFailureQueryParams.pageNum,
this.assetFailureQueryParams.pageSize this.assetFailureQueryParams.pageSize

View File

@@ -6,16 +6,19 @@ const baseStaffApiPath = path.resolve(
__dirname, __dirname,
"../../src/api/ccdiBaseStaff.js" "../../src/api/ccdiBaseStaff.js"
); );
const assetApiPath = path.resolve( const baseStaffAssetApiPath = path.resolve(
__dirname, __dirname,
"../../src/api/ccdiAssetInfo.js" "../../src/api/ccdiBaseStaffAsset.js"
); );
assert(fs.existsSync(baseStaffApiPath), "未找到员工 API 文件 ccdiBaseStaff.js"); assert(fs.existsSync(baseStaffApiPath), "未找到员工 API 文件 ccdiBaseStaff.js");
assert(fs.existsSync(assetApiPath), "未找到员工资产 API 文件 ccdiAssetInfo.js"); assert(
fs.existsSync(baseStaffAssetApiPath),
"未找到员工资产 API 文件 ccdiBaseStaffAsset.js"
);
const baseStaffSource = fs.readFileSync(baseStaffApiPath, "utf8"); const baseStaffSource = fs.readFileSync(baseStaffApiPath, "utf8");
const assetSource = fs.readFileSync(assetApiPath, "utf8"); const assetSource = fs.readFileSync(baseStaffAssetApiPath, "utf8");
[ [
"export function addBaseStaff(data)", "export function addBaseStaff(data)",
@@ -29,16 +32,25 @@ const assetSource = fs.readFileSync(assetApiPath, "utf8");
}); });
[ [
"export function importAssetTemplate()", "export function importBaseStaffAssetTemplate()",
"export function importAssetData(data)", "export function importBaseStaffAssetData(data)",
"export function getAssetImportStatus(taskId)", "export function getBaseStaffAssetImportStatus(taskId)",
"export function getAssetImportFailures(taskId, pageNum, pageSize)", "export function getBaseStaffAssetImportFailures(taskId, pageNum, pageSize)",
"/ccdi/baseStaff/asset/importTemplate",
"/ccdi/baseStaff/asset/importData",
"/ccdi/baseStaff/asset/importStatus/",
"/ccdi/baseStaff/asset/importFailures/",
].forEach((token) => {
assert(assetSource.includes(token), `员工资产 API 缺少关键契约: ${token}`);
});
[
"/ccdi/assetInfo/importTemplate", "/ccdi/assetInfo/importTemplate",
"/ccdi/assetInfo/importData", "/ccdi/assetInfo/importData",
"/ccdi/assetInfo/importStatus/", "/ccdi/assetInfo/importStatus/",
"/ccdi/assetInfo/importFailures/", "/ccdi/assetInfo/importFailures/",
].forEach((token) => { ].forEach((token) => {
assert(assetSource.includes(token), `员工资产 API 缺少关键契约: ${token}`); assert(!assetSource.includes(token), `员工资产 API 不应再引用旧接口: ${token}`);
}); });
console.log("employee-asset-api-contract test passed"); console.log("employee-asset-api-contract test passed");

View File

@@ -17,6 +17,13 @@ const source = fs.readFileSync(componentPath, "utf8");
"assetFailureDialogVisible", "assetFailureDialogVisible",
"employee_asset_import_last_task", "employee_asset_import_last_task",
"员工资产数据导入", "员工资产数据导入",
"下载员工资产模板",
"@/api/ccdiBaseStaffAsset",
"/ccdi/baseStaff/asset/importData",
"ccdi/baseStaff/asset/importTemplate",
"getBaseStaffAssetImportStatus",
"getBaseStaffAssetImportFailures",
"仅支持导入员工本人资产数据",
].forEach((token) => { ].forEach((token) => {
assert( assert(
source.includes(token), source.includes(token),
@@ -24,4 +31,17 @@ const source = fs.readFileSync(componentPath, "utf8");
); );
}); });
[
'from "@/api/ccdiAssetInfo"',
"/ccdi/assetInfo/importData",
"ccdi/assetInfo/importTemplate",
"getAssetImportStatus(taskId)",
"getAssetImportFailures(",
].forEach((token) => {
assert(
!source.includes(token),
`员工资产导入 UI 不应再引用亲属资产接口: ${token}`
);
});
console.log("employee-asset-import-ui test passed"); console.log("employee-asset-import-ui test passed");

View File

@@ -42,4 +42,13 @@ const assetSource = fs.readFileSync(assetApiPath, "utf8");
assert(assetSource.includes(token), `亲属资产 API 缺少关键契约: ${token}`); assert(assetSource.includes(token), `亲属资产 API 缺少关键契约: ${token}`);
}); });
[
"/ccdi/baseStaff/asset/importTemplate",
"/ccdi/baseStaff/asset/importData",
"/ccdi/baseStaff/asset/importStatus/",
"/ccdi/baseStaff/asset/importFailures/",
].forEach((token) => {
assert(!assetSource.includes(token), `亲属资产 API 不应引用员工资产接口: ${token}`);
});
console.log("staff-family-asset-api-contract test passed"); console.log("staff-family-asset-api-contract test passed");

View File

@@ -24,6 +24,10 @@ const source = fs.readFileSync(componentPath, "utf8");
"startAssetImportStatusPolling(taskId)", "startAssetImportStatusPolling(taskId)",
"getAssetFailureList()", "getAssetFailureList()",
"clearAssetImportHistory()", "clearAssetImportHistory()",
'from "@/api/ccdiAssetInfo"',
"/ccdi/assetInfo/importData",
"ccdi/assetInfo/importTemplate",
"亲属资产信息模板_",
].forEach((token) => { ].forEach((token) => {
assert(source.includes(token), `亲属资产导入 UI 缺少关键结构或状态: ${token}`); assert(source.includes(token), `亲属资产导入 UI 缺少关键结构或状态: ${token}`);
}); });
@@ -37,4 +41,16 @@ const source = fs.readFileSync(componentPath, "utf8");
assert(source.includes(token), `详情展示或禁改逻辑缺少关键结构: ${token}`); assert(source.includes(token), `详情展示或禁改逻辑缺少关键结构: ${token}`);
}); });
[
"@/api/ccdiBaseStaffAsset",
"/ccdi/baseStaff/asset/importData",
"ccdi/baseStaff/asset/importTemplate",
"下载员工资产模板",
].forEach((token) => {
assert(
!source.includes(token),
`亲属资产导入 UI 不应引用员工资产导入实现: ${token}`
);
});
console.log("staff-family-asset-detail-import-ui test passed"); console.log("staff-family-asset-detail-import-ui test passed");