编辑页面

修改后将从当前时间重新计算过期时间
`; } function renderProjectProgress() { return `
8
进行中
2
延期预警
5
已结项
12
总任务
项目-任务关联
项目名称负责人任务分配给截止日期状态进度操作
汽车涂料配方优化王建国配方小试 v1王建国2026-07-10${statusTag('进行中')}
80%
耐黄变测试张莉2026-07-15${statusTag('进行中')}
40%
UV固化树脂开发李强树脂合成实验李强2026-08-01${statusTag('进行中')}
55%
`; } function renderProjectArchive() { return `
${mockProjects.filter(p => p.status === '已结项').length === 0 ? `
暂无归档项目
已结项的项目将自动归档至此处
` : mockProjects.filter(p => p.status === '已结项').map(p => `
${p.name}
${p.id} · 负责人:${p.manager} · 截止:${p.deadline}
`).join('')}
`; } function renderFormulaList() { return `
配方名称所属项目当前版本负责人创建日期最近修改状态操作
汽车涂料配方
机密
汽车涂料配方优化v3.3${avatar('王')} 王建国2026-01-152026-07-01${statusTag('进行中')}
UV固化树脂配方
内部
UV固化树脂开发v2.1${avatar('李')} 李强2026-02-202026-06-28${statusTag('进行中')}
耐高温涂层配方
公开
耐高温涂层体系v5.0${avatar('王')} 王建国2025-10-012026-06-20${statusTag('已结项')}
`; } function renderFormulaAdd() { return `
配方基本信息
️ 工艺参数
原料配方
序号原料名称规格用量单位备注
1
2
3
`; } function renderFormulaReport() { return `
检测指标记录
检测项目检测结果标准值判定检测方法
附着力0~1级合格GB/T 9286
耐黄变性ΔE≤2.0合格GB/T 23987
水洗留存率≥95%合格企业内部方法
硬度≥H合格GB/T 6739
光泽度≥80 GU合格GB/T 9754
`; } function renderFormulaVersion() { return `
汽车涂料配方 v3 版本历史
v3.0
2026-01-15
v3.1
2026-04-10
v3.2
2026-06-01
3
v3.3
2026-07-01
?
v3.4
待发布
版本变更类型变更说明修改人修改时间状态操作
v3.3参数调整调整固化剂用量 15% → 18%,固化时间缩短 30min${avatar('王')} 王建国2026-07-01 13:50${statusTag('进行中')}
v3.2新增添加耐黄变助剂,耐黄变性能提升 20%${avatar('王')} 王建国2026-06-01 10:20历史
v3.1优化替换钛白粉品牌,光泽度提升 5 GU${avatar('张')} 张莉2026-04-10 15:30历史
v3.0初始初始配方创建${avatar('王')} 王建国2026-01-15 09:00历史
`; } function renderMaterialLedger() { return `
${mockMaterials.map(m => ` `).join('')}
物料编号物料名称规格当前库存安全库存供应商状态操作
${m.id} ${m.name} ${m.spec} ${m.stock} ${m.unit} ${m.safeStock} ${m.unit} ${m.supplier} ${stockStatusTag(m.status)}
`; } function renderMaterialInout() { return `
快捷入库
最近操作记录
操作类型物料名称数量关联项目操作人时间
领用异丙醇5 kg汽车涂料配方优化${avatar('张')} 张莉2026-07-01 10:05
入库环氧树脂 E-51100 kg${avatar('陈')} 陈敏2026-06-30 14:30
领用钛白粉 R-90210 kgUV固化树脂开发${avatar('李')} 李强2026-06-28 09:15
入库固化剂 T-3150 kg${avatar('陈')} 陈敏2026-06-25 11:00
领用二甲苯8 kg汽车涂料配方优化${avatar('王')} 王建国2026-06-20 16:45
`; } function renderMaterialSample() { return `
留样编号配方名称项目编号留样量存放位置留样日期有效期状态操作
SMP-2026-001汽车涂料配方 v3.2PRJ-2026-001500gA-03-052026-06-012027-06-01正常
SMP-2026-002UV固化树脂配方 v2.0PRJ-2026-003300gB-01-122026-05-152027-05-15正常
SMP-2026-003耐高温涂层配方 v5.0PRJ-2026-0051kgA-02-082026-06-202027-06-20临近到期
`; } function renderUserList() { return `
${mockUsers.map(u => ` `).join('')}
用户编号姓名角色部门手机号最后登录状态操作
${u.id} ${avatar(u.name)}${u.name} ${u.role} ${u.dept} ${u.phone} ${u.lastLogin} ${statusTag(u.status)}
`; } function renderUserRole() { return `
${[ { role: '系统管理员', desc: '全系统最高权限,可管理所有模块', color: 'red', count: 1 }, { role: '研发总监', desc: '可审批所有立项、变更、结项申请', color: 'purple', count: 1 }, { role: '研发主管', desc: '管理部门项目、审批工程师申请', color: 'blue', count: 1 }, { role: '研发工程师', desc: '仅可查看本人负责项目、录入实验', color: 'green', count: 3 }, { role: '仓管员', desc: '管理物料台账、审批领用申请', color: 'orange', count: 1 }, { role: '查看者(访客)', desc: '仅可查看已授权的公开信息', color: 'gray', count: 0 }, ].map(r => `
${avatar(r.role.charAt(0), r.color)}
${r.role}
${r.count} 人
${r.desc}
查看权限 编辑权限
`).join('')}
配方数据隔离规则
隔离维度
按「项目」隔离,工程师仅可见本人参与项目
权限分级
机密(仅本人+主管)→ 内部(部门可见)→ 公开(全研发部)
配方修改
需提交变更申请 → 主管审批 → 自动生成新版本
导出控制
机密配方禁止导出,导出操作全程记录
`; } function renderAuditLog() { return `
${mockAuditLogs.map(l => ` `).join('')}
序号操作人操作类型操作对象操作时间IP地址
${l.id} ${avatar(l.user)} ${l.user} ${l.action} ${l.target} ${l.time} ${l.ip}
`; } // ========== 工程师端页面渲染函数 ========== function renderEngMyTasks() { const todo = mockEngTasks.filter(t => t.status !== '已完成'); const done = mockEngTasks.filter(t => t.status === '已完成'); return `
${todo.length}
待办任务
${mockEngTasks.filter(t=>t.status==='进行中').length}
进行中
${done.length}
已完成
1
即将到期
待办 / 进行中 ${todo.length}
${todo.map(t => `
${t.name}
项目:${t.project} · 截止:${t.deadline}
${statusTag(t.status)}
`).join('')}
已完成 ${done.length}
${done.map(t => `
${t.name}
项目:${t.project} · 完成日期:${t.deadline}
${statusTag(t.status)}
`).join('')}
`; } function renderEngMyProjects() { return `
${mockEngProjects.map(p => `
${p.name}
${p.id} · ${p.type} · 角色:${p.role}
${statusTag(p.status)}
项目进度${p.progress}%
${p.doneTasks}/${p.tasks}
完成任务
截止日期
${p.deadline}
`).join('')}
`; } function renderEngNewExp() { return `
实验基本信息
️ 工艺参数记录
检测数据(本次实验结果)
检测项目检测结果单位是否符合预期备注
附件上传
点击或拖拽上传检测报告、图片等附件
支持 PDF、Word、图片格式,单个文件≤20MB
`; } function renderEngTestData() { return `
选择实验批次
性能指标检测
检测指标检测方法本次结果标准值判定
附着力GB/T 92860~1级合格
耐黄变性 ΔEGB/T 23987ΔE≤2.0合格
水洗留存率企业内部方法≥95%合格
光泽度 (60°)GB/T 9754≥80 GU合格
铅笔硬度GB/T 6739≥H合格
`; } function renderEngExpHistory() { return `
${mockEngExperiments.map(e => ` `).join('')}
实验编号关联项目配方版本实验类型检测结果日期操作
${e.id} ${e.project} ${e.formula} ${e.type} ${e.result === '通过' ? ' 通过' : ' 待出结果'} ${e.date}
`; } function renderEngMyFormula() { return `
按权限可见配方
配方数据仅限本人查看,禁止外传
${mockEngFormulas.map(f => ` `).join('')}
配方名称所属项目当前版本保密级别最近更新操作
${f.name} ${f.project} ${f.version} ${f.level} ${f.lastUpdate}
`; } function renderEngChangeFormula() { return `
变更申请信息
新旧参数对比
参数名称当前值建议新值变更幅度变更理由
变更依据(可选)
点击上传实验数据、检测报告等支持文件
`; } function renderEngApplyMaterial() { return `
发起领用
领用记录
${mockEngMaterialApply.map(a => ` `).join('')}
申请编号物料名称数量关联项目申请日期审批状态审批人
${a.id} ${a.material} ${a.qty} ${a.project} ${a.applyDate} ${a.status === '已通过' ? ' 已通过' : ' 待审批'} ${a.approver}
`; } function renderEngMyApply() { return `
${mockEngMyApply.map(a => ` `).join('')}
申请编号申请类型关联项目申请内容申请日期当前环节状态操作
${a.id} ${a.type} ${a.project} ${a.content} ${a.applyDate} ${a.level} ${statusTag(a.status)}
`; } function renderEngPendingApproval() { return `
工程师无审批权限
暂无审批任务
审批权限仅对「研发主管」及以上角色开放
您作为「研发工程师」,可在此查看他人的申请进度
您可以:
查看我的申请
查看您发起的所有申请及审批进度
查看我的任务
查看当前待办和进行中的实验任务
`; } function renderEngUpdateProgress() { return `
选择任务并更新进度
${mockEngTasks.filter(t => t.status !== '已完成').map(t => `
${t.name}
${t.project} · 截止:${t.deadline}
${statusTag(t.status)}
当前进度${t.status==='待开始'?'0':t.status==='进行中'?'50':'100'}%
`).join('')}
`; } function renderEngArchiveView() { const archivedProjects = [{ id: 'PRJ-2025-008', name: '耐高温涂层体系', closeDate: '2026-06-20', formulas: 3, reports: 5, leader: '王建国' }]; return `
${archivedProjects.length === 0 ? `
暂无归档项目
已结项的项目将自动归档至此处
` : archivedProjects.map(p => `
${p.name}
${p.id} · 结项日期:${p.closeDate} · 负责人:${p.leader}
已归档
${p.formulas}
配方版本
${p.reports}
实验报告
${p.formulas}
留样记录
`).join('')}
`; } function submitMaterialApply() { const mat = document.getElementById('applyMaterial').value; const qty = document.getElementById('applyQty').value; if (!mat || !qty) { showToast('请填写完整信息', 'error'); return; } openConfirm(`确认提交「${qty}kg」的物料领用申请?`, () => { showToast('领用申请已提交,等待仓管审批!', 'success'); navigateTo('eng-apply-material'); }); } // ---- 页面交互事件 ---- function bindPageEvents() { // 表单处理等 } function navigateTo(pageId) { renderPage(pageId); } // ---- 端切换 ---- function switchEnd(end) { currentEnd = end; const cfg = END_CONFIG[end]; // 更新顶部端按钮 document.getElementById('end-admin').classList.toggle('active', end === 'admin'); document.getElementById('end-engineer').classList.toggle('active', end === 'engineer'); // 更新用户信息 document.getElementById('userAvatar').textContent = cfg.user.avatar; document.getElementById('userName').textContent = cfg.user.name; document.getElementById('userRole').innerHTML = cfg.user.role; // 面包屑已移除 // 切换到第一个模块 currentModule = Object.keys(cfg.modules)[0]; currentPage = cfg.modules[currentModule].menus[0].id; renderSidebar(currentModule); renderPage(currentPage); } // 更新面包屑 function updateBreadcrumb() { const cfg = END_CONFIG[currentEnd]; const modCfg = cfg?.modules[currentModule]; const breadcrumb = document.getElementById('breadcrumb'); if (breadcrumb) { breadcrumb.innerHTML = ` ${currentEnd === 'admin' ? ' 管理端' : ' 工程师端'} / ${modCfg?.label || ''} `; } } // 模块切换 document.querySelectorAll('.module-tab').forEach(tab => { tab.addEventListener('click', () => { document.querySelectorAll('.module-tab').forEach(t => t.classList.remove('active')); tab.classList.add('active'); const module = tab.dataset.module; currentModule = module; // 默认显示该模块第一个菜单 const firstMenu = MODULE_CONFIG[module]?.menus[0]?.id; if (firstMenu) { renderSidebar(module); renderPage(firstMenu); } }); }); // 消息弹窗 document.getElementById('msgBtn').addEventListener('click', () => { document.getElementById('msgModal').classList.add('show'); }); document.getElementById('closeMsgModal').addEventListener('click', () => { document.getElementById('msgModal').classList.remove('show'); }); document.getElementById('msgModal').addEventListener('click', (e) => { if (e.target === document.getElementById('msgModal')) document.getElementById('msgModal').classList.remove('show'); }); // ---- 业务操作函数 ---- function doApprove(id) { const approval = mockApprovals.find(a => a.id === id); if (!approval) return; openConfirm(`确认审批通过「${approval.project}」的${approval.type}申请?`, () => { approval.status = '已通过'; approval.level = '已归档'; showToast(`「${approval.project}」审批已通过!`, 'success'); renderPage(currentPage); }); } function submitProject() { openConfirm('确认提交此立项申请?提交后将进入审批流程。', () => { showToast('立项申请已提交,等待主管审批!', 'success'); navigateTo('approval-project'); }); } function submitFormula() { showToast('配方已保存,版本号 v1.0 创建成功!', 'success'); navigateTo('formula-list'); } function showAddUserModal() { showToast('打开新增用户弹窗', 'info'); } function toggleUserStatus(id) { showToast(`用户 ${id} 已禁用`, 'warn'); } function exportTable() { showToast('数据导出中,请稍候...', 'success'); setTimeout(() => showToast('导出完成!', 'success'), 1200); } function showApprovalDetail(id) { showToast(`查看申请 ${id} 详情`, 'info'); } // ---- 确认弹窗 ---- function openConfirm(msg, onOk) { const modal = document.getElementById('confirmModal'); document.getElementById('confirmMsg').textContent = msg; modal.classList.add('show'); document.getElementById('confirmOk').onclick = () => { modal.classList.remove('show'); if (onOk) onOk(); }; } function closeConfirm() { document.getElementById('confirmModal').classList.remove('show'); } // ---- 初始化 ---- (function init() { // 默认加载管理端 currentEnd = 'admin'; currentModule = 'dashboard'; currentPage = 'dashboard-home'; renderSidebar('dashboard'); renderPage('dashboard-home'); })(); 取消
访问码: rzdm4jbd