user.js 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import {
  2. fetchUserDetail,
  3. getServerConfig,
  4. request,
  5. } from "@/utils/auth";
  6. import { getCurrentUser, getLoginUser, saveCurrentUser } from "@/utils/storage";
  7. function isServerMode() {
  8. return getServerConfig().mode === "server";
  9. }
  10. /**
  11. * 修改档案成功后,重新拉一次当前用户的 profile 接口,
  12. * 把最新数据落进 storage 并返回。
  13. * - demo 模式:不发起请求,直接返回当前缓存的 user
  14. * - 服务器模式:调 /main/users/{userId}/profile(鉴权由 request() 自动处理)
  15. */
  16. export async function refetchMyProfile() {
  17. if (!isServerMode()) return getCurrentUser();
  18. const login = getLoginUser() || {};
  19. const userId = login.userId || (getCurrentUser() || {}).id;
  20. if (!userId && userId !== 0) throw new Error("缺少用户ID,无法刷新档案");
  21. const vo = await fetchUserDetail(userId);
  22. if (vo) saveCurrentUser(vo);
  23. return vo;
  24. }
  25. /**
  26. * 把前端本地 bankCardList 映射成后端保存参数。
  27. * 后端 `accountName` 必填,但前端没有户名字段 → 退回到当前用户的姓名快照。
  28. */
  29. function mapBankCardList(list, fallbackAccountName) {
  30. if (!Array.isArray(list)) return undefined;
  31. return list.map((c) => ({
  32. cardNumber: String(c.cardNumber || "").trim(),
  33. openingBank: String(c.openingBank || "").trim(),
  34. accountName: String(c.accountName || fallbackAccountName || "").trim(),
  35. }));
  36. }
  37. /**
  38. * 新增 / 修改员工档案(用于「我的档案」修改手机号、婚姻、紧急联系人、银行卡)。
  39. * 后端约定:
  40. * - 未传 bankCardList:保持既有明细(接口侧兼容旧数据)
  41. * - 空数组:清空
  42. * - 非空数组:整单替换
  43. * - 首条明细自动投影到顶层 cardNumber / openingBank(兼容旧工资卡字段)
  44. *
  45. * ⚠️ 重要约束:调用方必须**显式**把 `bankCardList` 放在 payload 里才会一并保存。
  46. * 修改手机号 / 婚姻 / 紧急联系人时**不要**带 `bankCardList`,避免误传触发整单替换。
  47. *
  48. * @param {{
  49. * bankCardList?: Array<{ cardNumber: string, openingBank: string, accountName?: string }>,
  50. * phone?: string,
  51. * maritalStatus?: string,
  52. * secondLinkName?: string,
  53. * secondLinkPhone?: string,
  54. * secondLinkRelation?: string,
  55. * }} payload
  56. */
  57. export async function saveEmployee(payload = {}) {
  58. const user = getCurrentUser() || {};
  59. const raw = user.raw || user;
  60. const accountName =
  61. user.name || raw.userName || raw.name || raw.secondLinkName || "";
  62. // 用 delete 把 raw 里的 bankCardList / 顶层兼容 cardNumber / openingBank 删掉,
  63. // 避免修改其它字段时把旧的银行卡一并带上去(后端会按"非空整单替换"覆盖)
  64. const body = { ...raw };
  65. if ("phone" in payload) body.phone = payload.phone;
  66. if ("maritalStatus" in payload) body.maritalStatus = payload.maritalStatus;
  67. if ("secondLinkName" in payload) body.secondLinkName = payload.secondLinkName;
  68. if ("secondLinkPhone" in payload)
  69. body.secondLinkPhone = payload.secondLinkPhone;
  70. if ("secondLinkRelation" in payload)
  71. body.secondLinkRelation = payload.secondLinkRelation;
  72. if (Array.isArray(payload.bankCardList)) {
  73. body.bankCardList = mapBankCardList(payload.bankCardList, accountName);
  74. }
  75. if(Array.isArray(payload.positionList) && payload.positionList.length > 0) {
  76. body.positionList = payload.positionList;
  77. }
  78. if (!isServerMode()) {
  79. await new Promise((r) => setTimeout(r, 250));
  80. return { code: 0, data: body, message: "演示模式:本地保存" };
  81. }
  82. const path = `/main/user/saveNew`;
  83. const res = await request({ url: path, method: "POST", data: body });
  84. return res;
  85. }