编辑页面

修改后将从当前时间重新计算过期时间
格式示例:{"电源":[["单电源",0],["双电源冗余",900]]}。不填则视为无选配。
`; } function parseSpec(txt){ const obj = {}; txt.split('\n').forEach(line=>{ const idx = line.indexOf(':'); if(idx>0){ const k=line.slice(0,idx).trim(), v=line.slice(idx+1).trim(); if(k&&v) obj[k]=v; } }); return obj; } function parseOptions(txt){ try{ const o = JSON.parse(txt||'{}'); return typeof o==='object'&&o!==null?o:{}; } catch(e){ return null; } } function editGood(id){ const g = goods.find(x=>x.id===id); if(!g) return; showModal(goodFormHtml(g, false)); } function saveGood(id){ const g = goods.find(x=>x.id===id); if(!g) return; const patch = readGoodForm(); if(!patch) return; Object.assign(g, patch); closeModal(); renderGoods(); toast('商品已保存'); } function addGood(){ showModal(goodFormHtml({cat:'switch', status:'上架', spec:{}, options:{}}, true)); } function saveNewGood(){ const patch = readGoodForm(); if(!patch) return; const newId = goods.length ? Math.max(...goods.map(x=>x.id)) + 1 : 1; goods.unshift(Object.assign({id:newId}, patch)); closeModal(); renderGoods(); toast('商品已添加'); } function readGoodForm(){ const name = $('eName').value.trim(), brand = $('eBrand').value.trim(), base = parseFloat($('eBase').value); if(!name){ toast('商品名称不能为空'); return null; } if(!brand){ toast('品牌不能为空'); return null; } if(!(base>=0)){ toast('请输入有效价格'); return null; } const spec = parseSpec($('eSpec').value); const options = parseOptions($('eOptions').value); if(options===null){ toast('可选配置 JSON 格式错误'); return null; } return { name, brand, cat:$('eCat').value, base, desc:$('eDesc').value.trim(), status:$('eStatus').value, spec, options }; } function delGood(id){ const g = goods.find(x=>x.id===id); if(!g) return; if(!confirm(`确定删除商品「${g.name}」吗?删除后不可恢复。`)) return; goods = goods.filter(x=>x.id!==id); renderGoods(); toast('商品已删除'); } /* ================= 订单管理 ================= */ let oFilter = {kw:'', st:'全部'}; function renderOrders(){ const list = records.filter(r=>{ const okKw = !oFilter.kw || (r.code+r.customer+r.contact).toLowerCase().includes(oFilter.kw.toLowerCase()); const okSt = oFilter.st==='全部' || r.status===oFilter.st; return okKw && okSt; }); const stN = s => records.filter(r=>r.status===s).length; $('content').innerHTML = `
订单总数
${records.length}
待付款
${stN('待付款')}
笔,等待客户支付
待发货
${stN('待发货')}
笔,可安排发货
已完成(已收货)
${stN('已收货')}
笔,流程结束

订单列表(来自 App 端客户下单)

