diff --git a/src/api/base/xkTfApi.ts b/src/api/base/xkTfApi.ts
new file mode 100644
index 0000000..62f3c52
--- /dev/null
+++ b/src/api/base/xkTfApi.ts
@@ -0,0 +1,33 @@
+import { get, post } from "@/utils/request";
+
+/**
+ * 获取选课退费分页查询
+ * @param params
+ * @returns
+ */
+export const findPageXkTfApi = async (params: any) => {
+ return await get("/api/xkTf/findPage", params);
+};
+
+/**
+ * 获取选课退费详情
+ * @param params
+ * @returns
+ */
+export const getXkTfDetailByIdApi = async (id: string) => {
+ return await get("/api/xkTf/getDetailById?id=" + id);
+};
+
+/**
+ * 审批退费
+ */
+export const xkTfSpApi = async (params: any) => {
+ return await post("/api/xkTf/sp", params);
+};
+
+/**
+ * 审批转办
+ */
+export const xkTfSpTransferApi = async (params: any) => {
+ return await post("/api/xkTf/spTransfer", params);
+};
diff --git a/src/api/base/xxtsApi.ts b/src/api/base/xxtsApi.ts
new file mode 100644
index 0000000..07c515a
--- /dev/null
+++ b/src/api/base/xxtsApi.ts
@@ -0,0 +1,6 @@
+import { get } from "@/utils/request";
+
+// 根据ID获取消息推送详情
+export const xxtsFindByIdApi = async (params: any) => {
+ return await get("/api/xxts/findById", params);
+};
\ No newline at end of file
diff --git a/src/pages/base/xs/qj/components/progressList.vue b/src/components/LcglSpList/index.vue
similarity index 70%
rename from src/pages/base/xs/qj/components/progressList.vue
rename to src/components/LcglSpList/index.vue
index ebd52d9..98dd224 100644
--- a/src/pages/base/xs/qj/components/progressList.vue
+++ b/src/components/LcglSpList/index.vue
@@ -4,7 +4,7 @@
审批进度
-
+
@@ -27,34 +27,57 @@
+
+
+
+
+ 暂无审批进度信息
+ 可能审批流程尚未启动或数据加载失败
+
+ 重新加载
+
+
@@ -272,5 +284,43 @@ if (props.qjId) {
}
}
}
+
+ .empty-state {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding: 40px 20px;
+
+ .empty-icon {
+ margin-bottom: 16px;
+ }
+
+ .empty-text {
+ font-size: 16px;
+ color: #333;
+ margin-bottom: 8px;
+ font-weight: 500;
+ }
+
+ .empty-subtext {
+ font-size: 14px;
+ color: #999;
+ margin-bottom: 20px;
+ text-align: center;
+ }
+
+ .retry-button {
+ padding: 8px 24px;
+ background-color: #007AFF;
+ border-radius: 4px;
+ cursor: pointer;
+
+ .retry-text {
+ color: #FFFFFF;
+ font-size: 14px;
+ }
+ }
+ }
}
-
+
\ No newline at end of file
diff --git a/src/components/PreviewImage/index.vue b/src/components/PreviewImage/index.vue
new file mode 100644
index 0000000..247b174
--- /dev/null
+++ b/src/components/PreviewImage/index.vue
@@ -0,0 +1,134 @@
+
+
+ {{ title }}
+
+
+
+
+
+
+
+
+
+ {{ emptyText || '暂无图片' }}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/base/xs/qj/detail.vue b/src/pages/base/xs/qj/detail.vue
index bb047d5..8b6d3ea 100644
--- a/src/pages/base/xs/qj/detail.vue
+++ b/src/pages/base/xs/qj/detail.vue
@@ -48,7 +48,7 @@
-
+
@@ -69,7 +69,7 @@
import { ref, onMounted } from 'vue';
import { useDataStore } from "@/store/modules/data";
import { getXsQjDetailApi } from "@/api/base/server";
-import ProgressList from "./components/progressList.vue";
+import LcglSpList from "@/components/LcglSpList/index.vue";
const { getData } = useDataStore();
diff --git a/src/pages/base/xs/qj/sp.vue b/src/pages/base/xs/qj/sp.vue
index 5c8565e..eadc3c9 100644
--- a/src/pages/base/xs/qj/sp.vue
+++ b/src/pages/base/xs/qj/sp.vue
@@ -77,8 +77,7 @@ import { xsQjFindByIdApi, xsQjSpApi } from "@/api/base/server";
import { useUserStore } from "@/store/modules/user";
import { useDataStore } from "@/store/modules/data";
import { ref, nextTick } from "vue";
-import { xxtsFindByIdApi, xxtsBlApi } from "@/api/base/server";
-import ProgressList from "./components/progressList.vue";
+import { xxtsFindByIdApi } from "@/api/base/server";
const { getJs, loginByOpenId } = useUserStore();
const { getData, setXxts, setData, getXxts } = useDataStore();
diff --git a/src/pages/view/hr/jsQj/detail.vue b/src/pages/view/hr/jsQj/detail.vue
index 140249e..3b6135f 100644
--- a/src/pages/view/hr/jsQj/detail.vue
+++ b/src/pages/view/hr/jsQj/detail.vue
@@ -35,7 +35,7 @@
-
+
@@ -53,7 +53,7 @@ import { useDataStore } from "@/store/modules/data";
import { ref, computed } from "vue";
import JsQjDetailInfo from "./components/jsQjDetailInfo.vue";
import JsQjDetailDk from "./components/jsQjDetailDk.vue";
-import ProgressList from "./components/progressList.vue";
+import LcglSpList from "@/components/LcglSpList/index.vue";
const { getData, setData } = useDataStore();
diff --git a/src/pages/view/hr/jsQj/dkQr.vue b/src/pages/view/hr/jsQj/dkQr.vue
index 2d6628b..7d977b1 100644
--- a/src/pages/view/hr/jsQj/dkQr.vue
+++ b/src/pages/view/hr/jsQj/dkQr.vue
@@ -32,7 +32,7 @@
-
+
@@ -76,7 +76,7 @@ import { useDataStore } from "@/store/modules/data";
import { ref } from "vue";
import JsQjDetailInfo from "./components/jsQjDetailInfo.vue";
import JsQjDetailDk from "./components/jsQjDetailDk.vue";
-import ProgressList from "./components/progressList.vue";
+import LcglSpList from "@/components/LcglSpList/index.vue";
import { QjPageUtils } from "@/utils/qjPageUtils";
const { getJs } = useUserStore();
diff --git a/src/pages/view/hr/jsQj/jwcQr.vue b/src/pages/view/hr/jsQj/jwcQr.vue
index 37e92b2..732033b 100644
--- a/src/pages/view/hr/jsQj/jwcQr.vue
+++ b/src/pages/view/hr/jsQj/jwcQr.vue
@@ -32,7 +32,7 @@
-
+
@@ -77,7 +77,7 @@ import { useDataStore } from "@/store/modules/data";
import { ref } from "vue";
import JsQjDetailInfo from "./components/jsQjDetailInfo.vue";
import JsQjDetailDk from "./components/jsQjDetailDk.vue";
-import ProgressList from "./components/progressList.vue";
+import LcglSpList from "@/components/LcglSpList/index.vue";
import { QjPageUtils } from "@/utils/qjPageUtils";
const { getJs } = useUserStore();
diff --git a/src/pages/view/hr/jsQj/jwcXt.vue b/src/pages/view/hr/jsQj/jwcXt.vue
index a67b778..3ccb0b2 100644
--- a/src/pages/view/hr/jsQj/jwcXt.vue
+++ b/src/pages/view/hr/jsQj/jwcXt.vue
@@ -29,7 +29,7 @@
-
+
@@ -52,7 +52,7 @@ import { useDataStore } from "@/store/modules/data";
import { ref } from "vue";
import JsQjDetailInfo from "./components/jsQjDetailInfo.vue";
import JsQjDkEdit from "./components/jsQjDkEdit.vue";
-import ProgressList from "./components/progressList.vue";
+import LcglSpList from "@/components/LcglSpList/index.vue";
import { QjPageUtils } from "@/utils/qjPageUtils";
const { getJs } = useUserStore();
diff --git a/src/pages/view/hr/jsQj/sp.vue b/src/pages/view/hr/jsQj/sp.vue
index 5235b6b..9e18dd0 100644
--- a/src/pages/view/hr/jsQj/sp.vue
+++ b/src/pages/view/hr/jsQj/sp.vue
@@ -35,7 +35,7 @@
-
+
@@ -62,7 +62,7 @@ import { useDataStore } from "@/store/modules/data";
import { ref } from "vue";
import JsQjDetailInfo from "./components/jsQjDetailInfo.vue";
import JsQjDetailDk from "./components/jsQjDetailDk.vue";
-import ProgressList from "./components/progressList.vue";
+import LcglSpList from "@/components/LcglSpList/index.vue";
import { QjPageUtils } from "@/utils/qjPageUtils";
const { getJs } = useUserStore();
diff --git a/src/pages/view/routine/xk/tf/detail.vue b/src/pages/view/routine/xk/tf/detail.vue
new file mode 100644
index 0000000..8183fd0
--- /dev/null
+++ b/src/pages/view/routine/xk/tf/detail.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/view/routine/xk/tf/sp.vue b/src/pages/view/routine/xk/tf/sp.vue
new file mode 100644
index 0000000..8183fd0
--- /dev/null
+++ b/src/pages/view/routine/xk/tf/sp.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+