diff --git a/src/api/routine/gw.ts b/src/api/routine/gw.ts new file mode 100644 index 0000000..b681484 --- /dev/null +++ b/src/api/routine/gw.ts @@ -0,0 +1,168 @@ +import { get, post } from "@/utils/request"; + +// 公文相关API接口 + +/** + * 获取公文列表 + * @param params 查询参数 + */ +export function getGwListApi(params: { + page: number; + pageSize: number; + status?: string; + keyword?: string; + gwType?: string; + urgencyLevel?: string; + startTime?: string; + endTime?: string; +}) { + return get('/api/gw/list', params); +} + +/** + * 获取公文详情 + * @param id 公文ID + */ +export function getGwDetailApi(id: string) { + return get(`/api/gw/detail/${id}`); +} + +/** + * 创建公文 + * @param data 公文数据 + */ +export function createGwApi(data: { + title: string; + gwType: string; + urgencyLevel: string; + remark?: string; + files: any[]; + approvers: any[]; + ccUsers: any[]; +}) { + return post('/api/gw/create', data); +} + +/** + * 更新公文 + * @param id 公文ID + * @param data 更新数据 + */ +export function updateGwApi(id: string, data: any) { + return post(`/api/gw/update/${id}`, data); +} + +/** + * 删除公文 + * @param id 公文ID + */ +export function deleteGwApi(id: string) { + return post(`/api/gw/delete/${id}`, { id }); +} + +/** + * 保存草稿 + * @param data 草稿数据 + */ +export function saveDraftApi(data: any) { + return post('/api/gw/draft', data); +} + +/** + * 提交公文 + * @param data 提交数据 + */ +export function submitGwApi(data: any) { + return post('/api/gw/submit', data); +} + +/** + * 保存变更 + * @param data 变更数据 + */ +export function saveChangesApi(data: { + gwId: string; + approvers: any[]; + ccUsers: any[]; + operationLogs: any[]; +}) { + return post('/api/gw/changes', data); +} + +/** + * 搜索用户 + * @param keyword 搜索关键词 + */ +export function searchUsersApi(keyword: string) { + return get('/api/user/search', { keyword }); +} + +/** + * 获取审批人列表 + * @param gwId 公文ID + */ +export function getApproversApi(gwId: string) { + return get(`/api/gw/approvers/${gwId}`); +} + +/** + * 获取抄送人列表 + * @param gwId 公文ID + */ +export function getCCUsersApi(gwId: string) { + return get(`/api/gw/cc-users/${gwId}`); +} + +/** + * 获取操作记录 + * @param gwId 公文ID + */ +export function getOperationLogsApi(gwId: string) { + return get(`/api/gw/logs/${gwId}`); +} + +/** + * 文件上传 + * @param file 文件对象 + */ +export function uploadFileApi(file: File) { + const formData = new FormData(); + formData.append("file", file); + + return post('/api/file/upload', formData); +} + +/** + * 文件删除 + * @param fileId 文件ID + */ +export function deleteFileApi(fileId: string) { + return post(`/api/file/delete/${fileId}`, { fileId }); +} + +/** + * 获取公文统计信息 + */ +export function getGwStatsApi() { + return get('/api/gw/stats'); +} + +/** + * 审批公文 + * @param data 审批数据 + */ +export function approveGwApi(data: { + gwId: string; + action: "approve" | "reject"; + remark?: string; +}) { + return post('/api/gw/approve', data); +} + +/** + * 抄送确认 + * @param gwId 公文ID + */ +export function confirmCCApi(gwId: string) { + return post(`/api/gw/cc-confirm/${gwId}`); +} diff --git a/src/pages.json b/src/pages.json index 3babb77..027cc14 100644 --- a/src/pages.json +++ b/src/pages.json @@ -192,6 +192,27 @@ "enablePullDownRefresh": false } }, + { + "path": "pages/view/routine/gwlz/gwAdd", + "style": { + "navigationBarTitleText": "公文列表", + "enablePullDownRefresh": false + } + }, + { + "path": "pages/view/routine/gwlz/index", + "style": { + "navigationBarTitleText": "公文接收", + "enablePullDownRefresh": false + } + }, + { + "path": "pages/view/routine/gwlz/gwFlow", + "style": { + "navigationBarTitleText": "公文流转", + "enablePullDownRefresh": false + } + }, { "path": "pages/view/routine/JiFenPingJia/JiFenPingJia", "style": { diff --git a/src/pages/base/service/index.vue b/src/pages/base/service/index.vue index 9bc58f9..96bae89 100644 --- a/src/pages/base/service/index.vue +++ b/src/pages/base/service/index.vue @@ -180,9 +180,33 @@ const handleLogout = () => { const sections = reactive([ { id: "routine", - title: "常规", + title: "教学常规", permissionKey: "routine", // 整个常规区域的权限编码 items: [ + { + id: "r2", + icon: "jfpj", + text: "积分评价", + show: true, + permissionKey: "routine-jfpj", // 积分评价权限编码 + path: "/pages/view/routine/JiFenPingJia/JiFenPingJia", + }, + { + id: "r3", + icon: "gzltj", + text: "工作量", + show: true, + permissionKey: "routine-gzl", // 工作量权限编码 + path: "/pages/view/routine/GongZuoLiang/index", + }, + { + id: "hs4", + icon: "cjfx", + text: "成绩分析", + show: true, + permissionKey: "home-cjfx", // 成绩分析权限编码 + path: "/pages/view/homeSchool/ChengJiFenXi", + }, { id: "r1", icon: "stack-fill", @@ -191,30 +215,38 @@ const sections = reactive([ permissionKey: "routine-jszr", // 教学资源权限编码 path: "/pages/view/routine/JiaoXueZiYuan/index", }, - { - id: "r2", - icon: "file-mark-fill", - text: "积分评价", - show: true, - permissionKey: "routine-jfpj", // 积分评价权限编码 - path: "/pages/view/routine/JiFenPingJia/JiFenPingJia", - }, - { - id: "r3", - icon: "file-list-3-fil", - text: "工作量", - show: true, - permissionKey: "routine-gzl", // 工作量权限编码 - path: "/pages/view/routine/GongZuoLiang/index", - }, { id: "r4", - icon: "file-paper-2-fill", + icon: "rzrj", text: "任教任职", show: true, permissionKey: "routine-rzrj", // 任教任职权限编码 path: "/pages/view/routine/RengJiaoRengZhi/index", }, + { + id: "r10", + icon: "qdfb", + text: "签到发布", + show: true, + permissionKey: "routine-qdfb", // 签到发布权限编码 + path: "/pages/view/routine/qd/index", + }, + { + id: "r7", + icon: "kctb", + text: "课程填报", + show: true, + permissionKey: "routine-kcjs", // 课程介绍权限编码 + path: "/pages/base/groupTeaching/xkList", + }, + { + id: "r6", + icon: "kfxc", + text: "课服巡查", + show: true, + permissionKey: "routine-kfxc", // 课服巡查权限编码 + path: "/pages/view/routine/kefuxuncha/xcXkList", + }, { id: "r5", icon: "hc-fill", @@ -223,64 +255,18 @@ const sections = reactive([ permissionKey: "routine-stxc", // 食堂巡查权限编码 path: "/pages/view/routine/ShiTangXunCha/index", }, - { - id: "r6", - icon: "pass-pending-fill", - text: "课服巡查", - show: true, - permissionKey: "routine-kfxc", // 课服巡查权限编码 - path: "/pages/view/routine/kefuxuncha/xcXkList", - }, - { - id: "r7", - icon: "file-text-fill-2", - text: "课程填报", - show: true, - permissionKey: "routine-kcjs", // 课程介绍权限编码 - path: "/pages/base/groupTeaching/xkList", - }, - { - id: "r8", - icon: "draftfill", - text: "选课点名", - show: true, - permissionKey: "routine-kcdm", // 选课点名权限编码 - path: "/pages/base/groupTeaching/dmXkList", - }, - { - id: "r9", - icon: "draftfill", - text: "发布接龙", - show: true, - permissionKey: "routine-bjjl", // 发布接龙权限编码 - path: "/pages/view/notice/index", - }, - { - id: "r10", - icon: "draftfill", - text: "签到发布", - show: true, - permissionKey: "routine-qdfb", // 签到发布权限编码 - path: "/pages/view/routine/qd/index", - }, - { - id: "r11", - icon: "draftfill", - text: "就餐点名", - show: true, - permissionKey: "routine-jcdm", // 就餐点名权限编码 - path: "/pages/view/routine/jc/index", - }, + + ], }, { id: "home-school", - title: "家校", + title: "家校沟通", permissionKey: "home", // 整个家校区域的权限编码 items: [ { id: "hs1", - icon: "file-text-fill", + icon: "jskb", text: "教师课表", show: true, permissionKey: "home-jskb", // 教师课表权限编码 @@ -288,7 +274,7 @@ const sections = reactive([ }, { id: "hs2", - icon: "file-text-fill-2", + icon: "bjkb", text: "班级课表", show: true, permissionKey: "home-bjkb", // 班级课表权限编码 @@ -296,30 +282,47 @@ const sections = reactive([ }, { id: "hs3", - icon: "file-paper-2-fill", + icon: "txl", text: "家长通讯录", show: true, permissionKey: "home-jztxl", // 家长通讯录权限编码 path: "/pages/view/homeSchool/parentAddressBook/index", }, + { - id: "hs4", - icon: "filechart2fil", - text: "成绩分析", + id: "r8", + icon: "xkdm", + text: "选课点名", show: true, - permissionKey: "home-cjfx", // 成绩分析权限编码 - path: "/pages/view/homeSchool/ChengJiFenXi", + permissionKey: "routine-kcdm", // 选课点名权限编码 + path: "/pages/base/groupTeaching/dmXkList", + }, + { + id: "r11", + icon: "jcdm", + text: "就餐点名", + show: true, + permissionKey: "routine-jcdm", // 就餐点名权限编码 + path: "/pages/view/routine/jc/index", + }, + { + id: "r9", + icon: "jlfb", + text: "发布接龙", + show: true, + permissionKey: "routine-bjjl", // 发布接龙权限编码 + path: "/pages/view/notice/index", }, ], }, { id: "hr", - title: "人事", + title: "行政办公", permissionKey: "personnel", // 整个人事区域的权限编码 items: [ { id: "hr1", - icon: "draftfill", + icon: "qjsq", text: "请假申请", show: true, permissionKey: "personnel-qjsq", // 请假申请权限编码 @@ -327,15 +330,23 @@ const sections = reactive([ }, { id: "hr2", - icon: "file-user-fill", + icon: "jsda", text: "教师档案", show: true, permissionKey: "personnel-jsda", // 教师档案权限编码 path: "/pages/view/hr/teacherProfile/index", }, + { + id: "r12", + icon: "gw", + text: "公文流转", + show: true, + permissionKey: "routine-gwlz", // 公文流转权限编码 + path: "/pages/view/routine/gwlz/index", + }, { id: "hr3", - icon: "newspaper-fill", + icon: "gz", text: "工资条", show: true, permissionKey: "personnel-gzt", // 工资条权限编码 diff --git a/src/pages/view/hr/jsQj/components/jsQjEdit.vue b/src/pages/view/hr/jsQj/components/jsQjEdit.vue index 2cb276d..7496dce 100644 --- a/src/pages/view/hr/jsQj/components/jsQjEdit.vue +++ b/src/pages/view/hr/jsQj/components/jsQjEdit.vue @@ -36,11 +36,11 @@ const props = withDefaults(defineProps<{ }>(), { data: () => ({ id: "", - qjlx: "事假", - qjkstime: "2025-07-07 09:00:00", - qjjstime: "2025-07-08 10:00:00", - qjsc: "25小时", - qjsy: "我有事情", + qjlx: "", + qjkstime: "", + qjjstime: "", + qjsc: "", + qjsy: "", dkfs: 0, }) }); diff --git a/src/pages/view/routine/gwlz/gwAdd.vue b/src/pages/view/routine/gwlz/gwAdd.vue new file mode 100644 index 0000000..25d215c --- /dev/null +++ b/src/pages/view/routine/gwlz/gwAdd.vue @@ -0,0 +1,389 @@ + + + + + + diff --git a/src/pages/view/routine/gwlz/gwFlow.vue b/src/pages/view/routine/gwlz/gwFlow.vue new file mode 100644 index 0000000..6d3db3e --- /dev/null +++ b/src/pages/view/routine/gwlz/gwFlow.vue @@ -0,0 +1,857 @@ + + + + + diff --git a/src/pages/view/routine/gwlz/index.vue b/src/pages/view/routine/gwlz/index.vue new file mode 100644 index 0000000..e7bf84c --- /dev/null +++ b/src/pages/view/routine/gwlz/index.vue @@ -0,0 +1,575 @@ + + + + + + diff --git a/src/pages/view/routine/qd/detail.vue b/src/pages/view/routine/qd/detail.vue index 89fbac1..3b0d1c9 100644 --- a/src/pages/view/routine/qd/detail.vue +++ b/src/pages/view/routine/qd/detail.vue @@ -41,15 +41,15 @@ 签到统计 - + {{ totalCount }} 总人数 - + {{ signedCount }} 已签到 - + {{ unsignedCount }} 未签到 @@ -93,6 +93,38 @@ + + + + + + {{ popupTitle }} + × + + + + + + {{ teacher.jsxm }} + {{ teacher.dzzw || '' }} {{ teacher.qtzw || '' }} + + + + {{ getStatusText(teacher.qdStatus) }} + + + {{ formatTime(teacher.qdwctime) }} + + + + + + + @@ -127,10 +159,24 @@ interface TeacherInfo { const qdId = ref(''); const qdInfo = ref({} as QdInfo); const teacherList = ref([]); +const teacherPopup = ref(); +const popupTitle = ref(''); +const currentFilter = ref('all'); const totalCount = computed(() => teacherList.value.length); const signedCount = computed(() => teacherList.value.filter(t => t.qdStatus === '1').length); -const unsignedCount = computed(() => totalCount.value - signedCount.value); +const unsignedCount = computed(() => teacherList.value.filter(t => t.qdStatus === '0').length); + +const filteredTeacherList = computed(() => { + switch (currentFilter.value) { + case 'signed': + return teacherList.value.filter(t => t.qdStatus === '1'); + case 'unsigned': + return teacherList.value.filter(t => t.qdStatus === '0'); + default: + return teacherList.value; + } +}); onLoad((options) => { if (options && options.id) { @@ -159,14 +205,39 @@ const loadQdDetail = async () => { const loadTeacherList = async () => { try { const result = await qdzxFindByQdParamsApi({ qdId: qdId.value }); - if (result.resultCode === 1 && result.result) { - teacherList.value = result.result; + + // 修复数据解析逻辑 - 数据在rows字段中 + if (result.rows && Array.isArray(result.rows)) { + teacherList.value = result.rows; + } else { + console.log('接口返回异常 - 没有rows字段或不是数组:', result); + teacherList.value = []; } } catch (error) { console.error('加载教师列表失败:', error); + teacherList.value = []; } }; +const showTeacherList = (filter: string) => { + currentFilter.value = filter; + switch (filter) { + case 'signed': + popupTitle.value = `已签到人员 (${signedCount.value}人)`; + break; + case 'unsigned': + popupTitle.value = `未签到人员 (${unsignedCount.value}人)`; + break; + default: + popupTitle.value = `全部人员 (${totalCount.value}人)`; + } + teacherPopup.value.open(); +}; + +const closeTeacherPopup = () => { + teacherPopup.value.close(); +}; + const getStatusClass = (status: string) => { switch (status) { case 'A': @@ -330,6 +401,12 @@ const handleBack = () => { flex-direction: column; align-items: center; gap: 8px; + cursor: pointer; + transition: transform 0.2s ease; + + &:active { + transform: scale(0.95); + } } .stat-number { @@ -427,12 +504,100 @@ const handleBack = () => { .back-btn { width: 100%; - padding: 12px; + padding: 8px 16px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border: none; - border-radius: 8px; - font-size: 16px; + border-radius: 6px; + font-size: 14px; font-weight: 500; } + +// 弹窗样式 +.popup-content { + background: white; + border-radius: 16px; + width: 90vw; + max-width: 400px; + max-height: 80vh; + overflow: hidden; +} + +.popup-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 20px 20px 15px; + border-bottom: 1px solid #f0f0f0; +} + +.popup-title { + font-size: 18px; + font-weight: 600; + color: #333; +} + +.popup-close { + font-size: 24px; + color: #999; + cursor: pointer; + padding: 5px; + line-height: 1; +} + +.popup-body { + max-height: 60vh; +} + +.popup-teacher-list { + padding: 15px 20px; +} + +.popup-teacher-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 12px 0; + border-bottom: 1px solid #f5f5f5; + + &:last-child { + border-bottom: none; + } +} + +.popup-teacher-info { + flex: 1; +} + +.popup-teacher-name { + display: block; + font-size: 16px; + font-weight: 500; + color: #333; + margin-bottom: 4px; +} + +.popup-teacher-position { + font-size: 14px; + color: #666; +} + +.popup-teacher-status { + display: flex; + flex-direction: column; + align-items: flex-end; + gap: 4px; +} + +.popup-status-text { + font-size: 12px; + font-weight: 500; + padding: 2px 8px; + border-radius: 6px; +} + +.popup-sign-time { + font-size: 11px; + color: #999; +} \ No newline at end of file diff --git a/src/static/base/home/bjkb.png b/src/static/base/home/bjkb.png new file mode 100644 index 0000000..647e7b6 Binary files /dev/null and b/src/static/base/home/bjkb.png differ diff --git a/src/static/base/home/cjfx.png b/src/static/base/home/cjfx.png new file mode 100644 index 0000000..4a1008f Binary files /dev/null and b/src/static/base/home/cjfx.png differ diff --git a/src/static/base/home/gw.png b/src/static/base/home/gw.png new file mode 100644 index 0000000..cd495e8 Binary files /dev/null and b/src/static/base/home/gw.png differ diff --git a/src/static/base/home/gz.png b/src/static/base/home/gz.png new file mode 100644 index 0000000..b4da4fb Binary files /dev/null and b/src/static/base/home/gz.png differ diff --git a/src/static/base/home/gzltj.png b/src/static/base/home/gzltj.png new file mode 100644 index 0000000..f23b53a Binary files /dev/null and b/src/static/base/home/gzltj.png differ diff --git a/src/static/base/home/jcdm.png b/src/static/base/home/jcdm.png new file mode 100644 index 0000000..9506bac Binary files /dev/null and b/src/static/base/home/jcdm.png differ diff --git a/src/static/base/home/jfpj.png b/src/static/base/home/jfpj.png new file mode 100644 index 0000000..18b2e49 Binary files /dev/null and b/src/static/base/home/jfpj.png differ diff --git a/src/static/base/home/jlfb.png b/src/static/base/home/jlfb.png new file mode 100644 index 0000000..618bc95 Binary files /dev/null and b/src/static/base/home/jlfb.png differ diff --git a/src/static/base/home/jsda.png b/src/static/base/home/jsda.png new file mode 100644 index 0000000..2902bce Binary files /dev/null and b/src/static/base/home/jsda.png differ diff --git a/src/static/base/home/jskb.png b/src/static/base/home/jskb.png new file mode 100644 index 0000000..6a3b785 Binary files /dev/null and b/src/static/base/home/jskb.png differ diff --git a/src/static/base/home/kctb.png b/src/static/base/home/kctb.png new file mode 100644 index 0000000..0b92725 Binary files /dev/null and b/src/static/base/home/kctb.png differ diff --git a/src/static/base/home/kfxc.png b/src/static/base/home/kfxc.png new file mode 100644 index 0000000..81eac13 Binary files /dev/null and b/src/static/base/home/kfxc.png differ diff --git a/src/static/base/home/qdfb.png b/src/static/base/home/qdfb.png new file mode 100644 index 0000000..88657b2 Binary files /dev/null and b/src/static/base/home/qdfb.png differ diff --git a/src/static/base/home/qjsq.png b/src/static/base/home/qjsq.png new file mode 100644 index 0000000..efec314 Binary files /dev/null and b/src/static/base/home/qjsq.png differ diff --git a/src/static/base/home/rzrj.png b/src/static/base/home/rzrj.png new file mode 100644 index 0000000..95998aa Binary files /dev/null and b/src/static/base/home/rzrj.png differ diff --git a/src/static/base/home/txl.png b/src/static/base/home/txl.png new file mode 100644 index 0000000..40925d2 Binary files /dev/null and b/src/static/base/home/txl.png differ diff --git a/src/static/base/home/xkdm.png b/src/static/base/home/xkdm.png new file mode 100644 index 0000000..e9fac1e Binary files /dev/null and b/src/static/base/home/xkdm.png differ