liyong
3 天以前 93b8ceac34e2fbd5c57fe5ab4f5bac32c85408aa
src/views/officeProcessAutomation/EnterpriseNews/news-manage/enterpriseNewsUtils.js
@@ -8,13 +8,62 @@
  { 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",
};
/** 后端数字状态码 → 枚举(0 草稿 1 待审批 2 已发布 3 驳回 4 已下线) */
const ENTERPRISE_NEWS_STATUS_NUMERIC_MAP = {
  0: "DRAFT",
  1: "PENDING",
  2: "PUBLISHED",
  3: "REJECTED",
  4: "OFFLINE",
};
const ENTERPRISE_NEWS_STATUS_LABEL_MAP = {
  草稿: "DRAFT",
  待审批: "PENDING",
  已发布: "PUBLISHED",
  驳回: "REJECTED",
  已驳回: "REJECTED",
  已下线: "OFFLINE",
};
/** 统一为后端状态枚举值 */
export function normalizeEnterpriseNewsStatus(v) {
  if (v == null || v === "") return "DRAFT";
  if (typeof v === "number" || (typeof v === "string" && /^\d+$/.test(v.trim()))) {
    const numKey = ENTERPRISE_NEWS_STATUS_NUMERIC_MAP[Number(v)];
    if (numKey) return numKey;
  }
  const raw = String(v).trim();
  if (ENTERPRISE_NEWS_STATUS_LABEL_MAP[raw]) {
    return ENTERPRISE_NEWS_STATUS_LABEL_MAP[raw];
  }
  const upper = raw.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[raw.toLowerCase()];
  if (legacy) return legacy;
  return upper;
}
/** 排版模板 */
export const LAYOUT_TEMPLATE_OPTIONS = [
@@ -40,8 +89,6 @@
  { value: "editor", label: "内容编辑" },
];
export const STORAGE_KEY = "oa_enterprise_news_v1";
/** 目标受众(对接组织架构 API 前为空) */
export const MOCK_AUDIENCE = [];
@@ -65,11 +112,13 @@
}
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) {
@@ -101,7 +150,7 @@
    readScope: "all",
    targetDeptIds: [],
    targetUserIds: [],
    publishStatus: "draft",
    publishStatus: "DRAFT",
    publisherName: "",
    publishTime: "",
    readRecords: [],
@@ -111,56 +160,9 @@
    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 [];
}
export function loadStoredNews() {
  try {
    const raw = localStorage.getItem(STORAGE_KEY);
    if (!raw) return null;
    const data = JSON.parse(raw);
    return Array.isArray(data) ? data : null;
  } catch {
    return null;
  }
}
export function saveStoredNews(rows) {
  try {
    localStorage.setItem(STORAGE_KEY, JSON.stringify(rows));
  } catch {
    /* ignore */
  }
}
/** 按阅读范围解析目标受众 */
@@ -192,17 +194,6 @@
  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) {