| | |
| | | { value: "culture", label: "文化活动", color: "#67c23a" }, |
| | | ]; |
| | | |
| | | /** 发布状态 */ |
| | | /** 企业新闻状态(与后端枚举一致) */ |
| | | export const PUBLISH_STATUS_OPTIONS = [ |
| | | { value: "draft", label: "草稿", tag: "info" }, |
| | | { value: "pending_review", label: "待审核", tag: "warning" }, |
| | | { value: "published", label: "已发布", tag: "success" }, |
| | | { value: "archived", label: "已归档", tag: "" }, |
| | | { value: "DRAFT", label: "草稿", tag: "info" }, |
| | | { value: "PENDING", label: "待审批", tag: "warning" }, |
| | | { value: "PUBLISHED", label: "已发布", tag: "success" }, |
| | | { value: "REJECTED", label: "驳回", tag: "danger" }, |
| | | { value: "OFFLINE", label: "已下线", tag: "info" }, |
| | | ]; |
| | | |
| | | /** 企业新闻列表筛选 */ |
| | | export const ENTERPRISE_NEWS_STATUS_SEARCH_OPTIONS = [...PUBLISH_STATUS_OPTIONS]; |
| | | |
| | | const LEGACY_PUBLISH_STATUS_MAP = { |
| | | draft: "DRAFT", |
| | | pending_review: "PENDING", |
| | | published: "PUBLISHED", |
| | | archived: "OFFLINE", |
| | | }; |
| | | |
| | | /** 统一为后端状态枚举值 */ |
| | | export function normalizeEnterpriseNewsStatus(v) { |
| | | if (v == null || v === "") return "DRAFT"; |
| | | const upper = String(v).trim().toUpperCase(); |
| | | if (upper === "APPROVED") return "PUBLISHED"; |
| | | const hit = PUBLISH_STATUS_OPTIONS.find((x) => x.value === upper); |
| | | if (hit) return hit.value; |
| | | const legacy = LEGACY_PUBLISH_STATUS_MAP[String(v).trim().toLowerCase()]; |
| | | if (legacy) return legacy; |
| | | return upper; |
| | | } |
| | | |
| | | /** 排版模板 */ |
| | | export const LAYOUT_TEMPLATE_OPTIONS = [ |
| | |
| | | { value: "editor", label: "内容编辑" }, |
| | | ]; |
| | | |
| | | export const STORAGE_KEY = "oa_enterprise_news_v1"; |
| | | |
| | | /** 目标受众(对接组织架构 API 前为空) */ |
| | | export const MOCK_AUDIENCE = []; |
| | | |
| | |
| | | } |
| | | |
| | | export function publishStatusLabel(v) { |
| | | return PUBLISH_STATUS_OPTIONS.find((x) => x.value === v)?.label || v || "—"; |
| | | const key = normalizeEnterpriseNewsStatus(v); |
| | | return PUBLISH_STATUS_OPTIONS.find((x) => x.value === key)?.label || v || "—"; |
| | | } |
| | | |
| | | export function publishStatusTag(v) { |
| | | return PUBLISH_STATUS_OPTIONS.find((x) => x.value === v)?.tag || "info"; |
| | | const key = normalizeEnterpriseNewsStatus(v); |
| | | return PUBLISH_STATUS_OPTIONS.find((x) => x.value === key)?.tag || "info"; |
| | | } |
| | | |
| | | export function layoutTemplateLabel(v) { |
| | |
| | | readScope: "all", |
| | | targetDeptIds: [], |
| | | targetUserIds: [], |
| | | publishStatus: "draft", |
| | | publishStatus: "DRAFT", |
| | | publisherName: "", |
| | | publishTime: "", |
| | | readRecords: [], |
| | |
| | | versions: [], |
| | | versionNo: 1, |
| | | requireReadConfirm: false, |
| | | templateId: null, |
| | | templateName: "", |
| | | }; |
| | | } |
| | | |
| | | function buildReadRecords(readUserIds = []) { |
| | | return (readUserIds || []).map((userId) => ({ |
| | | userId, |
| | | employeeNo: "", |
| | | name: "", |
| | | deptName: "", |
| | | readAt: "", |
| | | lastRemindAt: "", |
| | | })); |
| | | } |
| | | |
| | | function createVersionSnapshot(row, changeNote = "发布") { |
| | | return { |
| | | versionNo: row.versionNo || 1, |
| | | title: row.title, |
| | | summary: row.summary, |
| | | contentHtml: row.contentHtml, |
| | | newsType: row.newsType, |
| | | publishTime: row.publishTime || dayjs().format("YYYY-MM-DD HH:mm:ss"), |
| | | archivedAt: dayjs().format("YYYY-MM-DD HH:mm:ss"), |
| | | changeNote, |
| | | publisherName: row.publisherName || "系统", |
| | | }; |
| | | } |
| | | |
| | | /** @deprecated 不再注入演示数据,初始列表为空 */ |
| | | export function createInitialMockNews() { |
| | | return []; |
| | | } |
| | | |
| | | /** 不再使用前端本地缓存,列表数据以接口为准;并清除历史 localStorage 数据 */ |
| | | export function loadStoredNews() { |
| | | try { |
| | | localStorage.removeItem(STORAGE_KEY); |
| | | } catch { |
| | | /* ignore */ |
| | | } |
| | | return []; |
| | | } |
| | | |
| | | /** @deprecated 保留空实现,避免旧调用报错;不做任何持久化 */ |
| | | export function saveStoredNews() {} |
| | | |
| | | /** 按阅读范围解析目标受众 */ |
| | | export function resolveTargetAudience(row) { |
| | |
| | | if (!audience.length) return 0; |
| | | const readCount = (row.readRecords || []).filter((r) => r.readAt).length; |
| | | return Math.round((readCount / audience.length) * 100); |
| | | } |
| | | |
| | | export function nextNewsNo() { |
| | | return `EN${dayjs().format("YYYYMMDD")}${String(Math.floor(Math.random() * 9000) + 1000)}`; |
| | | } |
| | | |
| | | export function pushVersionBeforeUpdate(row, changeNote) { |
| | | const versions = row.versions || []; |
| | | versions.unshift(createVersionSnapshot(row, changeNote)); |
| | | row.versions = versions; |
| | | row.versionNo = (row.versionNo || 1) + 1; |
| | | } |
| | | |
| | | export function validateNewsForm(form) { |