import { fetchUserDetail, getServerConfig, request, } from "@/utils/auth"; import { getCurrentUser, getLoginUser, saveCurrentUser } from "@/utils/storage"; function isServerMode() { return getServerConfig().mode === "server"; } /** * 修改档案成功后,重新拉一次当前用户的 profile 接口, * 把最新数据落进 storage 并返回。 * - demo 模式:不发起请求,直接返回当前缓存的 user * - 服务器模式:调 /main/users/{userId}/profile(鉴权由 request() 自动处理) */ export async function refetchMyProfile() { if (!isServerMode()) return getCurrentUser(); const login = getLoginUser() || {}; const userId = login.userId || (getCurrentUser() || {}).id; if (!userId && userId !== 0) throw new Error("缺少用户ID,无法刷新档案"); const vo = await fetchUserDetail(userId); if (vo) saveCurrentUser(vo); return vo; } /** * 把前端本地 bankCardList 映射成后端保存参数。 * 后端 `accountName` 必填,但前端没有户名字段 → 退回到当前用户的姓名快照。 */ function mapBankCardList(list, fallbackAccountName) { if (!Array.isArray(list)) return undefined; return list.map((c) => ({ cardNumber: String(c.cardNumber || "").trim(), openingBank: String(c.openingBank || "").trim(), accountName: String(c.accountName || fallbackAccountName || "").trim(), })); } /** * 新增 / 修改员工档案(用于「我的档案」修改手机号、婚姻、紧急联系人、银行卡)。 * 后端约定: * - 未传 bankCardList:保持既有明细(接口侧兼容旧数据) * - 空数组:清空 * - 非空数组:整单替换 * - 首条明细自动投影到顶层 cardNumber / openingBank(兼容旧工资卡字段) * * ⚠️ 重要约束:调用方必须**显式**把 `bankCardList` 放在 payload 里才会一并保存。 * 修改手机号 / 婚姻 / 紧急联系人时**不要**带 `bankCardList`,避免误传触发整单替换。 * * @param {{ * bankCardList?: Array<{ cardNumber: string, openingBank: string, accountName?: string }>, * phone?: string, * maritalStatus?: string, * secondLinkName?: string, * secondLinkPhone?: string, * secondLinkRelation?: string, * }} payload */ export async function saveEmployee(payload = {}) { const user = getCurrentUser() || {}; const raw = user.raw || user; const accountName = user.name || raw.userName || raw.name || raw.secondLinkName || ""; // 用 delete 把 raw 里的 bankCardList / 顶层兼容 cardNumber / openingBank 删掉, // 避免修改其它字段时把旧的银行卡一并带上去(后端会按"非空整单替换"覆盖) const body = { ...raw }; if ("phone" in payload) body.phone = payload.phone; if ("maritalStatus" in payload) body.maritalStatus = payload.maritalStatus; if ("secondLinkName" in payload) body.secondLinkName = payload.secondLinkName; if ("secondLinkPhone" in payload) body.secondLinkPhone = payload.secondLinkPhone; if ("secondLinkRelation" in payload) body.secondLinkRelation = payload.secondLinkRelation; if (Array.isArray(payload.bankCardList)) { body.bankCardList = mapBankCardList(payload.bankCardList, accountName); } if(Array.isArray(payload.positionList) && payload.positionList.length > 0) { body.positionList = payload.positionList; } if (!isServerMode()) { await new Promise((r) => setTimeout(r, 250)); return { code: 0, data: body, message: "演示模式:本地保存" }; } const path = `/main/user/saveNew`; const res = await request({ url: path, method: "POST", data: body }); return res; }