storage.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. // HR 本地存储:申请草稿、本地申请记录、审批结果缓存
  2. // 由 kd-aiot-frontend-hr-H5 的 src/utils/storage.ts 迁移而来(去掉演示模式数据)
  3. const APPLY_KEY = "aimill_hr_applications";
  4. const DRAFT_KEY = "aimill_hr_application_drafts";
  5. const APPROVAL_KEY = "aimill_hr_approval_results";
  6. const RESIGN_ID_KEY = "aimill_hr_my_resign_ids";
  7. const USER_CHANGE_ID_KEY = "aimill_hr_user_change_ids";
  8. const REGULARIZATION_ID_KEY = "aimill_hr_regularization_ids";
  9. const REGULARIZATION_BILL_KEY = "aimill_hr_regularization_bills";
  10. const ONBOARD_MATERIAL_KEY = "aimill_hr_onboard_materials";
  11. /** yyyy-MM-dd HH:mm */
  12. export function formatNow() {
  13. const d = new Date();
  14. const pad = (n) => String(n).padStart(2, "0");
  15. return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(
  16. d.getHours()
  17. )}:${pad(d.getMinutes())}`;
  18. }
  19. /** 只保留 yyyy-MM-dd */
  20. export function dateOnly(value) {
  21. if (!value) return "";
  22. const m = String(value).match(/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})/);
  23. if (!m) return String(value);
  24. const pad = (n) => String(n).padStart(2, "0");
  25. return `${m[1]}-${pad(m[2])}-${pad(m[3])}`;
  26. }
  27. // ============ 我的申请(本地记录) ============
  28. export function getApplications() {
  29. const saved = uni.getStorageSync(APPLY_KEY);
  30. return Array.isArray(saved) ? saved : [];
  31. }
  32. export function addApplication(item) {
  33. const list = getApplications();
  34. const source = item || {};
  35. // 调用方已传 id(服务端单据主键)则保留
  36. const id = source.id ? source.id : Date.now();
  37. const rest = Object.assign({}, source);
  38. delete rest.id;
  39. list.unshift(Object.assign({}, rest, { id, status: "审批中", createdAt: formatNow() }));
  40. uni.setStorageSync(APPLY_KEY, list);
  41. return list;
  42. }
  43. // ============ 申请草稿 ============
  44. export function saveDraft(type, form) {
  45. const drafts = uni.getStorageSync(DRAFT_KEY) || {};
  46. drafts[type] = Object.assign({}, form, { savedAt: formatNow() });
  47. uni.setStorageSync(DRAFT_KEY, drafts);
  48. }
  49. export function getDraft(type) {
  50. const drafts = uni.getStorageSync(DRAFT_KEY) || {};
  51. return drafts[type] || null;
  52. }
  53. export function removeDraft(type) {
  54. const drafts = uni.getStorageSync(DRAFT_KEY) || {};
  55. delete drafts[type];
  56. uni.setStorageSync(DRAFT_KEY, drafts);
  57. }
  58. // ============ 审批结果缓存 ============
  59. export function getApprovalResults() {
  60. const saved = uni.getStorageSync(APPROVAL_KEY);
  61. return saved && typeof saved === "object" ? saved : {};
  62. }
  63. export function setApprovalResult(id, status, comment) {
  64. const results = getApprovalResults();
  65. results[id] = { status, comment: comment || "", handledAt: formatNow() };
  66. uni.setStorageSync(APPROVAL_KEY, results);
  67. return results[id];
  68. }
  69. // ============ 我已提交的离职单主键(用于详情页回查) ============
  70. export function getMyResignIds() {
  71. const saved = uni.getStorageSync(RESIGN_ID_KEY);
  72. return Array.isArray(saved) ? saved.map(String).filter(Boolean) : [];
  73. }
  74. export function rememberResignId(id) {
  75. const text = id === null || id === undefined ? "" : String(id).trim();
  76. if (!text) return getMyResignIds();
  77. const next = [text, ...getMyResignIds().filter((item) => item !== text)].slice(0, 200);
  78. uni.setStorageSync(RESIGN_ID_KEY, next);
  79. return next;
  80. }
  81. // ============ 我已提交的人事异动单主键 ============
  82. export function getUserChangeIds() {
  83. const saved = uni.getStorageSync(USER_CHANGE_ID_KEY);
  84. return Array.isArray(saved) ? saved.map(String).filter(Boolean) : [];
  85. }
  86. export function rememberUserChangeId(id) {
  87. const text = id === null || id === undefined ? "" : String(id).trim();
  88. if (!text) return getUserChangeIds();
  89. const next = [text, ...getUserChangeIds().filter((item) => item !== text)].slice(0, 200);
  90. uni.setStorageSync(USER_CHANGE_ID_KEY, next);
  91. return next;
  92. }
  93. // ============ 试用期员工 → 转正单主键映射 ============
  94. export function loadRegularizationBillMap() {
  95. const saved = uni.getStorageSync(REGULARIZATION_BILL_KEY);
  96. return saved && typeof saved === "object" ? saved : {};
  97. }
  98. export function saveRegularizationBillId(userId, billId) {
  99. const key = userId === null || userId === undefined ? "" : String(userId).trim();
  100. if (!key || billId === null || billId === undefined || billId === "") {
  101. return loadRegularizationBillMap();
  102. }
  103. const map = loadRegularizationBillMap();
  104. map[key] = String(billId);
  105. uni.setStorageSync(REGULARIZATION_BILL_KEY, map);
  106. return map;
  107. }
  108. export function removeRegularizationBillId(userId) {
  109. const key = userId === null || userId === undefined ? "" : String(userId).trim();
  110. if (!key) return loadRegularizationBillMap();
  111. const map = loadRegularizationBillMap();
  112. if (key in map) delete map[key];
  113. uni.setStorageSync(REGULARIZATION_BILL_KEY, map);
  114. return map;
  115. }
  116. export function getRegularizationIds() {
  117. const saved = uni.getStorageSync(REGULARIZATION_ID_KEY);
  118. return Array.isArray(saved) ? saved.map(String).filter(Boolean) : [];
  119. }
  120. export function rememberRegularizationId(id) {
  121. const text = id === null || id === undefined ? "" : String(id).trim();
  122. if (!text) return getRegularizationIds();
  123. const next = [text, ...getRegularizationIds().filter((item) => item !== text)].slice(0, 200);
  124. uni.setStorageSync(REGULARIZATION_ID_KEY, next);
  125. return next;
  126. }
  127. // ============ 入职材料(按员工 id 分组,本地缓存已上传附件) ============
  128. function loadOnboardMaterialMap() {
  129. const saved = uni.getStorageSync(ONBOARD_MATERIAL_KEY);
  130. return saved && typeof saved === "object" ? saved : {};
  131. }
  132. function persistOnboardMaterialMap(map) {
  133. uni.setStorageSync(ONBOARD_MATERIAL_KEY, map);
  134. }
  135. export function getOnboardMaterials(employeeId) {
  136. const map = loadOnboardMaterialMap();
  137. const bucket = map[String(employeeId)];
  138. return bucket && typeof bucket === "object" ? bucket : {};
  139. }
  140. export function addOnboardMaterial(employeeId, materialKey, file) {
  141. const key = String(employeeId);
  142. const map = loadOnboardMaterialMap();
  143. const bucket = Object.assign({}, map[key] || {});
  144. const list = Array.isArray(bucket[materialKey]) ? bucket[materialKey].slice() : [];
  145. const id =
  146. (file && file.id != null && String(file.id)) ||
  147. `mat_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
  148. list.push(
  149. Object.assign({}, file, {
  150. id,
  151. name: (file && file.name) || `材料_${list.length + 1}`,
  152. uploadedAt: formatNow(),
  153. })
  154. );
  155. bucket[materialKey] = list;
  156. map[key] = bucket;
  157. persistOnboardMaterialMap(map);
  158. return bucket;
  159. }
  160. export function removeOnboardMaterial(employeeId, materialKey, fileId) {
  161. const key = String(employeeId);
  162. const map = loadOnboardMaterialMap();
  163. const bucket = Object.assign({}, map[key] || {});
  164. const list = Array.isArray(bucket[materialKey]) ? bucket[materialKey] : [];
  165. bucket[materialKey] = list.filter((item) => String(item.id) !== String(fileId));
  166. map[key] = bucket;
  167. persistOnboardMaterialMap(map);
  168. return bucket;
  169. }
  170. export function renameOnboardMaterial(employeeId, materialKey, fileId, name) {
  171. const key = String(employeeId);
  172. const map = loadOnboardMaterialMap();
  173. const bucket = Object.assign({}, map[key] || {});
  174. const list = Array.isArray(bucket[materialKey]) ? bucket[materialKey] : [];
  175. bucket[materialKey] = list.map((item) =>
  176. String(item.id) === String(fileId) ? Object.assign({}, item, { name }) : item
  177. );
  178. map[key] = bucket;
  179. persistOnboardMaterialMap(map);
  180. return bucket;
  181. }