From 48e2b8cacd11b7f8a52a999c4aed606afae40104 Mon Sep 17 00:00:00 2001
From: "2358328281@qq.com" <邮箱地址>
Date: Thu, 9 Jul 2026 16:16:11 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=9D=E5=AD=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/i18n/lang/zh-CN.js | 2 +-
src/service/modular/admin/index.js | 8 +++
.../components/ServiceRecordDialog.vue | 58 +++++++++++++------
src/views/admin/hospitals/service.vue | 18 +++++-
.../orders/components/OrderAwardDialog.vue | 2 +-
.../orders/components/OrderHandleDialog.vue | 26 +++++----
.../orders/components/OrderProcessDialog.vue | 24 +++-----
.../orders/components/ReportDetailDialog.vue | 22 ++++++-
src/views/admin/orders/report.vue | 48 +++++++++++----
src/views/admin/performance/score.vue | 2 +-
10 files changed, 149 insertions(+), 61 deletions(-)
diff --git a/src/i18n/lang/zh-CN.js b/src/i18n/lang/zh-CN.js
index 55a9ab3..2e7117e 100644
--- a/src/i18n/lang/zh-CN.js
+++ b/src/i18n/lang/zh-CN.js
@@ -246,7 +246,7 @@ export default {
type: "服务类型",
status: "状态",
time: "提交时间",
- submitter: "提交人",
+ submitter: "提出人员",
feedbackchannel: "反馈渠道",
action: "操作",
hospital: "医院名称",
diff --git a/src/service/modular/admin/index.js b/src/service/modular/admin/index.js
index f5ae4f3..b02eb00 100644
--- a/src/service/modular/admin/index.js
+++ b/src/service/modular/admin/index.js
@@ -82,6 +82,10 @@ export const getAdminReportDetail = (id) => {
export const generateAdminReport = (data) => {
return kcRequest.request(`/admin/reports/generate`, "post", data);
};
+// 重新计算报告数据(重新生成)
+export const recalculateAdminReport = (id) => {
+ return kcRequest.request(`/admin/reports/${id}/recalculate`, "put");
+};
// 更新备注
export const updateAdminReportRemark = (id, data) => {
return kcRequest.request(`/admin/reports/${id}/remark`, "put", data);
@@ -94,6 +98,10 @@ export const toggleAdminReportSendStatus = (id) => {
export const downloadAdminReport = (id, format) => {
return kcRequest.downloadFile(`/admin/reports/${id}/download?format=${format}`);
};
+// 删除报告文件
+export const deleteAdminReport = (id) => {
+ return kcRequest.request(`/admin/reports/${id}`, "delete");
+};
// ============== 客户服务(1.6) ==============
// 维保列表
diff --git a/src/views/admin/hospitals/components/ServiceRecordDialog.vue b/src/views/admin/hospitals/components/ServiceRecordDialog.vue
index 8976223..58daf50 100644
--- a/src/views/admin/hospitals/components/ServiceRecordDialog.vue
+++ b/src/views/admin/hospitals/components/ServiceRecordDialog.vue
@@ -25,12 +25,15 @@
-
-
+
+
+
+
+
-
+
@@ -48,8 +51,10 @@
-
-
+
+
+
+
@@ -104,8 +109,10 @@
-
-
+
+
+
+
@@ -162,11 +169,11 @@
- 回访人:{{ item.callPerson }}
+ 回访人:{{ item.callPersonName }}
回访情况:{{ item.content || "—" }}
- 巡检人:{{ item.inspectionPerson }}
+ 巡检人:{{ item.inspectionPersonName }}
巡检情况:{{ item.content || "—" }}
巡检报告:
@@ -179,7 +186,19 @@
培训主题:{{ item.topic }}
- 参与人员:{{ item.participants || "—" }}人
+
+
+ 参与人员:{{ item.participants || "—" }}人
+
+
+ 培训人员:{{ item.trainerName || "—" }}
+
+
+ 培训日期:{{ dayjs(item.trainingDate).format('YYYY-MM-DD') ||
+ "—"
+ }}
+
+
纪念品名称:{{ item.name }}
@@ -224,6 +243,8 @@ const props = defineProps({
type: { type: String, default: "call" },
hospitalId: { type: [String, Number], default: "" },
hospitalName: { type: String, default: "" },
+ managerLoaded: { type: Boolean, default: false },
+ managerOptions: { type: Array, default: () => [] },
});
const emit = defineEmits(["update:modelValue", "saved"]);
@@ -288,17 +309,17 @@ const typeLabel = computed(() => title.value.replace("记录", ""));
const defaultForm = () => {
if (props.type === "call") {
- return { callTime: dayjs().format("YYYY-MM-DD HH:mm:ss"), callPerson: "", content: "" };
+ return { callTime: dayjs().format("YYYY-MM-DD HH:mm:ss"), callPersonId: "", content: "" };
}
if (props.type === "inspection") {
- return { inspectionTime: dayjs().format("YYYY-MM-DD"), inspectionPerson: "", content: "" };
+ return { inspectionTime: dayjs().format("YYYY-MM-DD"), inspectionPersonId: "", content: "" };
}
if (props.type === "training") {
return {
trainingDate: dayjs().format("YYYY-MM-DD"),
participants: "",
trainingMethod: "线上",
- trainer: "",
+ trainerId: "",
topic: "",
};
}
@@ -312,7 +333,7 @@ const buildRules = () => {
if (props.type === "call") {
return {
callTime: [{ required: true, message: "请选择回访时间" }],
- callPerson: [{ required: true, message: "请输入回访人" }],
+ callPersonId: [{ required: true, message: "请选择回访人" }],
content: [{ required: true, message: "请输入回访内容" }],
};
}
@@ -321,7 +342,7 @@ const buildRules = () => {
return {
inspectionTime: [{ required: true, message: "请选择巡检时间" }],
- inspectionPerson: [{ required: true, message: "请输入巡检人" }],
+ inspectionPersonId: [{ required: true, message: "请选择巡检人" }],
content: [{ required: true, message: "请输入巡检内容" }],
};
}
@@ -329,7 +350,7 @@ const buildRules = () => {
return {
trainingDate: [{ required: true, message: "请选择培训日期" }],
participants: [{ required: true, message: "请输入参与人数" }],
- trainer: [{ required: true, message: "请输入培训人员" }],
+ trainerId: [{ required: true, message: "请选择培训人员" }],
topic: [{ required: true, message: "请输入培训主题" }],
};
}
@@ -389,7 +410,7 @@ const formatTime = (item) => {
}
if (props.type === "training") {
- const t = item.trainingDate;
+ const t = item.createdAt;
return (dayjs(t).isValid() ? dayjs(t).format("YYYY-MM-DD HH:mm") : "—");
}
@@ -558,7 +579,8 @@ const viewReport = async (filePath) => {
color: #1D2129 !important;
}
- .el-input__wrapper {
+ .el-input__wrapper,
+ .el-select__wrapper {
min-height: 48px;
border-radius: 8px 8px 8px 8px;
border: 1px solid #E0E0E0;
diff --git a/src/views/admin/hospitals/service.vue b/src/views/admin/hospitals/service.vue
index f33978d..f45fa61 100644
--- a/src/views/admin/hospitals/service.vue
+++ b/src/views/admin/hospitals/service.vue
@@ -165,7 +165,7 @@
+ :hospital-id="currentHospitalId" :hospital-name="currentHospitalName" :managerOptions="managerOptions" :managerLoaded="managerLoaded" />
@@ -176,7 +176,7 @@
import { computed, onMounted, reactive, ref } from "vue";
import { Calendar, Phone, View, Reading, Present } from "@element-plus/icons-vue";
import dayjs from "dayjs";
-import { getAdminExpiring, getAdminMaintenance } from "@/service/modular/admin";
+import { getAdminExpiring, getAdminMaintenance, getAdminAccounts } from "@/service/modular/admin";
import { useHospitalStore } from "@/stores/api/hospital";
import MaintenanceDetailDialog from "./components/MaintenanceDetailDialog.vue";
import ServiceRecordDialog from "./components/ServiceRecordDialog.vue";
@@ -188,6 +188,19 @@ const loading = ref(false);
const expiringLoading = ref(false);
const expiringList = ref([]);
+const managerOptions = ref([]);
+const managerLoaded = ref(false);
+const loadManagers = async () => {
+ if (managerLoaded.value) return;
+ try {
+ const res = await getAdminAccounts({ type: "Admin" });
+ managerOptions.value = res?.list || [];
+ managerLoaded.value = true;
+ } catch (e) {
+ // request 层已统一提示错误
+ }
+};
+
// 通用医院列表(来自 Pinia store,多页面共享缓存)
const hospitalStore = useHospitalStore();
const hospitals = computed(() => hospitalStore.list);
@@ -280,6 +293,7 @@ const monthlyVisible = ref(false);
onMounted(() => {
hospitalStore.ensureLoaded();
loadList();
+ loadManagers();
// loadExpiring();
});
diff --git a/src/views/admin/orders/components/OrderAwardDialog.vue b/src/views/admin/orders/components/OrderAwardDialog.vue
index 319a88f..ff5c8d7 100644
--- a/src/views/admin/orders/components/OrderAwardDialog.vue
+++ b/src/views/admin/orders/components/OrderAwardDialog.vue
@@ -21,7 +21,7 @@ import awardIcon from "@/assets/image/admin/orders/award.svg";
defineProps({
modelValue: { type: Boolean, default: false },
- points: { type: [String, Number], default: 5 },
+ points: { type: [String, Number], default: 1 },
});
const emit = defineEmits(["update:modelValue", "continue"]);
diff --git a/src/views/admin/orders/components/OrderHandleDialog.vue b/src/views/admin/orders/components/OrderHandleDialog.vue
index f9d676a..5479080 100644
--- a/src/views/admin/orders/components/OrderHandleDialog.vue
+++ b/src/views/admin/orders/components/OrderHandleDialog.vue
@@ -7,6 +7,7 @@
返回
+
@@ -86,12 +87,8 @@
复制工单
-
+
![]()
@@ -106,10 +103,10 @@
-
+
-
+
{{ f.fileName }}
@@ -215,7 +212,7 @@ const closeDialog = () => emit("update:modelValue", false);
// 复制工单回填数据:剔除附件字段,避免上传框中显示原工单的附件占位项
const copyOrderData = computed(() => {
console.log(detail.value);
-
+
const { attachments: _attachments, ...rest } = detail.value || {};
rest.createdAt = dayjs().format("YYYY-MM-DD HH:mm:ss");
return rest;
@@ -375,6 +372,9 @@ const onPreviewDownload = ({ blob, fileName }) => {
.dialog-topbar {
padding: 16px 24px;
border-bottom: 1px solid #F3F4F6;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
.back-btn {
font-weight: 500;
@@ -392,6 +392,12 @@ const onPreviewDownload = ({ blob, fileName }) => {
margin-right: 4px;
}
}
+
+ .close-btn {
+ width: 30px;
+ height: 30px;
+ cursor: pointer;
+ }
}
.body-wrap {
diff --git a/src/views/admin/orders/components/OrderProcessDialog.vue b/src/views/admin/orders/components/OrderProcessDialog.vue
index 9605ad2..ac2e3c6 100644
--- a/src/views/admin/orders/components/OrderProcessDialog.vue
+++ b/src/views/admin/orders/components/OrderProcessDialog.vue
@@ -12,33 +12,27 @@
-
+
-
-
-
-
-
-
-
-
-
-
+
-
+
-
+
+
+
+
下载报告
@@ -160,7 +161,7 @@