mp_xyqj_inp.html 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  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. <script src="/js/mp_base/base.js"></script>
  8. <style>
  9. [v-cloak] {
  10. display: none !important;
  11. }
  12. #app {
  13. background: #f5f5f5;
  14. min-height: 100vh;
  15. /* padding: 8px; */
  16. box-sizing: border-box;
  17. }
  18. .table th {
  19. width: 140px;
  20. max-width: 170px;
  21. }
  22. .table td {
  23. position: relative;
  24. }
  25. .reason-input {
  26. width: 100%;
  27. }
  28. </style>
  29. </head>
  30. <body>
  31. <div id="app" v-cloak>
  32. <!-- 新增请假发起页面 by xu 2026-02-28 -->
  33. <div class="form-wrap">
  34. <table class="table">
  35. <tr>
  36. <th>请假类别</th>
  37. <td>
  38. <!-- 功能说明:下拉选项改为组件内部按 cb/url 拉取(对齐PC ss-objp),页面不再手写加载方法 by xu 2026-02-28 -->
  39. <ss-select
  40. v-model="formData.rclbm"
  41. cb="xyqjlb"
  42. :auto-select-first="true"
  43. placeholder="请选择"
  44. >
  45. </ss-select>
  46. </td>
  47. </tr>
  48. <tr>
  49. <th>学员</th>
  50. <td>
  51. <ss-select
  52. v-model="formData.fzryid"
  53. cb="xyByJzBySess"
  54. :auto-select-first="true"
  55. placeholder="请选择"
  56. >
  57. </ss-select>
  58. </td>
  59. </tr>
  60. <tr>
  61. <th>请假开始时间</th>
  62. <td>
  63. <ss-datetime-picker
  64. v-model="formData.kssj"
  65. mode="datetime"
  66. placeholder="YYYY-MM-DD HH:mm"
  67. @change="onStartTimeChange"
  68. >
  69. </ss-datetime-picker>
  70. </td>
  71. </tr>
  72. <tr>
  73. <th>请假结束时间</th>
  74. <td>
  75. <ss-datetime-picker
  76. v-model="formData.jssj"
  77. mode="datetime"
  78. :min-date="endMinDate"
  79. placeholder="YYYY-MM-DD HH:mm"
  80. >
  81. </ss-datetime-picker>
  82. </td>
  83. </tr>
  84. <tr>
  85. <th>事由</th>
  86. <td>
  87. <ss-input
  88. v-model="formData.ms"
  89. name="ms"
  90. class="reason-input"
  91. placeholder="请录入"
  92. />
  93. </td>
  94. </tr>
  95. </table>
  96. </div>
  97. </div>
  98. <script>
  99. window.SS.ready(function () {
  100. window.SS.dom.initializeFormApp({
  101. el: '#app',
  102. data() {
  103. return {
  104. // 初始化请假发起数据 by xu 2026-02-28
  105. pageParams: {},
  106. formData: {
  107. mc: '学员请假',
  108. fzryid: '',
  109. rclbm: '',
  110. kssj: '',
  111. jssj: '',
  112. ms: ''
  113. },
  114. endMinDate: ''
  115. }
  116. },
  117. async mounted() {
  118. this.pageParams = this.getUrlParams()
  119. this.initDefaultTimeRange()
  120. // 功能说明:向 mp_objInp 暴露统一取值方法,尽量减少表单页改动 by xu 2026-02-28
  121. window.__mpObjInpGetFormData = () => {
  122. const message = this.validateForm()
  123. return {
  124. valid: !message,
  125. message: message || '',
  126. data: {
  127. mc: this.formData.mc,
  128. fzryid: this.formData.fzryid,
  129. rclbm: this.formData.rclbm,
  130. kssj: this.formData.kssj,
  131. jssj: this.formData.jssj,
  132. ms: (this.formData.ms || '').trim()
  133. }
  134. }
  135. }
  136. },
  137. beforeUnmount() {
  138. // 功能说明:页面卸载时清理桥接方法,避免污染其他表单页 by xu 2026-02-28
  139. try {
  140. if (window.__mpObjInpGetFormData) {
  141. delete window.__mpObjInpGetFormData
  142. }
  143. } catch (_) {}
  144. },
  145. methods: {
  146. getUrlParams() {
  147. const params = {}
  148. const urlSearchParams = new URLSearchParams(window.location.search)
  149. for (const [key, value] of urlSearchParams) {
  150. params[key] = decodeURIComponent(value)
  151. }
  152. return params
  153. },
  154. initDefaultTimeRange() {
  155. // 设置默认开始/结束时间 by xu 2026-02-28
  156. const now = new Date()
  157. const start = new Date(now.getTime() + 30 * 60 * 1000)
  158. const end = new Date(start.getTime() + 2 * 60 * 60 * 1000)
  159. this.formData.kssj = this.formatToDateTime(start)
  160. this.formData.jssj = this.formatToDateTime(end)
  161. this.endMinDate = this.formData.kssj
  162. },
  163. formatToDateTime(date) {
  164. const year = date.getFullYear()
  165. const month = String(date.getMonth() + 1).padStart(2, '0')
  166. const day = String(date.getDate()).padStart(2, '0')
  167. const hour = String(date.getHours()).padStart(2, '0')
  168. const minute = String(date.getMinutes()).padStart(2, '0')
  169. return `${year}-${month}-${day} ${hour}:${minute}`
  170. },
  171. onStartTimeChange(val) {
  172. this.endMinDate = val || ''
  173. if (this.formData.jssj && val && new Date(this.formData.jssj).getTime() < new Date(val).getTime()) {
  174. this.formData.jssj = val
  175. }
  176. },
  177. validateForm() {
  178. if (!this.formData.rclbm) return '请选择请假类别'
  179. if (!this.formData.fzryid) return '请选择学员'
  180. if (!this.formData.kssj) return '请选择请假开始时间'
  181. if (!this.formData.jssj) return '请选择请假结束时间'
  182. // 功能说明:请假“事由/描述”改为前端非必填,仅保留其他必填项校验 by xu 2026-02-28
  183. const start = new Date(this.formData.kssj).getTime()
  184. const end = new Date(this.formData.jssj).getTime()
  185. if (!Number.isNaN(start) && !Number.isNaN(end) && end < start) {
  186. return '结束时间不能早于开始时间'
  187. }
  188. return ''
  189. }
  190. }
  191. })
  192. })
  193. </script>
  194. </body>
  195. </html>