mp_xyqj_baseInfo.html 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  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. padding-top: 8px;
  19. box-sizing: border-box;
  20. }
  21. .loading {
  22. text-align: center;
  23. padding: 50px;
  24. color: #999;
  25. }
  26. .error {
  27. text-align: center;
  28. padding: 50px;
  29. color: #ff4d4f;
  30. }
  31. .section-card {
  32. margin: 0 8px 10px;
  33. background: #ffffff;
  34. border-radius: 8px;
  35. overflow: hidden;
  36. }
  37. .form {
  38. width: 100%;
  39. border-collapse: collapse;
  40. }
  41. .form th {
  42. width: 140px;
  43. max-width: 170px;
  44. }
  45. .reason-text {
  46. white-space: pre-wrap;
  47. line-height: 1.6;
  48. }
  49. </style>
  50. </head>
  51. <body>
  52. <div id="app" v-cloak>
  53. <div v-if="loading" class="loading">加载中...</div>
  54. <div v-else-if="error" class="error">{{ error }}</div>
  55. <!-- 新增学员请假基本信息回显页 by xu 2026-02-28 -->
  56. <div v-else class="content-div">
  57. <div class="section-card">
  58. <table class="form">
  59. <tr>
  60. <th>请假类别</th>
  61. <td>{{ displayData.rclb || '-' }}</td>
  62. </tr>
  63. <tr>
  64. <th>学员</th>
  65. <td>
  66. {{ displayData.studentName || displayData.fzrymc ||
  67. displayData.xm || displayData.fzryid || '-' }}
  68. </td>
  69. </tr>
  70. <tr>
  71. <th>请假开始时间</th>
  72. <td>{{ displayData.kssj || '-' }}</td>
  73. </tr>
  74. <tr>
  75. <th>请假结束时间</th>
  76. <td>{{ displayData.jssj || '-' }}</td>
  77. </tr>
  78. <tr>
  79. <th>事由</th>
  80. <td class="reason-text">{{ displayData.ms || '-' }}</td>
  81. </tr>
  82. </table>
  83. </div>
  84. </div>
  85. </div>
  86. <script>
  87. window.SS.ready(function () {
  88. window.SS.dom.initializeFormApp({
  89. el: "#app",
  90. data() {
  91. return {
  92. pageParams: {},
  93. loading: false,
  94. error: "",
  95. formData: {},
  96. displayData: {
  97. rclb: "",
  98. fzrymc: "",
  99. xm: "",
  100. kssj: "",
  101. jssj: "",
  102. ms: "",
  103. fjid: "",
  104. },
  105. };
  106. },
  107. async mounted() {
  108. this.pageParams = this.getUrlParams();
  109. await this.loadData();
  110. },
  111. methods: {
  112. getUrlParams() {
  113. const params = {};
  114. const urlSearchParams = new URLSearchParams(
  115. window.location.search
  116. );
  117. for (const [key, value] of urlSearchParams) {
  118. params[key] = decodeURIComponent(value);
  119. }
  120. return params;
  121. },
  122. parseParamObject(paramStr) {
  123. if (!paramStr) return {};
  124. try {
  125. return JSON.parse(paramStr);
  126. } catch (err) {
  127. try {
  128. const fixed = paramStr.replace(
  129. /([,{]\s*)([a-zA-Z_][a-zA-Z0-9_]*)\s*:/g,
  130. '$1"$2":'
  131. );
  132. return JSON.parse(fixed);
  133. } catch (err2) {
  134. console.error("解析param失败:", err2);
  135. return {};
  136. }
  137. }
  138. },
  139. async loadData() {
  140. // 加载请假详情数据并回显 by xu 2026-02-28
  141. const service = this.pageParams.service;
  142. if (!service) {
  143. this.error = "缺少service参数";
  144. return;
  145. }
  146. this.loading = true;
  147. this.error = "";
  148. try {
  149. const paramObj = this.parseParamObject(this.pageParams.param);
  150. const requestData = {
  151. ...paramObj,
  152. };
  153. const appendIfMissing = (targetKey, sourceKeys) => {
  154. if (
  155. requestData[targetKey] !== undefined &&
  156. requestData[targetKey] !== null &&
  157. requestData[targetKey] !== ""
  158. ) {
  159. return;
  160. }
  161. for (let i = 0; i < sourceKeys.length; i += 1) {
  162. const sourceKey = sourceKeys[i];
  163. const value = this.pageParams[sourceKey];
  164. if (value !== undefined && value !== null && value !== "") {
  165. requestData[targetKey] = value;
  166. return;
  167. }
  168. }
  169. };
  170. appendIfMissing("sqid", ["sqid"]);
  171. appendIfMissing("shid", ["shid"]);
  172. appendIfMissing("ssObjName", ["ssObjName", "ssobjname"]);
  173. appendIfMissing("ssObjId", ["ssObjId", "ssobjid"]);
  174. appendIfMissing("bdlbm", ["bdlbm"]);
  175. appendIfMissing("dataType", ["dataType", "datatype"]);
  176. appendIfMissing("encode_shid", ["encode_shid"]);
  177. appendIfMissing("jdmc", ["jdmc"]);
  178. appendIfMissing("ssToken", ["ssToken"]);
  179. const response = await request.post(
  180. `/service?ssServ=${service}&ssDest=data`,
  181. requestData,
  182. { loading: false, formData: true }
  183. );
  184. const raw = this.pickLeaveData(response?.data);
  185. if (!raw) {
  186. this.error = "未获取到请假数据";
  187. return;
  188. }
  189. this.formData = raw;
  190. await this.buildDisplayData(raw);
  191. } catch (error) {
  192. console.error("加载请假基本信息失败:", error);
  193. this.error = "加载失败:" + (error.message || "未知错误");
  194. } finally {
  195. this.loading = false;
  196. }
  197. },
  198. pickLeaveData(data) {
  199. if (!data) return null;
  200. if (data.xyqj) return data.xyqj;
  201. if (data.rcqj) return data.rcqj;
  202. if (data.qj) return data.qj;
  203. if (Array.isArray(data.objectList) && data.objectList.length > 0)
  204. return data.objectList[0];
  205. if (Array.isArray(data.data) && data.data.length > 0)
  206. return data.data[0];
  207. if (typeof data === "object") return data;
  208. return null;
  209. },
  210. async buildDisplayData(raw) {
  211. const cloned = { ...raw };
  212. cloned.kssj = this.formatDate(raw.kssj);
  213. cloned.jssj = this.formatDate(raw.jssj);
  214. cloned.rclb = await this.translateLeaveType(raw.rclbm, raw.rclb);
  215. cloned.studentName = await this.resolveStudentName(raw);
  216. this.displayData = {
  217. ...this.displayData,
  218. ...cloned,
  219. };
  220. },
  221. async resolveStudentName(raw) {
  222. const direct = raw.fzrymc || raw.xm || raw.rymc || raw.xmmc || "";
  223. if (direct) return direct;
  224. const idValue = String(raw.fzryid || "").trim();
  225. if (!idValue) return "";
  226. try {
  227. if (typeof window.getDictOptions === "function") {
  228. const options = await window.getDictOptions("ry");
  229. const target = (options || []).find(
  230. (item) => String(item.v) === String(idValue)
  231. );
  232. if (target && target.n) return target.n;
  233. }
  234. } catch (error) {
  235. console.error("学员姓名翻译失败:", error);
  236. }
  237. const dictCache = [
  238. this.pageParams,
  239. this.formData,
  240. raw,
  241. this.displayData,
  242. ];
  243. for (let i = 0; i < dictCache.length; i += 1) {
  244. const src = dictCache[i] || {};
  245. const candidate =
  246. src[`${idValue}_name`] ||
  247. src[`${idValue}Name`] ||
  248. src.fzryName ||
  249. src.fzrymc;
  250. if (candidate) return candidate;
  251. }
  252. return idValue;
  253. },
  254. formatDate(value) {
  255. if (!value) return "";
  256. if (
  257. window.H5FieldFormatter &&
  258. typeof window.H5FieldFormatter.formatDate === "function"
  259. ) {
  260. return window.H5FieldFormatter.formatDate(
  261. value,
  262. "YYYY-MM-DD HH:mm"
  263. );
  264. }
  265. return value;
  266. },
  267. async translateLeaveType(rclbm, fallbackName) {
  268. if (fallbackName) return fallbackName;
  269. if (!rclbm) return "";
  270. try {
  271. if (typeof window.getDictOptions === "function") {
  272. const options = await window.getDictOptions("xyqjlb");
  273. const target = (options || []).find(
  274. (item) => String(item.v) === String(rclbm)
  275. );
  276. return target ? target.n : rclbm;
  277. }
  278. return rclbm;
  279. } catch (error) {
  280. console.error("请假类别翻译失败:", error);
  281. return rclbm;
  282. }
  283. },
  284. },
  285. });
  286. });
  287. </script>
  288. </body>
  289. </html>