拆分员工与亲属资产导入前端链路
This commit is contained in:
@@ -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 个前端静态契约测试验证员工页与亲属页导入交互隔离生效
|
||||||
|
|||||||
35
ruoyi-ui/src/api/ccdiBaseStaffAsset.js
Normal file
35
ruoyi-ui/src/api/ccdiBaseStaffAsset.js
Normal 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 }
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
Reference in New Issue
Block a user