bjdm_bzrDm.html 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
  6. <title>班主任点名</title>
  7. <!-- 引入基础依赖 -->
  8. <script src="/js/mp_base/base.js"></script>
  9. <style>
  10. /* 防止Vue模板闪烁 */
  11. [v-cloak] {
  12. display: none !important;
  13. }
  14. #app {
  15. background: #f5f5f5;
  16. min-height: 100vh;
  17. display: flex;
  18. flex-direction: column;
  19. }
  20. /* 固定头部区域 */
  21. .fixed-header {
  22. background: #f5f5f5;
  23. padding: 10px 0;
  24. position: sticky;
  25. top: 0;
  26. z-index: 100;
  27. }
  28. .filter-area.simple-mode {
  29. /* padding: 10px 16px; */
  30. /* background: #f8f9fa; */
  31. /* border-radius: 6px; */
  32. transition: all 0.3s ease;
  33. }
  34. .simple-display {
  35. display: flex;
  36. align-items: center;
  37. justify-content: center;
  38. height: 40px;
  39. }
  40. .simple-text {
  41. font-size: 16px;
  42. color: #333;
  43. }
  44. /* 统计区域 */
  45. .stats-area {
  46. display: flex;
  47. justify-content: flex-start;
  48. padding: 10px 16px;
  49. background: #ffffff;
  50. border-radius: 6px;
  51. gap: 8px;
  52. }
  53. .stat-item {
  54. text-align: center;
  55. font-size: 14px;
  56. }
  57. .stat-absent { color: #ff0000; }
  58. .stat-sick { color: #ee9700; }
  59. .stat-parent { color: #00a0e9; }
  60. /* 学生列表区域 */
  61. .student-list-area {
  62. flex: 1;
  63. /* padding: 8px; */
  64. padding-bottom: 80px; /* 给底部按钮留出空间 */
  65. overflow-y: auto;
  66. width: calc(100% - 16px);
  67. margin: 8px auto;
  68. }
  69. /* 学生表格 */
  70. .student-table {
  71. background: white;
  72. overflow: hidden;
  73. border: 1px solid #d2d2d2;
  74. }
  75. .table-header {
  76. display: flex;
  77. background: #f8f9fa;
  78. font-weight: 400;
  79. border-bottom: 1px solid #d2d2d2;
  80. }
  81. .table-row {
  82. display: flex;
  83. border-bottom: 1px solid #d2d2d2;
  84. cursor: pointer;
  85. transition: background-color 0.2s;
  86. }
  87. .table-row:last-child {
  88. border-bottom: none;
  89. }
  90. .table-row.absent {
  91. background: #ff0000;
  92. color: white !important;
  93. }
  94. .table-row.absent .col-number,
  95. .table-row.absent .col-name,
  96. .table-row.absent .col-status {
  97. color: white !important;
  98. }
  99. .table-row.sick {
  100. background: #ffa502;
  101. color: white !important;
  102. }
  103. .table-row.sick .col-number,
  104. .table-row.sick .col-name,
  105. .table-row.sick .col-status {
  106. color: white !important;
  107. }
  108. .table-row.leave {
  109. background: #ee9700;
  110. color: white !important;
  111. }
  112. .table-row.leave .col-number,
  113. .table-row.leave .col-name,
  114. .table-row.leave .col-status {
  115. color: white !important;
  116. }
  117. .table-row.parent {
  118. background: #00a0e9;
  119. color: white !important;
  120. }
  121. .table-row.parent .col-number,
  122. .table-row.parent .col-name,
  123. .table-row.parent .col-status {
  124. color: white !important;
  125. }
  126. .col-number {
  127. width: 60px;
  128. padding: 12px 8px;
  129. text-align: center;
  130. font-size: 16px;
  131. color: #333;
  132. }
  133. .col-name {
  134. flex: 1;
  135. padding: 12px;
  136. font-size: 16px;
  137. color: #333;
  138. }
  139. .col-status {
  140. width: 80px;
  141. padding: 12px 8px;
  142. text-align: center;
  143. font-size: 16px;
  144. font-weight: 400;
  145. color: #333;
  146. }
  147. /* 加载状态 */
  148. .loading {
  149. text-align: center;
  150. padding: 40px;
  151. color: #666;
  152. }
  153. /* 周几显示 */
  154. .weekday-text {
  155. margin-left: 10px;
  156. font-size: 12px;
  157. color: #666;
  158. position:absolute;
  159. right: 16px;
  160. }
  161. </style>
  162. </head>
  163. <body>
  164. <div id="app" v-cloak>
  165. <!-- 固定头部区域 -->
  166. <div class="fixed-header">
  167. <!-- 筛选条件区域 -->
  168. <div class="filter-area" :class="{ 'simple-mode': isSimpleMode }">
  169. <!-- 简化模式:显示回显文本 -->
  170. <div v-if="isSimpleMode" class="simple-display">
  171. <span class="simple-text">{{ displayText }}</span>
  172. </div>
  173. <!-- 完整模式:显示表单 -->
  174. <div v-if="!isSimpleMode" class="full-form">
  175. <table class="form-table">
  176. <tr>
  177. <th>班级</th>
  178. <td>
  179. <ss-select
  180. v-model="formData.bjid"
  181. :options="bjOptions"
  182. :mapping="{ text: 'label', value: 'value' }"
  183. placeholder="请选择班级"
  184. @change="loadStudentList"
  185. >
  186. </ss-select>
  187. </td>
  188. </tr>
  189. <tr>
  190. <th>日期</th>
  191. <td>
  192. <ss-datetime-picker
  193. v-model="formData.rq"
  194. mode="date"
  195. :max-date="new Date().toISOString().slice(0,10)"
  196. placeholder="请选择日期"
  197. @change="onDateChange"
  198. :disabled="true"
  199. >
  200. </ss-datetime-picker>
  201. <span v-if="weekdayText" class="weekday-text">{{ weekdayText }}</span>
  202. </td>
  203. </tr>
  204. <tr>
  205. <th>节次</th>
  206. <td>
  207. <ss-onoff-button v-model="formData.jc" name="jc" label="上午" value="1" :disabled="true"></ss-onoff-button>
  208. <ss-onoff-button v-model="formData.jc" name="jc" label="下午" value="2" :disabled="true"></ss-onoff-button>
  209. <ss-onoff-button v-model="formData.jc" name="jc" label="晚上" value="3" :disabled="true"></ss-onoff-button>
  210. </td>
  211. </tr>
  212. </table>
  213. </div>
  214. </div>
  215. </div>
  216. <!-- 考勤统计 -->
  217. <div class="stats-area">
  218. <div class="stat-item">
  219. <span class="stat-absent">缺勤:</span>{{ stats.absent }}人
  220. </div>
  221. <div class="stat-item">
  222. <span class="stat-sick">请假:</span>{{ stats.sick + stats.leave }}人
  223. </div>
  224. <div class="stat-item">
  225. <span class="stat-parent">家长请假:</span>{{ stats.parentLeave }}人
  226. </div>
  227. </div>
  228. <!-- 学生列表区域 -->
  229. <div class="student-list-area">
  230. <div v-if="loading" class="loading">
  231. 加载中...
  232. </div>
  233. <div v-else-if="studentList.length === 0" class="loading">
  234. 暂无学生数据
  235. </div>
  236. <div v-else class="student-table">
  237. <!-- 表头 -->
  238. <div class="table-header">
  239. <span class="col-number">序号</span>
  240. <span class="col-name">姓名</span>
  241. <span class="col-status">状态</span>
  242. </div>
  243. <!-- 学生行 -->
  244. <div
  245. v-for="(student, index) in studentList"
  246. :key="student.id"
  247. class="table-row"
  248. :class="getRowClass(student.kqlbm, student.rcid)"
  249. @click="handleStudentClick(student)"
  250. >
  251. <span class="col-number">{{ String(index + 1).padStart(2, '0') }}</span>
  252. <span class="col-name">{{ student.xm }}</span>
  253. <span class="col-status">{{ getStatusText(student.kqlbm, student.rcid) }}</span>
  254. </div>
  255. </div>
  256. </div>
  257. <!-- 使用SsBottom组件 -->
  258. <ss-bottom
  259. :show-shyj="false"
  260. :buttons="bottomButtons"
  261. @button-click="handleBottomAction"
  262. ></ss-bottom>
  263. <!-- 确认弹窗组件 -->
  264. <ss-confirm v-model="showConfirm" title="确认提交" @confirm="submitAttendance">
  265. <div style="text-align: center; padding: 20px;">
  266. <div style="display: flex; flex-direction: column; gap: 10px;">
  267. <div>出勤:<span >{{ stats.present }}人</span></div>
  268. <div>缺勤:<span >{{ stats.absent }}人</span></div>
  269. <div>病假:<span >{{ stats.sick }}人</span></div>
  270. <div>事假:<span >{{ stats.leave }}人</span></div>
  271. <div>家长请假:<span >{{ stats.parentLeave }}人</span></div>
  272. </div>
  273. </div>
  274. </ss-confirm>
  275. </div>
  276. <script>
  277. // 等待SS框架加载完成
  278. window.SS.ready(function () {
  279. // 使用SS框架的方式创建Vue实例
  280. window.SS.dom.initializeFormApp({
  281. el: '#app',
  282. data() {
  283. return {
  284. // 页面参数
  285. pageParams: {},
  286. // 加载状态
  287. loading: true,
  288. // 表单数据
  289. formData: {
  290. bjid: '', // 班级ID
  291. rq: '', // 日期
  292. jc: '1' // 节次:1-上午,2-下午,3-晚上
  293. },
  294. // 显示模式
  295. isSimpleMode: false,
  296. displayText: '',
  297. weekdayText: '',
  298. // 滚动相关
  299. pageScrollTop: 0,
  300. initialFilterHeight: 0,
  301. // 统计数据
  302. stats: {
  303. absent: 0, // 缺勤
  304. leave: 0, // 请假
  305. parent: 0 // 家长请假
  306. },
  307. // 学生列表
  308. studentList: [],
  309. // 班级选项
  310. bjOptions: [],
  311. // 确认弹窗相关
  312. showConfirm: false,
  313. confirmStatsHtml: '',
  314. // 底部按钮
  315. bottomButtons: [
  316. { text: '取消', action: 'cancel' },
  317. { text: '保存点名', action: 'save' }
  318. ]
  319. }
  320. },
  321. async mounted() {
  322. try {
  323. // 获取页面参数
  324. this.pageParams = NavigationManager.getUrlParam();
  325. console.log('📋 页面参数:', this.pageParams);
  326. // 设置页面标题
  327. if (this.pageParams.title) {
  328. document.title = this.pageParams.title;
  329. }
  330. // 初始化页面
  331. await this.initPage();
  332. } catch (error) {
  333. console.error('❌ 页面初始化失败:', error);
  334. }
  335. },
  336. methods: {
  337. // 初始化页面
  338. async initPage() {
  339. try {
  340. // 设置默认日期为今天
  341. this.formData.rq = new Date().toISOString().slice(0, 10);
  342. this.updateWeekdayText();
  343. // 根据当前时间设置默认节次
  344. this.setDefaultPeriod();
  345. // 初始化回显文本
  346. this.updateDisplayText();
  347. // 初始化筛选区域高度
  348. this.$nextTick(() => {
  349. const filterArea = document.querySelector('.filter-area');
  350. if (filterArea) {
  351. this.initialFilterHeight = filterArea.offsetHeight;
  352. console.log('初始筛选区域高度:', this.initialFilterHeight);
  353. }
  354. });
  355. // 添加滚动监听
  356. window.addEventListener('scroll', this.handlePageScroll);
  357. // 加载班级选项
  358. await this.loadBjOptions();
  359. // 如果有默认班级,加载学生数据
  360. if (this.formData.bjid) {
  361. await this.loadStudentList();
  362. }
  363. } catch (error) {
  364. console.error('❌ 页面初始化失败:', error);
  365. throw error;
  366. } finally {
  367. this.loading = false;
  368. }
  369. },
  370. // 获取开始时间
  371. getKssj() {
  372. const jc = this.formData.jc;
  373. const rq = this.formData.rq;
  374. let time = '';
  375. if (jc === '1') {
  376. time = '08:00:00'; // 上午
  377. } else if (jc === '2') {
  378. time = '14:00:00'; // 下午
  379. } else if (jc === '3') {
  380. time = '19:00:00'; // 晚上
  381. }
  382. return `${rq} ${time}`;
  383. },
  384. // 获取结束时间
  385. getJssj() {
  386. const jc = this.formData.jc;
  387. const rq = this.formData.rq;
  388. let time = '';
  389. if (jc === '1') {
  390. time = '12:00:00'; // 上午
  391. } else if (jc === '2') {
  392. time = '18:00:00'; // 下午
  393. } else if (jc === '3') {
  394. time = '22:00:00'; // 晚上
  395. }
  396. return `${rq} ${time}`;
  397. },
  398. // 页面销毁时移除滚动监听
  399. beforeUnmount() {
  400. window.removeEventListener('scroll', this.handlePageScroll);
  401. },
  402. // 组件初始化逻辑已改为模板中直接使用 Vue 组件,无需此方法
  403. initFormComponents() {},
  404. // 日期变化处理
  405. onDateChange(value) {
  406. this.formData.rq = value;
  407. this.updateWeekdayText();
  408. this.updateDisplayText();
  409. this.loadStudentList();
  410. },
  411. // 更新星期几显示
  412. updateWeekdayText() {
  413. if (!this.formData.rq) {
  414. this.weekdayText = '';
  415. return;
  416. }
  417. try {
  418. const date = new Date(this.formData.rq);
  419. const weekdays = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
  420. this.weekdayText = weekdays[date.getDay()];
  421. // 更新回显文本
  422. this.updateDisplayText();
  423. } catch (error) {
  424. this.weekdayText = '';
  425. }
  426. },
  427. // 根据当前时间设置默认节次
  428. setDefaultPeriod() {
  429. const currentTime = new Date();
  430. const currentHour = currentTime.getHours();
  431. let currentPeriod = '';
  432. let jcValue = '1';
  433. if (currentHour >= 0 && currentHour < 12) {
  434. // 0-12点:上午
  435. currentPeriod = '上午';
  436. jcValue = '1';
  437. } else if (currentHour >= 12 && currentHour < 18) {
  438. // 12-18点:下午
  439. currentPeriod = '下午';
  440. jcValue = '2';
  441. } else {
  442. // 18-24点:晚上
  443. currentPeriod = '晚上';
  444. jcValue = '3';
  445. }
  446. this.formData.jc = jcValue;
  447. console.log(`🕐 当前时间 ${currentHour}:xx,自动设置为${currentPeriod}(${jcValue})`);
  448. },
  449. // 计算回显文本
  450. updateDisplayText() {
  451. const jcText = this.formData.jc === '1' ? '上午' : this.formData.jc === '2' ? '下午' : '晚上';
  452. this.displayText = `${this.formData.rq} ${this.weekdayText} ${jcText}`;
  453. },
  454. // 处理页面滚动事件
  455. handlePageScroll() {
  456. const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
  457. const previousScrollTop = this.pageScrollTop;
  458. this.pageScrollTop = scrollTop;
  459. console.log('页面滚动位置:', scrollTop, '初始高度:', this.initialFilterHeight);
  460. // 检测滚动方向和位置
  461. const isScrollingDown = scrollTop > previousScrollTop;
  462. const isScrollingUp = scrollTop < previousScrollTop;
  463. // 三行变一行:向下滚动超过筛选区域高度的30px时触发
  464. if (isScrollingDown &&
  465. scrollTop > (this.initialFilterHeight + 30) &&
  466. !this.isSimpleMode) {
  467. console.log('向下滚动超过阈值,切换到简化模式');
  468. this.isSimpleMode = true;
  469. }
  470. // 一行变三行:向上滚动回到接近顶部时触发
  471. if (isScrollingUp &&
  472. scrollTop <= 10 &&
  473. this.isSimpleMode) {
  474. console.log('向上滚动回到顶部,切换到完整模式');
  475. this.isSimpleMode = false;
  476. }
  477. },
  478. // 加载班级选项
  479. async loadBjOptions() {
  480. try {
  481. // 使用已封装的 getDictOptions 获取班级数据
  482. const bjOptions = await window.getDictOptions('bj');
  483. if (bjOptions && bjOptions.length > 0) {
  484. this.bjOptions = bjOptions.map(item => ({
  485. value: item.v,
  486. label: item.n
  487. }));
  488. console.log('📚 班级选项加载成功:', this.bjOptions);
  489. // 设置默认选中第一个班级
  490. if (this.bjOptions.length > 0) {
  491. this.formData.bjid = this.bjOptions[0].value;
  492. }
  493. } else {
  494. console.warn('⚠️ 没有获取到班级数据');
  495. }
  496. } catch (error) {
  497. console.error('❌ 加载班级选项失败:', error);
  498. }
  499. },
  500. // 加载学生列表
  501. async loadStudentList() {
  502. if (!this.formData.bjid) {
  503. console.warn('⚠️ 班级ID为空,无法加载学生列表');
  504. return;
  505. }
  506. try {
  507. this.loading = true;
  508. console.log('👥 加载学生列表...', { bjid: this.formData.bjid });
  509. // 调用真实的 bjdm_initBzrDm 接口
  510. const response = await window.request.post(
  511. `/service?ssServ=bjdm_initBzrdm`,
  512. { bjid: this.formData.bjid },
  513. {
  514. loading: true,
  515. formData: true
  516. }
  517. );
  518. console.log('👥 学生数据返回:', response);
  519. if (response.data && response.data.bjList && response.data.bjList.length > 0) {
  520. // 取第一个班级的学生列表
  521. this.studentList = response.data.bjList[0];
  522. this.updateStats();
  523. } else {
  524. console.log('⚠️ 没有获取到学生数据:', response.data?.msg);
  525. this.studentList = [];
  526. }
  527. } catch (error) {
  528. console.log('❌ 加载学生列表失败:', error);
  529. // this.updateStats();
  530. } finally {
  531. this.loading = false;
  532. }
  533. },
  534. // 更新统计数据
  535. updateStats() {
  536. const stats = {
  537. present: 0, // 出勤
  538. absent: 0, // 缺勤
  539. sick: 0, // 病假
  540. leave: 0, // 事假
  541. parentLeave: 0 // 家长请假
  542. };
  543. this.studentList.forEach(student => {
  544. if (student.rcid > 0) {
  545. stats.parentLeave++ // 家长请假(优先判断)
  546. } else if (student.kqlbm === 81) {
  547. stats.present++ // 出勤
  548. } else if (student.kqlbm === 1) {
  549. stats.absent++ // 缺勤
  550. } else if (student.kqlbm === 31) {
  551. stats.leave++ // 事假
  552. } else if (student.kqlbm === 41) {
  553. stats.sick++ // 病假
  554. } else {
  555. stats.present++ // 其他情况默认为出勤(学生一开始都是出勤状态)
  556. }
  557. });
  558. this.stats = stats;
  559. },
  560. // 获取行样式类
  561. getRowClass(kqlbm, rcid) {
  562. if (rcid > 0) return 'parent'; // 家长请假(优先判断)
  563. if (kqlbm === 81) return ''; // 出勤(默认样式)
  564. if (kqlbm === 1) return 'absent'; // 缺勤
  565. if (kqlbm === 41) return 'sick'; // 病假
  566. if (kqlbm === 31) return 'leave'; // 事假
  567. return '';
  568. },
  569. // 获取状态文本
  570. getStatusText(kqlbm, rcid) {
  571. if (rcid > 0) return '家长请假'; // 家长请假(优先判断)
  572. if (kqlbm === 81) return '出勤';
  573. if (kqlbm === 1) return '缺勤';
  574. if (kqlbm === 41) return '病假';
  575. if (kqlbm === 31) return '事假';
  576. return '出勤'; // 默认为出勤,不存在未知状态
  577. },
  578. // 学生点击事件
  579. handleStudentClick(student) {
  580. console.log('👤 学生点击:', student);
  581. // 家长请假不可点击
  582. if (student.rcid > 0) {
  583. console.log('家长请假状态,不可点击');
  584. return;
  585. }
  586. // 切换学生状态
  587. this.toggleStudentStatus(student);
  588. },
  589. // 切换学生状态
  590. toggleStudentStatus(student) {
  591. /**
  592. * 状态切换逻辑:出勤(81) → 缺勤(1) → 病假(41) → 事假(31) → 出勤(81)
  593. * 只在这四个状态间轮流切换,不存在其他状态
  594. */
  595. let newStatus;
  596. switch (student.kqlbm) {
  597. case 81: // 出勤 → 缺勤
  598. newStatus = 1;
  599. break;
  600. case 1: // 缺勤 → 病假
  601. newStatus = 41;
  602. break;
  603. case 41: // 病假 → 事假
  604. newStatus = 31;
  605. break;
  606. case 31: // 事假 → 出勤
  607. newStatus = 81;
  608. break;
  609. default: // 任何其他状态都重置为出勤
  610. newStatus = 81;
  611. }
  612. student.kqlbm = newStatus;
  613. student.rcid = null; // 清除家长请假标记
  614. console.log(`学生 ${student.xm} 状态切换为:`, newStatus);
  615. this.updateStats();
  616. },
  617. // 保存点名数据
  618. async handleSave() {
  619. try {
  620. // 显示确认弹窗
  621. this.showConfirmDialog();
  622. } catch (error) {
  623. console.error('❌ 保存失败:', error);
  624. }
  625. },
  626. // 显示确认弹窗
  627. showConfirmDialog() {
  628. this.showConfirm = true;
  629. },
  630. // 提交考勤数据
  631. async submitAttendance() {
  632. try {
  633. // 构建提交参数,参考小程序版本
  634. const params = {
  635. bjid: this.formData.bjid,
  636. kkrs: this.stats.absent, // 缺勤人数
  637. qjrs: this.stats.sick + this.stats.leave, // 请假人数(病假+事假)
  638. jkssj: this.getKssj(), // 开始时间
  639. jjssj: this.getJssj(), // 结束时间
  640. ryList: JSON.stringify(this.studentList
  641. .filter(student => student.kqlbm !== 81) // 只提交非出勤的学生
  642. .map(student => ({
  643. ryid: student.ryid,
  644. kqlbm: student.kqlbm
  645. })))
  646. };
  647. // 调用真实的 bjdm_saveBzrDm 接口,使用表单格式提交
  648. const response = await window.request.post(`/service?ssServ=bjdm_saveBzrdm`, params, {
  649. loading: true,
  650. formData: true // 使用表单格式提交
  651. });
  652. if (response.data && response.data.ssCode === 0) {
  653. NavigationManager.goBack({ refreshParent: true });
  654. }
  655. } catch (error) {
  656. console.error('❌ 提交失败:', error);
  657. }
  658. },
  659. // 获取开始时间
  660. getKssj() {
  661. const jc = this.formData.jc;
  662. const rq = this.formData.rq;
  663. let time = '';
  664. if (jc === '1') {
  665. time = '08:00:00'; // 上午
  666. } else if (jc === '2') {
  667. time = '14:00:00'; // 下午
  668. } else if (jc === '3') {
  669. time = '19:00:00'; // 晚上
  670. }
  671. return `${rq} ${time}`;
  672. },
  673. // 获取结束时间
  674. getJssj() {
  675. const jc = this.formData.jc;
  676. const rq = this.formData.rq;
  677. let time = '';
  678. if (jc === '1') {
  679. time = '12:00:00'; // 上午
  680. } else if (jc === '2') {
  681. time = '18:00:00'; // 下午
  682. } else if (jc === '3') {
  683. time = '22:00:00'; // 晚上
  684. }
  685. return `${rq} ${time}`;
  686. },
  687. // 处理底部按钮点击
  688. handleBottomAction(data) {
  689. console.log('底部按钮操作:', data);
  690. switch(data.action) {
  691. case 'cancel':
  692. this.handleCancel();
  693. break;
  694. case 'save':
  695. this.handleSave();
  696. break;
  697. default:
  698. console.warn('未知的按钮操作:', data.action);
  699. }
  700. },
  701. // 取消返回
  702. handleCancel() {
  703. NavigationManager.goBack({ refreshParent: false });
  704. },
  705. }
  706. })
  707. })
  708. </script>
  709. </body>
  710. </html>