mp_kqjl_inp.html 8.0 KB

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