mp_kqjl_inp.html 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  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. box-sizing: border-box;
  16. }
  17. .table th {
  18. width: 140px;
  19. max-width: 170px;
  20. }
  21. .table td {
  22. position: relative;
  23. }
  24. .reason-input {
  25. width: 100%;
  26. }
  27. </style>
  28. </head>
  29. <body>
  30. <div id="app" v-cloak>
  31. <!-- 新增考勤记录发起页面 by xu 2026-03-06 -->
  32. <div class="form-wrap">
  33. <table class="table">
  34. <tr>
  35. <th>名称</th>
  36. <td>
  37. <ss-input
  38. v-model="formData.mc"
  39. name="mc"
  40. class="reason-input"
  41. placeholder="请录入"
  42. />
  43. </td>
  44. </tr>
  45. <tr>
  46. <th>人员</th>
  47. <td>
  48. <ss-select
  49. v-model="formData.ryid"
  50. cb="ry"
  51. :auto-select-first="true"
  52. placeholder="请选择"
  53. >
  54. </ss-select>
  55. </td>
  56. </tr>
  57. <tr>
  58. <th>开始时间</th>
  59. <td>
  60. <ss-datetime-picker
  61. v-model="formData.kssj"
  62. mode="datetime"
  63. placeholder="YYYY-MM-DD HH:mm"
  64. @change="onStartTimeChange"
  65. >
  66. </ss-datetime-picker>
  67. </td>
  68. </tr>
  69. <tr>
  70. <th>结束时间</th>
  71. <td>
  72. <ss-datetime-picker
  73. v-model="formData.jssj"
  74. mode="datetime"
  75. :min-date="endMinDate"
  76. placeholder="YYYY-MM-DD HH:mm"
  77. >
  78. </ss-datetime-picker>
  79. </td>
  80. </tr>
  81. <tr>
  82. <th>考勤类别</th>
  83. <td>
  84. <ss-select
  85. v-model="formData.kqlbm"
  86. cb="kqlb"
  87. :auto-select-first="true"
  88. placeholder="请选择"
  89. >
  90. </ss-select>
  91. </td>
  92. </tr>
  93. <tr>
  94. <th>班级</th>
  95. <td>
  96. <ss-select
  97. v-model="formData.bjid"
  98. cb="bj"
  99. :auto-select-first="true"
  100. placeholder="请选择"
  101. >
  102. </ss-select>
  103. </td>
  104. </tr>
  105. <tr>
  106. <th>描述</th>
  107. <td>
  108. <ss-input
  109. v-model="formData.ms"
  110. name="ms"
  111. class="reason-input"
  112. placeholder="请录入"
  113. />
  114. </td>
  115. </tr>
  116. </table>
  117. </div>
  118. </div>
  119. <script>
  120. window.SS.ready(function () {
  121. window.SS.dom.initializeFormApp({
  122. el: '#app',
  123. data() {
  124. return {
  125. // 初始化考勤记录发起数据 by xu 2026-03-06
  126. pageParams: {},
  127. formData: {
  128. mc: '考勤记录',
  129. ryid: '',
  130. bjid: '',
  131. kqlbm: '',
  132. kssj: '',
  133. jssj: '',
  134. ms: ''
  135. },
  136. endMinDate: '',
  137. }
  138. },
  139. async mounted() {
  140. this.pageParams = this.getUrlParams()
  141. this.initDefaultTimeRange()
  142. // 功能说明:向 mp_objInp 暴露统一取值方法,尽量减少表单页改动 by xu 2026-03-06
  143. window.__mpObjInpGetFormData = async () => {
  144. const message = this.validateForm()
  145. return {
  146. valid: !message,
  147. message: message || '',
  148. data: {
  149. mc: this.formData.mc,
  150. ryid: this.formData.ryid,
  151. bjid: this.formData.bjid,
  152. kqlbm: this.formData.kqlbm,
  153. kssj: this.formData.kssj,
  154. jssj: this.formData.jssj,
  155. ms: (this.formData.ms || '').trim(),
  156. mswj: (this.formData.ms || '').trim()
  157. }
  158. }
  159. }
  160. },
  161. beforeUnmount() {
  162. // 功能说明:页面卸载时清理桥接方法,避免污染其他表单页 by xu 2026-03-06
  163. try {
  164. if (window.__mpObjInpGetFormData) {
  165. delete window.__mpObjInpGetFormData
  166. }
  167. } catch (_) {}
  168. },
  169. methods: {
  170. getUrlParams() {
  171. const params = {}
  172. const urlSearchParams = new URLSearchParams(window.location.search)
  173. for (const [key, value] of urlSearchParams) {
  174. params[key] = decodeURIComponent(value)
  175. }
  176. return params
  177. },
  178. initDefaultTimeRange() {
  179. // 设置默认开始/结束时间 by xu 2026-03-06
  180. const now = new Date()
  181. const start = new Date(now.getTime() + 30 * 60 * 1000)
  182. const end = new Date(start.getTime() + 2 * 60 * 60 * 1000)
  183. this.formData.kssj = this.formatToDateTime(start)
  184. this.formData.jssj = this.formatToDateTime(end)
  185. this.endMinDate = this.formData.kssj
  186. },
  187. formatToDateTime(date) {
  188. const year = date.getFullYear()
  189. const month = String(date.getMonth() + 1).padStart(2, '0')
  190. const day = String(date.getDate()).padStart(2, '0')
  191. const hour = String(date.getHours()).padStart(2, '0')
  192. const minute = String(date.getMinutes()).padStart(2, '0')
  193. return `${year}-${month}-${day} ${hour}:${minute}`
  194. },
  195. onStartTimeChange(val) {
  196. this.endMinDate = val || ''
  197. if (this.formData.jssj && val && new Date(this.formData.jssj).getTime() < new Date(val).getTime()) {
  198. this.formData.jssj = val
  199. }
  200. },
  201. validateForm() {
  202. if (!this.formData.mc) return '请录入名称'
  203. if (!this.formData.ryid) return '请选择人员'
  204. if (!this.formData.kssj) return '请选择开始时间'
  205. if (!this.formData.jssj) return '请选择结束时间'
  206. if (!this.formData.kqlbm) return '请选择考勤类别'
  207. if (!this.formData.bjid) return '请选择班级'
  208. const start = new Date(this.formData.kssj).getTime()
  209. const end = new Date(this.formData.jssj).getTime()
  210. if (!Number.isNaN(start) && !Number.isNaN(end) && end < start) {
  211. return '结束时间不能早于开始时间'
  212. }
  213. return ''
  214. }
  215. }
  216. })
  217. })
  218. </script>
  219. </body>
  220. </html>