// HR 本地存储:申请草稿、本地申请记录、审批结果缓存 // 由 kd-aiot-frontend-hr-H5 的 src/utils/storage.ts 迁移而来(去掉演示模式数据) const APPLY_KEY = "aimill_hr_applications"; const DRAFT_KEY = "aimill_hr_application_drafts"; const APPROVAL_KEY = "aimill_hr_approval_results"; const RESIGN_ID_KEY = "aimill_hr_my_resign_ids"; const USER_CHANGE_ID_KEY = "aimill_hr_user_change_ids"; const REGULARIZATION_ID_KEY = "aimill_hr_regularization_ids"; const REGULARIZATION_BILL_KEY = "aimill_hr_regularization_bills"; const ONBOARD_MATERIAL_KEY = "aimill_hr_onboard_materials"; /** yyyy-MM-dd HH:mm */ export function formatNow() { const d = new Date(); const pad = (n) => String(n).padStart(2, "0"); return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad( d.getHours() )}:${pad(d.getMinutes())}`; } /** 只保留 yyyy-MM-dd */ export function dateOnly(value) { if (!value) return ""; const m = String(value).match(/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})/); if (!m) return String(value); const pad = (n) => String(n).padStart(2, "0"); return `${m[1]}-${pad(m[2])}-${pad(m[3])}`; } // ============ 我的申请(本地记录) ============ export function getApplications() { const saved = uni.getStorageSync(APPLY_KEY); return Array.isArray(saved) ? saved : []; } export function addApplication(item) { const list = getApplications(); const source = item || {}; // 调用方已传 id(服务端单据主键)则保留 const id = source.id ? source.id : Date.now(); const rest = Object.assign({}, source); delete rest.id; list.unshift(Object.assign({}, rest, { id, status: "审批中", createdAt: formatNow() })); uni.setStorageSync(APPLY_KEY, list); return list; } // ============ 申请草稿 ============ export function saveDraft(type, form) { const drafts = uni.getStorageSync(DRAFT_KEY) || {}; drafts[type] = Object.assign({}, form, { savedAt: formatNow() }); uni.setStorageSync(DRAFT_KEY, drafts); } export function getDraft(type) { const drafts = uni.getStorageSync(DRAFT_KEY) || {}; return drafts[type] || null; } export function removeDraft(type) { const drafts = uni.getStorageSync(DRAFT_KEY) || {}; delete drafts[type]; uni.setStorageSync(DRAFT_KEY, drafts); } // ============ 审批结果缓存 ============ export function getApprovalResults() { const saved = uni.getStorageSync(APPROVAL_KEY); return saved && typeof saved === "object" ? saved : {}; } export function setApprovalResult(id, status, comment) { const results = getApprovalResults(); results[id] = { status, comment: comment || "", handledAt: formatNow() }; uni.setStorageSync(APPROVAL_KEY, results); return results[id]; } // ============ 我已提交的离职单主键(用于详情页回查) ============ export function getMyResignIds() { const saved = uni.getStorageSync(RESIGN_ID_KEY); return Array.isArray(saved) ? saved.map(String).filter(Boolean) : []; } export function rememberResignId(id) { const text = id === null || id === undefined ? "" : String(id).trim(); if (!text) return getMyResignIds(); const next = [text, ...getMyResignIds().filter((item) => item !== text)].slice(0, 200); uni.setStorageSync(RESIGN_ID_KEY, next); return next; } // ============ 我已提交的人事异动单主键 ============ export function getUserChangeIds() { const saved = uni.getStorageSync(USER_CHANGE_ID_KEY); return Array.isArray(saved) ? saved.map(String).filter(Boolean) : []; } export function rememberUserChangeId(id) { const text = id === null || id === undefined ? "" : String(id).trim(); if (!text) return getUserChangeIds(); const next = [text, ...getUserChangeIds().filter((item) => item !== text)].slice(0, 200); uni.setStorageSync(USER_CHANGE_ID_KEY, next); return next; } // ============ 试用期员工 → 转正单主键映射 ============ export function loadRegularizationBillMap() { const saved = uni.getStorageSync(REGULARIZATION_BILL_KEY); return saved && typeof saved === "object" ? saved : {}; } export function saveRegularizationBillId(userId, billId) { const key = userId === null || userId === undefined ? "" : String(userId).trim(); if (!key || billId === null || billId === undefined || billId === "") { return loadRegularizationBillMap(); } const map = loadRegularizationBillMap(); map[key] = String(billId); uni.setStorageSync(REGULARIZATION_BILL_KEY, map); return map; } export function removeRegularizationBillId(userId) { const key = userId === null || userId === undefined ? "" : String(userId).trim(); if (!key) return loadRegularizationBillMap(); const map = loadRegularizationBillMap(); if (key in map) delete map[key]; uni.setStorageSync(REGULARIZATION_BILL_KEY, map); return map; } export function getRegularizationIds() { const saved = uni.getStorageSync(REGULARIZATION_ID_KEY); return Array.isArray(saved) ? saved.map(String).filter(Boolean) : []; } export function rememberRegularizationId(id) { const text = id === null || id === undefined ? "" : String(id).trim(); if (!text) return getRegularizationIds(); const next = [text, ...getRegularizationIds().filter((item) => item !== text)].slice(0, 200); uni.setStorageSync(REGULARIZATION_ID_KEY, next); return next; } // ============ 入职材料(按员工 id 分组,本地缓存已上传附件) ============ function loadOnboardMaterialMap() { const saved = uni.getStorageSync(ONBOARD_MATERIAL_KEY); return saved && typeof saved === "object" ? saved : {}; } function persistOnboardMaterialMap(map) { uni.setStorageSync(ONBOARD_MATERIAL_KEY, map); } export function getOnboardMaterials(employeeId) { const map = loadOnboardMaterialMap(); const bucket = map[String(employeeId)]; return bucket && typeof bucket === "object" ? bucket : {}; } export function addOnboardMaterial(employeeId, materialKey, file) { const key = String(employeeId); const map = loadOnboardMaterialMap(); const bucket = Object.assign({}, map[key] || {}); const list = Array.isArray(bucket[materialKey]) ? bucket[materialKey].slice() : []; const id = (file && file.id != null && String(file.id)) || `mat_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`; list.push( Object.assign({}, file, { id, name: (file && file.name) || `材料_${list.length + 1}`, uploadedAt: formatNow(), }) ); bucket[materialKey] = list; map[key] = bucket; persistOnboardMaterialMap(map); return bucket; } export function removeOnboardMaterial(employeeId, materialKey, fileId) { const key = String(employeeId); const map = loadOnboardMaterialMap(); const bucket = Object.assign({}, map[key] || {}); const list = Array.isArray(bucket[materialKey]) ? bucket[materialKey] : []; bucket[materialKey] = list.filter((item) => String(item.id) !== String(fileId)); map[key] = bucket; persistOnboardMaterialMap(map); return bucket; } export function renameOnboardMaterial(employeeId, materialKey, fileId, name) { const key = String(employeeId); const map = loadOnboardMaterialMap(); const bucket = Object.assign({}, map[key] || {}); const list = Array.isArray(bucket[materialKey]) ? bucket[materialKey] : []; bucket[materialKey] = list.map((item) => String(item.id) === String(fileId) ? Object.assign({}, item, { name }) : item ); map[key] = bucket; persistOnboardMaterialMap(map); return bucket; }