🤖 AI 提醒
{{it.title}} {{it.count}}
让 AI 帮我处理 →
待审核单据 / AI 预警(按优先级)
消息列表 全部已读
{{row.title}}
去处理
已读
主数据
产品
客户
供应商
批量标签
新增{{({materials:'产品',customers:'客户',suppliers:'供应商'})[masterType]}}
查询
共 {{mdTotal}} 条
—
{{row.name}}
{{row.spec}}
· {{row.model}}
· {{row.brand}}
{{row.category_label||row.category||'未分类'}}
{{row.type_label||row.material_type||'-'}}
{{row.sale_mode==='preorder'?('预定'+(row.production_cycle_days?('·'+row.production_cycle_days+'天'):'')):'现货'}}
{{row.unit_label||row.unit||'-'}}
售 {{row.sale_price==null?'-':row.sale_price}}
采 {{row.purchase_price}}
{{row.is_saleable?'是':'否'}}
{{row.status===1?'正常':(row.status===2?'待审':'停用')}}
码
编辑
{{row.status===1?'停用':'启用'}}
建档后用于单据、条码、对账的唯一标识
{{mdTypeHint}}
取自数据字典「产品分类」,需新增请到 系统 → 数据字典 维护
采购、库存、报价统一按此单位计量
不含税成本,仅采购/管理岗可见
客户商城与报价单取此价
开票与含税/不含税换算用
低于此值触发补货预警
采购与客户下单的起订数量
原料/粮食类必填,设备填 0
现货(有库存直接发)
预定(按单生产)
预定产品下单后按此周期安排生产,商城与二维码标签会展示
物流运费与装车测算用
关闭后客户门户不可见(内部仍可用于采购/生产)
上传中…
点击上传 主图
取消
保存
门店装修(客户商城首页)
轮播图
促销位
置顶商品
公司介绍
产品宣传
新增装修位
报价说明
保存
留空则使用默认文案;保存后客户端价格旁即时生效
{{row.emoji}} {{row.title.slice(0,6)}}
{{decorLinkText(row)}}
{{row.promo_text}}
{{row.promo_state_label}}
{{row.promo_scope==='items'?('指定 '+(row.promo_items||[]).length+' 个商品'):('按分类 '+row.link_value)}}
· {{row.promo_start||'…'}}~{{row.promo_end||'…'}}
未设置
toggleDecor(row,v)">
编辑
删除
说明:某类装修位一旦配置(≥1条启用),首页即以配置为准(不再显示内置默认);置顶商品不足 6 个时自动按热度规则补齐。跳转可填页面(category/orders/ar/svc)或分类编码(finished/semi/raw/aux/pack)。
促销位可另配促销折扣 :折扣率(如 90=9 折)/ 直降 / 一口价,可限定分类或指定商品与起止日期;生效期间商城商品价、购物车、下单成交价与公开扫码页统一按促销价计算,过期自动恢复原价。
公司介绍 / 产品宣传 :支持图文正文 + 附件(图片 / PDF / PPT / MP4 视频,图片≤5MB、PPT/PDF≤50MB、视频≤200MB),客户端展示介绍卡片并可预览、播放或下载附件。
不跳转
跳到页面
跳到指定商品
跳到商品分类
{ if(v) decorSearchMat(''); }">
{{decorMatGroupLabel}};客户点这张卡片会进入商品列表,
只呈现该商品并高亮,顶部还能点「查看详情」。
跳到页面:客户点卡片直接切到该页面。
跳到分类:客户点卡片进入该分类的商品列表。
不跳转:卡片只是展示,点了没有反应。
促销折扣
{{decorPromoHint()}}
按跳转分类
指定商品
{{decorForm.promo_scope==='category'
? '作用于「跳转」里填写的分类编码下的全部可售商品;跳转填页面(category/orders…)时不生效'
: '只对下面勾选的产品生效,优先于分类'}}
~
留空表示长期有效;到期后自动恢复原价
取消
保存
设备租赁管理
设备档案
租赁单
用电会话
下级用户
分润台账
新增设备
查询
{{row.state_label}}
{{row.state_note}}
¥{{row.price_day}}
{{row.price_month?('¥'+row.price_month):'—'}}
¥{{row.deposit}}
查看
重置
编辑
删除
查询
¥{{row.amount}}
+赔偿¥{{row.damage_fee}}
实收¥{{row.settle_amount}}
{{row.status_label}}
通过
驳回
出库
归还
结算
日志
通电中 {{ p86.summary.running }}
今日收入 ¥{{ p86.summary.today_income }}
待结算分润 ¥{{ p86.summary.pending_share }}
查询
¥{{row.rate}}/分
¥{{row.pay_amount}}
¥{{row.share_amount}}
全额归客户
按上幅分成
{{row.status_label}}
{{ fmtMin(row.remain_sec) }}
—
断电
—
查询
下级用户由租用客户在门户自行维护并设定上幅;上幅计入租用客户收益
{{ row.phone }}
被占用
{{ row.markup_type==='percent' ? ('+'+row.markup_value+'%') : ('+¥'+row.markup_value+'/分') }}
无
{{ row.enabled?'启用':'停用' }}
结算该客户待结分润
待结算合计 ¥{{ p86.pendingTotal }}
刷新
¥{{row.base_amount}}
¥{{row.share_amount}}
{{row.status_label}}
扫码地址:{{ eqQr.base || '读取中…' }}
用手机扫此码即可打开预约页(手机需与服务器同网络或使用公网地址)
关闭
重置二维码
{{ eqDlg.id?'可修改,须唯一':'留空保存即自动编号' }}
按月付款用此价,0=不开放月租
按年付款用此价,0=不开放年租
按日
按月
按年
按时长(扫码)
勾选的才是客户可选的方式;价格为 0 的方式即使勾选也不会展示
eqDlg.enabled=v?1:0">
P86 扫码用电计费
大于0时扫码进入付费用电页
最长
eqDlg.owner_free=v?1:0">
开启后:客户在按年/月/日整租期内扫码自用不收费;关则按其分钟价(下方「自用分钟价」)收费
仅「租期自用」关闭且客户整租中时有意义;0=沿用分钟价
小时;0=不限(仍受租期约束)。整租期内自用到期自动断电收尾,防止忘关机把设备锁死
开关自检
取消
保存
大于0时设备自动转维修中
取消
确认归还
{{l.action}} | {{l.note}}
单据中心
审批中心
只看供应商门户发货
刷新
📷 扫码定位
新建报销单
新建资产
统一审批中心:待我审批共 {{approvalsCenter.total_pending}} 单
{{({purchase_order:'采购订单',sale_order:'销售订单',stock_in:'入库单',stock_out:'出库单',
stocktake:'盘点单',receipt:'回款核销单',contract:'合同',expense:'费用报销',
asset_dispose:'资产处置',project:'项目立项',quality_check:'质检单',salary:'薪资测算',
leave:'请假单',vehicle_use:'用车申请',inst_settle:'售后服务结算'})[row.doc_type]||row.doc_type}}
{{row.items.map(x=>x.doc_no).join('、')}}
{{row.ref_no||'—'}}
{{row.logistics_label}}
{{row.transport_label}}
{{({draft:'草稿',pending:'待审核',active:'已生效',void:'已作废'})[row.doc_status]}}
高风险
中风险
—
{{row.amount? row.amount.toLocaleString() : '—'}}
AI 人工
提交
审核
驳回
物流
打印
风险
码
⚠ 该单据为高风险,必须勾选复核确认后才能审核通过
【{{r.rule_code}}】级别{{r.risk_level}} · {{JSON.stringify(r.hit_detail)}}
已复核风险项
关闭
驳回
通过
入库单:{{intlDetail.in_no}} {{intlDetail.in_date}}
采购单:{{intlDetail.po_no||'-'}}
{{intlDetail.logistics_label||'未登记'}}
运输方式:{{intlDetail.transport_label}}
承运商:{{intlDetail.carrier_name}}
运单号:{{intlDetail.tracking_no}}
车辆:{{intlDetail.plate_no}}
司机:{{intlDetail.driver_name}}
({{intlDetail.driver_mobile}})
发运:{{intlDetail.depart_at}}
预计到达:{{intlDetail.eta}}
签收人:{{intlDetail.signer}} {{intlDetail.signed_at}}
{{(row.amount||0).toLocaleString()}}
运输过程凭证(供应商上传)
无可核验凭证(请向供应商索取)
物流轨迹
{{t.node_label}}
· {{t.place}}
{{t.remark}}
该入库单尚未审核通过;审核通过后可在本页上传签收单/卸货照片留证。
关闭
删
+ 添加明细
取消
保存草稿
取消
保存
产品销售管理
{{t.t}}
收款配置
新建方案报价
查询
{{row.title||'—'}}
¥{{row.total_amount}}
V{{row.version}}
{{({draft:'草稿',submitted:'待确认',accepted:'已接受',rejected:'已驳回',converted:'已转单'})[row.status]}}
详情
打印
调价
提交
接受
驳回
转销售单
删除
查询
按门槛重算合同
门槛 ¥{{smCfg.contract_threshold}}:订单金额 ≥ 门槛须签合同方可收款/发货
¥{{row.total_amount}}
免签
已签
需签
{{['未收','部分','收清'][row.pay_status]}}
{{['未发货','发货中','已签收'][row.ship_status]}}
{{({draft:'草稿',pending:'待审',active:'生效',rejected:'驳回',voided:'作废'})[row.doc_status]||row.doc_status}}
详情
提交
审核
签合同
收款计划
登记收款
发货
查询
{{row.method_label}}
·第{{row.plan_seq}}期
¥{{row.amount}}
{{({submitted:'待确认',confirmed:'已确认',rejected:'已驳回'})[row.status]}}
确认到账
驳回
查询
{{row.status_label}}
轨迹
打印
发货
到货
签收
{{smRebate.members||0}}
会员总数(已绑推荐人 {{smRebate.members_bound||0}})
¥{{fmt2(smRebate.month_accrue)}}
本月计提返点
¥{{fmt2(smRebate.account?.balance)}}
会员可抵扣余额
¥{{fmt2(smRebate.pending)}}
待生效返点
返点比例 %
一级 %
二级 %
单笔抵扣上限 %
保存规则
平台留存 {{fmt2(100-(smRebateCfg.l1_ratio||0)-(smRebateCfg.l2_ratio||0))}}%
会员({{smRebate.members||0}})
返点明细
抵扣流水
产品专属规则
只看有推荐人
查询
同步全部客户为会员
{{row.parent_name||'—'}}
L{{row.depth}}
¥{{fmt2(row.balance)}}
¥{{fmt2(row.pending)}}
¥{{fmt2(row.total_earned)}}
关系与明细
查询
共 {{smRebateRecordTotal}} 条 · 本页金额 ¥{{fmt2(smRebateRecSum.amount)}} · 已抵扣 ¥{{fmt2(smRebateRecSum.used)}}
{{row.beneficiary_name}}
{{row.level===1?'一级直推':'二级推荐'}}
¥{{fmt2(row.base_amount)}}
{{row.rate}}%
¥{{fmt2(row.amount)}}
¥{{fmt2(row.used_amount)}}
{{({pending:'待生效',available:'可抵扣',used:'已用完',cancelled:'已作废'})[row.status]||row.status}}
{{({use:'下单抵扣',release:'退回',clawback:'作废回冲'})[row.action]||row.action}}
¥{{fmt2(row.amount)}}
¥{{fmt2(row.balance_after)}}
新增产品专属规则
产品专属规则优先于全局规则;删除后该产品回到全局比例
{{row.rate}}%
{{row.l1_ratio}}% / {{row.l2_ratio}}%
{{row.deduct_max_pct}}%
{{row.activate_on==='audit'?'订单生效':'收款结清'}}
{{row.enabled?'启用':'停用'}}
编辑
删除
会员号 {{smMemberDetail.member.member_no}}
邀请码 {{smMemberDetail.member.ref_code}}
层级 L{{smMemberDetail.member.depth}}
一级上线 {{smMemberDetail.member.parent_name||'—'}}
二级上线 {{smMemberDetail.member.parent2_name||'—'}}
加入 {{smMemberDetail.member.joined_at}}
¥{{fmt2(smMemberDetail.account.balance)}}
可抵扣
¥{{fmt2(smMemberDetail.account.pending)}}
待生效
¥{{fmt2(smMemberDetail.account.total_earned)}}
累计获得
¥{{fmt2(smMemberDetail.account.total_used)}}
累计抵扣
¥{{fmt2(row.contributed)}}
¥{{fmt2(row.contributed)}}
{{row.level===1?'一级':'二级'}}
¥{{fmt2(row.amount)}}
{{({pending:'待生效',available:'可抵扣',used:'已用完',cancelled:'已作废'})[row.status]||row.status}}
{{({use:'下单抵扣',release:'退回',clawback:'作废回冲'})[row.action]||row.action}}
¥{{fmt2(row.amount)}}
按明细重算余额
关闭
取消
保存
查询
待审核 {{(smRefundStat.applied||0)}} 笔 / ¥{{(smRefundAmounts.applied||0).toFixed(2)}} ·
待退款 {{(smRefundStat.approved||0)}} 笔 / ¥{{(smRefundAmounts.approved||0).toFixed(2)}} ·
已退款 ¥{{(smRefundAmounts.refunded||0).toFixed(2)}}
{{row.refund_no}}
{{row.order_no}}
{{row.customer_name}}
{{row.apply_source==='portal'?'客户申请':'内部发起'}}
¥{{row.amount}}
{{row.status_label}}
详情
审核
执行退款
撤销
¥{{(it.qty*it.price).toFixed(2)}}
删
+ 加一行
明细合计 ¥{{smQuoteGross}}
优惠
折后合计 ¥{{smQuoteTotal}}
取消
{{smQuoteForm.id?'保存调价(生成新版本)':'创建方案报价'}}
方案名称 {{smQuoteDetail.title}} · 客户
{{smQuoteDetail.customer_name}} · 折后合计
¥{{smQuoteDetail.total_amount}}
(明细合计 ¥{{quoteDetailGross}} − 优惠 ¥{{smQuoteDetail.discount}})
· 版本 V{{smQuoteDetail.version}} · 有效期 {{smQuoteDetail.valid_until||'-'}}
{{({draft:'草稿',submitted:'待客户确认',accepted:'客户已接受',rejected:'已驳回',converted:'已转销售单'})[smQuoteDetail.status]}}
{{row.category||'—'}}
{{row.spec||'—'}}
方案说明:{{smQuoteDetail.remark}}
调价与流转留痕
{{({create:'创建',adjust:'调价',submit:'提交',accept:'接受',reject:'驳回',convert:'转单'})[g.action]||g.action}}
{{g.detail}}
打印方案报价单
关闭
客户 {{(smOrderDetail.items&&smOrderDetail.items[0])?smOrderCustName:''}}
· 金额 ¥{{smOrderDetail.total_amount}}
· 付款 {{smOrderDetail.pay_type==='installment'?'分期':'全款'}}
· 状态 {{({draft:'草稿',pending:'待审',active:'生效',rejected:'驳回',voided:'作废'})[smOrderDetail.doc_status]}}
{{smOrderDetail.contract_id?'合同已签':'需签合同'}}(金额达 ¥{{smCfg.contract_threshold}} 门槛)
免签合同
已收 ¥{{(smOrderDetail.pay_summary||{}).paid||0}}
/ 待收 ¥{{(smOrderDetail.pay_summary||{}).remaining||0}}
收款计划与记录
第{{p.seq}}期 ¥{{p.amount}} · 应收 {{p.due_date||'不限'}}
{{({unpaid:'未收',partial:'部分',paid:'已收'})[p.status]}}
未设置分期计划(默认全款)
¥{{p.amount}} {{p.voucher_no||'-'}}
({{({submitted:'待确认',confirmed:'已确认',rejected:'已驳回'})[p.status]}})
物流配送
{{s.status_label}} · {{s.receiver}} {{s.receiver_phone}}
{{s.receiver_address}}
尚未创建发货单
合同 {{smOrderDetail.contract.contract_no}} ({{smOrderDetail.contract.sign_mode==='online'?'网签':'线下签'}} ·
{{({signed:'已签署',unsigned:'未签署'})[smOrderDetail.contract.sign_status]}})
提交审核
审核
签署合同
登记收款
登记发货
发起退款
关闭
订单 {{smAuditForm.order_no}} · 客户 {{smAuditForm.customer_name||'-'}}
· 金额 ¥{{smAuditForm.total_amount}}
客户门户下单
通过
驳回
已知悉信用风险,确认放行
取消
提交审核
订单 {{smContractForm.order_no}} · 金额 ¥{{smContractForm.amount}}
(达到 ¥{{smCfg.contract_threshold}} 门槛,须完成签署后才能收款/发货)
网签(系统内登记)
线下签
取消
确认签署
订单 {{smPlanForm.order_no}} · 总额 ¥{{smPlanForm.total_amount}}
全款(1 期)
分期
第{{i+1}}期
删
+ 加一期
合计 ¥{{smPlanTotal}}
≠订单金额
取消
保存计划
订单 {{smPayForm.order_no}} · 待收
¥{{smPayRemaining}}
微信支付
支付宝
银行转账
{{smCfg.bank_info||'请联系财务获取账户信息'}}
生成在线支付码(推荐)
需先提交收款记录;客户扫码支付后平台回调自动确认到账,无需人工核对
请客户使用{{smCfg.pay_provider==='wechat'?'微信':'支付宝'}}扫码支付
¥{{smPayForm.amount}}
等待客户支付…(每 3 秒自动确认)
在线支付模式下可免传,仅作人工兜底
取消
提交收款(待财务确认)
{{smRefundDetail.order_no}}
{{smRefundDetail.customer_name}}
¥{{smRefundDetail.amount}}
{{smRefundDetail.status_label}}
{{smRefundDetail.reason_type_label}}
{{smRefundDetail.refund_method_label}}
{{smRefundDetail.payment_no||'未指定'}}
{{smRefundDetail.created_name}}
{{smRefundDetail.reason}}
{{smRefundDetail.audit_name}} · {{smRefundDetail.audit_at}}
{{smRefundDetail.audit_opinion}}
{{smRefundDetail.refunded_name}} · {{smRefundDetail.refunded_at}}
{{smRefundDetail.refund_trade_no?('· 流水 '+smRefundDetail.refund_trade_no):''}}
处理轨迹
{{({apply:'申请',approve:'审核通过',reject:'驳回',refund:'退款完成',cancel:'撤销'})[g.action]||g.action}} {{g.detail}}
审核
执行退款
关闭
退款单 {{smRefundAudit.refund_no}} · 订单 {{smRefundAudit.order_no}}
· 客户 {{smRefundAudit.customer_name}}
金额 ¥{{smRefundAudit.amount}}
· {{smRefundAudit.reason_type_label}} · {{smRefundAudit.refund_method_label}}
{{smRefundAudit.reason}}
通过
驳回
取消
提交审核
退款单 {{smRefundExec.refund_no}} · 订单 {{smRefundExec.order_no}}
应退 ¥{{smRefundExec.amount}} ·
{{smRefundExec.refund_method_label}}
线下退款登记
在线原路退回(网关)
退款完成后将自动回冲应收与分期计划,订单收款状态同步重算,并通知客户。
取消
确认退款
订单 {{smOrderDetail.order_no}} ·
已收 ¥{{(smOrderDetail.pay_summary||{}).paid||0}} ·
可退 ¥{{smRefundApplyMax}}
取消
提交退款申请
订单 {{smShipForm.order_no}} · 客户 {{smShipForm.customer_name}}
取消
创建发货单
{{smShipTrace.carrier||'未填承运'}} {{smShipTrace.track_no||''}} ·
收货 {{smShipTrace.receiver}} {{smShipTrace.receiver_phone}}
{{smShipTrace.receiver_address}}
{{g.detail}}
登记发货
登记到货
客户签收
关闭
订单金额 ≥ 该值时必须签署合同(网签或线下签)后才能收款/发货
在线支付网关(P45)
人工确认(收款码+凭证)
微信在线支付
支付宝在线支付
未开通商户号资质时保持「人工确认」即可;开通后选择通道并填入商户参数,
客户在收款时将获得在线支付码,支付成功由平台回调自动核销。
需在商户平台配置回调:{{(smCfgGW.notify_base||location.origin).replace(/\/+$/,'')}}/api/v1/salesm/pay/notify/{{smCfgGW.pay_provider}}
{{smCfg.wechat_ready?'微信通道就绪,可在线下单':'参数未齐,当前仍走人工确认'}}
{{smCfg.alipay_ready?'支付宝通道就绪,可在线下单':'参数未齐,当前仍走人工确认'}}
取消
保存配置
库存总览
现存量
出入库流水
预警中心
库存分析
空中仓库
🖨 打印当前报表
仓库档案
导出明细
📷 扫码查库存
{{k.t}}
{{k.v}}
{{k.sub||''}}
库存结构(按类别)
{{row.qty.toLocaleString()}}
{{row.amount.toLocaleString()}}
金额 Top5
{{row.name}}
{{row.code}}
{{row.qty}} {{row.unit}}
{{row.amount.toLocaleString()}}
{{row.ratio}}%
仓库分布
管理仓库
{{row.qty.toLocaleString()}}
{{row.status?'启用':'停用'}}
含零库存
查询
重置
共 {{invStockTotal}} 条 ·
合计数量 {{invSummary.qty||0}} ·
金额 ¥{{(invSummary.amount||0).toLocaleString()}} ·
可用 {{invSummary.available||0}}
{{row.material_name}}
{{row.material_code}}
· {{row.spec}}
{{row.batch_no||'—'}}
{{row.location||'未设库位'}}
{{row.qty}} {{row.unit}}
{{row.locked_qty||'—'}}
{{row.available}}
{{row.unit_cost||'—'}}
{{row.amount.toLocaleString()}}
{{row.safety_stock||'—'}} / {{row.max_stock||'—'}}
{{row.latest_in_date||'—'}}
正常
{{row.status_label}}
追溯
设置
查询
共 {{invFlowTotal}} 笔 · 本页入库 {{invFlowIn}} ·
本页出库 {{invFlowOut}}
{{row.material_name}}
{{row.material_code}}
{{row.biz_label}}
+{{row.qty_in}}
-{{row.qty_out}}
{{row.balance}}
{{c.t}}
{{c.v}}
{{c.sub}}
{{({low:'低库存(低于安全库存)',over:'超储(高于最高库存)',slow:'呆滞(90 天无进出)',expiring:'临期(30 天内到期)'})[invAlertType]}}
共 {{invAlertRows.length}} 条
{{row.material_name}}
{{row.material_code}} · {{row.spec}}
{{row.qty}} {{row.unit}}
{{row.total_qty}} / {{({low:row.safety_stock,over:row.max_stock})[invAlertType] || '—'}}
{{row.amount.toLocaleString()}}
{{row.extra}}
追溯
补货
ABC 分类(近 {{invAnalysis.days||90}} 天出库金额)
A {{((invAnalysis.abc_summary||{}).A||{}).count||0}} 项 ·
¥{{((((invAnalysis.abc_summary||{}).A||{}).amount||0)/10000).toFixed(1)}}万
B {{((invAnalysis.abc_summary||{}).B||{}).count||0}} 项 ·
¥{{((((invAnalysis.abc_summary||{}).B||{}).amount||0)/10000).toFixed(1)}}万
C {{((invAnalysis.abc_summary||{}).C||{}).count||0}} 项 ·
¥{{((((invAnalysis.abc_summary||{}).C||{}).amount||0)/10000).toFixed(1)}}万
平均周转天数
{{(invAnalysis.avg_turnover_days>=999)?'999+':(invAnalysis.avg_turnover_days||'—')}} 天
周转天数越短,资金占用越少
期间零动销
{{invAnalysis.no_move_count||0}} 项
建议按呆滞品处理
ABC 与周转分析
{{row.name}}
{{row.code}}
{{row.abc}}
{{row.out_qty}}
{{row.out_amount.toLocaleString()}}
{{row.turnover||'—'}}
{{row.turnover_days||'—'}}
{{row.amount.toLocaleString()}}
库龄结构
{{row.qty}}
{{row.amount.toLocaleString()}}
{{k.t}}
{{k.v}}
{{k.sub||''}}
供应商直发台账
共 {{invAirTotal}} 笔 · 在库结存 {{invAir.residual_qty||0}}
查询
刷新
空中仓编码 {{invAir.code||'AIR'}} · 虚拟仓(不可手工出入库/盘点)
{{row.in_no}}
{{row.air_at||row.in_date}}
{{row.customer_name}}
{{row.receiver}} {{row.receiver_phone}}
{{row.receiver_address||'—'}}
{{row.total_qty}}
{{row.total_amount.toLocaleString()}}
{{row.transport_label}}
{{row.carrier_name||row.tracking_no||'—'}}
{{row.logistics_label}}
留痕
采购入库单:{{invAirDetail.in_no}}
自动出库单:{{invAirDetail.out_no}}
过账时间:{{invAirDetail.air_at||'—'}}
供应商:{{invAirDetail.supplier_name}}
采购单:{{invAirDetail.po_no||'—'}}
销售单:{{invAirDetail.sale_order_no||'—'}}
直发客户:{{invAirDetail.customer_name}}
收货人:{{invAirDetail.receiver}} {{invAirDetail.receiver_phone}}
物流:
{{invAirDetail.logistics_label}}
收货地址:{{invAirDetail.receiver_address||'—'}}
运输:{{invAirDetail.transport_label}}
· {{invAirDetail.carrier_name}}
· 运单 {{invAirDetail.tracking_no}}
· 车牌 {{invAirDetail.plate_no}}
· 司机 {{invAirDetail.driver_name}}
· 签收 {{invAirDetail.signed_at}}({{invAirDetail.signer}})
① 明细(入库 → 出库)
+{{row.qty}}
-{{row.out_qty}}
{{row.price}}
{{row.amount.toLocaleString()}}
{{row.in_flow}}→{{row.out_flow}}
② 空中仓流水(两段过账)
{{row.qty_in||''}}
{{row.qty_out||''}}
③ 物流轨迹
{{t.node_label}}
{{t.place}}
{{t.remark}}
关闭
{{invTrace.material.name}}
{{invTrace.material.code}} · {{invTrace.material.spec}}
安全库存 {{invTrace.material.safety_stock||0}}
最高库存 {{invTrace.material.max_stock||0}}
批次台账
最近流水
{{row.qty_in||''}}
{{row.qty_out||''}}
关闭
{{invSetRow.material_name}}
{{invSetRow.material_code}} ·
{{invSetRow.warehouse_name}} / {{invSetRow.batch_no||'无批次'}}
低于安全库存→低库存预警;高于最高库存→超储预警;0 表示不控制
取消
保存
{{invWhForm.id?'保存修改':'新增仓库'}}
清空为新增
编辑
关闭
🎯 我的岗位任务
{{aiMyTasks.position_count||0}} 个岗位 · {{aiMyTasks.stats.total||0}} 项任务 ·
AI 可直接代办 {{aiMyTasks.stats.ai_ready||0}} 项 · 需人工 {{aiMyTasks.stats.human_only||0}} 项
刷新
{{p.position_name}}
({{p.allowed_count}}/{{p.task_count}} 项可执行)
{{t.allowed?(t.ai_ready?'AI 可代办':'人工执行'):'无权限'}}
{{t.name}}
· {{t.perm}}
AI:{{t.ai_note}}|必须真人:{{t.human}}
让 AI 干
🤖 AI 工作简报
按你的权限自动汇总 · {{aiBriefing.generated_at}} · 共 {{aiBriefing.total||0}} 项待处理
刷新
{{it.level==='high'?'紧急':(it.level==='medium'?'关注':'提示')}}
{{it.count}} · {{it.title}}
💡 {{it.suggestion}}
去处理
AI 跟进
会话
新会话
{{s.title}}
{{s.position_name||''}} {{s.created_at}}
AI 员工对话
按你的 {{aiAssistants.length||1}} 个岗位自动分配
{{aiMe.ai_name}}
匹配:{{ {position:'按岗位', permission:'按角色权限', auto_created:'按权限自动生成', none:'未匹配'}[aiMe.matched] || aiMe.matched }}
数据密级:{{aiMe.clearance_label}}
{{t.desc}}
{{ {image:'🖼',pdf:'📄',docx:'📝',xlsx:'📊',text:'📃',legacy:'🗂'}[a.kind] || '📎' }}
{{a.filename}} ⚠
{{m.content}}
知识库:{{k}}
AI 正在处理…(模型思考通常需要十几秒,请稍候)
{{ {image:'🖼',pdf:'📄',docx:'📝',xlsx:'📊',text:'📃'}[f.kind] || '📎' }}
{{f.name}}
{{(f.size/1024).toFixed(0)}}KB
✕
📎
发送
支持图片(可直接看图)、PDF、Word、Excel、TXT/CSV,单个 ≤10MB、每次 ≤5 个;截图可 Ctrl+V 直接粘贴
门户客服
转人工工单
项目需求工单
{{ {waiting:'待接单',accepted:'服务中',closed:'已关闭'}[sc.row.status] }}
接入回复
查看
我(客服)
AI 客服
{{m.content}}
回复
结束服务
项目需求工单
共 {{reqRows.length}} 条 · 收集中 {{reqStats.collecting||0}} · 待跟进 {{(reqStats.analyzed||0)+(reqStats.assigned||0)}} · 处理中 {{reqStats.processing||0}}
{{ paReqTypes[sc.row.req_type]||sc.row.req_type }}
{{ sc.row.stage_label || sc.row.stage }}
{{ sc.row.assign_type==='ai'?'AI·':'员工·' }}{{ sc.row.assign_name||'—' }}
任务·{{ sc.row.chain.task.status_label }}
{{ sc.row.chain.quote.quote_no }}
{{ sc.row.chain.order.order_no }}
—
详情/跟进
报价
转派
{{reqDetail.party_name}}
{{ paReqTypes[reqDetail.req_type]||reqDetail.req_type }}
{{reqDetail.stage_label||reqDetail.stage}}
{{ (reqDetail.assign_type==='ai'?'AI·':'员工·')+(reqDetail.assign_name||'—') }}
转派
{{reqDetail.assign_position||'—'}}
{{reqDetail.created_at}}
跟进任务
{{ reqDetail.chain.task.title }}
{{ reqDetail.chain.task.assignee_name }} · {{ reqDetail.chain.task.status_label }}
· 进度 {{ reqDetail.chain.task.progress }}%
· 截止 {{ reqDetail.chain.task.deadline }}
去任务管理
报价单
{{ reqDetail.chain.quote.quote_no }} · ¥{{ reqDetail.chain.quote.total_amount }}
{{ reqDetail.chain.quote.status_label }}
去销售管理
销售订单
{{ reqDetail.chain.order.order_no }} · ¥{{ reqDetail.chain.order.total_amount }}
{{ reqDetail.chain.order.status_label }}
客户原始需求
{{reqDetail.content}}
AI 分析结果
{{ {ok:'已完成',pending:'待分析',error:'分析降级'}[reqDetail.ai_status]||reqDetail.ai_status }}
{{reqDetail.ai_summary||'—'}}
{{ PA_FIELD_LABEL[k]||k }}:{{ v }}
客户上传资料({{(reqDetail.docs||[]).length}})
{{ sc.row.kind==='image'?'图片':'文档' }}
{{ Math.max(1, Math.round((sc.row.size||0)/1024)) }} KB
查看
处理记录
{{ e.event }} · {{e.detail}}
AI 员工跟进建议
生成建议
{{reqAiSuggestion}}
点击「生成建议」,由 AI 员工按该需求内容输出跟进方案与话术。
回复客户
接单跟进
一键转报价
生成任务
标记完成
关闭需求
报价已发给客户,客户在门户「我的报价」确认后即可在「销售管理 → 报价单」一键转销售订单。
已转销售订单,后续合同签署 / 收款 / 发货请在「销售管理」跟进。
真实员工
AI 员工
取消
确认转派
客户:{{ reqQuoteCustName }} |需求:{{ reqDetail.title }}
按 AI 要素预填,可直接改数量/单价
reqQuotePickMat(sc.row, v)">
¥{{ ((sc.row.qty||0)*(sc.row.price||0)).toFixed(2) }}
删
+ 添加一行
有效期
天
合计:
¥{{ reqQuoteTotal }}
生成后为「草稿」状态,可在「销售管理 → 报价单」调价并提交客户确认。
取消
生成报价单
{{ reqDetail.req_no }}|{{ reqDetail.title }}
普通
紧急
特急
取消
生成任务
模型配置(火山方舟)
保存配置
测试连接
Token 额度
保存
今日用量 {{quota.usage?.day||0}} / {{quota.daily_limit}} · 本月 {{quota.usage?.month||0}} / {{quota.monthly_limit}}
岗位 AI 员工配置
⚡ 智能匹配(按系统业务自动配置)
savePosition(row,{enabled:v?1:0})">
savePosition(row,{system_prompt:v})">
{{(row.tools||[]).join(', ')||'—'}}
岗位任务台账(AI 履职边界)
🔄 按台账补齐工具
📦 精简编制岗位包
共 {{aiLedgerStat.positions||0}} 个岗位 / {{aiLedgerStat.tasks||0}} 项任务
台账由后端 pos_tasks 固化:每条任务都对应系统真实权限点与真实页签,
「AI 可代办」= 该任务已挂工具且账号有权限;台账之外的事 AI 一律回答「不在我的岗位职责范围」。
{{t.name}}
({{t.perm}} · 页签 {{t.tab}})
权限码不存在
AI:{{(t.ai_labels||[]).join('、')||'仅答疑'}} — {{t.ai_note}}
必须真人:{{t.human}}
{{(row.tasks||[]).map(t=>t.name).join('、')}}
知识库管理
新增知识
{{row.position_code||'全员'}}
{{ {public:'公开',internal:'内部',secret:'机密'}[row.sec_level]||'内部' }}
saveKb({...row, enabled:v?1:0})">
编辑
删除
取消
保存
岗位包只解决「一个人兼哪些岗、配哪些角色」;互斥岗位(下单与收货、检验与生产)仍需第二人复核,
每条包下的红线已标注。给员工套用时在「员工管理 → 编辑 → 岗位」点对应岗位包即可。
现状体检: 内部在册员工 {{aiPackSummary.staff_count||0}} 人,已覆盖
{{aiPackSummary.covered_by_staff||0}}/{{aiPackSummary.positions_total||0}} 个岗位。
尚未有人认领:
{{u.name}}
全部岗位已有人认领
员工负载:
{{st.real_name}}({{st.position_count}}岗 / {{st.task_count}}项任务)
{{pk.name}}
{{pk.desc}}
{{pk.task_count}} 项任务
岗位:{{p.name}} · {{p.tasks}}项
角色:{{(pk.roles||[]).join('、')}}
⚠ {{pk.note}}
关闭
{{m}}
等{{row.modules.length}}项
{{row.tools.join(', ')||'仅问答'}} 工具待补齐
{{row.existing?'已有配置':'将新增'}}
匹配依据:岗位下全部账号的角色权限点 ∩ 系统权限树(业务模块)∩ AI 工具权限要求。应用为幂等操作,不覆盖手工编辑过的提示词。
关闭
全部应用
风险规则配置
saveRule(row,{threshold:v})">
saveRule(row,{risk_level:v})">
saveRule(row,{enabled:v?1:0})">
AI 交互调用日志
AI 业务审计日志(append-only,不可删改)
单据 OCR 识别
上传单据图片识别
{{ocrResult}}
公告通知
发布公告
紧急
重要
普通
{{row.read?'已读':'标记已读'}}
已读统计
取消
发布并推送
待开始
{{meetStat.upcoming||0}}
待我审核工单
{{meetTodo.counts.to_review||0}}
待我执行工单
{{meetTodo.counts.to_execute||0}}
会议管理
会议列表
会议工单
刷新
预约会议
{{row.title}}
进行中
{{row.mode_label}}
{{row.meet_date}} {{row.start_time}}-{{row.end_time}}
{{row.room_name||'-'}}
{{fmtCode(row.room_code)}}
{{row.participant_count}} 人
·{{row.online_count}} 在线
{{row.note_count||0}} 条
-
{{['','AI草案','审核中','已确认','已分发'][row.ticket_status]}}
{{['待开始','进行中','已结束','已取消'][row.status]}}
开始
进入
纪要/工单
取消
AI 已把会议记录转成工单草案,请核对责任人/截止时间/优先级后确认;
确认后一键分发会自动生成任务并通知执行人。
{{t.title}}
{{['普通','紧急','特急'][t.priority]}}
会议:{{t.meeting_title}}({{t.meet_date}})
责任人:{{t.assignee_name||'未指定'}} · 截止:{{t.due_date||'未定'}}
原话:{{t.source_note}}
修改
确认
{{['普通','紧急','特急'][row.priority]}}
{{['待处理','进行中','已完成'][row.task_status<0?0:row.task_status]}}
{{row.task_progress}}%
去任务里回填
#{{row.task_id}}
线下会议
视频会议
语音会议
视频/语音会议自动生成会议号,参会人点「进入」即可在线开会,无需会议室
至
真实员工:负责审核 AI 生成的工单草案并确认分发
取消
预约并通知参会人
{{dtMeet.title||'会议详情'}}
{{dtMeet.mode_label}}
{{['待开始','进行中','已结束','已取消'][dtMeet.status]}}
{{dtMeet.meet_date}} {{dtMeet.start_time}}-{{dtMeet.end_time}} ·
{{dtMeet.meet_mode==='offline' ? (dtMeet.room_name||'-') : ('会议号 '+fmtCode(dtMeet.room_code))}} ·
主持 {{dtMeet.host_name||'-'}} · 记录 {{dtMeet.recorder_name||'-'}} ·
责任人 {{dtMeet.reviewer_name||'-'}}
AI 重新总结
大模型深化
保存纪要
确认纪要
{{dtMeet.minutes_status===2?'纪要已确认':(dtMeet.minutes_status===1?'AI 草稿':'未生成')}}
引擎:{{dtMeet.ai_engine==='llm'?'大模型':'本地规则引擎'}} · 记录 {{dtMeet.note_count}} 条
AI 重新抽取
+ 手工补一条
全部确认
确认并分发(AI 派单)
责任人须为真实员工;分发后自动生成任务工单并通知执行人
{{t.title}}
{{['普通','紧急','特急'][t.priority]}}
AI
已确认
已驳回
已分发 #{{t.task_id}}
责任人:{{t.assignee_name||'未指定'}} · 截止:{{t.due_date||'未定'}}
· 优先级:{{['普通','紧急','特急'][t.priority]}}
要求:{{t.content}}
审核:{{t.reviewed_name}}({{t.review_note}})
修改
确认
驳回
{{n.at_time}} · {{n.real_name}} ·
{{({point:'要点',decision:'决议',todo:'待办',issue:'问题',ai:'AI'})[n.note_type]||'要点'}}
{{n.content}}
{{row.role==='host'?'主持人':(row.role==='recorder'?'记录人':'参会人')}}
{{row.required?'必选':'可选'}}
{{row.joined?'已到会':'未到'}}
{{row.online?'在线':'离线'}}
关闭
进入会议
普通
紧急
特急
取消
保存
保存并分发
{{roomInfo.title||'会议中'}}
{{roomInfo.mode_label}}
会议号 {{fmtCode(roomInfo.room_code)}} · 主持 {{roomInfo.host_name||'-'}}
实时同步
{{roomClock}}
{{(p.name||'?').slice(0,1)}}
{{p.name}}{{p.uid===me.user_id?'(我)':''}}
{{p.screen?'📺':(p.mic?'🎤':'🔇')}}
📺 投屏中
{{media.mic?'🎤':'🔇'}}
{{media.cam?'📷':'📵'}}
🖥
👤
🔗
结束会议
{{roomInfo.can_manage?'暂时离开':'离开'}}
实时记录 {{roomNotes.length}} 条
{{n.real_name}} · {{n.at_time}}
{{n.content}}
还没有记录。边听边记:要点 / 决议 / 待办 / 问题, AI 会把这些整理成纪要和工单草案。
{{m.real_name}}
外部
{{m.role==='host'?'主持':(m.role==='recorder'?'记录':'')}}
{{m.online?'在线':(m.joined?'已离开':'未到')}}
手机扫码直接进入会场(无需账号,填姓名即可)
{{guestUrl}}
复制入会链接
开启后生成入会二维码,外部人员扫码即可音视频参会;会议结束或关闭开关后立即失效。
任务管理
我的相关
全部
派发任务
特急
紧急
普通
已逾期
{{['待处理','进行中','已完成'][row.status]}}
{{row.log_count}} 条
未回填
{{row.total_hours||0}} h
回填进度
留痕
取消
派发(自动通知)
回填须填写本次工作事项、投入工时与工作日期,保存后自动写入任务留痕,可在「留痕」中查看历史。
✓ 已选 {{progForm.images.length}} 张(保存后上传,最多 3 张)
历史回填({{progLogs.length}} 条 · 累计 {{progHours}} 小时)
{{g.work_date}} · {{g.operator_name}}
{{g.progress_before}}% → {{g.progress_after}}%
{{g.work_content}}
取消
保存并留痕
进度 {{taskLogTask.progress}}% · 状态
{{['待处理','进行中','已完成'][taskLogTask.status]}}
· 执行人 {{taskLogTask.assignee_name||'—'}} · 截止 {{taskLogTask.deadline||'—'}}
· 累计回填 {{taskLogs.length}} 次 / {{taskLogHours}} 小时
任务说明:{{taskLogTask.content}}
{{g.progress_before}}% → {{g.progress_after}}%
工作日期 {{g.work_date}} · 投入 {{g.hours}} 小时
{{g.image_count}} 张凭证
{{g.work_content}}
⚠ 问题/风险:{{g.blockers}}
→ 下一步:{{g.next_plan}}
关闭
车辆总数
{{vehStat.vehicles||0}}
行程进行中
{{vehStat.running||0}}
待确认结束
{{vehStat.pending_confirm||0}}
本月里程(km)
{{(vehStat.month_company_km||0)+(vehStat.month_private_km||0)}}
本月油费 / 私车补助
{{vehStat.month_fuel_cost||0}} / {{vehStat.month_subsidy||0}}
车辆用车
用车单
车辆档案
私车公用补助
只看我的
刷新
申请用车
新增车辆
新增补助规则
{{row.use_no}}
{{row.type_label}}
{{row.dest_count}} 个目的地 · 加油 {{row.refuel_count}} 次
· {{row.use_type==='private'?(row.distance_manual||row.distance):row.distance}} km
启程 {{row.start_at}}
油费 ¥{{row.fuel_cost}}
补助 ¥{{row.subsidy_amount}}
{{({draft:'草稿',pending:'待审批',active:'在用',void:'已作废'})[row.doc_status]}}
{{row.trip_label}}
提交
审批
启程
继续行程
详情
作废
{{row.brand||'-'}} {{row.model||''}}
{{row.status}}
{{row.mileage}}
{{carUseOf(row.id).use_no}} · {{carUseOf(row.id).applicant_name}} · {{carUseOf(row.id).trip_label}}
—
车辆状态由用车流程自动维护:申请通过 → 占用;确认结束用车 → 释放为空闲,并把总里程同步为结束里程表读数。
{{r.name}}
{{r.mode_label}}
默认
已停用
编辑
设为默认
{{r.enabled?'停用':'删除'}}
{{r.desc}} · {{r.remark}}
· 含油费
· 需发票
补助试算
按规则和里程预估应补金额
km
应补 ¥{{calcResult.amount||0}}
{{calcResult.note||''}}
公车
私车公用
{{vuForm.use_type==='company'?'使用单位车辆,需登记加油费用':'使用本人车辆,按补助规则结算'}}
车型
km
预估补助
¥{{vuPreSub}}
预计归还
公车流程: 启程拍照(公里数 + 油表数)→ 到达目的地拍照定位(可实时追加多个)→ 途中加油(前后照片 + 支付金额,可多次)→ 返程拍照(公里数 + 油表数)→ 确认结束用车。
私车公用流程: 启程拍照(公里数 + 油表数)→ 到达目的地拍照定位(可实时追加多个)→ 返程拍照 + 填写实际里程数 → 确认结束,按补助规则结算。
取消
提交申请
{{tripUse.type_label}}
{{tripUse.plate_no}}
{{tripUse.applicant_name}} · {{tripUse.use_date}}
首个目的地:{{tripUse.destination}}
{{tripUse.trip_label}}
目的地 {{tripUse.dest_count}} 个
加油 {{tripUse.refuel_count}} 次 · ¥{{tripUse.fuel_cost}}
里程 {{tripUse.distance_manual||tripUse.distance}} km · 补助 ¥{{tripUse.subsidy_amount}}
{{lg.type_label}}
{{lg.place}}
{{lg.at}}
¥{{lg.amount}}
{{lg.mileage}} km · 油表 {{lg.fuel}}%
删除
📍 {{lg.geo}}
📍 未取到定位
{{lg.address}}
加油 {{lg.liters}} L
{{lg.operator_name}}
{{lg.note}}
② 途中记录
已提交返程,仍可补录
📍 到达目的地
⛽ 途中加油
🏁 返程结束
④ 确认结束用车
行驶里程{{tripUse.use_type==='private'?(tripUse.distance_manual||tripUse.distance):tripUse.distance}} km
油表{{tripUse.start_fuel}}% → {{tripUse.end_fuel}}%
加油费用¥{{tripUse.fuel_cost}}
私车补助¥{{tripUse.subsidy_amount}}
{{tripUse.subsidy_note}}
确认结束用车
确认后公车自动释放、总里程同步;私车补助归档到本月统计。
已完成
行驶里程{{tripUse.use_type==='private'?(tripUse.distance_manual||tripUse.distance):tripUse.distance}} km
加油费用¥{{tripUse.fuel_cost}}
私车补助¥{{tripUse.subsidy_amount}}
结束时间{{tripUse.end_at}}
交车备注:{{tripUse.confirm_note}}
按里程结算
包干结算
元 / km
km(此里程内只算起步价)
元
开启后里程按 2 倍计算
元 / 次
元(0 = 不封顶)
补助已含油费
需提供发票
私车公用申请时默认选中
取消
保存
取消
保存
单号:{{vuAuditRow? vuAuditRow.use_no : ''}} · {{vuAuditRow? vuAuditRow.applicant_name : ''}}
{{vuAuditRow? vuAuditRow.plate_no : ''}} · {{vuAuditRow? vuAuditRow.type_label : ''}} · 目的地 {{vuAuditRow? vuAuditRow.destination : ''}}
取消
驳回
通过(车辆转为占用)
今日来访
{{visStat.today_total||0}}
待到访
{{visStat.waiting||0}}
本月累计 / 接待区域登记
{{visStat.month_total||0}}
/ {{visStat.area_logs||0}}
访客登记
来访列表
今日看板
黑名单
只看我的
刷新
加入黑名单
预约访客
{{row.name}}
在访
{{row.company||'个人来访'}} · {{row.visit_no}}
{{row.type_label}}
{{row.visit_date}}
{{row.start_time||'—'}}{{row.end_time?' - '+row.end_time:''}}
{{row.host_name}}
{{row.receive_place||'前台大厅'}}
{{row.visitor_count}} 人 · {{row.area_count}} 区域
{{row.plate_no}}
{{row.status_label}}
到访登记
区域
离场
详情
更多
邀请码
修改预约
取消来访
标记爽约
离场登记
待到访
{{visBoard.counts.waiting||0}}
今日暂无待到访
{{row.name}}
{{row.start_time||'—'}}{{row.end_time?'-'+row.end_time:''}}
{{row.company||'个人来访'}} · {{row.visitor_count}} 人
被访 {{row.host_name}} · {{row.receive_place||'前台大厅'}}
邀请码 {{row.invite_code||'—'}}
到访登记
在访中
{{visBoard.counts.inside||0}}
当前没有在访访客
{{row.name}}
{{row.arrive_at?row.arrive_at.slice(11)+' 到访':'在访'}}
{{row.company||'个人来访'}} · 卡号 {{row.badge_no||'—'}}
到访 {{row.arrive_at}} · {{row.area_count}} 个区域
登记区域
离场
今日已离场
{{visBoard.counts.left||0}}
今天还没有离场记录
{{row.company||'个人来访'}} · 在访 {{row.stay_minutes}} 分钟
访客卡 {{row.badge_returned?'已归还':'未归还'}}
后续预约
{{visBoard.upcoming.length}}
{{row.company||'个人来访'}} · {{row.start_time||'—'}}
命中黑名单(姓名或电话或证件号)的访客,预约时会被直接拦截。
移出
来访人信息
来访安排
删除
+ 添加随行人员
接待安排
取消
保存
{{arriveRow?arriveRow.name+' · '+(arriveRow.company||'个人来访'):''}}
· 被访 {{arriveRow.host_name}}
📷 拍摄 / 选择照片
📍 获取当前位置
{{arriveForm.loc_ok?('已定位 '+arriveForm.geo):'未取到定位'}}
已向访客宣读安全须知并确认
取消
确认到访
{{areaRow?areaRow.name+' · 已在访 '+(areaRow.area_count||0)+' 个区域':''}}
📷 拍摄 / 选择照片
×
📍 获取当前位置
{{areaForm.loc_ok?('已定位 '+areaForm.geo):'未取到定位'}}
取消
登记
{{leaveRow?leaveRow.name+' · 到访 '+leaveRow.arrive_at:''}}
📷 拍摄 / 选择照片
访客卡已收回
📍 获取当前位置
{{leaveForm.loc_ok?('已定位 '+leaveForm.geo):'未取到定位'}}
取消
确认离场
{{visDetail.status_label}}
{{visDetail.visit_no}}
{{visDetail.type_label}}
{{visDetail.visit_date}} {{visDetail.start_time||''}}{{visDetail.end_time?'-'+visDetail.end_time:''}}
· 被访 {{visDetail.host_name}}
到访登记
登记区域
离场
{{visDetail.name}}
{{visDetail.company||'—'}}
{{visDetail.phone||'—'}}
{{visDetail.id_type_label}}
{{visDetail.id_no||'—'}}
{{visDetail.receive_place||'前台大厅'}}
{{visDetail.escort_name||'—'}}
{{visDetail.visitor_count}} 人
{{visDetail.belongings||'—'}}
{{visDetail.reason||'—'}}
{{visDetail.arrive_at||'—'}}
{{visDetail.leave_at||'—'}}
{{visDetail.badge_no||'—'}}
{{visDetail.badge_returned?'已归还':'未归还'}}
{{visDetail.stay_minutes?visDetail.stay_minutes+' 分钟':'—'}}
{{visDetail.area_count}} 个
{{visDetail.created_at}}
取消原因:{{visDetail.cancel_reason}}
{{visDetail.plate_no||'无车辆'}}
无随行人员
{{ {invite:'预约/邀请',arrive:'到访登记',area:'接待区域',leave:'离场',cancel:'取消/爽约'}[lg.log_type] }}
{{lg.area}}
{{lg.operator_name}}
{{lg.content}}
📍
{{lg.addr||(lg.lat+', '+lg.lng)}}
{{visDetail.invite_code||'—'}}
请将邀请码或下列文案发送给访客,到前台核验后登记到访。
来访邀请:{{visDetail.name}} 您好,{{visDetail.visit_date}}
{{visDetail.start_time||''}}{{visDetail.end_time?'-'+visDetail.end_time:''}}
请到 {{visDetail.receive_place||'前台大厅'}},邀请码 {{visDetail.invite_code}},
被访人 {{visDetail.host_name}}。
复制邀请文案
刷新邀请码
姓名 / 电话 / 证件号至少填一项,命中即拦截预约。
取消
保存
{{attClock}}
{{attToday.work_date}} {{attToday.weekday}}
· 休息日
· 请假中
{{attToday.shift?attToday.shift.name:'—'}}
{{attToday.shift?attToday.shift.work_start+' - '+attToday.shift.work_end:''}}
{{attToday.shift.hours}} 小时/天
工作日:{{attToday.shift?attToday.shift.workday_names:'—'}} ·
迟到宽限 {{attToday.shift?attToday.shift.grace_late:0}} 分钟
{{attToday.need_location?'需定位':'免定位'}}
{{attToday.need_face?(attToday.face_registered?'扫脸已注册':'扫脸未注册'):'免扫脸'}}
{{attToday.need_photo?'需拍照':'免拍照'}}
未配置打卡地点
今日尚未上班打卡
上班 {{attToday.record.checkin_at.slice(11,16)}},待下班打卡
今日打卡已完成
{{attToday.next_action==='in'?'上班打卡':(attToday.next_action==='out'?'下班打卡':'已完成')}}
{{attToday.face_registered?'重新录入人脸':'注册人脸'}}
已录入
今日状态
{{attToday.record.status_name}}
· 迟到 {{attToday.record.late_min}} 分钟
· 早退 {{attToday.record.early_min}} 分钟
未打卡
本月出勤 / 迟到
{{attMonth.days||0}} / {{attMonth.late||0}}
本月工时
{{((attMonth.minutes||0)/60).toFixed(1)}} 小时
今日打卡明细
今天还没有打卡记录
{{p.label}} {{p.time}}
{{p.tag}}
距「{{p.site||'打卡点'}}」{{p.dist}} 米
{{p.addr||'未记录地址'}}
· 人脸相似度 {{Math.round(p.face_score)}}%
应出勤 / 实出勤
{{attSum.should_days||0}} / {{attSum.attend_days||0}}
迟到 / 早退
{{attSum.late_days||0}} / {{attSum.early_days||0}}
外勤 / 缺卡
{{attSum.field_days||0}} / {{attSum.lack_days||0}}
本月工时
{{attSum.work_hours||0}} 小时
打卡明细
申请补卡
{{row.checkin_at.slice(11,16)}}
缺卡
{{row.checkout_at.slice(11,16)}}
未打
{{row.status_name}}
{{row.work_minutes?((row.work_minutes/60).toFixed(1)+'h'):'—'}}
{{row.in.site||'—'}}
{{row.in.dist!==null&&row.in.dist!==undefined?(' · '+row.in.dist+'m'):''}}
{{row.note}}补卡
补卡申请
申请补卡
{{row.status_name}}
{{row.audit_name}} {{row.audit_opinion}}
请假申请
申请请假
{{row.start_date}} ~ {{row.end_date}}
{{({draft:'草稿',pending:'待审批',active:'已批准',void:'已作废'})[row.doc_status]}}
提交
班次(工作日期 / 上下班时间 / 打卡要求)
新增班次
{{row.work_start}} - {{row.work_end}}
{{row.workday_names}}
{{row.grace_late}}/{{row.grace_early}} 分
定位
扫脸
拍照
外勤
默认
设为默认
编辑
删除
打卡地点:员工进入任一地点半径内才算有效打卡
新增地点
{{row.lng}}, {{row.lat}}
{{row.radius}} 米
{{row.enabled?'启用':'停用'}}
编辑
删除
应到 / 已打卡
{{attBoard.stat.total||0}} / {{attBoard.stat.checked||0}}
已下班
{{attBoard.stat.done||0}}
迟到
{{attBoard.stat.late||0}}
外勤 / 请假
{{attBoard.stat.field||0}} / {{attBoard.stat.leave||0}}
未打卡
{{attBoard.stat.absent||0}}
当日考勤
刷新
{{row.checkin_at?row.checkin_at.slice(11,16):'—'}}
{{row.checkout_at?row.checkout_at.slice(11,16):'—'}}
{{row.state}}
{{row.late_min?row.late_min+'分':'—'}}
{{row.work_minutes?((row.work_minutes/60).toFixed(1)+'h'):'—'}}
修正
补卡待审批
刷新
—
通过
驳回
{{row.status_name}}
📍
定位
定位中…
已定位
定位失败
未开始
范围外
{{attLoc.addr||'(未配置地图服务,仅记录坐标)'}}
{{attLoc.lng.toFixed(6)}}, {{attLoc.lat.toFixed(6)}}(精度 ±{{Math.round(attLoc.acc)}}m)
最近打卡点「{{attLoc.site}}」距离 {{attLoc.dist}} 米
(有效 {{attLoc.radius}} 米)
尚未配置打卡地点,本次只记录坐标
{{attLoc.err}}
需在浏览器弹窗中允许定位;局域网 http 访问无法定位,请用 127.0.0.1 或 https。
重新定位
🙂
扫脸验证
未注册人脸
相似度 {{Math.round(punchForm.face_score)}}%
待拍摄
本班次非必填
拍摄人脸
先注册底照
相似度偏低,建议重拍;仍要提交请勾选下方「忽略人脸校验」
📷
现场拍照
必填
选填
已拍
拍照留证
在打卡范围外办公时开启,将记为外勤(需班次允许)
今日非工作日,到岗需开启
人脸相似度偏低仍提交(会记录并由管理员核验)
取消
确认打卡
{{camMsg}}
取消
重拍
拍照
使用这张
上班卡
下班卡
拍照
取消
提交(HR 审批)
下班
{{['一','二','三','四','五','六','日'][d-1]}}
分钟
早退宽限
分钟
分钟(仅用于计算标准工时)
需定位
需扫脸
需现场拍照
允许外勤打卡
米,0 = 沿用打卡地点自身半径
取消
保存
,
取当前位置
⚠️ 当前是 http 地址,浏览器禁止定位,点了「取当前位置」不会有反应。
查看解决办法(改用 https) ,
或手动填写经纬度。
米
取消
保存
{{fixForm.user_name}} {{fixForm.work_date}}
已打卡不可改
已打卡不可改
取消
保存修正
取消
提交(人事审批)
售后看板
刷新
📷 扫码查工单
两本账分开算:对客户应收 =报价/材料/差旅(客户确认后生效) |
对服务方应付 =派工时约定的工时/包干价(对账后付款)
待派工
{{svcStats.waiting||0}}
已派工
{{svcStats.dispatched||0}}
处理中
{{svcStats.processing||0}}
紧急未完工
{{svcStats.urgent||0}}
供货方待接/处理
{{svcStats.supplier_pending||0}} / {{svcStats.supplier_active||0}}
完工未结算
{{svcStats.done_unsettled||0}}
客户应收
¥{{(svcStats.cust_amount||0).toLocaleString()}}
已确认 ¥{{(svcStats.cust_amount_confirmed||0).toLocaleString()}}
待客户确认
{{svcStats.cust_pending_confirm||0}}
对服务方待付
¥{{(svcStats.party_payable||0).toLocaleString()}}
待审结算单
{{svcStats.settle_pending||0}}
已生效待回款
¥{{(svcStats.cust_receivable||0).toLocaleString()}}
缺客户确认单
{{svcStats.missing_sign||0}}
未附转款凭证(选填)
{{svcStats.missing_voucher||0}}
退回
{{svcStats.refused_pending||0}}
平均满意度
{{svcStats.avg_satisfaction||'—'}}
售后服务
工单
结算单
我的工单
退回待重派 {{svcStats.refused_pending||0}}
登记工单
查询
{{row.work_no}}
{{row.order_type_name}}
急
{{row.supplier_name||'供货方'}}
{{row.team_name||'服务团队'}}
待重派
{{row.engineer_name||'内部工程师'}}
建议派 {{row.suggest_supplier.name}}
{{row.plan_at?row.plan_at.slice(5,16):'—'}}
{{({waiting:'待派工',dispatched:'已派工',processing:'处理中',done:'已完工'})[row.exec_status]}}
退回{{row.refuse_count>1?' ×'+row.refuse_count:''}}
{{({draft:'草稿',pending:'待审',active:'生效',void:'作废'})[row.doc_status]}}
¥{{(row.cust_amount||0).toLocaleString()}}
{{row.cust_settle_type_label}}
{{row.cust_confirm_label}}
完工后确认
{{row.team_settle_type_label}}
¥{{row.team_settle_rate}}/h
{{row.team_commission_rate}}%
¥{{(row.team_amount||0).toLocaleString()}}
付 {{row.team_name||row.supplier_name||'承接方'}}
依据:{{row.team_settle_basis}}
¥{{row.charge_total.toLocaleString()}}
—
缺确认单
详情
提交
通过
驳回
再派单
派工
派供货方
派团队
到场
完工回填
回访
客户结算
服务方结算
打印
查询
共 {{settleAgg.count||0}} 单 ·
对客户应收(已生效)¥{{(settleAgg.cust_receivable||0).toLocaleString()}} ·
对服务方待付 ¥{{(settleAgg.party_payable||0).toLocaleString()}} ·
已生效 ¥{{(settleAgg.active||0).toLocaleString()}}
· {{settleAgg.need_voucher}} 单缺转款凭证
{{row.settle_no}}
{{row.settle_side==='customer'?'对客户应收':'对服务方应付'}}
{{row.settle_target||'内部工程师'}}
{{row.settle_party_label}}
{{row.work_hours||0}}h × {{row.hour_rate||0}}
¥{{(row.total_amount||0).toLocaleString()}}
¥{{(row.payable||0).toLocaleString()}}
{{row.doc_status_label}}
未附凭证
{{row.pay_status_label}}
¥{{(row.paid_amount||0).toLocaleString()}}
详情
登记付款
附凭证
提交
通过
驳回
作废
打印
电话
优先级
{{t.label}}
对外向客户 收费的口径(与派给服务团队的结算无关,团队结算在派单时单独约定)
报价/预估应收
元 · 完工后客户确认
质保内 质保外
质保内客户免费,但团队/供货方的服务费仍按约定另行结算
取消
保存(草稿)
该单已被承接方退回
(累计 {{dispatchRow.refuse_count}} 次) :
{{dispatchRow.refuse_reason||'—'}}
{{dispatchRow.refused_by_name}} · {{dispatchRow.refused_at}}
取消
派工(自动通知)
设备「{{supDispatchRow.product_name||supDispatchRow.device_info}}」由
{{supDispatchRow.suggest_supplier.name}} 供货(采购单
{{supDispatchRow.suggest_supplier.po_no}}),按售后责任应派给该供货方。
未定位到该设备的供货来源,可手工选择供货方;建议在设备产品里选择产品以自动定位。
质保内(免费)
质保外(另行结算)
取消
派单并通知(门户可见)
工单 {{teamDispatchRow?teamDispatchRow.work_no:''}} ·
{{teamDispatchRow?teamDispatchRow.customer_name:''}} ·
类型 {{teamDispatchRow?teamDispatchRow.order_type_name:''}}
服务团队在门户「我的任务」接单 → 上传现场照片与客户确认单 → 回填完工。
未开通账号的团队不可选:先在「账号管理 → 服务团队账号」开通
我方与该团队的结算(对内应付 · 与客户收费无关)
提成比例
%(按客户结算金额)
单价
元/小时
本单金额
元
垫付主体
预估应付 = 客户结算 ¥{{((teamDispatchRow?teamDispatchRow.cust_amount:0)||0).toFixed(2)}}
× {{teamDispatchForm.team_commission_rate||0}}%
{{ teamDispatchForm.team_advance_party==='us' ? ' − 我方垫付 ¥'+(teamDispatchForm.team_advance_fee||0).toFixed(2) : '' }}
{{ teamDispatchForm.team_advance_party==='team' ? ' + 服务方垫付 ¥'+(teamDispatchForm.team_advance_fee||0).toFixed(2) : '' }}
= ¥{{(teamDispatchPay||0).toFixed(2)}}
(客户实收以完工结算为准,基数变化则同步重算)
质保内(客户免费)
质保外(向客户收费)
只影响客户是否付费;团队服务费仍按上面的约定结算
取消
派单并通知团队
工单 {{svcFinishRow?svcFinishRow.work_no:''}} · {{svcFinishRow?svcFinishRow.customer_name:''}}
· 完工后按工时与费用生成结算依据
小时 × 单价
工时费 ¥{{((svcFinishForm.hours||0)*(svcFinishForm.labor_rate||0)).toFixed(2)}}
配件费
¥{{svcFinishTotal}}
= 工时费 + 差旅 + 配件
按现场实际向客户收取 的费用项逐条录入;清单合计即客户实际结算额,
也是服务方「按客户金额提成」的唯一基数(报价预估不作依据)
删除
+ 增加费用项
清单合计
¥{{svcFinishFeeTotal}}
必填 · 质保内免费可填 0 元项目说明
📎 上传《售后服务确认单》(客户签字)
已上传
必传 · 无客户签字确认单不能完工
📎 上传现场照片
本次上传 {{svcFinishForm.photos.length}} 张
已有 {{svcFinishForm.photo_count}} 张(可继续补传)
必传 · 至少一张现场/完工照片
取消
确认完工
工单 {{custConfirmForm.work_no}} · 客户结算方式 {{custConfirmForm.type_label}}
应收客户 ¥{{(custConfirmForm.amount||0).toFixed(2)}}
(对外应收,与服务方结算无关)
确认金额无误
有异议
取消
提交
取消
提交
工单 {{settleForm.workorder_no}} · {{settleForm.customer_name}} ·
类型 {{settleForm.workorder_type_label||'—'}}
方向:对客户应收(对外) · 结算对象:{{settleForm.settle_target||'客户'}}
(向客户收取;与服务团队/供货方结算分别单独做单,互不冲抵)
工单 {{settleForm.workorder_no}} · {{settleForm.customer_name}} ·
类型 {{settleForm.workorder_type_label||'—'}}
方向:对服务方应付(对内) · 结算对象:{{settleForm.settle_target||'内部工程师'}}
(工单派给服务团队,结算给该团队;团队门户可见并确认对账)
(按工单承接方自动确定)
结算依据(派单时与承接方约定,可追溯) {{settleForm.settle_basis}}
{{t.label}}
工时
× 单价
对客户的应收金额(含工时/材料/差旅,按客户结算方式口径一次列示)
元
客户实际结算额(基数)
¥{{(settleForm.basis_amount||0).toFixed(2)}}
{{settleForm.base_source_label||''}}
提成金额
¥{{(settleCalc.gross||0).toFixed(2)}}
应付 = 提成 ¥{{(settleCalc.gross||0).toFixed(2)}}
− 我方垫付 ¥{{Math.abs(settleCalc.adj).toFixed(2)}}
+ 服务方垫付 ¥{{settleCalc.adj.toFixed(2)}}
= ¥{{(settleCalc.labor||0).toFixed(2)}}
客户应收 ¥{{(settleForm.basis_amount||0).toFixed(2)}}
属另一本账,不在此单抵扣
{{settleForm.settle_type==='hour'?'工时费':'约定服务费'}}
%
优惠减免
发票
¥{{(row.amount||0).toFixed(2)}}
删
+ 添加明细行
📎 {{settleForm.pay_voucher?'重新上传转款凭证':'上传转款/收款凭证(选填)'}}
已上传{{settleForm.pay_voucher_at?('('+settleForm.pay_voucher_at+')'):''}}
选填 · 客户换方式抵扣或合并付款时可暂不上传,事后随时可补
费用合计 ¥{{settleCalc.total}}
+ 税额 ¥{{settleCalc.tax}}
− 优惠 ¥{{settleForm.discount||0}}
= 应付 ¥{{settleCalc.payable}}
取消
{{settleForm.id?'保存修改':'创建结算单(草稿)'}}
结算单 {{payForm.settle_no}} · 应付 ¥{{(payForm.payable||0).toLocaleString()}}
· 对象 {{payForm.settle_target||'—'}}
登记后对方门户立即显示「已付款」,并收到站内通知
留 0 = 按应付全额
📎 {{payForm.pay_voucher?'重新上传':'上传回单(选填)'}}
取消
确认付款
{{svcDetail.doc_status_label}}
{{svcDetail.exec_status_label}}
{{svcDetail.priority_label}}
{{svcDetail.service_mode_label}}
客户结算:{{svcDetail.cust_settle.type_label}}
{{svcDetail.warranty?'质保内':'质保外'}}
{{svcDetail.customer_name}}
{{svcDetail.contact||'—'}} {{svcDetail.phone}}
{{svcDetail.product_name||svcDetail.device_info||'—'}}
{{svcDetail.order_type_name}}
待我方重新派工(已退回 {{svcDetail.refuse_count}} 次)
{{svcDetail.service_party_label}}
{{svcDetail.service_party==='supplier'?('· '+svcDetail.supplier_name):('· '+(svcDetail.engineer_name||'—'))}}
{{svcDetail.plan_at||'—'}}
{{svcDetail.arrive_at||'—'}}
{{svcDetail.finish_at||'—'}}
{{svcDetail.hours}}h × {{svcDetail.labor_rate}}
¥{{(svcDetail.cust_settle.amount||0).toLocaleString()}}
① 客户结算(对外应收)
{{svcDetail.cust_settle.type_label}}
{{svcDetail.cust_settle.warranty_label}}
应收客户 ¥{{(svcDetail.cust_settle.amount||0).toFixed(2)}}
{{svcDetail.cust_settle.confirm_label}}
登记客户确认
报价/预估 ¥{{(svcDetail.cust_settle.quote_fee||0).toFixed(2)}} ·
实际费用清单 ¥{{(svcDetail.cust_settle.fee_total||0).toFixed(2)}}
({{svcDetail.cust_settle.fee_by_name}} 填报) ·
工时 {{svcDetail.cust_settle.detail.hours}}h × ¥{{svcDetail.cust_settle.detail.labor_rate}} ·
差旅 ¥{{(svcDetail.cust_settle.detail.travel_fee||0).toFixed(2)}} ·
配件 ¥{{(svcDetail.cust_settle.detail.parts_fee||0).toFixed(2)}}
{{f.name}}({{f.note}})
¥{{(f.amount||0).toFixed(2)}}
未填客户费用清单(历史工单):提成结算按客户确认额计,无确认额时不予计提
客户确认:{{svcDetail.cust_settle.confirm_at}}
· {{svcDetail.cust_settle.confirm_note}}
待客户在门户确认(或客户口头确认后在此登记)
② 服务方结算(对内应付)
{{svcDetail.team_settle.party_label}}
承接方 {{svcDetail.team_settle.target}}
{{svcDetail.team_settle.type_label}}
¥{{svcDetail.team_settle.rate}}/小时
提成 {{svcDetail.team_settle.commission_rate}}% ·
基数待客户实际费用确认
(报价预估 ¥{{(svcDetail.team_settle.base_amount||0).toFixed(2)}} 不作依据)
客户实际结算 ¥{{(svcDetail.team_settle.base_amount||0).toFixed(2)}}
({{svcDetail.team_settle.base_source_label}})
× {{svcDetail.team_settle.commission_rate}}%
· 垫付 ¥{{(svcDetail.team_settle.advance_fee||0).toFixed(2)}}({{svcDetail.team_settle.advance_party_label}})
约定金额 ¥{{(svcDetail.team_settle.est_amount||0).toFixed(2)}}
应付承接方 ¥{{(svcDetail.team_settle.amount||0).toFixed(2)}}
结算依据:{{svcDetail.team_settle.basis}}
约定说明:{{svcDetail.team_settle.note}}
尚未派工或未约定服务方结算方式:派团队/派供货方时确定,承接方在门户接单前即可看到
必备凭证
客户签字确认单
{{svcDetail.has_sign?'已上传':'未上传'}}
{{svcDetail.sign_by_name}} · {{svcDetail.sign_at}}
完工前必传,否则不能回填完工
{{svcDetail.has_sign?'替换':'上传'}}
转款凭证
{{svcDetail.need_voucher?'缺凭证':(svcDetail.charge_total>0?'已齐备':'无需')}}
{{svcDetail.need_voucher?'本单有费用,结算单需上传转款凭证才能送审':'—'}}
故障与处理
故障描述: {{svcDetail.fault_desc||'—'}}
处理结果: {{svcDetail.result||'—'}}
更换配件: {{svcDetail.parts_used||'—'}}
驳回原因: {{svcDetail.reject_reason}}
派单说明: {{svcDetail.dispatch_note}}
退回过程记录
累计退回 {{svcDetail.refuse_count}} 次
{{r.at}}
{{r.by}}
{{r.party_label||r.party}}
无法处理:{{r.reason}}
已回到「待派工」,责任方重置为内部,可直接重新派工 / 派供货方 / 派服务团队
立即重新派单
处理流程(资料留痕)
{{t.action}}
{{t.by}}
过程资料
+ 上传
{{f.kind_label}}
结算记录
¥{{(row.payable||0).toLocaleString()}}
{{({draft:'草稿',pending:'待审',active:'生效',void:'作废'})[row.doc_status]}}
明细
客户结算(应收)
服务方结算(应付)
打印工单
{{settleView.doc_status_label}}
{{settleView.settle_type_label}}
{{settleView.settle_side_label}}
{{settleView.pay_method_label}}
{{settleView.invoice_type_label}}
{{settleView.workorder_no||'—'}}
{{settleView.customer_name}}
{{settleView.workorder_type_label||'—'}}
{{settleView.settle_month}}
¥{{(settleView.basis_amount||0).toFixed(2)}} × {{settleView.basis_rate}}%
· 垫付 ¥{{settleView.advance_fee}}({{settleView.advance_party_label}})
{{settleView.work_hours}}h × {{settleView.hour_rate}}
{{settleView.team_name||settleView.supplier_name||settleView.engineer_name||'—'}}
结算依据 :{{settleView.settle_basis}}
费用明细
¥{{(row.amount||0).toFixed(2)}}
费用合计 ¥{{(settleView.total_amount||0).toLocaleString()}}
税额({{settleView.tax_rate}}%)¥{{settleView.tax_amount}}
优惠减免 −¥{{settleView.discount}}
应付 ¥{{(settleView.payable||0).toLocaleString()}}
备注:{{settleView.remark}}
驳回原因:{{settleView.reject_reason}}
转款凭证
(选填,客户换方式抵扣/合并付款时可后补)
暂无
上传人:{{settleView.pay_voucher_by_name||'—'}}
· {{settleView.pay_voucher_at}}
未上传(选填)· 应付 ¥{{settleView.payable}},不影响提交与审批
📎 {{settleView.pay_voucher?'替换凭证':'上传转款凭证'}}
流转记录
{{t.action}}
{{t.by}}
关闭
修改
提交审批
驳回
审批通过
打印
经营总览({{ov.month}})
本月销售额
¥{{ov.sales_amount?.toLocaleString()}}
本月采购额
¥{{ov.purchase_amount?.toLocaleString()}}
库存数量
{{ov.stock_qty?.toLocaleString()}}
库存金额(估)
¥{{ov.stock_value?.toLocaleString()}}
应收余额
¥{{ov.receivable_open?.toLocaleString()}}
逾期应收
¥{{ov.receivable_overdue?.toLocaleString()}}
查询
导出Excel
导出Excel
导出Excel
低于安全线
正常
未到期 ¥{{recvSummary.not_due?.toLocaleString()}} · 1-30天 ¥{{recvSummary.d1_30?.toLocaleString()}} · 31-60天 ¥{{recvSummary.d31_60?.toLocaleString()}} · 60天+ ¥{{recvSummary.d60p?.toLocaleString()}}
导出Excel
CRM 销售线索
新增线索
{{({new:'新线索',following:'跟进中',won:'已成交',lost:'已流失'})[row.stage]}}
跟进
转客户
流失
取消
保存
{{fuLead.name}} {{({new:'新线索',following:'跟进中',won:'已成交',lost:'已流失'})[fuLead.stage]}}
关闭
提交跟进
生产与采购申请
生产工单
采购申请
采购订单
预定履约
供应商发货
新建工单
新建申请
新建履约工单
刷新协同台账
刷新台账
{{row.done_qty}} / {{row.plan_qty}}
{{({draft:'草稿',pending:'待审',active:'生产中',void:'作废'})[row.doc_status]}}
提交
审核
领料
完工入库
{{it.material}}×{{it.qty}};
{{({draft:'草稿',pending:'待审',active:'已生效',void:'作废'})[row.doc_status]}}
提交
审核
转采购订单
已转PO
预定产品销售订单审核通过后自动生成履约工单;内部生产部或流转至供应商生产部处理
{{row.material_name}} × {{row.qty}}
{{row.mode==='supplier'?'供应商生产':'内部生产'}}
{{({waiting:'待处理',producing:'生产中',delivering:'待交付确认',done:'已完成'})[row.status]}}
详情 / 过程资料
全部
执行中
待审核
草稿
查询
同一张单:我方叫「采购订单」,供应商门户叫「销售订单」。「待发」=订量 − 已入库 − 在途待确认,
与门户可发数同一口径;点「协同详情」可直接收货入账,门户同步变「已收货」。
{{row.item_summary}}
{{row.order_qty}}
{{row.in_qty}}
{{row.pending_qty}}
{{row.deliverable_qty}}
{{row.progress}}%
{{row.ship_state_label}}
{{row.status_label}}
协同详情
收货 {{row.unreceived_count}}
全部
待收货
在途
已到达
已收货
只看门户发货
查询
供应商门户一发货即出现在此;此处审核通过=收货入账,门户同步显示「已收货」
{{row.po_no}}
—
{{row.item_summary}}
{{row.total_qty}}
{{row.transport_label}}
{{row.carrier_name}} · {{row.plate_no}}
{{row.logistics_label}}
{{row.proof_count}} 图 / {{row.track_count}} 节点
{{row.source_label}}
{{row.doc_status==='active'?'已收货':'待收货'}}
物流凭证
收货入账
供应商: {{pcDetail.supplier_name}}
下单日期: {{pcDetail.order_date}}
预计到货: {{pcDetail.expect_date||'—'}}
单据状态: {{pcDetail.status_label}}
采购金额: ¥{{pcDetail.total_amount}}
到货阶段:
{{pcDetail.ship_state_label}}
收货去向:
{{pcDetail.delivery_mode_label}}
{{pcDetail.delivery_mode==='direct'?'修改直发约定':'设为直发客户'}}
🖨 打印采购单
采购明细(口径与门户一致)
发货记录({{(pcDetail.deliveries||[]).length}} 张)
来自供应商门户或内部代录,收货入账后门户同步
{{row.transport_label}}
· {{row.plate_no||row.tracking_no}}
{{row.doc_status_label}}
{{row.signed_at}}
收货入账
{{row.delivery_mode==='direct'?'直发已过账':'已入账'}}
取消
恢复发我方仓
保存直发约定
删
+ 添加产品(并入同一张工单表)
多个产品将生成一张多产品工单表,接单方按产品分段核对
企业内部生产部
合作供应商生产部
取消
保存
{{fulDetail.order.fulfill_no}}
{{fulDetail.order.source_so_no||'手动创建'}}
{{fulDetail.order.customer_name}}
{{fulDetail.order.material_name}} × {{fulDetail.order.qty}}
多产品工单 · 共 {{fulDetail.order.product_count}} 个产品
{{fulDetail.order.mode==='supplier'?('供应商·'+(fulDetail.order.supplier_name||'')):'内部生产'}}
{{fulDetail.order.expect_date}}
{{fulDetail.order.assignee_name||'未派单'}}
{{fulDetail.order.assigned_by?fulDetail.order.assigned_by+' · '+fulDetail.order.assigned_at:'—'}}
工单表 · 技术参数核对单
v{{fulDetail.sheet.version}} · 生成 {{fulDetail.sheet.generated_at}}
{{fulDetail.order.sheet_confirmed_by}} 已核对
待接单方核对
🖨 打印工单表
{{r.h}}
{{r.p.label}}*
{{r.p.value||'—'}}
工艺/物料清单(按工单数量折算)
{{it.product?('【'+it.product+'】'):''}}{{it.material_name}}
{{it.spec||'—'}} · {{it.qty}}{{it.unit||''}}
{{fulDetail.sheet.note}}
派单 / 修订工单表
代接单方核对确认
流转供应商接单
开始生产
提交交付
确认完成
{{fulDetail.order.mode==='internal'?'改为供应商生产':'改为内部生产'}}
上传过程资料
扫码上传
流程进度
{{({waiting:'接单/开工',producing:'进入生产',delivering:'提交交付',done:'确认完成'}[e.stage]||e.stage || '动态')}}{{e.note?(':'+e.note):''}}
过程资料
{{({waiting:'接单',producing:'生产',delivering:'交付',done:'完成'}[row.stage]||row.stage)}}
图片
暂无过程资料,各环节均可上传或扫码上传。
✓ 图片已选择
取消
上传
企业内部生产部
合作供应商
工单表技术参数(派单时确定,接单方须逐项核对;带 * 为关键参数)
删
+ 增加自定义参数
取消
确认派单并生成工单表
由内部人员代替接单方(如内部班组/供应商电话确认)逐项核对技术参数,核对结果将记入工单流转。
{{p.label}}不符
已逐项核对工单表技术参数,确认可按此生产
取消
确认核对
~
取消
保存
取消
确认领料
取消
确认入库
删
+ 添加行
取消
保存
{{convertRow&&convertRow.request_no}}
{{convertRow&&convertRow.use_for}}
{{convertRow&&(convertRow.items||[]).map(i=>i.material+'×'+i.qty).join(';')}}
取消
转单并查看
人事行政
出差申请
培训管理
员工档案
绩效考核
文档中心
申请出差
{{({draft:'草稿',pending:'待审',active:'已批准',void:'作废'})[row.doc_status]}}
提交
批准
总结
新建培训
{{row.records.length}} / {{row.records.filter(r=>r.signed).length}}
签到
成绩
新建档案
{{row.status===1?'在职':'离职'}}
查询
录入考核
{{row.total}}
登记文档
{{({1:'普通',2:'内部',3:'机密'})[row.secret_level]}}
~
取消
保存
取消
保存
取消
保存
取消
保存
取消
保存
数据字典
新增字典项
新增字典类型
{{dictTypeName}}(编码 {{dictType||'-'}}):共 {{dictItems.length}} 项,启用
{{dictItems.filter(i=>i.status===1).length}} 项。停用项不再进入业务下拉,历史单据保留原值。
{{row.status===1?'启用':'停用'}}
编辑
{{row.status===1?'停用':'启用'}}
保存后由系统分配同类内唯一值,无需手工填写
值已被业务引用,不可修改
数字小的排前面
取消
保存
保存后自动分配唯一编码,如 dict_0011
取消
保存
企业信息
{{orgInfo.locked? '🔒 公司名称已锁定 · 不可修改' : (orgInfo.initialized?'✏️ 尚未锁定,名称仍可修改':'① 待录入')}}
请先录入公司名称。 这个名称会出现在侧栏品牌、所有单据的打印抬头、合同落款、门户首页与 AI 助手的自我介绍里——
系统里"我方是谁"全靠它。录入并核对无误后请点「锁定」,锁定后名称不可再改(避免有人误改导致历史单据主体不一致)。
已录入{{orgInfo.name}} 。确认无误后请点「锁定公司名称」 ;锁定后其余资料(电话/地址/银行等)仍可随时维护。
企业名称{{orgInfo.name}} 已于 {{orgInfo.locked_at}} 由 {{orgInfo.locked_by}} 锁定。
该名称已同步到:侧栏品牌、单据打印抬头、门户首页、AI 助手。如需变更须超级管理员解锁。
公司全称 *必填
公司简称 侧栏/门户显示
英文名称
所属行业
统一社会信用代码
法定代表人
注册地址
办公/收货地址
联系人
联系电话
电子邮箱
网站
开户银行
银行账号
纳税人识别号
Logo 图片地址
备注
保存企业信息
🔒 锁定公司名称
解锁(需输入全称确认)
最近更新 {{orgInfo.updated_at}} · {{orgInfo.updated_by||'—'}}
预览:这个名称会出现在哪里
侧栏品牌 {{orgInfo.brand||'—'}}
单据打印抬头 {{orgInfo.name||'—'}}
合同落款 {{orgInfo.name||'—'}}
门户「服务方」 {{orgInfo.brand||'—'}}{{orgInfo.phone?(' · '+orgInfo.phone):''}}
AI 助手自我介绍 我在为「{{orgInfo.name||'—'}}」工作
对外地址 {{orgInfo.office_address||'—'}}
数据备份
目录 {{bkOv.dir||'-'}} · {{bkOv.platform==='sqlite'?('SQLite/'+(bkOv.journal_mode||'-')):bkOv.platform}} · 构建 {{bkOv.build||'-'}}
最近备份
{{bkOv.last_backup? bkOv.last_backup.created_at : '从未备份'}}
{{fmtSize(bkOv.last_backup.size)}} · {{bkOv.last_backup.kind_label}} · {{bkOv.last_backup.operator_name}}
建议先点右侧「立即备份」
备份份数
{{bkOv.count||0}} 份
共占 {{fmtSize(bkOv.total_size)}} · 最近 {{bkOv.age_hours===null||bkOv.age_hours===undefined?'-':bkOv.age_hours+' 小时前'}}
下次自动备份
{{bkOv.next_run||'未启用'}}
每日 {{bkSet.run_time||'02:30'}} · 保留 {{bkSet.keep_days||30}} 天 / {{bkSet.keep_count||30}} 份
磁盘余量
{{fmtSize(bkOv.disk_free)}}
数据库 {{fmtSize(bkOv.db_size)}} · 附件 {{fmtSize(bkOv.uploads_size)}}({{bkOv.uploads_files||0}} 个)
注意:已超过 36 小时没有成功备份。请点「立即备份」,并检查「备份策略」是否启用、时间是否已过。
备份策略
保留
天 /
份
包含上传附件
异地镜像目录
保存策略
立即备份
扫描备份目录
异地镜像 = 每份备份再复制一份到该目录;指向百度网盘/OneDrive 同步文件夹、移动硬盘或另一台机器的共享盘,即「云端生产 + 本地留底」。
{{row.kind_label}}
{{fmtSize(row.size)}}
{{row.table_count}} 表 {{row.row_count}} 行
{{row.status==='ok'?'可用':(row.status==='missing'?'文件缺失':'失败')}}
已镜像
失败
-
下载
校验
镜像
还原
删除
还原会用备份包里的数据覆盖当前系统(单据、账号、库存、门户数据全部回到该时间点)。
系统会先自动生成一份「还原前快照」,需要时可再还原回来。
建议在无人使用时操作;还原完成后刷新页面并重新登录。
目标备份:{{(bkRestoreRow||{}).filename||'-'}}
备份时间:{{(bkRestoreRow||{}).created_at||'-'}} ·
含 {{(bkRestoreRow||{}).table_count||0}} 表 / {{(bkRestoreRow||{}).row_count||0}} 行 ·
{{fmtSize((bkRestoreRow||{}).size)}}
取消
确认还原
部署与升级
版本 {{dpEnv.version||'-'}} · {{dpEnv.mode||'-'}} · 升级包目录 {{dpUpd.dir||'-'}}
当前版本
{{dpEnv.version||'-'}} / 构建 {{dpEnv.build||'-'}}
发布 {{dpEnv.released_at||'-'}} · 本次进程已运行 {{dpEnv.uptime_hours||0}} 小时
运行环境
{{dpEnv.mode||'-'}}
{{dpEnv.platform||''}} · Python {{dpEnv.python||''}} · PID {{dpEnv.pid||''}}
最近备份
{{dpEnv.last_backup?dpEnv.last_backup.created_at:'从未备份'}}
{{dpEnv.backup_stale?'已超 36 小时:先备份再升级':'目录 '+(dpEnv.backup_dir||'-')}}
磁盘余量
{{fmtSize(dpEnv.disk_free)}}
数据库 {{fmtSize(dpEnv.db_size)}} · 附件 {{dpEnv.uploads_files||0}} 个
刷新状态
运行自检
打开数据备份
自检 7 项:版本 / 数据库 / 备份 / 磁盘 / 前端入口 / 升级目录 / 待应用包
自检结果 {{dpCheck.at}} ·
{{dpCheck.ok?'全部通过':'有未通过项,见提示'}}
{{it.ok?'✅':'⚠️'}}
{{it.name}}
{{it.detail}}{{it.hint}}
云服务器托管
录入一次;换服务器、换本地电脑,改这条档案就行
主用:{{cvPrimaryName||'未设置'}}
1 「新增服务器」填:公网 IP、root 密码、阿里云 AccessKey (推荐,填了就不用再去控制台点安全组)
2 点「安全组体检」:系统直连阿里云 OpenAPI,读出实例真正绑定的安全组,逐端口告诉你差哪条
3 点「自动放行」:缺的 22 / 8902 / 80 / 443 规则由系统自己加到实例实际绑定 的安全组上;点「云助手」还能不看 22 直接进系统内查防火墙
4 点「部署」(首次勾「同时把本机数据搬过去」)→ 打开 http://IP:8902;之后每天「拉备份」留底
没填 AccessKey 也能用:点「测试」会给你可复制的放行清单,照着手工加规则。
新增服务器
刷新
本机 {{cvLocal.mode||'-'}} · 端口 {{cvLocal.web_port||8902}} · 版本 {{cvLocal.version||'-'}}
· 出口 IP {{cvLocalIp||'-'}}
{{row.host}} :{{row.ssh_port}}
{{row.ssh_user}} · {{row.root_dir}}
主用
备用
已连通
未连通
{{row.last_check_msg||'还没测试过'}}
上次诊断
阿里云已接入
{{row.ak.region_id}} · {{row.ak.instance_id||'未绑定实例'}}
{{row.remote_version||'-'}}
安全组体检
云助手
测试
部署
拉备份
设主用
编辑
删除
最近任务
开始 类型 结果
当前步骤
{{t.started_at}}
{{cvKind(t.kind)}}
{{t.status==='ok'?'成功':(t.status==='fail'?'失败':'运行中')}}
{{t.step}} · {{t.operator}}
日志
{{cvDiag.row?(cvDiag.row.name||cvDiag.row.host):''}} ·
{{cvDiag.ok?'四层全部通过,可以点「部署」了':cvDiag.msg}}
你的出口 IP 一直在变 :{{(cvDiag.ip_shift.ips||[]).join(' → ')}}
(共 {{cvDiag.ip_shift.count}} 个)。安全组里写死 /32 的话,
换个网络就断——这就是反复「放行了还是不行」的原因。
授权对象一律填 0.0.0.0/0 ;或填 AccessKey 让系统自己放行(以后换网络不用管)。
层级 结果 详情 / 下一步
{{st.title}}
{{st.ok?'通过':'未通过'}}
{{st.detail}}
{{st.hint}}
端口放行体检(同一时刻从本机并发探测全机常用端口)
端口 探测结果 判断
{{pp.port}}
{{pp.state==='timeout'?'无响应':(pp.state==='open'?'有服务在跑':'连接被拒绝')}}
{{pp.state==='timeout'
?'数据包被云侧丢弃 → 这条还没放行'
:(pp.state==='open'?'已放行且有服务在跑':'已被放行,只是没有程序监听')}}
只要出现「连接被拒绝」,就说明实例在线、安全组整体是通的;只需给「无响应」的端口补规则。
操作清单(照着填,填完回到这里点「重新测试」)
{{cvRulesText}}
复制放行清单
控制台直达:
ECS 实例
|
轻量应用服务器
ECS:实例 → 安全组 → 配置规则 → 入方向 → 手动添加;轻量:实例 → 防火墙 → 添加规则。
加了规则还是这样? 最常见三种原因,都只有凭 AccessKey 才能查清:
① 规则加到了别的安全组 (这个安全组没绑在这台实例上);
② 加到了出方向 而不是入方向;
③ 授权对象填成了 IPv6 或写错的段。
填 AccessKey,让系统自己查并放行
关闭
重新测试
必填:公网 IP、root 密码。其余保持默认即可;密码用 JWT 密钥派生加密存库,页面与接口都不回显。
密码
私钥
安全组要放行这个端口
阿里云 AccessKey(推荐,填了可自动放行端口 / 云助手执行)
阿里云凭据没绑定成功: {{cvAkErr}}
凭据已保存,改上面的地域 / 实例后直接再点「保存」即可,不用重贴 Secret。
校验并列出实例
怎么拿 AccessKey(约 2 分钟)
打开 RAM 控制台 ↗
① 左侧「用户」→ 创建用户 → 勾选「使用永久 AccessKey 访问」 → 创建
② 复制 AccessKey ID / Secret(Secret 只显示这一次)→ 粘贴到上面两个框
③ 回到用户详情 → 「权限策略」→ 添加权限 → 选
AliyunECSFullAccess ,或点下面按钮复制最小权限策略自己建
复制策略 JSON
密钥加密存库,接口与页面都不回显。填好后点行上的「安全组体检」→「自动放行」,
22/8902 一次补齐,以后换网络换电脑都不用再动安全组。
取消
保存
目标:{{(cvDeploySrv||{}).name}} ({{(cvDeploySrv||{}).host}})
执行内容:建目录 → 上传程序 → 装 Python 依赖(阿里云源)→ 写配置 → 注册 systemd → 启动并健康检查。
全程约 2–5 分钟,日志实时显示;失败会指出卡在哪一步。
同时把本机数据搬过去(库 + 附件;首次部署强烈建议勾选,否则云端是空库)
取消
开始部署
{{cvAk.conclusion}}
实例
{{cvAk.instance.name}} · {{cvAk.instance.instance_id}} · {{cvAk.instance.status}}
({{cvAk.instance.region}} / {{cvAk.instance.os}})
公网 IP {{cvAk.instance.public_ip||'-'}}
· 本机出口 {{cvAk.local_ip||'-'}}
绑定安全组
{{g.name||g.id}} ({{g.id}})
端口 用途
判定 说明
{{p.port}}
{{p.why}}
{{p.state==='ok'?'已放行':(p.state==='missing'?'未放行':(p.state==='limited'?'来源不符':'被拒绝'))}}
{{p.note}}
自动放行会调用 AuthorizeSecurityGroup,把缺的规则加到实例实际绑定的安全组上(来源
0.0.0.0/0 ,家用宽带 IP 会变,写死 /32 迟早失效)。放行后若外网仍进不来,就是实例系统防火墙,
点「云助手」看 firewalld/iptables。
关闭
改 AccessKey
自动放行 {{(cvAk&&cvAk.missing&&cvAk.missing.length)?'('+cvAk.missing.join('/')+')':''}}
通过阿里云云助手在实例内执行命令,SSH 不通也能用。
状态:
{{cvAgentSt||'执行中'}}
{{cvAgentOut||'等待云助手回传…'}}
关闭
再体检一次
系统防火墙放行
{{cvTask?(cvTask.status==='ok'?'成功':(cvTask.status==='fail'?'失败':'运行中')):''}}
· {{cvTask?cvTask.step:''}}
{{(cvTask&&cvTask.log)||'等待日志…'}}
① 云端部署(手动,备用) 做一次即可;换服务器、搬机房照这个顺序走
方式 适合 数据在哪 公网可用
云主机 + Docker(推荐) 多人长期使用、客户与供应商扫码进门户 云盘 /data 是
本机 + 内网穿透 先试用、临时给外地同事看 本机磁盘 是(依赖本机开机)
纯内网 + VPN 数据不出公司 公司服务器 仅 VPN 内
1 买机:2 核 4G 起,系统盘 40G + 数据盘 20G;安全组只开 22 / 80 / 443,不要对公网开 8902
2 放代码:git clone <仓库地址> /opt/scm(或把 zip 传上去解压到 /opt/scm)
3 配环境:cp deploy/.env.example deploy/.env,改 SCM_PUBLIC_BASE(域名)与 SCM_JWT_SECRET(随机长串)
4 起服务:docker compose up -d --build;应用只绑 127.0.0.1:8902,外网统一走 Nginx
5 域名 + HTTPS:证书放 deploy/nginx/certs,把 scm-http.conf 换成 scm-tls.conf 后 reload nginx
6 首次进入:用 admin 登录 → 企业信息录入公司名称 → 账号管理建岗位与人 → 数据备份开自动
{{dpCmd.deploy}}
复制命令
数据全在 /data(库 + 备份 + 附件),容器重建不丢;升级前先做 ② 的备份
② 本地备份 云端生产 + 本地留底,两边都有才叫安全
每日自动备份
{{dpEnv.backup_auto?'已启用':'未启用'}}
保留 {{dpEnv.backup_protect_days||0}} 天 · 目录 {{dpEnv.backup_dir||'-'}}
最近一份
{{dpEnv.last_backup?dpEnv.last_backup.created_at:'从未备份'}}
{{dpEnv.last_backup?fmtSize(dpEnv.last_backup.size)+' · '+(dpEnv.backup_age_hours||0)+' 小时前':'先点下方「立即备份」'}}
异地镜像目录
{{(bkOv.settings||{}).mirror_dir||'未设置'}}
指向网盘同步文件夹/移动硬盘 = 每份备份自动再存一份异地
1 系统内每日自动备份:数据备份页 → 备份策略(默认 02:30,保留 30 份)
2 异地镜像:把「异地镜像目录」设为百度网盘 / OneDrive 同步目录或移动硬盘
3 云上生产时,本机定时跑 deploy/windows/pull_backup.ps1 拉最新备份到本地(任务计划程序每天一次)
4 还原、升级前系统都会自动再打一份快照,不用手动加保险
立即备份
下载最新备份
备份列表 / 还原
③ 升级更新 程序与数据分离:只换程序文件,库和附件原地不动
1 备份:点「立即备份」;应用升级时系统还会强制再打一份「升级前」快照
2 放包:把 scm-update-Pxx.zip 放进 {{dpUpd.dir||'updates'}},包内必须有 manifest.json(version / released_at / notes)
3 检查:本页自动扫描并显示版本、说明、可应用状态(版本须高于 {{dpEnv.version||'当前版本'}})
4 应用:点「应用」并输入完整包名确认;被覆盖的旧文件自动留档到 updates/rollback/时间戳
5 重启:{{dpEnv.docker?'Docker 用镜像重建(下方命令),容器内改文件在重建时会丢':'关旧进程再启动(下方命令)'}}
6 自检:点上方「运行自检」,7 项全绿再通知用户使用
当前是 Docker 部署:升级请走「换镜像」——服务器上 git pull 后用下方命令重建;本页「应用」适合本机 / 云主机直接跑代码的部署。数据在 /data,重建不动数据。
{{row.notes.join(';')}}
{{row.released_at||'-'}}
已应用
可应用 · {{row.files}} 个文件
{{row.error}}
应用
重启命令
{{dpCmd.restart}}
复制重启命令
最近升级记录
时间 升级包 版本 升级前备份 操作人
{{a.at}} {{a.filename}} {{a.from_version}} → {{a.version}}
{{a.backup||'-'}} {{a.operator||'-'}}
应用会:① 立即生成一份「升级前」全量备份;② 覆盖程序文件;③ 旧文件留档到 updates/rollback。
数据库、附件、备份、.env 都不会被改动。应用完成后必须重启才生效。
升级包:{{(dpRow||{}).filename||'-'}}
版本:{{(dpRow||{}).version||'-'}}(当前 {{dpEnv.version||'-'}})· 文件 {{(dpRow||{}).files||0}} 个
取消
确认应用
文件库
按类别
按项目
文件夹
+ 新建
容量
文件 {{fMeta.stats.total}} 个 · {{fMeta.stats.size_text}}
磁盘可用 {{fHuman(fMeta.disk.disk_free)}}
已进知识库 {{fMeta.stats.kb}} 个
全部文件
/ {{b.name}}
/ 系统单据
/ 最近 7 天
/ 我上传的
/ 我的分享
/ 回收站
/ {{fCatLabel(fCur.cat)}}
搜索
⬆ 上传
新建文件夹
归集系统附件
已选 {{fSel.length}} 项
批量还原
移动到…
改类别
删除
📁
{{fo.name}}
{{fo.file_count}} 个文件
{{fIconText(row.ext)}}
{{row.name}}
v{{row.version}}
机密
已入知识库
{{row.cat_label}}
{{row.project_name||'—'}}
{{row.ref_no}}
{{row.source_label}}
{{row.owner_name||'—'}} · {{(row.created_at||'').slice(5)}}
详情
下载
还原
彻底删除
编辑
删除
选择文件
支持 Office / PDF / 图片 / 音视频 / 压缩包,单个不超过 {{fMeta.limits?fMeta.limits.max_mb:50}}MB;可执行文件与脚本禁止上传
· {{f.name}}({{fHuman(f.size)}})
{{x.label}}
机密文件仅上传人本人与文件管理员可见,且不能生成外链
文本类与 PDF/Office 文件会自动解析正文:可在本模块全文检索,也会自动进入 AI 知识库供 AI 员工引用。
取消
上传 {{fUpFiles.length||''}} 个文件
取消
创建
取消
保存
1 天
3 天
7 天
30 天
仅查看
可下载
链接已生成({{fShareResult.expire_at}} 过期):
{{fShareResult.full_url}}
复制链接
外链访问会记录在文件的「操作日志」里;机密文件不允许生成外链。
关闭
生成链接
{{fDetail.preview_text}}
该格式不支持在线预览,请下载后查看
下载原文件
{{fDetail.kb_id?'已入知识库(再同步一次)':'加入 AI 知识库'}}
生成外链
重新解析正文
{{fDetail.file_no}}
v{{fDetail.version}}
{{fDetail.size_text}}
{{fDetail.cat_label}}
{{fDetail.sec_label}}
{{fDetail.source_label}}
{{fDetail.project_name||'—'}}
{{fDetail.ref_no||'—'}}
{{fDetail.owner_name||'—'}}
{{fDetail.download_count}}
{{fDetail.text_status==='ok'?('已解析 '+fDetail.preview_text.length+' 字'):'未解析'}}
{{fDetail.created_at}}
{{(fDetail.tags||[]).join('、')||'—'}}
{{fDetail.remark||'—'}}
版本记录({{(fDetail.versions||[]).length}})
v{{v.version}} · {{v.size_text}} · {{v.owner_name||'—'}} · {{v.created_at}}
当前
下载
外链
{{sh.mode==='download'?'可下载':'仅查看'}} · 访问 {{sh.visit_count}} 次 · 至 {{sh.expire_at||'长期'}}
取消
操作日志
{{lg.at}} · {{lg.user||'系统'}} · {{lg.detail}}
取消
按上面目录移动
按上面类别修改
账号管理
员工账号
客户账号
供应商账号
服务团队账号
新增员工
新建服务团队
{{ userTab==='supplier' ? '新增供应商' : '新增客户' }}
开通申请
服务团队登录后只进任务与费用结算门户:接单 → 填完工 → 对账确认
{{ userTab==='supplier'
? '供应商账号只能在这里开通:先「新增供应商」建档案,再点行内「开通账号」(对方登录后仅见供应商门户)'
: '客户账号可在此开通,也可由客户在登录页自助申请(免审核);开通后仅见客户门户' }}
{{p}}
未分配 · 请补齐
{{a.name}}
随岗位开通
{{r}}
未分配
{{row.status===1?'启用':'停用'}}
编辑
重置密码
{{row.status===1?'停用':'启用'}}
删除
还没有{{ userTab==='supplier'?'供应商':(userTab==='customer'?'客户':'服务团队') }}档案,所以这里没有可开通的对象。
新建服务团队
新增{{ userTab==='supplier'?'供应商':'客户' }}
建档后回到本页,点行内「开通账号」即可生成门户登录账号。
{{teamTypeLabel(row.team_type)}}
{{scopeLabel(sc)}}
未设承接范围
{{settleTypeLabel(row.settle_type)}}
· ¥{{row.hour_rate}}/时
{{row.username}}
待设密码
未开通
{{row.status===1?'启用':'停用'}}
-
编辑
开通账号
重置密码
{{row.status===1?'停用':'启用'}}
服务团队=承接生产加工 / 安装施工 / 维修保养的队伍(自有班组、外协服务商、代工方均可)。
建好后在此页签「开通账号」,团队即可登录门户接单与对账。
{{t.label}}
{{t.label}}
留空=不限;勾选后派单会校验「这队会不会干这个活」,不匹配直接拦住
电话
默认工时单价
税率
评级
取消
{{teamForm.id?'保存':'创建'}}
岗位包快选:
{{pk.name}}
按选择顺序,第一个为主岗位;AI 助手按所选全部岗位 逐个开通,可在「AI 对话助手」中切换
{{r.name}}
{{r.remark||''}}
取消
保存
{{pwdForm.username}}
取消
确认重置
电话
这里只建企业档案;保存后会直接弹出「开通账号」,生成门户登录账号后对方才能登录。
取消
保存并开通账号
{{partyForm.party_name}}
自动生成(企业编码小写,重名自动加序号)
首次登录无需密码,客户进入后自行设置
自动生成 Scm@ + 6 位企业 ID
开通后对方登录仅可见:我的订单 / 对账回款 / 售后服务(客户)或 我的销售订单 / 送货登记 / 售后服务(供应商)
取消
开通并生成账号
待审核
已开通
已驳回
全部
{{({customer:'客户',supplier:'供应商'})[row.account_type||'staff']||'员工'}}
{{({0:'待审核',1:'已开通',2:'已驳回'})[row.status]}}
开通
驳回
{{(row.account_type||'staff')==='customer'?'已自助开通':'账号已创建'}}
{{row.remark||'已驳回'}}
员工申请 → 在此指定岗位/角色开通;供应商入驻申请 → 通过后自动建/绑供应商档案并开门户账号;
客户账号为自助开通,无需审核(也可在「客户账号」页签由我方直接开通)。
{{approveForm.real_name}} ({{approveForm.mobile}})
{{approveForm.kind==='supplier'?'供应商门户账号':'员工账号'}}
同名供应商档案已存在则直接绑定,不存在会自动建档(编码 SUP…);
通过后对方用手机号登录,只见供应商门户:销售订单 / 送货登记 / 售后服务。
审核通过即按所选全部岗位 开通对应 AI 助手
取消
确认开通
取消
确认驳回
摄像头扫码
扫码枪 / 手动输入
解析
提示:不打开本对话框时,桌面端直接用扫码枪扫描也会自动识别(全局监听)。
识别为外部码,搜索「{{scanResult.keyword}}」结果:
无匹配记录
📦 物料 {{m.code}} {{m.name}} 查看库存
🏷️ 资产 {{a.asset_no}} {{a.name}}
📄 {{({svc:'售后工单'})[d.kind]||'单据'}} {{d.doc_no}}
打开
规格 {{scanResult.spec||'—'}} · 单位 {{scanResult.unit||'—'}}
位置 {{scanResult.location||'—'}} ·
状态 {{({1:'在用',2:'闲置',3:'维修',9:'已处置'})[scanResult.status]||scanResult.status}}
客户 {{scanResult.customer_name||'—'}} ·
执行状态 {{({waiting:'待派工',dispatched:'已派工',processing:'处理中',done:'已完成'})[scanResult.exec_status]||scanResult.exec_status}}
单号 {{scanResult.doc_no}} · 状态
{{({draft:'草稿',pending:'待审核',active:'已生效',void:'已作废'})[scanResult.doc_status]||scanResult.doc_status}}
查库存
去处理
打开单据
知道了
想让人扫码直接打开登录页?填系统访问地址即可:
用当前系统地址({{qrBase()}})
当前是本机地址,手机扫码打不开;正式贴码请改成公网地址(如 http://47.118.48.29:8902)。
{{qrImgUrl? qrQrText : '输入后点生成'}}
✔ {{ qrForm.kind==='TEXT' ? '微信扫一扫可直接打开这个网址' : '微信扫一扫可直接打开产品页' }}:{{qrLink}}
当前为纯文本码,微信扫一扫只会显示文字、无法打开页面
生成
下载 PNG
打印标签