/* ==================== 视图一:项目管理 ==================== */
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 =
'' +
"| ID | 项目名称 | 模型配置 | 行业模板 | 维度 | 创建时间 | 操作 | " +
"
" + rows + "
";
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"); });
};
}