/* ==================== 视图一:项目管理 ==================== */ function renderProjects() { var st = state.projects; $("#view-projects").innerHTML = '
' + '
项目列表' + '' + '
' + '
新建项目时可选择行业模板自动复制维度内容,进入项目后可继续编辑与 AI 分析。
' + '
' + '
' + "
"; $("#pj-add").onclick = projectCreateDialog; var doSearch = Core.debounce(function () { st.kw = $("#pj-search").value.trim(); loadProjects(1); }, 350); $("#pj-search").oninput = doSearch; loadProjects(st.page); } function loadProjects(page) { page = page || 1; var st = state.projects; $("#pj-table").innerHTML = '
'; Core.api("project/list", { name: st.kw, page: page, page_size: 10 }) .then(function (data) { st.list = (data && data.list) || []; st.total = (data && data.total) || 0; st.page = page; renderProjectsTable(); }) .catch(function (e) { $("#pj-table").innerHTML = '
⚠
' + Core.esc(e.message) + "
"; }); } function renderProjectsTable() { var st = state.projects; if (!st.list.length) { $("#pj-table").innerHTML = '
▤
' + (st.kw ? "无匹配项目" : '暂无项目,点击「+ 新增项目」开始
提示:先在管理后台配置行业模板与模型配置效果更佳') + "
"; $("#pj-pager").innerHTML = ""; return; } var activeId = state.project && state.project.projectId; var rows = st.list.map(function (p) { var isActive = String(p.project_id) === String(activeId); var dims = ["client_dimension", "project_dimension", "advicer_dimension", "talk_skill_dimension"].filter(function (k) { return p[k] && String(p[k]).trim(); }).length; return "" + '' + p.project_id + "" + '' + Core.esc(p.name) + "" + (isActive ? ' 当前' : "") + "" + '' + (p.model_sup_id ? '#' + p.model_sup_id + "" : '未配置') + "" + '' + (p.industry_id ? '#' + p.industry_id + "" : '未关联') + "" + ' 0 ? "yellow" : "gray") + '">' + dims + "/4 维度" + '' + Core.fmtTime(p.create_at) + "" + '' + '' + '' + ""; }).join(""); $("#pj-table").innerHTML = '
' + "" + "" + rows + "
ID项目名称模型配置行业模板维度创建时间操作
"; var pages = Math.max(1, Math.ceil(st.total / 10)); $("#pj-pager").innerHTML = '
共 ' + st.total + " 条 · 第 " + st.page + "/" + pages + ' 页' + '" + '
"; $(".pg-prev").onclick = function () { loadProjects(st.page - 1); }; $(".pg-next").onclick = function () { loadProjects(st.page + 1); }; function enterProject(id) { console.log("[enterProject] id=", id, "list len=", st.list.length); var p = st.list.filter(function (x) { return String(x.project_id) === String(id); })[0]; if (!p) { Core.toast("未找到项目", "err"); return; } console.log("[enterProject] found project:", p.project_id, p.name); setActiveProject(p); Core.toast("已进入项目:" + p.name, "ok"); setTimeout(function () { switchView("data"); }, 50); } $$("#pj-table .pj-enter").forEach(function (b) { b.onclick = function (e) { e.stopPropagation(); enterProject(b.dataset.id); }; }); $$("#pj-table .pj-enter-link").forEach(function (b) { b.onclick = function () { enterProject(b.dataset.id); }; }); $$("#pj-table .pj-set").forEach(function (b) { b.onclick = function (e) { e.stopPropagation(); var p = st.list.filter(function (x) { return String(x.project_id) === b.dataset.id; })[0]; if (!p) return; setActiveProject(p); setTimeout(function () { switchView("projectDetail"); }, 50); }; }); } function projectCreateDialog() { var m = Core.modal({ title: "新增项目", body: '
' + '
项目内所有 AI 能力(分析/对话)将使用该模型配置
' + '
选择后自动把行业模板的维度内容复制到项目,可在项目设置中继续编辑
', footer: '' }); loadModelsupOptions($("#pc-model", m.root), null).catch(function (e) { Core.toast(e.message, "err"); }); loadIndustryOptions($("#pc-industry", m.root), null).catch(function (e) { Core.toast(e.message, "err"); }); $(".mf-cancel", m.root).onclick = m.close; $(".mf-save", m.root).onclick = function () { var name = $("#pc-name", m.root).value.trim(); var modelSupId = Number($("#pc-model", m.root).value); var industryId = Number($("#pc-industry", m.root).value) || 0; if (!name) { Core.toast("请填写项目名称", "err"); return; } if (!modelSupId) { Core.toast("请选择模型配置", "err"); return; } Core.loading(true, "创建项目中…"); Core.api("project/base/init", { name: name, modelSupId: modelSupId, industryId: industryId }) .then(function (data) { Core.loading(false); m.close(); var pid = data && data.projectId; Core.toast("项目创建成功 #" + pid + (industryId ? "(已复制行业模板)" : ""), "ok"); setActiveProject({ projectId: pid, name: name }); loadProjects(1); switchView("projectDetail"); }) .catch(function (e) { Core.loading(false); Core.toast(e.message, "err"); }); }; }