factoryCalendar.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. import request from '@/utils/request';
  2. import axios from 'axios';
  3. import { Loading } from 'element-ui';
  4. const baseUrl = '/aps/factory/calendar';
  5. const pendingRequests = {};
  6. let loadingInstance = null;
  7. let loadingCount = 0;
  8. function showLoading(text = '加载中...') {
  9. loadingCount += 1;
  10. if (!loadingInstance) {
  11. loadingInstance = Loading.service({
  12. lock: true,
  13. text,
  14. spinner: 'el-icon-loading',
  15. background: 'rgba(255, 255, 255, 0.68)',
  16. customClass: 'factory-calendar-loading'
  17. });
  18. } else {
  19. loadingInstance.text = text;
  20. }
  21. }
  22. function hideLoading() {
  23. loadingCount = Math.max(loadingCount - 1, 0);
  24. if (!loadingCount && loadingInstance) {
  25. loadingInstance.close();
  26. loadingInstance = null;
  27. }
  28. }
  29. async function requestWithLoading(requestFactory, text) {
  30. showLoading(text);
  31. try {
  32. return await requestFactory();
  33. } finally {
  34. hideLoading();
  35. }
  36. }
  37. function onceRequest(key, requestFactory) {
  38. if (pendingRequests[key]) {
  39. return pendingRequests[key];
  40. }
  41. pendingRequests[key] = requestFactory().finally(() => {
  42. delete pendingRequests[key];
  43. });
  44. return pendingRequests[key];
  45. }
  46. function normalizeTimeValue(value) {
  47. if (typeof value !== 'string' || !/^\d{2}:\d{2}$/.test(value)) {
  48. return value;
  49. }
  50. return `${value}:00`;
  51. }
  52. function normalizeDateTimeValue(value) {
  53. if (typeof value !== 'string') {
  54. return value;
  55. }
  56. if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$/.test(value)) {
  57. return value.replace('T', ' ');
  58. }
  59. if (/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}$/.test(value)) {
  60. return `${value}:00`;
  61. }
  62. return value;
  63. }
  64. function normalizeTimePayload(data) {
  65. if (Array.isArray(data)) {
  66. return data.map((item) => normalizeTimePayload(item));
  67. }
  68. if (
  69. !data ||
  70. typeof data !== 'object' ||
  71. Object.prototype.toString.call(data) !== '[object Object]'
  72. ) {
  73. return data;
  74. }
  75. return Object.keys(data).reduce((next, key) => {
  76. const value = data[key];
  77. if (key === 'startTime' || key === 'endTime') {
  78. next[key] = normalizeTimeValue(value);
  79. } else if (key === 'effectiveTime' || key === 'expireTime') {
  80. next[key] = normalizeDateTimeValue(value);
  81. } else {
  82. next[key] = normalizeTimePayload(value);
  83. }
  84. return next;
  85. }, {});
  86. }
  87. function normalizeSegmentContent(data) {
  88. if (!data || typeof data.newContent !== 'string') {
  89. return data;
  90. }
  91. try {
  92. const parsed = JSON.parse(data.newContent);
  93. return {
  94. ...data,
  95. newContent: JSON.stringify(normalizeTimePayload(parsed))
  96. };
  97. } catch (e) {
  98. return data;
  99. }
  100. }
  101. function normalizeRequestData(data) {
  102. return normalizeSegmentContent(normalizeTimePayload(data));
  103. }
  104. function unwrap(res) {
  105. if (res.data.code == 0) {
  106. return res.data.data;
  107. }
  108. return Promise.reject(new Error(res.data.message));
  109. }
  110. export async function addCalendar(data) {
  111. const res = await requestWithLoading(
  112. () => request.post(`${baseUrl}/add`, normalizeRequestData(data)),
  113. '保存日历中...'
  114. );
  115. return unwrap(res);
  116. }
  117. export async function editCalendar(data) {
  118. const res = await requestWithLoading(
  119. () => request.put(`${baseUrl}/edit`, normalizeRequestData(data)),
  120. '保存日历中...'
  121. );
  122. return unwrap(res);
  123. }
  124. export async function deleteCalendar(data) {
  125. const res = await requestWithLoading(
  126. () => request.delete(`${baseUrl}/delete`, { data }),
  127. '删除日历中...'
  128. );
  129. return unwrap(res);
  130. }
  131. export async function updateCalendarStatus(data) {
  132. const res = await requestWithLoading(
  133. () => request.put(`${baseUrl}/status`, data),
  134. '同步状态中...'
  135. );
  136. return unwrap(res);
  137. }
  138. export async function pageCalendar(params) {
  139. const res = await requestWithLoading(
  140. () => request.get(`${baseUrl}/list`, { params }),
  141. '加载日历数据中...'
  142. );
  143. return unwrap(res);
  144. }
  145. export async function copyCalendar(data) {
  146. const res = await requestWithLoading(
  147. () => request.post(`${baseUrl}/copy`, data),
  148. '复制日历中...'
  149. );
  150. return unwrap(res);
  151. }
  152. export async function exportCalendarList(params) {
  153. const res = await requestWithLoading(
  154. () => request.get(`${baseUrl}/batch/export`, { params }),
  155. '导出日历中...'
  156. );
  157. return unwrap(res);
  158. }
  159. export async function viewCalendar(params) {
  160. const res = await requestWithLoading(
  161. () => request.get(`${baseUrl}/view`, { params }),
  162. '加载日历视图中...'
  163. );
  164. return unwrap(res);
  165. }
  166. export async function saveCalendarDetail(data) {
  167. const res = await requestWithLoading(
  168. () => request.post(`${baseUrl}/detail/save`, normalizeRequestData(data)),
  169. '保存时段明细中...'
  170. );
  171. return unwrap(res);
  172. }
  173. export async function checkCalendarConflict(data) {
  174. const payload = normalizeRequestData(data);
  175. const res = await requestWithLoading(
  176. () =>
  177. onceRequest(`conflict-check:${JSON.stringify(payload)}`, () =>
  178. request.post(`${baseUrl}/conflict/check`, payload)
  179. ),
  180. '检测冲突中...'
  181. );
  182. return unwrap(res);
  183. }
  184. export async function checkAllCalendarConflict(params) {
  185. const payload = normalizeRequestData(params);
  186. const res = await requestWithLoading(
  187. () =>
  188. onceRequest(`conflict-all:${JSON.stringify(payload)}`, () =>
  189. request.get(`${baseUrl}/conflict/all`, { params: payload })
  190. ),
  191. '年度冲突检测中...'
  192. );
  193. return unwrap(res);
  194. }
  195. export async function applyCalendarAdjust(data) {
  196. const res = await requestWithLoading(
  197. () => request.post(`${baseUrl}/adjust/apply`, normalizeRequestData(data)),
  198. '提交调整申请中...'
  199. );
  200. return unwrap(res);
  201. }
  202. export async function approveCalendarAdjust(data) {
  203. const res = await requestWithLoading(
  204. () => request.put(`${baseUrl}/adjust/approve`, data),
  205. '审批处理中...'
  206. );
  207. return unwrap(res);
  208. }
  209. export async function pageCalendarAdjust(params) {
  210. const res = await requestWithLoading(
  211. () => request.get(`${baseUrl}/adjust/list`, { params }),
  212. '加载调整申请中...'
  213. );
  214. return unwrap(res);
  215. }
  216. export async function getPlanRelation(params) {
  217. const res = await requestWithLoading(
  218. () =>
  219. request.get(`${baseUrl}/plan/relation`, {
  220. params: normalizeRequestData(params)
  221. }),
  222. '加载关联计划中...'
  223. );
  224. return unwrap(res);
  225. }
  226. export async function refreshCalendarPlan(data) {
  227. const res = await requestWithLoading(
  228. () => request.post(`${baseUrl}/plan/refresh`, data),
  229. '刷新关联计划中...'
  230. );
  231. return unwrap(res);
  232. }
  233. export async function getMonthStat(params) {
  234. const res = await requestWithLoading(
  235. () => request.get(`${baseUrl}/stat/month`, { params }),
  236. '加载统计数据中...'
  237. );
  238. return unwrap(res);
  239. }
  240. export async function getPublicLegalHolidays(year) {
  241. const res = await axios.get(
  242. `https://api.jiejiariapi.com/v1/holidays/${year}`,
  243. {
  244. timeout: 8000
  245. }
  246. );
  247. return res.data;
  248. }