📄 订单与合同一一对应:客户下单生成订单 DD-xxx,同时自动生成电子合同 HT-xxx。点击合同号可跳转查看对应合同。
${list.map(r=>` `).join('')}
订单号关联合同下单日期客户联系人含税金额付款状态操作
${esc(orderCodeOf(r))} ${esc(r.code)} → ${r.date} ${esc(r.customer)} ${esc(r.contact)} ${money(grandOf(r))} ${stBadge(r.status)}
${list.length===0?'
没有匹配的订单
':''}
`; } function viewOrder(code){ const r = records.find(x=>x.code===code); if(!r) return; const rows = r.items.map((i,idx)=>` ${idx+1}${esc(i.name)} ${money(i.unitPrice)}${i.qty} ${money(i.qty*i.unitPrice)}`).join(''); const sub = r.items.reduce((s,i)=>s+i.qty*i.unitPrice,0); const tax = Math.round(sub*(r.tax||0.13)); showModal(` `); } function editOrder(code){ const r = records.find(x=>x.code===code); if(!r) return; const S = r.status; let actionHtml = '', payRow = ''; if(S==='待付款'){ actionHtml = ``; payRow = `
`; } else if(S==='待发货'){ actionHtml = ``; payRow = `
`; } else if(S==='已发货'){ actionHtml = ``; } else if(S==='已收货'){ actionHtml = ``; } showModal(` `); } function saveOrderStatus(code){ const r = records.find(x=>x.code===code); if(!r) return; const action = $('oAction').value; const note = $('oNote')? $('oNote').value.trim() : ''; const now = new Date().toLocaleString('zh-CN'); if(note) r.remark = (r.remark? r.remark+';':'') + note; if(action==='ship'){ r.status='待发货'; r.paid=true; r.payMethod=$('oPayMethod').value; r.paidAt=now; toast('已确认收款,订单进入待发货'); } else if(action==='unpaid'){ r.status='待付款'; r.paid=false; r.payMethod=''; r.paidAt=''; toast('已撤销收款,恢复为待付款'); } else if(action==='send'){ if(r.status!=='已发货'){ r.status='已发货'; r.shipAt=now; } const company = $('oTrackingCompany') ? $('oTrackingCompany').value.trim() : ''; const no = $('oTrackingNo') ? $('oTrackingNo').value.trim() : ''; if(company) r.trackingCompany = company; if(no) r.trackingNo = no; toast('已标记发货' + (no ? ',物流单号:' + no : '')); } else if(action==='receive'){ r.status='已收货'; r.receiveAt=now; toast('已确认收货'); } else if(action==='back'){ r.status='已发货'; toast('已撤销收货,恢复为已发货'); } else { closeModal(); return; } closeModal(); renderOrders(); } function delOrder(code){ const r = records.find(x=>x.code===code); if(!r) return; if(!confirm(`确定删除订单「${r.code}」吗?删除后不可恢复。`)) return; records = records.filter(x=>x.code!==code); renderOrders(); toast('订单已删除'); } let cFilter = {kw:'', st:'全部'}; function renderContracts(){ const list = records.filter(r=>{ const okKw = !cFilter.kw || (r.code+r.customer).toLowerCase().includes(cFilter.kw.toLowerCase()); const okSt = cFilter.st==='全部' || r.status===cFilter.st; return okKw && okSt; }); $('content').innerHTML = `

合同列表(客户下单自动生成的电子合同)

📄 合同与订单一一对应:每份电子合同 HT-xxx 均来自一笔订单 DD-xxx。点击订单号可跳转查看对应订单。
${list.map(r=>` `).join('')}
合同编号关联订单签约日期买方(甲方)联系人设备项数含税金额付款状态操作
${esc(r.code)} ${esc(orderCodeOf(r))} → ${r.date} ${esc(r.customer)} ${esc(r.contact)} ${r.items.length} 项 ${money(grandOf(r))} ${stBadge(r.status)}
${list.length===0?'
没有匹配的合同
':''}
`; } function viewContract(code){ const r = records.find(x=>x.code===code); if(!r) return; const rows = r.items.map((i,idx)=>` ${idx+1}${esc(i.name)} ${money(i.unitPrice)}${i.qty} ${money(i.qty*i.unitPrice)}`).join(''); const sub = r.items.reduce((s,i)=>s+i.qty*i.unitPrice,0); const tax = Math.round(sub*(r.tax||0.13)); showModal(` `); } function delContract(code){ const r = records.find(x=>x.code===code); if(!r) return; if(!confirm(`确定删除合同「${r.code}」吗?删除后不可恢复。`)) return; records = records.filter(x=>x.code!==code); renderContracts(); toast('合同已删除'); } let cusFilter = ''; function renderCustomers(){ const list = customers.filter(c=> !cusFilter || (c.name+c.contact+c.phone).toLowerCase().includes(cusFilter.toLowerCase())); $('content').innerHTML = `

客户列表(App 端「我的-甲方信息」对应的客户档案)

${list.map(c=>` `).join('')}
客户编号客户单位联系人联系电话邮箱税率结算方式操作
${c.id} ${esc(c.name)} ${esc(c.contact)} ${esc(c.phone)} ${esc(c.email)} ${c.tax} ${esc(c.pay)}
${list.length===0?'
没有匹配的客户
':''}
`; } function customerFormHtml(c, isNew){ return ` `; } function readCustomerForm(){ const name = $('cName').value.trim(), phone = $('cPhone').value.trim(), addr = $('cAddr').value.trim(); if(!name || !phone || !addr){ toast('请完整填写客户单位、联系电话和详细地址'); return null; } return { name, contact:$('cContact').value.trim()||name, phone, email:$('cEmail').value.trim(), addr, tax:$('cTax').value, pay:$('cPay').value, remark:$('cRemark').value.trim() }; } function editCustomer(id){ const c = customers.find(x=>x.id===id); if(!c) return; showModal(customerFormHtml(c, false)); } function saveCustomer(id){ const c = customers.find(x=>x.id===id); if(!c) return; const patch = readCustomerForm(); if(!patch) return; Object.assign(c, patch); closeModal(); renderCustomers(); toast('客户信息已保存'); } function addCustomer(){ showModal(customerFormHtml({tax:'0.13', pay:'对公转账'}, true)); } function saveNewCustomer(){ const patch = readCustomerForm(); if(!patch) return; const maxN = customers.reduce((m,c)=>{ const n=parseInt((c.id||'C000').replace(/\D/g,''))||0; return Math.max(m,n); },0); const newId = 'C' + String(maxN+1).padStart(3,'0'); customers.unshift(Object.assign({id:newId}, patch)); closeModal(); renderCustomers(); toast('客户已添加'); } function delCustomer(id){ const c = customers.find(x=>x.id===id); if(!c) return; if(!confirm(`确定删除客户「${c.name}」吗?删除后不可恢复。`)) return; customers = customers.filter(x=>x.id!==id); renderCustomers(); toast('客户已删除'); } /* 初始化:默认停在登录页 */
取消
访问码: 4epn8tpn