diff --git a/ruoyi-ui/src/views/ccdiProject/components/detail/ExtendedPurchaseDetailDialog.vue b/ruoyi-ui/src/views/ccdiProject/components/detail/ExtendedPurchaseDetailDialog.vue
new file mode 100644
index 00000000..dfc29380
--- /dev/null
+++ b/ruoyi-ui/src/views/ccdiProject/components/detail/ExtendedPurchaseDetailDialog.vue
@@ -0,0 +1,98 @@
+
+
+
+ 基本信息
+
+ {{ detail.purchaseId || "-" }}
+ {{ detail.purchaseCategory || "-" }}
+ {{ detail.projectName || "-" }}
+ {{ detail.subjectName || "-" }}
+ {{ detail.purchaseMethod || "-" }}
+ {{ detail.subjectDesc || "-" }}
+
+
+ 数量与金额
+
+ {{ detail.purchaseQty || "-" }}
+ {{ detail.budgetAmount || "-" }}
+ {{ detail.bidAmount || "-" }}
+ {{ detail.actualAmount || "-" }}
+ {{ detail.contractAmount || "-" }}
+ {{ detail.settlementAmount || "-" }}
+
+
+ 供应商信息
+
+ {{ detail.supplierName || "-" }}
+ {{ detail.supplierUscc || "-" }}
+ {{ detail.contactPerson || "-" }}
+ {{ detail.contactPhone || "-" }}
+ {{ detail.supplierBankAccount || "-" }}
+
+
+ 日期信息
+
+ {{ detail.applyDate || "-" }}
+ {{ detail.planApproveDate || "-" }}
+ {{ detail.announceDate || "-" }}
+ {{ detail.bidOpenDate || "-" }}
+ {{ detail.contractSignDate || "-" }}
+ {{ detail.expectedDeliveryDate || "-" }}
+ {{ detail.actualDeliveryDate || "-" }}
+ {{ detail.acceptanceDate || "-" }}
+ {{ detail.settlementDate || "-" }}
+
+
+ 申请人信息
+
+ {{ detail.applicantName || "-" }}
+ {{ detail.applicantId || "-" }}
+ {{ detail.applyDepartment || "-" }}
+
+
+ 采购负责人信息
+
+ {{ detail.purchaseLeaderName || "-" }}
+ {{ detail.purchaseLeaderId || "-" }}
+ {{ detail.purchaseDepartment || "-" }}
+
+
+ 审计信息
+
+ {{ detail.createdBy || "-" }}
+ {{ detail.createTime || "-" }}
+ {{ detail.updatedBy || "-" }}
+ {{ detail.updateTime || "-" }}
+
+
+
+
+
+
+
diff --git a/ruoyi-ui/src/views/ccdiProject/components/detail/ExtendedQuerySection.vue b/ruoyi-ui/src/views/ccdiProject/components/detail/ExtendedQuerySection.vue
index 7bebe4a9..41427a2f 100644
--- a/ruoyi-ui/src/views/ccdiProject/components/detail/ExtendedQuerySection.vue
+++ b/ruoyi-ui/src/views/ccdiProject/components/detail/ExtendedQuerySection.vue
@@ -79,6 +79,7 @@
+
@@ -104,6 +105,12 @@
+
+
+
+ 查看详情
+
+
+
+
+
+
diff --git a/ruoyi-ui/src/views/ccdiProject/components/detail/ExtendedRecruitmentDetailDialog.vue b/ruoyi-ui/src/views/ccdiProject/components/detail/ExtendedRecruitmentDetailDialog.vue
new file mode 100644
index 00000000..fa91aae8
--- /dev/null
+++ b/ruoyi-ui/src/views/ccdiProject/components/detail/ExtendedRecruitmentDetailDialog.vue
@@ -0,0 +1,81 @@
+
+
+
+ 招聘项目信息
+
+ {{ detail.recruitId || "-" }}
+ {{ detail.recruitName || "-" }}
+
+
+ 职位信息
+
+ {{ detail.posName || "-" }}
+ {{ detail.posCategory || "-" }}
+ {{ detail.posDesc || "-" }}
+
+
+ 候选人信息
+
+ {{ detail.candName || "-" }}
+ {{ detail.candEdu || "-" }}
+ {{ detail.candId || "-" }}
+ {{ detail.candGrad || "-" }}
+ {{ detail.candSchool || "-" }}
+ {{ detail.candMajor || "-" }}
+
+
+ 录用信息
+
+ {{ detail.admitStatus || "-" }}
+
+
+ 面试官信息
+
+ {{ detail.interviewerName1 || "-" }} ({{ detail.interviewerId1 || "-" }})
+ {{ detail.interviewerName2 || "-" }} ({{ detail.interviewerId2 || "-" }})
+
+
+ 审计信息
+
+ {{ detail.createdBy || "-" }}
+ {{ formatDate(detail.createTime) }}
+ {{ detail.updatedBy || "-" }}
+ {{ formatDate(detail.updateTime) }}
+
+
+
+
+
+
+
diff --git a/ruoyi-ui/src/views/ccdiProject/components/detail/ExtendedTransferDetailDialog.vue b/ruoyi-ui/src/views/ccdiProject/components/detail/ExtendedTransferDetailDialog.vue
new file mode 100644
index 00000000..9e8cced7
--- /dev/null
+++ b/ruoyi-ui/src/views/ccdiProject/components/detail/ExtendedTransferDetailDialog.vue
@@ -0,0 +1,71 @@
+
+
+
+ 基本信息
+
+ {{ detail.staffName || "-" }}
+ {{ detail.transferType || "-" }}
+ {{ detail.transferSubType || "-" }}
+ {{ formatDate(detail.transferDate) }}
+
+
+ 调动前信息
+
+ {{ detail.deptNameBefore || "-" }}
+ {{ detail.gradeBefore || "-" }}
+ {{ detail.positionBefore || "-" }}
+ {{ detail.salaryLevelBefore || "-" }}
+
+
+ 调动后信息
+
+ {{ detail.deptNameAfter || "-" }}
+ {{ detail.gradeAfter || "-" }}
+ {{ detail.positionAfter || "-" }}
+ {{ detail.salaryLevelAfter || "-" }}
+
+
+ 审计信息
+
+ {{ detail.createdBy || "-" }}
+ {{ formatDate(detail.createTime) }}
+ {{ detail.updatedBy || "-" }}
+ {{ formatDate(detail.updateTime) }}
+
+
+
+
+
+
+
diff --git a/ruoyi-ui/tests/unit/special-check-extended-query-columns.test.js b/ruoyi-ui/tests/unit/special-check-extended-query-columns.test.js
new file mode 100644
index 00000000..6bc3e9d8
--- /dev/null
+++ b/ruoyi-ui/tests/unit/special-check-extended-query-columns.test.js
@@ -0,0 +1,30 @@
+const assert = require("assert");
+const fs = require("fs");
+const path = require("path");
+
+const source = fs.readFileSync(
+ path.resolve(__dirname, "../../src/views/ccdiProject/components/detail/ExtendedQuerySection.vue"),
+ "utf8"
+);
+
+[
+ "采购事项ID",
+ "项目名称",
+ "标的物名称",
+ "申请人姓名",
+ "申请日期",
+ "招聘项目编号",
+ "招聘项目名称",
+ "职位名称",
+ "面试官姓名摘要",
+ "录用情况",
+ "员工姓名",
+ "调动类型",
+ "调动前部门",
+ "调动后部门",
+ "调动日期",
+ "查看详情",
+].forEach((token) => assert(source.includes(token), token));
+
+assert(source.includes("handleDetail"), "缺少详情查看方法");
+assert(source.includes("操作"), "缺少操作列");
diff --git a/ruoyi-ui/tests/unit/special-check-extended-query-detail-dialogs.test.js b/ruoyi-ui/tests/unit/special-check-extended-query-detail-dialogs.test.js
new file mode 100644
index 00000000..584f53b1
--- /dev/null
+++ b/ruoyi-ui/tests/unit/special-check-extended-query-detail-dialogs.test.js
@@ -0,0 +1,54 @@
+const assert = require("assert");
+const fs = require("fs");
+const path = require("path");
+
+const sectionSource = fs.readFileSync(
+ path.resolve(__dirname, "../../src/views/ccdiProject/components/detail/ExtendedQuerySection.vue"),
+ "utf8"
+);
+const purchaseDialogSource = fs.readFileSync(
+ path.resolve(__dirname, "../../src/views/ccdiProject/components/detail/ExtendedPurchaseDetailDialog.vue"),
+ "utf8"
+);
+const recruitmentDialogSource = fs.readFileSync(
+ path.resolve(__dirname, "../../src/views/ccdiProject/components/detail/ExtendedRecruitmentDetailDialog.vue"),
+ "utf8"
+);
+const transferDialogSource = fs.readFileSync(
+ path.resolve(__dirname, "../../src/views/ccdiProject/components/detail/ExtendedTransferDetailDialog.vue"),
+ "utf8"
+);
+
+assert(sectionSource.includes("getExtendedPurchaseDetail"), "缺少采购详情接口调用");
+assert(sectionSource.includes("getExtendedRecruitmentDetail"), "缺少招聘详情接口调用");
+assert(sectionSource.includes("getExtendedTransferDetail"), "缺少调动详情接口调用");
+assert(sectionSource.includes("extended-purchase-detail-dialog"), "缺少采购详情弹窗挂载");
+assert(sectionSource.includes("extended-recruitment-detail-dialog"), "缺少招聘详情弹窗挂载");
+assert(sectionSource.includes("extended-transfer-detail-dialog"), "缺少调动详情弹窗挂载");
+assert(sectionSource.includes("详情加载失败"), "详情查询失败时应提示错误");
+
+[
+ "基本信息",
+ "数量与金额",
+ "供应商信息",
+ "日期信息",
+ "申请人信息",
+ "采购负责人信息",
+ "审计信息",
+].forEach((token) => assert(purchaseDialogSource.includes(token), token));
+
+[
+ "招聘项目信息",
+ "职位信息",
+ "候选人信息",
+ "录用信息",
+ "面试官信息",
+ "审计信息",
+].forEach((token) => assert(recruitmentDialogSource.includes(token), token));
+
+[
+ "基本信息",
+ "调动前信息",
+ "调动后信息",
+ "审计信息",
+].forEach((token) => assert(transferDialogSource.includes(token), token));