|
|
@@ -557,32 +557,38 @@ const filterOptions: PolicyListFilterOption[] = ["所有分类", "只看免申
|
|
|
const currentFilterOption = ref<PolicyListFilterOption>("所有分类");
|
|
|
const showFilterMenu = ref(false);
|
|
|
|
|
|
-// 兜底部门列表(仅在拿不到卡片数据时使用)
|
|
|
-const DEFAULT_DEPTS = [
|
|
|
- "区发改委",
|
|
|
- "区经委",
|
|
|
- "区商务委",
|
|
|
- "区科委",
|
|
|
- "区市场监管局",
|
|
|
- "区人社局",
|
|
|
- "区文旅局",
|
|
|
- "区农业农村委",
|
|
|
- "区体育局",
|
|
|
- "区人才局",
|
|
|
- "区财政局",
|
|
|
- "区教育局",
|
|
|
- "区卫健委",
|
|
|
- "区民政局",
|
|
|
- "区退役军人事务局"
|
|
|
-];
|
|
|
-
|
|
|
/**
|
|
|
- * 部门筛选项。
|
|
|
- * 对话内(记录模式)用卡片数据里真实出现的部门,
|
|
|
- * 否则原来那 15 个硬编码部门大多筛不到内容,且弹出层过高会被面板裁切。
|
|
|
+ * 部门筛选项:**只列数据里实际存在的部门**(用户 2026-09-24 明确要求)。
|
|
|
+ *
|
|
|
+ * 历史:这里曾经是一份**硬编码的 15 个部门**(用户早先要求"保持最初的样子"),
|
|
|
+ * 于是新数据里出现别的部门就筛不到、固定列表里也可能有库里根本没有的部门(选了空列表)。
|
|
|
+ * 现在改为从「惠企政策库 + 本会话卡片」现算。
|
|
|
+ *
|
|
|
+ * ⚠️ 用 ref + 手动刷新,**不用 computed**:`globalThis.policiesPublic` 由 index.html 异步加载、
|
|
|
+ * 不是响应式依赖(详见 `getLibraryPolicies` 的注释),computed 会把首次读到的空列表缓存住。
|
|
|
+ * 所以在**打开菜单时**现算一次(那时数据早已加载完)。
|
|
|
*/
|
|
|
-// 部门筛选项:固定为最初的那 15 个部门
|
|
|
-const deptOptions = computed(() => ["全部部门", ...DEFAULT_DEPTS]);
|
|
|
+const deptOptions = ref<string[]>(["全部部门"]);
|
|
|
+
|
|
|
+const collectDeptOptions = (): string[] => {
|
|
|
+ const clean = (values: unknown[]) =>
|
|
|
+ values.map((value) => String(value ?? "").trim()).filter(Boolean);
|
|
|
+ const fromLibrary = clean(getLibraryPolicies().map((item) => item?.["政策所属部门"]));
|
|
|
+ const fromCards = clean(policies.value.map((item) => item?.source));
|
|
|
+ const unique = [...new Set([...fromLibrary, ...fromCards])].sort((a, b) =>
|
|
|
+ a.localeCompare(b, "zh-CN")
|
|
|
+ );
|
|
|
+ return ["全部部门", ...unique];
|
|
|
+};
|
|
|
+
|
|
|
+const refreshDeptOptions = () => {
|
|
|
+ const next = collectDeptOptions();
|
|
|
+ deptOptions.value = next;
|
|
|
+ // 选中的部门若已不在数据里(数据换了),退回"全部部门",否则会筛出空列表还没提示
|
|
|
+ if (!next.includes(currentDeptFilter.value)) {
|
|
|
+ currentDeptFilter.value = "全部部门";
|
|
|
+ }
|
|
|
+};
|
|
|
|
|
|
const currentDeptFilter = ref("全部部门");
|
|
|
const showDeptMenu = ref(false);
|
|
|
@@ -600,8 +606,11 @@ const toggleFilterMenu = () => {
|
|
|
};
|
|
|
|
|
|
const toggleDeptMenu = () => {
|
|
|
- showDeptMenu.value = !showDeptMenu.value;
|
|
|
+ const willOpen = !showDeptMenu.value;
|
|
|
+ showDeptMenu.value = willOpen;
|
|
|
showFilterMenu.value = false;
|
|
|
+ // 打开时才现算部门清单(数据是异步加载的、且没有响应式依赖)
|
|
|
+ if (willOpen) refreshDeptOptions();
|
|
|
};
|
|
|
|
|
|
const selectFilter = (opt: PolicyListFilterOption) => {
|
|
|
@@ -926,7 +935,7 @@ const listPolicyItems = computed(() => {
|
|
|
/* ──────────────────────────────────────────────────────────────────────────
|
|
|
* 惠企政策库相关
|
|
|
*
|
|
|
- * 惠企政策 = policies_public.v1.json 里的那些政策(262 条申报事项 / 38 个政策,
|
|
|
+ * 惠企政策 = policies_public.v2.json 里的那些政策(170 条申报事项 / 25 个政策,
|
|
|
* 由 index.html 预加载到 globalThis.policiesPublic)。
|
|
|
* 判定优先用接口下发的 is_policy_library 字段,缺失时回退到"标题能在库里找到"。
|
|
|
* ────────────────────────────────────────────────────────────────────────── */
|
|
|
@@ -955,7 +964,7 @@ const selectedIsPolicyLibrary = computed(() =>
|
|
|
);
|
|
|
|
|
|
/**
|
|
|
- * 构建惠企政策库列表(从 policies_public.v1.json)。
|
|
|
+ * 构建惠企政策库列表(从 policies_public.v2.json)。
|
|
|
* 本轮匹配到的惠企政策置顶,其余保持库内原顺序。
|
|
|
*/
|
|
|
const buildLibraryPolicyList = () => {
|
|
|
@@ -1047,7 +1056,7 @@ let policyListRequestId = 0;
|
|
|
const fetchPolicyList = async () => {
|
|
|
if (!props.recordMode || !panelVisible.value || panelMode.value !== "list") return;
|
|
|
|
|
|
- // 政策事项列表统一来自惠企政策库(policies_public.v1.json)
|
|
|
+ // 政策事项列表统一来自惠企政策库(policies_public.v2.json)
|
|
|
if (getLibraryPolicies().length) {
|
|
|
buildLibraryPolicyList();
|
|
|
return;
|
|
|
@@ -1262,11 +1271,13 @@ const openDetailByItem = async (item: { originalData?: RawPolicyItem; support_ob
|
|
|
* `openCardList()` 的「政策列表」侧边栏(本会话卡片聚合、无筛选)。
|
|
|
* 本条路径现在只由惠企政策详情的「返回政策事项列表」使用。
|
|
|
*
|
|
|
- * 列表数据统一来自惠企政策库(policies_public.v1.json),本轮匹配到的惠企政策置顶。
|
|
|
+ * 列表数据统一来自惠企政策库(policies_public.v2.json),本轮匹配到的惠企政策置顶。
|
|
|
*/
|
|
|
const openPolicyList = async () => {
|
|
|
selectedPolicyOverride.value = null;
|
|
|
panelMode.value = "list";
|
|
|
+ // 面板打开即刷新部门清单(库是异步加载的,见 deptOptions 的说明)
|
|
|
+ refreshDeptOptions();
|
|
|
|
|
|
// 每次进入都重置筛选:部门 / 分类 / 关键词 / 页码
|
|
|
// 否则上次的筛选会残留,表现为"条目少"或"筛不出东西"
|
|
|
@@ -1296,6 +1307,7 @@ const openPolicyList = async () => {
|
|
|
const openCardList = async () => {
|
|
|
selectedPolicyOverride.value = null;
|
|
|
panelMode.value = "cardList";
|
|
|
+ refreshDeptOptions();
|
|
|
|
|
|
currentPage.value = 1;
|
|
|
searchKeyword.value = "";
|