From 55c62cc0338b614187e7276b7d96a7f5a7b7e875 Mon Sep 17 00:00:00 2001 From: ywyonui Date: Wed, 6 Aug 2025 20:29:45 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E9=80=89=E8=AF=BE=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E8=B7=B3=E8=BD=AC=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/base/jcApi.ts | 41 +-- src/api/base/server.ts | 70 ---- src/api/base/xkApi.ts | 95 ++++++ src/config.ts | 4 +- src/pages.json | 73 ++++ .../base/components/JcBzDetailCard/index.vue | 229 +++++++++++++ src/pages/base/components/JcBzList/index.vue | 14 +- .../base/components/JcBzPicker/index.vue | 318 ++++++++++++++++++ src/pages/base/components/XkPicker/index.vue | 17 +- src/pages/base/gzs/jc.vue | 2 +- src/pages/base/home/xsXz.vue | 62 ++++ src/pages/base/jc/README.md | 78 +++++ src/pages/base/jc/bm-detail.vue | 295 ++++++++++++++++ src/pages/base/jc/bm.vue | 157 ++++++--- src/pages/base/jc/pay/success.vue | 2 +- src/pages/base/xk/pay/index.vue | 2 +- src/pages/base/xk/pay/wait.vue | 2 +- src/pages/base/xk/qk/jlb.vue | 46 +-- src/pages/base/xk/qk/xqk.vue | 209 +++++++++++- src/pages/system/launchPage/launchPage.vue | 24 +- src/pages/system/login/login.vue | 25 +- src/store/modules/user.ts | 187 ++++++++++ src/utils/xkUtils.ts | 95 ++++++ 23 files changed, 1788 insertions(+), 259 deletions(-) create mode 100644 src/api/base/xkApi.ts create mode 100644 src/pages/base/components/JcBzDetailCard/index.vue create mode 100644 src/pages/base/components/JcBzPicker/index.vue create mode 100644 src/pages/base/home/xsXz.vue create mode 100644 src/pages/base/jc/README.md create mode 100644 src/pages/base/jc/bm-detail.vue create mode 100644 src/utils/xkUtils.ts diff --git a/src/api/base/jcApi.ts b/src/api/base/jcApi.ts index 368e8dc..760e68d 100644 --- a/src/api/base/jcApi.ts +++ b/src/api/base/jcApi.ts @@ -4,89 +4,68 @@ import { get, post } from "@/utils/request"; * 获取就餐标准列表 */ export const jcGetJcBzListApi = async (params: any) => { - return await get("/mobile/jc/getJcBzList", params); + return await get("/mobile/jz/jc/getJcBzList", params); }; /** * 获取就餐标准详情 */ export const jcGetJcBzDetailApi = async (params: any) => { - return await get("/mobile/jc/getJcBzDetail", params); + return await get("/mobile/jz/jc/getJcBzDetail", params); }; /** * 学生报名就餐标准 */ export const jcBmJcBzApi = async (params: any) => { - return await post("/mobile/jc/bmJcBz", params); + return await post("/mobile/jz/jc/bmJcBz", params); }; /** * 获取学生已报名的就餐标准列表 */ export const jcGetXsBmJcBzListApi = async (params: any) => { - return await get("/mobile/jc/getXsBmJcBzList", params); + return await get("/mobile/jz/jc/getXsBmJcBzList", params); }; /** * 取消报名就餐标准 */ export const jcCancelBmJcBzApi = async (params: any) => { - return await post("/mobile/jc/cancelBmJcBz", params); + return await post("/mobile/jz/jc/cancelBmJcBz", params); }; /** * 获取就餐标准报名倒计时 */ export const jcGetBmExpiredTimeApi = async (params: any) => { - return await get("/mobile/jc/getBmExpiredTime", params); + return await get("/mobile/jz/jc/getBmExpiredTime", params); }; /** * 发起就餐标准缴费 */ export const jcFqJcBzJfjApi = async (params: any) => { - return await post("/mobile/jc/fqJcBzJfj", params); + return await post("/mobile/jz/jc/fqJcBzJfj", params); }; /** * 查询就餐标准缴费状态 */ export const jcJcBzJfCxjApi = async (params: any) => { - return await post("/mobile/jc/jcBzJfcx", params); + return await post("/mobile/jz/jc/jcBzJfcx", params); }; /** * 获取就餐标准报名学生列表 */ export const jcGetJcBzBmXsListApi = async (params: any) => { - return await get("/mobile/jc/getJcBzBmXsList", params); -}; - -/** - * 获取就餐标准统计信息 - */ -export const jcGetJcBzTjInfoApi = async (params: any) => { - return await get("/mobile/jc/getJcBzTjInfo", params); -}; - -/** - * 获取当前学期就餐标准配置 - */ -export const jcGetDqXqJcBzConfigApi = async () => { - return await get("/mobile/jc/getDqXqJcBzConfig"); + return await get("/mobile/jz/jc/getJcBzBmXsList", params); }; /** * 获取学生就餐记录 */ export const jcGetXsJcJlApi = async (params: any) => { - return await get("/mobile/jc/getXsJcJl", params); -}; - -/** - * 获取就餐标准支付倒计时 - */ -export const jcGetJcBzPayExpiredTimeApi = async (params: any) => { - return await get("/mobile/jc/getJcBzPayExpiredTime", params); + return await get("/mobile/jz/jc/getXsJcJl", params); }; \ No newline at end of file diff --git a/src/api/base/server.ts b/src/api/base/server.ts index c4ff4f6..d082d1b 100644 --- a/src/api/base/server.ts +++ b/src/api/base/server.ts @@ -11,28 +11,12 @@ export const glxsApi = async (params: any) => { return await post("/open/login/glxs", params); }; -export const xkAddXkqdApi = async (params: any) => { - return await post("/mobile/xk/addXkqd", params); -}; - -export const xkListApi = async (params: any) => { - return await get("/mobile/xk/list", params); -}; -export const xkXkqdApi = async (params: any) => { - return await get("/mobile/xk/xkqd", params); -}; export const kcjhFindKcjhByKcIdApi = async (params: any) => { return await get("/api/kcjh/findKcjhByKcId", params); }; export const xkgzsApi = async (params: any) => { return await get("/api/gzs/findPage", params); }; -export const xkxkbmInfoApi = async (params: any) => { - return await get("/mobile/xk/xkbmInfo", params); -}; -export const xkqddeleteApi = async (params: any) => { - return await post("/api/xkqd/delete?ids=" + params.ids); -}; /** * 获取当前学期和周次 @@ -67,20 +51,6 @@ export const drpkkbApi = async (params: any) => { return await get("/mobile/jz/pkkb/drpkkb", params); }; -/** - * 查询学生选课列表 - */ -export const xsKxApi = async (params: any) => { - return await get("/mobile/jz/xkkc/list", params); -}; - -/** - * 学生已选课程列表 - */ -export const xsYxListApi = async (params: any) => { - return await get("/mobile/jz/xsxk/list", params); -}; - /** * 查询学生考试场次 */ @@ -94,46 +64,6 @@ export const xsKsccApi = async (params: any) => { export const xsKscjApi = async (params: any) => { return await get("/mobile/jz/kscj", params); }; - -/** - * 家长抢课 - */ -export const jzXkQkjApi = async (params: any) => { - return await post("/mobile/jz/xk/qk", params); -}; -/** - * 家长获取抢课到期时间 - */ -export const jzGetQkExpiredTime = async (params: any) => { - return await get("/mobile/jz/xk/getQkExpiredTime", params); -}; -/** - * 家长发起缴费 - */ -export const jzXkFqJfjApi = async (params: any) => { - return await post("/mobile/jz/xk/fqjf", params); -}; - -/** - * 家长取消选课,不支付 - */ -export const jzXkCancelApi = async (params: any) => { - return await post("/mobile/jz/xk/cancel", params); -}; - -/** - * 家长退课 - */ -export const jzXkTkjApi = async (params: any) => { - return await post("/mobile/jz/xk/tk", params); -}; - -/** - * 家长缴费查询 - */ -export const jzXkJfCxjApi = async (params: any) => { - return await post("/mobile/jz/xk/jfcx", params); -}; /** * 家长接龙查询 */ diff --git a/src/api/base/xkApi.ts b/src/api/base/xkApi.ts new file mode 100644 index 0000000..45c92e0 --- /dev/null +++ b/src/api/base/xkApi.ts @@ -0,0 +1,95 @@ +// 选课相关接口 +import { get, post } from "@/utils/request"; + +/** + * 查询学生选课列表 + */ +export const xsKxApi = async (params: any) => { + return await get("/mobile/jz/xkkc/list", params); +}; + +/** + * 学生已选课程列表 + */ +export const xsYxListApi = async (params: any) => { + return await get("/mobile/jz/xsxk/list", params); +}; + +/** + * 家长抢课 + */ +export const jzXkQkjApi = async (params: any) => { + return await post("/mobile/jz/xk/qk", params); +}; + +/** + * 家长获取抢课到期时间 + */ +export const jzGetQkExpiredTime = async (params: any) => { + return await get("/mobile/jz/xk/getQkExpiredTime", params); +}; + +/** + * 家长发起缴费 + */ +export const jzXkFqJfjApi = async (params: any) => { + return await post("/mobile/jz/xk/fqjf", params); +}; + +/** + * 家长取消选课,不支付 + */ +export const jzXkCancelApi = async (params: any) => { + return await post("/mobile/jz/xk/cancel", params); +}; + +/** + * 家长退课 + */ +export const jzXkTkjApi = async (params: any) => { + return await post("/mobile/jz/xk/tk", params); +}; + +/** + * 家长缴费查询 + */ +export const jzXkJfCxjApi = async (params: any) => { + return await post("/mobile/jz/xk/jfcx", params); +}; + +/** + * 查询学生当前学期是否选择了对应类型的选课 + */ +export const checkXsXkByTypeApi = async (params: any) => { + return await get("/mobile/jz/xk/checkXsXkByType", params); +}; + +/** + * 获取学生选课状态和限制信息 + */ +export const getXsXkStatusApi = async (params: any) => { + return await get("/mobile/jz/xkkc/list", params); +}; + +/** + * 选课相关其他接口 + */ +export const xkAddXkqdApi = async (params: any) => { + return await post("/mobile/xk/addXkqd", params); +}; + +export const xkListApi = async (params: any) => { + return await get("/mobile/xk/list", params); +}; + +export const xkXkqdApi = async (params: any) => { + return await get("/mobile/xk/xkqd", params); +}; + +export const xkxkbmInfoApi = async (params: any) => { + return await get("/mobile/xk/xkbmInfo", params); +}; + +export const xkqddeleteApi = async (params: any) => { + return await post("/api/xkqd/delete?ids=" + params.ids); +}; \ No newline at end of file diff --git a/src/config.ts b/src/config.ts index ddf376c..435a593 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,5 +1,5 @@ -// const ip: string = "127.0.0.1:8897"; -const ip: string = "lzcxsx.cn"; +const ip: string = "127.0.0.1:8897"; +// const ip: string = "lzcxsx.cn"; const fwqip: string = "lzcxsx.cn"; //const ip: string = "zhxy.yufangzc.com"; //const fwqip: string = "zhxy.yufangzc.com"; diff --git a/src/pages.json b/src/pages.json index 6ab5f55..0095ac7 100644 --- a/src/pages.json +++ b/src/pages.json @@ -192,6 +192,13 @@ "enablePullDownRefresh": false } }, + { + "path": "pages/base/home/xsXz", + "style": { + "navigationBarTitleText": "学生选择", + "enablePullDownRefresh": false + } + }, { "path": "pages/base/xk/qk/xqk", "style": { @@ -271,6 +278,72 @@ "navigationBarTitleText": "俱乐部告知书", "enablePullDownRefresh": false } + }, + { + "path": "pages/base/jc/index", + "style": { + "navigationBarTitleText": "检查", + "enablePullDownRefresh": false + } + }, + { + "path": "pages/base/jc/detail", + "style": { + "navigationBarTitleText": "检查详情", + "enablePullDownRefresh": false + } + }, + { + "path": "pages/base/jc/bm", + "style": { + "navigationBarTitleText": "报名", + "enablePullDownRefresh": false + } + }, + { + "path": "pages/base/jc/bm-detail", + "style": { + "navigationBarTitleText": "报名详情", + "enablePullDownRefresh": false + } + }, + { + "path": "pages/base/jc/record", + "style": { + "navigationBarTitleText": "记录", + "enablePullDownRefresh": false + } + }, + { + "path": "pages/base/jc/pay/index", + "style": { + "navigationBarTitleText": "支付", + "enablePullDownRefresh": false + } + }, + { + "path": "pages/base/jc/pay/wait", + "style": { + "navigationBarTitleText": "", + "enablePullDownRefresh": false, + "navigationBarBackgroundColor": "#ffffff", + "navigationBarTextStyle": "black", + "backgroundColor": "#ffffff" + } + }, + { + "path": "pages/base/jc/pay/success", + "style": { + "navigationBarTitleText": "支付成功", + "enablePullDownRefresh": false + } + }, + { + "path": "pages/base/jc/pay/fail", + "style": { + "navigationBarTitleText": "支付失败", + "enablePullDownRefresh": false + } } ], "globalStyle": { diff --git a/src/pages/base/components/JcBzDetailCard/index.vue b/src/pages/base/components/JcBzDetailCard/index.vue new file mode 100644 index 0000000..2b1c00b --- /dev/null +++ b/src/pages/base/components/JcBzDetailCard/index.vue @@ -0,0 +1,229 @@ + + + + + \ No newline at end of file diff --git a/src/pages/base/components/JcBzList/index.vue b/src/pages/base/components/JcBzList/index.vue index 4bb2269..9524593 100644 --- a/src/pages/base/components/JcBzList/index.vue +++ b/src/pages/base/components/JcBzList/index.vue @@ -60,7 +60,7 @@ const props = withDefaults(defineProps<{ }); // 定义一个上级传入的emit响应事件用于接收数据变更 -const emit = defineEmits(['change']) +const emit = defineEmits(['change', 'selectedData']) // 就餐标准列表数据 const jcBzList = ref([]); @@ -89,6 +89,12 @@ const initSelectedStatus = () => { jcBzList.value.forEach((jcBz: any) => { jcBz.isSelected = selectedJcBzIds.includes(jcBz.id); }); + + // 发送初始选中的数据 + const selectedData = jcBzList.value.filter((item: any) => + selectedJcBzIds.includes(item.id) + ); + emit("selectedData", selectedData); }; // 切换选餐标准 @@ -128,6 +134,12 @@ const toggleSelection = (jcBz: any) => { // 更新本地存储 uni.setStorageSync("selectedJcBzIds", selectedJcBzIds); emit("change", selectedJcBzIds); + + // 发送选中的完整数据 + const selectedData = jcBzList.value.filter((item: any) => + selectedJcBzIds.includes(item.id) + ); + emit("selectedData", selectedData); } const goToDetail = (jcBz: any) => { diff --git a/src/pages/base/components/JcBzPicker/index.vue b/src/pages/base/components/JcBzPicker/index.vue new file mode 100644 index 0000000..7cf2b40 --- /dev/null +++ b/src/pages/base/components/JcBzPicker/index.vue @@ -0,0 +1,318 @@ + + + + + \ No newline at end of file diff --git a/src/pages/base/components/XkPicker/index.vue b/src/pages/base/components/XkPicker/index.vue index 9cefba9..b98eea8 100644 --- a/src/pages/base/components/XkPicker/index.vue +++ b/src/pages/base/components/XkPicker/index.vue @@ -26,13 +26,11 @@ class="xk-item" :class="{ 'xk-item-active': curXk.id === xk.id, - 'xk-item-selected': xk.selected, }" @click="switchXk(xk)" > {{ xk.xkmc }} - 已选择 import { ref, watch } from "vue"; -import { xsKxApi, xsYxListApi } from "@/api/base/server"; +import { xsKxApi, xsYxListApi } from "@/api/base/xkApi"; import { useUserStore } from "@/store/modules/user"; import { useDataStore } from "@/store/modules/data"; @@ -223,11 +221,6 @@ if (props.xsId) { background-color: rgba(64, 158, 255, 0.05); } - &-selected { - background-color: rgba(64, 158, 255, 0.1); - border-left: 3px solid #409eff; - } - .xk-info { flex: 1; margin-left: 12px; @@ -239,14 +232,6 @@ if (props.xsId) { margin-bottom: 4px; display: block; } - - .xk-selected-tip { - font-size: 12px; - color: #409eff; - background-color: rgba(64, 158, 255, 0.1); - padding: 2px 6px; - border-radius: 4px; - } } } } diff --git a/src/pages/base/gzs/jc.vue b/src/pages/base/gzs/jc.vue index fa0726e..ed54c9c 100644 --- a/src/pages/base/gzs/jc.vue +++ b/src/pages/base/gzs/jc.vue @@ -50,7 +50,7 @@ async function submit() { sign_file: sign_file.value, }); uni.reLaunch({ - url: "/pages/base/xk/qk/jlb", + url: "/pages/base/jc/bm", }); } diff --git a/src/pages/base/home/xsXz.vue b/src/pages/base/home/xsXz.vue new file mode 100644 index 0000000..193b2b0 --- /dev/null +++ b/src/pages/base/home/xsXz.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/src/pages/base/jc/README.md b/src/pages/base/jc/README.md new file mode 100644 index 0000000..5662603 --- /dev/null +++ b/src/pages/base/jc/README.md @@ -0,0 +1,78 @@ +# JC模块 - 就餐标准管理 + +## 功能概述 + +JC模块是用于管理学生就餐标准的前端模块,包含以下主要功能: + +### 1. 就餐标准列表 (`/pages/base/jc/index.vue`) +- 显示当前学期可用的就餐标准 +- 支持学生选择器切换不同学生 +- 展示就餐标准的基本信息(名称、价格、描述) + +### 2. 就餐标准详情 (`/pages/base/jc/detail.vue`) +- 显示就餐标准的详细信息 +- 包含标准描述、使用说明、注意事项等 +- 支持图片展示 + +### 3. 就餐标准报名 (`/pages/base/jc/bm.vue`) +- 支持多选就餐标准 +- 实时计算总金额 +- 确认报名后跳转到支付页面 + +### 4. 支付流程 (`/pages/base/jc/pay/`) +- 支付页面 (`index.vue`):显示报名信息和支付倒计时 +- 支付等待页面 (`wait.vue`):处理支付回调 +- 支付成功页面 (`success.vue`):支付成功提示 +- 支付失败页面 (`fail.vue`):支付失败处理 + +### 5. 就餐记录 (`/pages/base/jc/record.vue`) +- 显示学生的就餐记录历史 +- 包含就餐日期、状态、地点等信息 + +## 组件结构 + +### 核心组件 +- `JcBzList` (`/pages/base/components/JcBzList/index.vue`):就餐标准列表组件 +- `JcRecordList` (`/pages/base/components/JcRecordList/index.vue`):就餐记录列表组件 + +### API接口 +所有JC相关的API接口都集中在 `jcApi.ts` 文件中,包括: +- 获取就餐标准列表 +- 获取就餐标准详情 +- 学生报名就餐标准 +- 取消报名 +- 发起支付 +- 查询支付状态 +- 获取就餐记录等 + +## 数据流 + +1. **报名流程**: + - 学生选择就餐标准 → 确认报名 → 跳转支付页面 → 完成支付 + +2. **数据存储**: + - 使用 Pinia store 管理状态 + - 本地存储保存选中状态 + - 支付数据通过 store 传递 + +## 技术特点 + +- 采用 Vue 3 Composition API +- 使用 TypeScript 进行类型检查 +- 响应式设计,支持移动端 +- 模块化组件设计 +- 统一的错误处理机制 + +## 注意事项 + +1. 支付倒计时功能需要后端提供倒计时接口 +2. 多选功能需要合理处理数据同步 +3. 支付状态查询需要定时轮询 +4. 图片资源需要正确的路径处理 + +## 扩展建议 + +1. 可以添加就餐标准筛选功能 +2. 支持按时间范围查询就餐记录 +3. 添加就餐统计功能 +4. 支持批量操作就餐标准 \ No newline at end of file diff --git a/src/pages/base/jc/bm-detail.vue b/src/pages/base/jc/bm-detail.vue new file mode 100644 index 0000000..3a8c7d0 --- /dev/null +++ b/src/pages/base/jc/bm-detail.vue @@ -0,0 +1,295 @@ + + + + + \ No newline at end of file diff --git a/src/pages/base/jc/bm.vue b/src/pages/base/jc/bm.vue index 6de015f..86abe52 100644 --- a/src/pages/base/jc/bm.vue +++ b/src/pages/base/jc/bm.vue @@ -10,18 +10,38 @@ - + + + + + + + - 已选择:{{ selectedCount }} 个就餐标准 - 总金额:¥{{ totalPrice }} + 缴费金额:¥{{ totalPrice }} 取消 - 确认报名 + 确认报名 @@ -29,46 +49,72 @@ diff --git a/src/pages/system/launchPage/launchPage.vue b/src/pages/system/launchPage/launchPage.vue index c5deb02..c892b40 100644 --- a/src/pages/system/launchPage/launchPage.vue +++ b/src/pages/system/launchPage/launchPage.vue @@ -19,25 +19,9 @@ import { checkOpenId } from "@/api/system/login"; import { refreshPermissionCache } from "@/utils/permission"; const { setGlobal } = useDataStore(); -const { afterLoginAction } = useUserStore(); +const userStore = useUserStore(); const isShow = ref(true); -function toHome(data: any) { - if (data.type == 1) { - uni.reLaunch({ - url: "/pages/base/gzs/xkXqk", - }); - } if (data.type == 2) { - uni.reLaunch({ - url: "/pages/base/gzs/xkJlb", - }); - } else { - uni.reLaunch({ - url: "/pages/base/home/index", - }); - } -} - onLoad(async (data: any) => { setGlobal(data); if (data && data.openId) { @@ -46,20 +30,18 @@ onLoad(async (data: any) => { if (res.resultCode == 1 && res.result) { // 执行登录操作 - afterLoginAction(res.result); + userStore.afterLoginAction(res.result); // 如果有changeTime参数,更新权限缓存 if (data.changeTime) { - const userStore = useUserStore(); const currentPermissions = userStore.getAuth; if (currentPermissions && currentPermissions.length > 0) { refreshPermissionCache(currentPermissions, data.changeTime); } } - // 直接跳转到首页,关注检查在首页进行 - toHome(data); + userStore.toHome(data.type); } else { uni.reLaunch({ url: "/pages/system/login/login", diff --git a/src/pages/system/login/login.vue b/src/pages/system/login/login.vue index 0b0a086..fdde29f 100644 --- a/src/pages/system/login/login.vue +++ b/src/pages/system/login/login.vue @@ -266,24 +266,8 @@ function removeStudent(index: number) { } } -function toHome() { - if (getGlobal.type == 1) { - uni.reLaunch({ - url: "/pages/base/gzs/xkXqk", - }); - } else if (getGlobal.type == 2) { - uni.reLaunch({ - url: "/pages/base/gzs/xkJlb", - }); - } else { - uni.reLaunch({ - url: "/pages/base/home/index", - }); - } -} - const { getGlobal, getAppCode } = useDataStore(); -const { afterLoginAction } = useUserStore(); +const userStore = useUserStore(); async function submit() { for (const student of students.value) { if (!student.xstx) { @@ -313,19 +297,16 @@ async function submit() { }); hideLoading(); if (res.resultCode == 1) { - afterLoginAction(res.result); - + userStore.afterLoginAction(res.result); // 如果有changeTime参数,更新权限缓存 if (res.result && res.result.changeTime) { - const userStore = useUserStore(); const currentPermissions = userStore.getAuth; if (currentPermissions && currentPermissions.length > 0) { refreshPermissionCache(currentPermissions, res.result.changeTime); } } - - toHome(); + userStore.toHome(getGlobal.type); } else { showToast({ title: res.message || "提交失败", icon: "none" }); } diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts index 34959b5..cc1954e 100644 --- a/src/store/modules/user.ts +++ b/src/store/modules/user.ts @@ -1,5 +1,6 @@ import { defineStore } from "pinia"; import { authenticationApi, loginCode, loginPass, weChatLogin, checkOpenId } from "@/api/system/login"; +import { checkXsXkByTypeApi, xsKxApi } from "@/api/base/xkApi"; import { AUTH_KEY } from "@/config"; import { imagUrl } from "@/utils"; import { useWebSocket } from '@/utils/webSocket/webSocket' @@ -194,6 +195,192 @@ export const useUserStore = defineStore({ } }) }, + /** + * 跳转逻辑 + * @param type 跳转类型 + */ + async toHome(type: number) { + if (type == 1) { + // 兴趣课逻辑: 判断当前学生列表 + if (this.userdata.xsList && this.userdata.xsList.length === 1) { + this.checkXqk(); + } else if (this.userdata.xsList && this.userdata.xsList.length > 1) { + uni.reLaunch({ + url: "/pages/base/home/xsXz", + }); + } + } else if (type == 2) { + // 俱乐部逻辑: 判断当前学生列表 + if (this.userdata.xsList && this.userdata.xsList.length == 1) { + this.checkJlb(); + } else if (this.userdata.xsList && this.userdata.xsList.length > 1) { + uni.reLaunch({ + url: "/pages/base/home/xsXz", + }); + } + } else { + uni.reLaunch({ + url: "/pages/base/home/index", + }); + } + }, + // 校验兴趣课 - 优化版本 + async checkXqk() { + try { + // 使用getXsKx接口获取详细选课信息 + const res = await xsKxApi({ + xsId: this.curXs.id, + njmcId: this.curXs.njmcId, + xklxId: "962488654" // 兴趣课类型ID + }); + + if (res.resultCode === 1) { + const data = res.result; + const type = data.type; + + switch (type) { + case 1: // 待支付 + uni.reLaunch({ + url: "/pages/base/xk/pay/index", + }); + return; + case 2: // 可选课列表 - 跳转到抢课页面 + uni.reLaunch({ + url: "/pages/base/xk/qk/xqk", + }); + return; + case 3: // 已支付 - 跳转到详情页 + uni.reLaunch({ + url: "/pages/base/xk/xqk", + }); + return; + default: + // 默认跳转到告知书页面 + uni.reLaunch({ + url: "/pages/base/gzs/xqk", + }); + return; + } + } + + // 接口调用失败,使用备用方案 + this.checkXqkFallback(); + } catch (error) { + console.error("查询兴趣课状态失败:", error); + // 异常情况,使用备用方案 + this.checkXqkFallback(); + } + }, + // 兴趣课备用检查方案 + async checkXqkFallback() { + try { + const res = await checkXsXkByTypeApi({ + xsId: this.curXs.id, + xklxId: "962488654" // 兴趣课类型ID + }); + if (res.resultCode === 1) { + const checkResult = res.result; + if (checkResult === 1) { + uni.reLaunch({ + url: "/pages/base/xk/pay/index", + }); + return; + } else if (checkResult === 2) { + uni.reLaunch({ + url: "/pages/base/xk/xqk", + }); + return; + } + } + uni.reLaunch({ + url: "/pages/base/gzs/xqk", + }); + } catch (error) { + console.error("备用方案也失败:", error); + uni.reLaunch({ + url: "/pages/base/gzs/xqk", + }); + } + }, + // 校验俱乐部 - 优化版本 + async checkJlb() { + try { + // 使用getXsKx接口获取详细选课信息 + const res = await xsKxApi({ + xsId: this.curXs.id, + njmcId: this.curXs.njmcId, + xklxId: "816059832" // 俱乐部类型ID + }); + + if (res.resultCode === 1) { + const data = res.result; + const type = data.type; + + switch (type) { + case 1: // 待支付 + uni.reLaunch({ + url: "/pages/base/xk/pay/index", + }); + return; + case 2: // 可选课列表 - 跳转到抢课页面 + uni.reLaunch({ + url: "/pages/base/xk/qk/jlb", + }); + return; + case 3: // 已支付 - 跳转到详情页 + uni.reLaunch({ + url: "/pages/base/xk/jlb", + }); + return; + default: + // 默认跳转到告知书页面 + uni.reLaunch({ + url: "/pages/base/gzs/jlb", + }); + return; + } + } + + // 接口调用失败,使用备用方案 + this.checkJlbFallback(); + } catch (error) { + console.error("查询俱乐部状态失败:", error); + // 异常情况,使用备用方案 + this.checkJlbFallback(); + } + }, + // 俱乐部备用检查方案 + async checkJlbFallback() { + try { + const res = await checkXsXkByTypeApi({ + xsId: this.curXs.id, + xklxId: "816059832" // 俱乐部类型ID + }); + + if (res.resultCode === 1) { + const checkResult = res.result; + if (checkResult === 1) { + uni.reLaunch({ + url: "/pages/base/xk/pay/index", + }); + return; + } else if (checkResult === 2) { + uni.reLaunch({ + url: "/pages/base/xk/jlb", + }); + return; + } + } + uni.reLaunch({ + url: "/pages/base/gzs/jlb", + }); + } catch (error) { + console.error("备用方案也失败:", error); + uni.reLaunch({ + url: "/pages/base/gzs/jlb", + }); + } + }, /** * @description: 注销 */ diff --git a/src/utils/xkUtils.ts b/src/utils/xkUtils.ts new file mode 100644 index 0000000..9980d57 --- /dev/null +++ b/src/utils/xkUtils.ts @@ -0,0 +1,95 @@ +import { getXsXkStatusApi } from "@/api/base/xkApi"; +import { useUserStore } from "@/store/modules/user"; + +/** + * 抢课工具类 + */ +export class XkUtils { + /** + * 检查学生选课状态 + * @param xklxId 选课类型ID + * @returns 选课状态信息 + */ + static async checkXkStatus(xklxId: string) { + const userStore = useUserStore(); + const curXs = userStore.getCurXs; + + try { + const res = await getXsXkStatusApi({ + xsId: curXs.id, + njmcId: curXs.njmcId, + xklxId: xklxId + }); + + if (res.resultCode === 1) { + return res.result; + } + return null; + } catch (error) { + console.error("检查选课状态失败:", error); + return null; + } + } + + /** + * 获取选课状态描述 + * @param type 状态类型 + * @returns 状态描述 + */ + static getStatusDescription(type: number): string { + switch (type) { + case 1: + return "有待支付的选课,请先完成支付"; + case 2: + return "可以选择的课程"; + case 3: + return "已选择并完成支付的选课"; + default: + return "暂无可选课程"; + } + } + + /** + * 检查是否可以抢课 + * @param xkList 选课列表 + * @returns 是否可以抢课 + */ + static canQk(xkList: any[]): boolean { + if (!xkList || xkList.length === 0) { + return false; + } + + // 检查是否有可选的课程 + return xkList.some((xk: any) => { + return !xk.selected && xk.xkkcs && xk.xkkcs.length > 0; + }); + } + + /** + * 获取可抢课的选课列表 + * @param xkList 选课列表 + * @returns 可抢课的选课列表 + */ + static getAvailableXkList(xkList: any[]): any[] { + if (!xkList || xkList.length === 0) { + return []; + } + + return xkList.filter((xk: any) => { + return !xk.selected && xk.xkkcs && xk.xkkcs.length > 0; + }); + } + + /** + * 获取已选课的选课信息 + * @param xkList 选课列表 + * @returns 已选课的选课信息 + */ + static getSelectedXk(xkList: any[]): any | null { + if (!xkList || xkList.length === 0) { + return null; + } + + return xkList.find((xk: any) => xk.selected) || null; + } +} \ No newline at end of file