/** * 人员档案暂存查询 key 及对应 SQL * 需在后台通用查询脚本中配置相同 key */ export const draftQueryKeys = { main: 'getRydaZcxxbByRenYuan', jbqk: 'getRydaJbqkzcByParentId', jyjl: 'getRydaJyjlzcByParentId', gzjl: 'getRydaGzjlzcByParentId', zsb: 'getRydaZsbzcByParentId' } export const draftQuerySql = { // params: [renYuan, zhuangTai] [draftQueryKeys.main]: 'SELECT * FROM t_rydazcxxb WHERE renYuan = ? AND zhuangTai = ? ORDER BY create_time_ DESC LIMIT 1', // params: [parentId] [draftQueryKeys.jbqk]: 'SELECT * FROM t_jbqkxxzc WHERE parentId = ?', [draftQueryKeys.jyjl]: 'SELECT * FROM t_jyjlzc WHERE parentId = ? ORDER BY create_time_ ASC', [draftQueryKeys.gzjl]: 'SELECT * FROM t_gzjlzc WHERE parentId = ? ORDER BY create_time_ ASC', [draftQueryKeys.zsb]: 'SELECT * FROM t_zsbzc WHERE parentId = ? ORDER BY create_time_ ASC' } export const draftChildQueryKeys = { t_jbqkxxzc: draftQueryKeys.jbqk, t_jyjlzc: draftQueryKeys.jyjl, t_gzjlzc: draftQueryKeys.gzjl, t_zsbzc: draftQueryKeys.zsb } /** 暂存表单 formKey */ export const draftFormKey = 'rydazcljgxbdqddmsy' /** 暂存表单 boCode */ export const draftBoCode = 'rydazcxxb' /** * 查询结果下划线字段 → 代码驼峰字段 * (与 BO / 数据库列名一致) */ export const draftSnakeToCamelMap = { zhuang_tai_: 'zhuangTai', ren_yuan_: 'renYuan', parent_id_: 'parentId', shi_fou_guo_shen_: 'shiFouGuoShen', di_dian_: 'diDian', bian_zhi_ren_: 'bianZhiRen', bian_zhi_bu_men_: 'bianZhiBuMen', bian_zhi_shi_jian_: 'bianZhiShiJian', kuai_zhao_: 'kuaiZhao', jian_dang_ri_qi_: 'jianDangRiQi', nian_ling_: 'nianLing', chu_sheng_ri_qi_: 'chuShengRiQi', zui_gao_xue_li_x_: 'zuiGaoXueLiX', yuan_bi_ye_yuan_x: 'yuanBiYeYuanXi', yuan_bi_ye_yuan_xi_: 'yuanBiYeYuanXi', xian_cong_shi_zhu: 'xianCongShiZhua', xian_cong_shi_zhua_: 'xianCongShiZhua', can_jia_gong_zuo: 'canJiaGongZuo', can_jia_gong_zuo_: 'canJiaGongZuo', ru_zhi_shi_jian_: 'ruZhiShiJian', ren_zhi_shi_jian_: 'renZhiShiJian', xing_zheng_zhi_wu: 'xingZhengZhiWu', xing_zheng_zhi_wu_: 'xingZhengZhiWu', zhi_cheng_deng_ji: 'zhiChengDengJi', zhi_cheng_deng_ji_: 'zhiChengDengJi', zhi_cheng_: 'zhiCheng', shen_fen_zheng_ha: 'shenFenZhengHao', shen_fen_zheng_hao_: 'shenFenZhengHao', ren_yuan_lei_xing: 'renYuanLeiXing', ren_yuan_lei_xing_: 'renYuanLeiXing', bao_mi_xie_yi_: 'baoMiXieYi', qian_zi_tu_wen_: 'qianZiTuWen', cheng_nuo_han_: 'chengNuoHan', she_bao_: 'sheBao', fu_jian_: 'fuJian', kai_shi_shi_jian_: 'kaiShiShiJian', jie_shu_shi_jian_: 'jieShuShiJian', xue_xiao_: 'xueXiao', zhuan_ye_: 'zhuanYe', xue_li_xue_wei_: 'xueLiXueWei', li_zhi_shi_jian_: 'liZhiShiJian', dan_wei_ming_chen: 'danWeiMingCheng', dan_wei_ming_cheng_: 'danWeiMingCheng', zhi_wei_: 'zhiWei', bu_men_: 'buMen', gong_zuo_nei_rong: 'gongZuoNeiRong', gong_zuo_nei_rong_: 'gongZuoNeiRong', zheng_shu_ming_c_: 'zhengShuMingC', zheng_jian_hao_: 'zhengJianHao', fa_zheng_dan_wei_: 'faZhengDanWei', fa_zheng_shi_jian: 'faZhengShiJian', fa_zheng_shi_jian_: 'faZhengShiJian', dang_an_bao_cun_: 'dangAnBaoCun', huo_jiang_zheng_s: 'huoJiangZhengS', huo_jiang_zheng_s_: 'huoJiangZhengS' } /** 日期类字段(el-date-picker 需要 yyyy-MM-dd 字符串) */ const draftDateFields = [ 'bianZhiShiJian', 'jianDangRiQi', 'chuShengRiQi', 'canJiaGongZuo', 'ruZhiShiJian', 'renZhiShiJian', 'kaiShiShiJian', 'jieShuShiJian', 'liZhiShiJian', 'faZhengShiJian' ] function toYmd(date) { const y = date.getFullYear() const m = String(date.getMonth() + 1).padStart(2, '0') const d = String(date.getDate()).padStart(2, '0') return `${y}-${m}-${d}` } /** 将时间戳 / Date 等非字符串日期转为 yyyy-MM-dd */ function formatDraftDateValue(value) { if (value === undefined || value === null || value === '') { return value === null ? '' : value } if (typeof value === 'string') { const trimmed = value.trim() if (!trimmed) { return '' } if (/^\d{4}-\d{2}-\d{2}/.test(trimmed)) { return trimmed.substring(0, 10) } if (/^\d{10,13}$/.test(trimmed)) { return formatDraftDateValue(Number(trimmed)) } const parsed = new Date(trimmed) if (!isNaN(parsed.getTime()) && trimmed.length >= 8) { return toYmd(parsed) } return trimmed } if (typeof value === 'number' && !Number.isNaN(value)) { let parsed if (value > 1e11) { parsed = new Date(value) } else if (value > 1e9) { parsed = new Date(value * 1000) } if (parsed && !isNaN(parsed.getTime())) { return toYmd(parsed) } return String(value) } if (value instanceof Date && !isNaN(value.getTime())) { return toYmd(value) } return '' } function normalizeDraftDateFields(result = {}) { draftDateFields.forEach((camelKey) => { const snakeKeys = Object.keys(draftSnakeToCamelMap).filter( (k) => draftSnakeToCamelMap[k] === camelKey ) ;[camelKey, ...snakeKeys].forEach((key) => { if ( result[key] !== undefined && result[key] !== null && result[key] !== '' ) { result[key] = formatDraftDateValue(result[key]) } }) if (result[camelKey] && snakeKeys.length) { snakeKeys.forEach((snakeKey) => { result[snakeKey] = result[camelKey] }) } }) if ( result.nian_ling_ !== undefined && result.nian_ling_ !== null && result.nian_ling_ !== '' ) { const age = Number(result.nian_ling_) if (!Number.isNaN(age)) { result.nianLing = age } } else if ( result.nianLing !== undefined && result.nianLing !== null && result.nianLing !== '' ) { const age = Number(result.nianLing) if (!Number.isNaN(age)) { result.nianLing = age } } return result } /** 将 query 返回的单行数据转为驼峰字段名 */ export function normalizeDraftQueryRow(row = {}) { if (!row || typeof row !== 'object') { return row } const result = { ...row } Object.keys(draftSnakeToCamelMap).forEach((snakeKey) => { const camelKey = draftSnakeToCamelMap[snakeKey] if ( result[snakeKey] !== undefined && result[snakeKey] !== null && (result[camelKey] === undefined || result[camelKey] === null || result[camelKey] === '') ) { result[camelKey] = result[snakeKey] } }) if (result.id_ !== undefined && (result.id === undefined || result.id === '')) { result.id = result.id_ } if ( result.parent_id_ !== undefined && (result.parentId === undefined || result.parentId === '') ) { result.parentId = result.parent_id_ } return normalizeDraftDateFields(result) } /** 将 query 返回的多行数据转为驼峰字段名 */ export function normalizeDraftQueryRows(rows = []) { return (rows || []).map((row) => normalizeDraftQueryRow(row)) } function normalizeGzjlRowForPage(row = {}) { const normalized = { ...row } if ( normalized.danWeiMingCheng !== undefined && normalized.danWeiMingCheng !== null && normalized.danWeiMingCheng !== '' ) { normalized.danWeiMingChen = normalized.danWeiMingChen || normalized.danWeiMingCheng } else if ( normalized.danWeiMingChen !== undefined && normalized.danWeiMingChen !== null && normalized.danWeiMingChen !== '' ) { normalized.danWeiMingCheng = normalized.danWeiMingCheng || normalized.danWeiMingChen } return normalized } function hasDraftValue(val) { return val !== undefined && val !== null && val !== '' } function formatDraftFieldValue(camelKey, val) { if (!hasDraftValue(val)) { return '' } return draftDateFields.includes(camelKey) ? formatDraftDateValue(val) : val } /** * 读取 VO 字段值:优先同名属性,其次别名/下划线对应关系 */ function getDraftFieldValue(source = {}, camelKey) { if (hasDraftValue(source[camelKey])) { return formatDraftFieldValue(camelKey, source[camelKey]) } const aliases = draftFieldAliasMap[camelKey] || [] for (const alias of aliases) { if (hasDraftValue(source[alias])) { return formatDraftFieldValue(camelKey, source[alias]) } } const snakeKeys = Object.keys(draftSnakeToCamelMap).filter( (k) => draftSnakeToCamelMap[k] === camelKey ) for (const snakeKey of snakeKeys) { if (hasDraftValue(source[snakeKey])) { return formatDraftFieldValue(camelKey, source[snakeKey]) } } return '' } function getDraftFieldValueFromSources(sources = [], camelKey) { for (const source of sources) { const val = getDraftFieldValue(source || {}, camelKey) if (val !== '') { return val } } return '' } const draftCommonChildFields = [ 'id', 'parentId', 'shiFouGuoShen', 'diDian', 'bianZhiRen', 'bianZhiBuMen', 'bianZhiShiJian', 'kuaiZhao' ] const draftJbqkFields = [ 'jianDangRiQi', 'nianLing', 'chuShengRiQi', 'zuiGaoXueLiX', 'yuanBiYeYuanXi', 'xianCongShiZhua', 'canJiaGongZuo', 'ruZhiShiJian', 'renZhiShiJian', 'xingZhengZhiWu', 'zhiChengDengJi', 'zhiCheng', 'shenFenZhengHao', 'renYuanLeiXing', 'baoMiXieYi', 'qianZiTuWen', 'chengNuoHan', 'sheBao', 'fuJian' ] const draftJyjlFields = [ 'kaiShiShiJian', 'jieShuShiJian', 'xueXiao', 'zhuanYe', 'xueLiXueWei', 'fuJian' ] const draftGzjlFields = [ 'ruZhiShiJian', 'liZhiShiJian', 'danWeiMingCheng', 'zhiWei', 'buMen', 'gongZuoNeiRong' ] const draftZsbFields = [ 'zhengShuMingC', 'zhengJianHao', 'faZhengDanWei', 'faZhengShiJian', 'dangAnBaoCun', 'huoJiangZhengS' ] function pickFields(source = {}, fields = []) { const result = {} fields.forEach((key) => { result[key] = getDraftFieldValue(source, key) }) return result } function toPlainObject(value) { if (value === undefined || value === null) { return value } try { return JSON.parse(JSON.stringify(value)) } catch (error) { return { ...value } } } function toDraftVoString(val) { if (val === undefined || val === null) { return '' } return String(val) } function flattenFirstRowFields(rows = [], fields = []) { const result = {} fields.forEach((key) => { result[key] = rows.length ? toDraftVoString(rows[0][key]) : '' }) return result } function buildDraftChildVoRow( item = {}, parentId, mainMeta, businessFields, index, isNewDraft = false ) { const source = toPlainObject(item) const normalized = normalizeDraftQueryRow(source) const row = {} draftCommonChildFields.forEach((key) => { if (key === 'parentId') { row.parentId = toDraftVoString( parentId || (isNewDraft ? '' : getDraftFieldValue(normalized, 'parentId')) || '' ) return } if (key === 'id') { row.id = toDraftVoString( isNewDraft ? '' : getDraftFieldValue(normalized, 'id') ) return } const selfVal = getDraftFieldValue(normalized, key) row[key] = toDraftVoString( selfVal !== '' ? selfVal : getDraftFieldValue(mainMeta, key) || '' ) }) businessFields.forEach((key) => { row[key] = toDraftVoString(getDraftFieldValue(normalized, key)) }) row.$index = index return row } function mapDraftChildRow( item = {}, parentId, mainMeta, fields, index = 0, isNewDraft = false ) { return buildDraftChildVoRow( item, parentId, mainMeta, fields, index, isNewDraft ) } function normalizeJbqkRow(row = {}) { const normalized = { ...row } if (normalized.fuJian !== undefined && normalized.fuJian !== '') { normalized.fujIan = normalized.fuJian } else if (normalized.fujIan !== undefined && normalized.fujIan !== '') { normalized.fuJian = normalized.fujIan } return normalized } export { normalizeJbqkRow } function hasDraftFieldValues(row = {}, fields = []) { return fields.some( (key) => row[key] !== undefined && row[key] !== null && row[key] !== '' ) } /** * 将 VO / 暂存表查询结果转为页面 personInfoData 子表结构 */ export function parseDraftVoToPageData(voData = {}) { const normalizedVo = normalizeDraftQueryRow(voData) let jbqkList = (voData.jbqkxxzc || []).map((row) => normalizeJbqkRow(normalizeDraftQueryRow(row)) ) let jyjlList = (voData.jyjlzc || []).map((row) => normalizeDraftQueryRow(row)) let gzjlList = (voData.gzjlzc || []).map((row) => normalizeGzjlRowForPage(normalizeDraftQueryRow(row)) ) let zsbList = (voData.zsbzc || []).map((row) => normalizeDraftQueryRow(row)) if (!jbqkList.length || !hasDraftFieldValues(jbqkList[0], draftJbqkFields)) { const fromRoot = normalizeJbqkRow({ ...(jbqkList[0] || {}), ...pickFields(normalizedVo, draftJbqkFields), parentId: jbqkList[0]?.parentId || normalizedVo.id || normalizedVo.id_ || '' }) if (hasDraftFieldValues(fromRoot, draftJbqkFields)) { jbqkList = [fromRoot] } } if (!jyjlList.length || !hasDraftFieldValues(jyjlList[0], draftJyjlFields)) { const fromRoot = { ...(jyjlList[0] || {}), ...pickFields(normalizedVo, draftJyjlFields), parentId: jyjlList[0]?.parentId || normalizedVo.id || normalizedVo.id_ || '' } if (hasDraftFieldValues(fromRoot, draftJyjlFields)) { jyjlList = [fromRoot] } } if (!gzjlList.length || !hasDraftFieldValues(gzjlList[0], draftGzjlFields)) { const fromRoot = normalizeGzjlRowForPage({ ...(gzjlList[0] || {}), ...pickFields(normalizedVo, draftGzjlFields), parentId: gzjlList[0]?.parentId || normalizedVo.id || normalizedVo.id_ || '' }) if (hasDraftFieldValues(fromRoot, draftGzjlFields)) { gzjlList = [fromRoot] } } if (!zsbList.length || !hasDraftFieldValues(zsbList[0], draftZsbFields)) { const fromRoot = { ...(zsbList[0] || {}), ...pickFields(normalizedVo, draftZsbFields), parentId: zsbList[0]?.parentId || normalizedVo.id || normalizedVo.id_ || '' } if (hasDraftFieldValues(fromRoot, draftZsbFields)) { zsbList = [fromRoot] } } return { ryjbqkInfoPoList: jbqkList, educationInfoPoList: jyjlList, workInfoPoList: gzjlList, certificateInfoPoList: zsbList } } /** * VO 字段 → 页面别名字段(同名优先,此处为次级对应关系) */ export const draftFieldAliasMap = { fuJian: ['fujIan'], danWeiMingCheng: ['danWeiMingChen'] } /** * 页面 personInfoData 子表 → VO 子表字段名 */ export const pageToDraftChildMap = { ryjbqkInfoPoList: 'jbqkxxzc', educationInfoPoList: 'jyjlzc', workInfoPoList: 'gzjlzc', certificateInfoPoList: 'zsbzc' } const draftPersonHeaderFields = [ 'name', 'jianDingZiGeZ', 'gender', 'mobile', 'email', 'photo', 'status' ] function buildPersonHeaderSnapshot(data = {}) { const snapshot = {} draftPersonHeaderFields.forEach((key) => { const val = data[key] if (val !== undefined && val !== null && val !== '') { snapshot[key] = val } }) if (!Object.keys(snapshot).length) { return data.kuaiZhao || '' } try { return JSON.stringify(snapshot) } catch (error) { return data.kuaiZhao || '' } } export function parsePersonHeaderSnapshot(kuaiZhao = '') { if (!kuaiZhao || typeof kuaiZhao !== 'string') { return {} } const trimmed = kuaiZhao.trim() if (!trimmed.startsWith('{')) { return {} } try { const parsed = JSON.parse(trimmed) return parsed && typeof parsed === 'object' ? parsed : {} } catch (error) { return {} } } /** * 将页面 personInfoData 转为 saveFormData/vo 所需 data 结构 */ export function buildDraftVoData(data = {}, options = {}) { return buildDraftFormData({ ...options, personInfoData: data }) } /** * 组装 saveFormData/vo 的 data 字段 * 结构: * { * id, shiFouGuoShen, diDian, bianZhiRen, bianZhiBuMen, bianZhiShiJian, kuaiZhao, zhuangTai, renYuan, * jbqkxxzc: [...], jyjlzc: [...], gzjlzc: [...], zsbzc: [...], * ...jbqk/jyjl/gzjl/zsb 首行字段平铺 * } */ export function buildDraftFormData({ draftMainId = '', renYuan = '', personInfoData = {}, userId = '', zhuangTai = '已暂存' }) { const safePersonInfoData = personInfoData && typeof personInfoData === 'object' ? personInfoData : {} const jbqkSrc = safePersonInfoData.ryjbqkInfoPoList?.[0] || {} const jyjlSrc = safePersonInfoData.educationInfoPoList || [] const gzjlSrc = safePersonInfoData.workInfoPoList || [] const zsbSrc = safePersonInfoData.certificateInfoPoList || [] const parentId = draftMainId || '' const isNewDraft = !parentId const mainMeta = { shiFouGuoShen: getDraftFieldValueFromSources( [jbqkSrc, safePersonInfoData], 'shiFouGuoShen' ), diDian: getDraftFieldValueFromSources( [safePersonInfoData, jbqkSrc], 'diDian' ), bianZhiRen: getDraftFieldValueFromSources( [safePersonInfoData, jbqkSrc], 'bianZhiRen' ) || userId || '', bianZhiBuMen: getDraftFieldValueFromSources( [safePersonInfoData, jbqkSrc], 'bianZhiBuMen' ), bianZhiShiJian: getDraftFieldValueFromSources( [safePersonInfoData, jbqkSrc], 'bianZhiShiJian' ), kuaiZhao: getDraftFieldValueFromSources( [safePersonInfoData, jbqkSrc], 'kuaiZhao' ) } const jbqkxxzc = safePersonInfoData.ryjbqkInfoPoList?.length ? [ buildDraftChildVoRow( jbqkSrc, parentId, mainMeta, draftJbqkFields, 0, isNewDraft ) ] : [] const jyjlzc = jyjlSrc.map((item, index) => buildDraftChildVoRow( item, parentId, mainMeta, draftJyjlFields, index, isNewDraft ) ) const gzjlzc = gzjlSrc.map((item, index) => buildDraftChildVoRow( item, parentId, mainMeta, draftGzjlFields, index, isNewDraft ) ) const zsbzc = zsbSrc.map((item, index) => buildDraftChildVoRow( item, parentId, mainMeta, draftZsbFields, index, isNewDraft ) ) return { id: toDraftVoString(parentId), shiFouGuoShen: toDraftVoString(mainMeta.shiFouGuoShen), diDian: toDraftVoString(mainMeta.diDian), bianZhiRen: toDraftVoString(mainMeta.bianZhiRen), bianZhiBuMen: toDraftVoString(mainMeta.bianZhiBuMen), bianZhiShiJian: toDraftVoString(mainMeta.bianZhiShiJian), kuaiZhao: toDraftVoString(mainMeta.kuaiZhao), zhuangTai: toDraftVoString(zhuangTai), renYuan: toDraftVoString(renYuan), jbqkxxzc, jyjlzc, gzjlzc, zsbzc, ...flattenFirstRowFields(jbqkxxzc, draftJbqkFields), ...flattenFirstRowFields(jyjlzc, draftJyjlFields), ...flattenFirstRowFields(gzjlzc, draftGzjlFields), ...flattenFirstRowFields(zsbzc, draftZsbFields) } } /** 暂存相关表名 */ export const draftTableNames = { main: 't_rydazcxxb', jbqk: 't_jbqkxxzc', jyjl: 't_jyjlzc', gzjl: 't_gzjlzc', zsb: 't_zsbzc' } /** * 构建提交后更新暂存主表状态的 update 参数 */ export function buildDraftSubmittedUpdateParams( parentId = '', zhuangTai = '已提交' ) { if (!parentId) { return [] } return [ { tableName: draftTableNames.main, updList: [ { where: { id_: parentId }, param: { zhuang_tai_: zhuangTai } } ] } ] } export default { draftQueryKeys, draftQuerySql, draftChildQueryKeys, draftTableNames, draftFormKey, draftBoCode, pageToDraftChildMap, draftFieldAliasMap, buildDraftVoData, buildDraftFormData, buildDraftSubmittedUpdateParams, parseDraftVoToPageData, parsePersonHeaderSnapshot, normalizeJbqkRow, draftSnakeToCamelMap, normalizeDraftQueryRow, normalizeDraftQueryRows }