|
|
@@ -674,6 +674,7 @@ let crmTasks = ref([]);
|
|
|
let srmTasks = ref([]);
|
|
|
let ehrTasks = ref([]);
|
|
|
const statsLoading = ref(true);
|
|
|
+let statsTimer = null;
|
|
|
|
|
|
const statNumbers = reactive({
|
|
|
todo: 0,
|
|
|
@@ -713,6 +714,124 @@ const doneCount = ref([
|
|
|
{ name: "SRM", value: 0 },
|
|
|
]);
|
|
|
|
|
|
+const withFallback = async (request, fallback, requestName) => {
|
|
|
+ try {
|
|
|
+ return await request;
|
|
|
+ } catch (error) {
|
|
|
+ console.error(`${requestName} failed:`, error);
|
|
|
+ return fallback;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+const loadTaskStats = async (pageSize = 10) => {
|
|
|
+ if (!userStore.getUser.username) {
|
|
|
+ statNumbers.todo = 0;
|
|
|
+ statNumbers.done = 0;
|
|
|
+ todoCount.value = [
|
|
|
+ { name: "OA", value: 0 },
|
|
|
+ { name: "CRM", value: 0 },
|
|
|
+ { name: "SRM", value: 0 },
|
|
|
+ { name: "EHR", value: 0 },
|
|
|
+ ];
|
|
|
+ doneCount.value = [
|
|
|
+ { name: "OA", value: 0 },
|
|
|
+ { name: "CRM", value: 0 },
|
|
|
+ { name: "SRM", value: 0 },
|
|
|
+ ];
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const username = userStore.getUser.username;
|
|
|
+ const [oaRes, crmRes, srmRes, ehrRes, crmDoneRes, srmDoneRes] =
|
|
|
+ await Promise.all([
|
|
|
+ withFallback(
|
|
|
+ getOATasks({
|
|
|
+ id: username,
|
|
|
+ pageNum: 1,
|
|
|
+ pageSize,
|
|
|
+ }),
|
|
|
+ { todoCount: 0, doneCount: 0, todoList: [], doneList: [] },
|
|
|
+ "getOATasks",
|
|
|
+ ),
|
|
|
+ withFallback(
|
|
|
+ getCRMTasks({
|
|
|
+ id: username,
|
|
|
+ type: "pending",
|
|
|
+ pageNum: 1,
|
|
|
+ pageSize: 10,
|
|
|
+ }),
|
|
|
+ { todoCount: 0 },
|
|
|
+ "getCRMTasks(pending)",
|
|
|
+ ),
|
|
|
+ withFallback(
|
|
|
+ getSRMTasks({
|
|
|
+ id: username,
|
|
|
+ pageNum: 1,
|
|
|
+ pageSize: 10,
|
|
|
+ }),
|
|
|
+ { todoCount: 0, doneCount: 0 },
|
|
|
+ "getSRMTasks(todo)",
|
|
|
+ ),
|
|
|
+ withFallback(
|
|
|
+ getEHRTasks({
|
|
|
+ id: username,
|
|
|
+ pageNum: 1,
|
|
|
+ pageSize: 10,
|
|
|
+ }),
|
|
|
+ { todoCount: 0 },
|
|
|
+ "getEHRTasks",
|
|
|
+ ),
|
|
|
+ withFallback(
|
|
|
+ getCRMTasks({
|
|
|
+ id: username,
|
|
|
+ type: "approved",
|
|
|
+ pageNum: 1,
|
|
|
+ pageSize: 10,
|
|
|
+ }),
|
|
|
+ { todoCount: 0 },
|
|
|
+ "getCRMTasks(approved)",
|
|
|
+ ),
|
|
|
+ withFallback(
|
|
|
+ getSRMTasks({
|
|
|
+ id: username,
|
|
|
+ pageNum: 1,
|
|
|
+ pageSize: 10,
|
|
|
+ }),
|
|
|
+ { todoCount: 0, doneCount: 0 },
|
|
|
+ "getSRMTasks(done)",
|
|
|
+ ),
|
|
|
+ ]);
|
|
|
+
|
|
|
+ oaTasks.value = oaRes;
|
|
|
+ crmTasks.value = crmRes;
|
|
|
+ srmTasks.value = srmRes;
|
|
|
+ ehrTasks.value = ehrRes;
|
|
|
+
|
|
|
+ statNumbers.todo =
|
|
|
+ Number(oaRes.todoCount ?? 0) +
|
|
|
+ Number(crmRes.todoCount ?? 0) +
|
|
|
+ Number(srmRes.todoCount ?? 0) +
|
|
|
+ Number(ehrRes.todoCount ?? 0);
|
|
|
+
|
|
|
+ todoCount.value = [
|
|
|
+ { name: "OA", value: oaRes.todoCount ?? 0 },
|
|
|
+ { name: "CRM", value: crmRes.todoCount ?? 0 },
|
|
|
+ { name: "SRM", value: srmRes.todoCount ?? 0 },
|
|
|
+ { name: "EHR", value: ehrRes.todoCount ?? 0 },
|
|
|
+ ];
|
|
|
+
|
|
|
+ statNumbers.done =
|
|
|
+ Number(oaRes.doneCount ?? 0) +
|
|
|
+ Number(crmDoneRes.todoCount ?? 0) +
|
|
|
+ Number(srmDoneRes.doneCount ?? 0);
|
|
|
+
|
|
|
+ doneCount.value = [
|
|
|
+ { name: "OA", value: oaRes.doneCount ?? 0 },
|
|
|
+ { name: "CRM", value: crmDoneRes.todoCount ?? 0 },
|
|
|
+ { name: "SRM", value: srmDoneRes.doneCount ?? 0 },
|
|
|
+ ];
|
|
|
+};
|
|
|
+
|
|
|
onMounted(async () => {
|
|
|
getAll();
|
|
|
// 等待 DOM 与样式生效,避免移动端首屏尺寸为 0
|
|
|
@@ -725,150 +844,16 @@ onMounted(async () => {
|
|
|
|
|
|
if (userStore.getUser.username) {
|
|
|
try {
|
|
|
- const res = await getOATasks({
|
|
|
- id: userStore.getUser.username,
|
|
|
- pageNum: 1,
|
|
|
- pageSize: 99,
|
|
|
- });
|
|
|
- oaTasks.value = res;
|
|
|
-
|
|
|
- const crmRes = await getCRMTasks({
|
|
|
- id: userStore.getUser.username,
|
|
|
- type: "pending",
|
|
|
- pageNum: 1,
|
|
|
- pageSize: 10,
|
|
|
- });
|
|
|
- crmTasks.value = crmRes;
|
|
|
-
|
|
|
- const srmRes = await getSRMTasks({
|
|
|
- id: userStore.getUser.username,
|
|
|
-
|
|
|
- pageNum: 1,
|
|
|
- pageSize: 10,
|
|
|
- });
|
|
|
-
|
|
|
- srmTasks.value = srmRes;
|
|
|
-
|
|
|
- const ehrRes = await getEHRTasks({
|
|
|
- id: userStore.getUser.username,
|
|
|
- pageNum: 1,
|
|
|
- pageSize: 10,
|
|
|
- });
|
|
|
-
|
|
|
- ehrTasks.value = ehrRes;
|
|
|
-
|
|
|
- statNumbers.todo =
|
|
|
- Number(oaTasks.value.todoCount) +
|
|
|
- Number(crmTasks.value.todoCount) +
|
|
|
- Number(srmTasks.value.todoCount) +
|
|
|
- Number(ehrTasks.value.todoCount);
|
|
|
- todoCount.value = [
|
|
|
- { name: "OA", value: oaTasks.value.todoCount ?? 0 },
|
|
|
- { name: "CRM", value: crmTasks.value.todoCount ?? 0 },
|
|
|
- { name: "SRM", value: srmTasks.value.todoCount ?? 0 },
|
|
|
- { name: "EHR", value: ehrTasks.value.todoCount ?? 0 },
|
|
|
- ];
|
|
|
-
|
|
|
- // *****************已办事项统计*************************
|
|
|
-
|
|
|
- const crmDoneRes = await getCRMTasks({
|
|
|
- id: userStore.getUser.username,
|
|
|
- type: "approved",
|
|
|
- pageNum: 1,
|
|
|
- pageSize: 10,
|
|
|
- });
|
|
|
-
|
|
|
- const srmDoneRes = await getSRMTasks({
|
|
|
- id: userStore.getUser.username,
|
|
|
-
|
|
|
- pageNum: 1,
|
|
|
- pageSize: 10,
|
|
|
- });
|
|
|
-
|
|
|
- statNumbers.done =
|
|
|
- Number(oaTasks.value.doneCount) +
|
|
|
- Number(crmDoneRes.todoCount) +
|
|
|
- Number(srmDoneRes.doneCount);
|
|
|
-
|
|
|
- doneCount.value = [
|
|
|
- { name: "OA", value: oaTasks.value.doneCount ?? 0 },
|
|
|
- { name: "CRM", value: crmDoneRes.todoCount ?? 0 },
|
|
|
- { name: "SRM", value: srmDoneRes.doneCount ?? 0 },
|
|
|
- ];
|
|
|
+ await loadTaskStats(99);
|
|
|
} finally {
|
|
|
statsLoading.value = false;
|
|
|
}
|
|
|
|
|
|
- setInterval(
|
|
|
- async () => {
|
|
|
- const res = await getOATasks({
|
|
|
- id: userStore.getUser.username,
|
|
|
- pageNum: 1,
|
|
|
- pageSize: 10,
|
|
|
- });
|
|
|
- oaTasks.value = res;
|
|
|
-
|
|
|
- const crmRes = await getCRMTasks({
|
|
|
- id: userStore.getUser.username,
|
|
|
- type: "pending",
|
|
|
- pageNum: 1,
|
|
|
- pageSize: 10,
|
|
|
- });
|
|
|
- crmTasks.value = crmRes;
|
|
|
-
|
|
|
- try {
|
|
|
- const srmRes = await getSRMTasks({
|
|
|
- id: userStore.getUser.username,
|
|
|
- pageNum: 1,
|
|
|
- pageSize: 10,
|
|
|
- });
|
|
|
-
|
|
|
- srmTasks.value = srmRes;
|
|
|
- } catch (error) {
|
|
|
- srmTasks.value.todoCount = 0;
|
|
|
- srmTasks.value.doneCount = 0;
|
|
|
- }
|
|
|
-
|
|
|
- statNumbers.todo =
|
|
|
- Number(oaTasks.value.todoCount) +
|
|
|
- Number(crmTasks.value.todoCount) +
|
|
|
- Number(srmTasks.value.todoCount);
|
|
|
- todoCount.value = [
|
|
|
- { name: "OA", value: oaTasks.value.todoCount ?? 0 },
|
|
|
- { name: "CRM", value: crmTasks.value.todoCount ?? 0 },
|
|
|
- { name: "SRM", value: srmTasks.value.todoCount ?? 0 },
|
|
|
- ];
|
|
|
-
|
|
|
- const crmDoneRes = await getCRMTasks({
|
|
|
- id: userStore.getUser.username,
|
|
|
- type: "approved",
|
|
|
- pageNum: 1,
|
|
|
- pageSize: 10,
|
|
|
- });
|
|
|
-
|
|
|
- let srmDoneRes = {};
|
|
|
- try {
|
|
|
- srmDoneRes = await getSRMTasks({
|
|
|
- id: userStore.getUser.username,
|
|
|
- pageNum: 1,
|
|
|
- pageSize: 10,
|
|
|
- });
|
|
|
- } catch (error) {
|
|
|
- srmDoneRes.doneCount = 0;
|
|
|
- }
|
|
|
- statNumbers.done =
|
|
|
- Number(oaTasks.value.doneCount) +
|
|
|
- Number(crmDoneRes.todoCount) +
|
|
|
- Number(srmDoneRes.doneCount);
|
|
|
-
|
|
|
- doneCount.value = [
|
|
|
- { name: "OA", value: oaTasks.value.doneCount ?? 0 },
|
|
|
- { name: "CRM", value: crmDoneRes.todoCount ?? 0 },
|
|
|
- { name: "SRM", value: srmDoneRes.doneCount ?? 0 },
|
|
|
- ];
|
|
|
- },
|
|
|
- 10 * 60 * 1000,
|
|
|
- ); // 每5分钟刷新一次
|
|
|
+ statsTimer = setInterval(() => {
|
|
|
+ loadTaskStats().catch((error) => {
|
|
|
+ console.error("loadTaskStats interval failed:", error);
|
|
|
+ });
|
|
|
+ }, 10 * 60 * 1000);
|
|
|
} else {
|
|
|
statsLoading.value = false;
|
|
|
}
|
|
|
@@ -884,6 +869,10 @@ onBeforeUnmount(() => {
|
|
|
if (tabsContainerRef.value) {
|
|
|
tabsContainerRef.value.removeEventListener("scroll", handleTabScroll);
|
|
|
}
|
|
|
+
|
|
|
+ if (statsTimer) {
|
|
|
+ clearInterval(statsTimer);
|
|
|
+ }
|
|
|
});
|
|
|
</script>
|
|
|
|