From c49f84b25007262fd7d3e18d6335742f76f69d51 Mon Sep 17 00:00:00 2001 From: fengyuan_yang <1976974459@qq.com> Date: Fri, 17 Jul 2026 17:23:15 +0800 Subject: [PATCH] =?UTF-8?q?2026-07-17=20=E5=BC=82=E5=B8=B8=E8=A7=84?= =?UTF-8?q?=E5=88=99=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/schedule/todoCenter.js | 10 + src/views/main-sidebar-hover.vue | 85 +- src/views/main-sidebar-sub-menu.vue | 43 +- src/views/main-sidebar.vue | 37 +- .../modules/sys/sceneExceptionRuleConfig.vue | 21 +- src/views/modules/todo/todoCenter.vue | 850 ++++++++++++++++++ 6 files changed, 1035 insertions(+), 11 deletions(-) create mode 100644 src/api/schedule/todoCenter.js create mode 100644 src/views/modules/todo/todoCenter.vue diff --git a/src/api/schedule/todoCenter.js b/src/api/schedule/todoCenter.js new file mode 100644 index 0000000..b880033 --- /dev/null +++ b/src/api/schedule/todoCenter.js @@ -0,0 +1,10 @@ +import { createAPI } from '@/utils/httpRequest.js' + +// 功能代办中心:查询统计 +export const getTodoCenterStats = data => createAPI('schedule/getTodoCenterStats', 'POST', data) + +// 功能代办中心:分页查询代办列表 +export const searchTodoCenterList = data => createAPI('schedule/searchTodoCenterList', 'POST', data) + +// 功能代办中心:查询创建分卷缓存详情 +export const getTodoCacheDetail = data => createAPI('schedule/shiftChange/getUnprocessedData', 'POST', data) diff --git a/src/views/main-sidebar-hover.vue b/src/views/main-sidebar-hover.vue index eb06386..7e0d8db 100644 --- a/src/views/main-sidebar-hover.vue +++ b/src/views/main-sidebar-hover.vue @@ -29,7 +29,14 @@ :class="{ 'active': hoveredMenu && hoveredMenu.menuId === menu.menuId }" @click="handleMainMenuClick(menu, $event)"> - {{ menu.name }} + + {{ menu.name }} + + {{ menu.name }} @@ -41,7 +48,14 @@ :class="{ 'active': hoveredMenu && hoveredMenu.menuId === menu.menuId }" @click="handleMainMenuClick(menu, $event)"> - {{ menu.name }} + + {{ menu.name }} + + {{ menu.name }} @@ -63,7 +77,14 @@ :class="{ 'active': hoveredMenu && hoveredMenu.menuId === menu.menuId }" @click="handleMainMenuClick(menu, $event)" :title="menu.name"> - + + + + @@ -74,7 +95,14 @@ :class="{ 'active': hoveredMenu && hoveredMenu.menuId === menu.menuId }" @click="handleMainMenuClick(menu, $event)" :title="menu.name"> - + + + + @@ -141,6 +169,7 @@ import { isURL } from '@/utils/validate' import { userFavoriteList } from '@/api/userFavorite.js' import { searchFunctionButtonList } from '@/api/sysLanguage.js' +import { getTodoCenterStats } from '@/api/schedule/todoCenter.js' export default { name: 'MainSidebarHover', @@ -149,6 +178,8 @@ export default { dynamicMenuRoutes: [], search: '', favoriteList: [], + todoPendingCount: 0, + todoBadgeTimer: null, hoveredMenu: null, submenuStyle: {}, hideTimer: null, @@ -211,17 +242,49 @@ export default { this.userFavorites() this.dynamicMenuRoutes = JSON.parse(sessionStorage.getItem('dynamicMenuRoutes') || '[]') this.routeHandle(this.$route) + this.refreshTodoPendingCount() // this.getFunctionButtonList() }, mounted() { // 添加全局点击监听,点击其他地方时收起菜单 document.addEventListener('click', this.handleDocumentClick) + this.todoBadgeTimer = setInterval(this.refreshTodoPendingCount, 60000) }, beforeDestroy() { // 移除全局点击监听 document.removeEventListener('click', this.handleDocumentClick) + if (this.todoBadgeTimer) { + clearInterval(this.todoBadgeTimer) + this.todoBadgeTimer = null + } }, methods: { + refreshTodoPendingCount () { + const site = this.$store.state.user.site + if (!site) { + this.todoPendingCount = 0 + return + } + const query = { + site: site, + buNo: '' + } + getTodoCenterStats(query).then(({ data }) => { + if (data && data.code === 200 && data.resultMap) { + this.todoPendingCount = Number(data.resultMap.lockPendingCount || 0) + } + }).catch(() => { + this.todoPendingCount = 0 + }) + }, + showTodoBadge (menu) { + if (!menu || this.todoPendingCount <= 0) { + return false + } + const menuName = String(menu.name || '') + const menuUrl = String(menu.url || '').toLowerCase() + return menuName.indexOf('代办中心') !== -1 || menuUrl.indexOf('todocenter') !== -1 || menuUrl.indexOf('todo-center') !== -1 + }, // 获取页面多语言数据 getFunctionButtonList() { let queryButton = { @@ -662,6 +725,20 @@ export default { } } +.hover-todo-badge { + width: calc(100% - 36px); +} + +.hover-todo-badge /deep/ .el-badge__content.is-fixed { + top: 11px; + right: -14px; +} + +.hover-todo-badge-icon /deep/ .el-badge__content.is-fixed { + top: 7px; + right: 0; +} + .hover-submenu { position: fixed; z-index: 1030; diff --git a/src/views/main-sidebar-sub-menu.vue b/src/views/main-sidebar-sub-menu.vue index 37898bb..3622e7f 100644 --- a/src/views/main-sidebar-sub-menu.vue +++ b/src/views/main-sidebar-sub-menu.vue @@ -5,18 +5,33 @@ :popper-class="'site-sidebar--' + sidebarLayoutSkin + '-popper'"> - {{ menu.name }} + + {{ menu.name }} + + {{ menu.name }} + :dynamicMenuRoutes="dynamicMenuRoutes" + :todoPendingCount="todoPendingCount"> - {{ menu.name }} + + {{ menu.name }} + + {{ menu.name }} @@ -32,6 +47,10 @@ dynamicMenuRoutes: { type: Array, required: true + }, + todoPendingCount: { + type: Number, + default: 0 } }, components: { @@ -43,6 +62,14 @@ } }, methods: { + showTodoBadge (menu) { + if (!menu || this.todoPendingCount <= 0) { + return false + } + const menuName = String(menu.name || '') + const menuUrl = String(menu.url || '').toLowerCase() + return menuName.indexOf('代办中心') !== -1 || menuUrl.indexOf('todocenter') !== -1 || menuUrl.indexOf('todo-center') !== -1 + }, // 通过menuId与动态(菜单)路由进行匹配跳转至指定路由 gotoRouteHandle (menu) { var route = this.dynamicMenuRoutes.filter(item => item.meta.menuId === menu.menuId) @@ -53,3 +80,13 @@ } } + + diff --git a/src/views/main-sidebar.vue b/src/views/main-sidebar.vue index 8ab900f..ee81529 100644 --- a/src/views/main-sidebar.vue +++ b/src/views/main-sidebar.vue @@ -21,14 +21,16 @@ v-for="menu in menuList" :key="menu.menuId" :menu="menu" - :dynamicMenuRoutes="dynamicMenuRoutes"> + :dynamicMenuRoutes="dynamicMenuRoutes" + :todoPendingCount="todoPendingCount"> + :dynamicMenuRoutes="dynamicMenuRoutes" + :todoPendingCount="todoPendingCount"> @@ -44,6 +46,7 @@ import {treeDataTranslate} from '@/utils' import { searchFunctionButtonList, } from "@/api/sysLanguage.js" +import { getTodoCenterStats } from '@/api/schedule/todoCenter.js' export default { data() { @@ -55,6 +58,8 @@ export default { favoriteList: [], newMenuList: [], list: [], + todoPendingCount: 0, + todoBadgeTimer: null, pageLanguage: { homePage: '首页' } @@ -119,8 +124,36 @@ export default { this.dynamicMenuRoutes = JSON.parse(sessionStorage.getItem('dynamicMenuRoutes') || '[]') this.routeHandle(this.$route) this.getFunctionButtonList() + this.refreshTodoPendingCount() + }, + mounted () { + this.todoBadgeTimer = setInterval(this.refreshTodoPendingCount, 60000) + }, + beforeDestroy () { + if (this.todoBadgeTimer) { + clearInterval(this.todoBadgeTimer) + this.todoBadgeTimer = null + } }, methods: { + refreshTodoPendingCount () { + const site = this.$store.state.user.site + if (!site) { + this.todoPendingCount = 0 + return + } + const query = { + site: site, + buNo: '' + } + getTodoCenterStats(query).then(({data}) => { + if (data && data.code === 200 && data.resultMap) { + this.todoPendingCount = Number(data.resultMap.lockPendingCount || 0) + } + }).catch(() => { + this.todoPendingCount = 0 + }) + }, // 获取 首页菜单 // 获取页面多语言数据 getFunctionButtonList() { diff --git a/src/views/modules/sys/sceneExceptionRuleConfig.vue b/src/views/modules/sys/sceneExceptionRuleConfig.vue index 4d6e8cf..ad94de3 100644 --- a/src/views/modules/sys/sceneExceptionRuleConfig.vue +++ b/src/views/modules/sys/sceneExceptionRuleConfig.vue @@ -156,7 +156,11 @@ - + + + {{ getResponsibilityDeptLabel(scope.row) }} + + {{ scope.row.parentConditionNo ? scope.row.triggerEvent : '' }} @@ -234,7 +238,7 @@ v-for="item in roleList" :key="item.roleId" :label="item.roleName" - :value="item.roleName"> + :value="String(item.roleId)"> @@ -376,6 +380,19 @@ export default { } }) }, + getResponsibilityDeptLabel (row) { + if (!row) { + return '' + } + if (row.responsibilityDeptName) { + return row.responsibilityDeptName + } + if (!row.responsibilityDept) { + return '' + } + const matched = (this.roleList || []).find(item => String(item.roleId) === String(row.responsibilityDept)) + return matched ? matched.roleName : row.responsibilityDept + }, queryRule () { this.pageIndex = 1 this.getDataList() diff --git a/src/views/modules/todo/todoCenter.vue b/src/views/modules/todo/todoCenter.vue new file mode 100644 index 0000000..7e1453c --- /dev/null +++ b/src/views/modules/todo/todoCenter.vue @@ -0,0 +1,850 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 查询 + 重置 + + + + + + + + + {{ stats.pendingAuditCount }} + 待审核 + + + + + + {{ stats.pendingOperateCount }} + 可报告 + + + + + + {{ stats.completedCount }} + 已完成 + + + + + + + + + + + {{ item.lockFlag === 'Y' ? '强制' : '提示' }} + + {{ item.infoCode || '-' }} + + {{ statusLabel(item) }} + + + + {{ item.messageSource || '-' }} + + + {{ item.orderNo || '-' }} + + + + 工序 + 工序 1|创建分卷 + + + 派工单号 + {{ item.seqNo || '-' }} + + + 责任部门 + {{ item.responsibilityDeptName || item.responsibilityDept || '-' }} + + + + 生成 + 审核 + 完成 + + + + + + + + 暂无代办数据 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ scope.row.defectQty }} + + + + + + {{ scope.row.yieldRate }} + + + + + + {{ scope.row.totalQty }} + + + + + + + + + + + + + + + + + + + + + + + + + 关闭 + + + + + + + +