chore: 清理项目中冗余的静态资源文件

移除了所有已生成的哈希后缀CSS、JS静态资源文件,这些文件属于构建产出的临时文件,不应提交到版本库中。
This commit is contained in:
SunYF
2026-08-29 15:39:15 +08:00
parent 9662029a63
commit 9e9915d539
49 changed files with 0 additions and 302 deletions
@@ -1 +0,0 @@
import{j as S,h as b,c as U,a as e,w as a,k as j,F as M,i as v,r as n,o as C,m as z,n as F,f as m,t as P,E as N,p as A,l as D}from"./index-DtJUIYo6.js";import{b as H,P as L}from"./help-ByrA6SoP.js";const J={__name:"Bom",setup(O){const s=v(""),c=v([]),V=v([]),o=D({show:!1,materialCode:"",materialName:"",spec:"",unit:"",manageMode:"2",unitQty:1,lossRate:0,requiredQty:1});async function f(){if(!s.value)return N.warning("请选择/输入产品编码");V.value=await b.get("/bom",{params:{productCode:s.value}})||[]}function x(){Object.assign(o,{show:!0,materialCode:"",materialName:"",spec:"",unit:"",manageMode:"2",unitQty:1,lossRate:0,requiredQty:1})}async function q(){await b.put("/bom",{productCode:s.value,items:[o]}),N.success("保存成功"),o.show=!1,f()}async function B(k){await A.confirm("确认移除该物料?","提示",{type:"warning"});const l=V.value.filter(p=>p.id!==k.id).map(({materialCode:p,materialName:w,spec:d,unit:i,manageMode:_,unitQty:u,lossRate:y,requiredQty:r})=>({materialCode:p,materialName:w,spec:d,unit:i,manageMode:_,unitQty:u,lossRate:y,requiredQty:r}));await b.put("/bom",{productCode:s.value,items:l}),await f()}return S(async()=>{c.value=await b.get("/product-types")||[]}),(k,l)=>{const p=n("el-option"),w=n("el-select"),d=n("el-form-item"),i=n("el-button"),_=n("el-form"),u=n("el-table-column"),y=n("el-table"),r=n("el-input"),Q=n("el-radio"),R=n("el-radio-group"),g=n("el-input-number"),E=n("el-dialog"),$=n("el-card");return C(),U(M,null,[e($,null,{default:a(()=>[e(_,{inline:""},{default:a(()=>[e(d,{label:"产品编码"},{default:a(()=>[e(w,{modelValue:s.value,"onUpdate:modelValue":l[0]||(l[0]=t=>s.value=t),filterable:"","allow-create":"","default-first-option":"",placeholder:"请选择/输入产品编码",style:{width:"240px"},onChange:f},{default:a(()=>[(C(!0),U(M,null,z(c.value,t=>(C(),F(p,{key:t.code,label:`${t.code} ${t.name||""}`,value:t.code},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),e(d,null,{default:a(()=>[e(i,{type:"primary",onClick:f},{default:a(()=>[...l[11]||(l[11]=[m("查询",-1)])]),_:1}),e(i,{onClick:x},{default:a(()=>[...l[12]||(l[12]=[m("添加物料",-1)])]),_:1})]),_:1})]),_:1}),e(y,{data:V.value,border:"",size:"small"},{default:a(()=>[e(u,{prop:"materialCode",label:"物料编码","min-width":"120"}),e(u,{prop:"materialName",label:"物料名称","min-width":"120"}),e(u,{prop:"spec",label:"规格"}),e(u,{prop:"unit",label:"单位",width:"70"}),e(u,{prop:"manageMode",label:"管理方式",width:"100"},{default:a(({row:t})=>[m(P(t.manageMode==="1"?"精密件(SN)":"结构件(批次)"),1)]),_:1}),e(u,{prop:"unitQty",label:"单台用量",width:"90"}),e(u,{prop:"lossRate",label:"损耗率%",width:"90"}),e(u,{prop:"requiredQty",label:"需求量",width:"90"}),e(u,{label:"操作",width:"90"},{default:a(({row:t})=>[e(i,{size:"small",type:"danger",onClick:T=>B(t)},{default:a(()=>[...l[13]||(l[13]=[m("移除",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"]),e(E,{modelValue:o.show,"onUpdate:modelValue":l[10]||(l[10]=t=>o.show=t),title:"添加物料清单",width:"520px"},{footer:a(()=>[e(i,{onClick:l[9]||(l[9]=t=>o.show=!1)},{default:a(()=>[...l[16]||(l[16]=[m("取消",-1)])]),_:1}),e(i,{type:"primary",onClick:q},{default:a(()=>[...l[17]||(l[17]=[m("保存",-1)])]),_:1})]),default:a(()=>[e(_,{model:o,"label-width":"90px"},{default:a(()=>[e(d,{label:"物料编码"},{default:a(()=>[e(r,{modelValue:o.materialCode,"onUpdate:modelValue":l[1]||(l[1]=t=>o.materialCode=t)},null,8,["modelValue"])]),_:1}),e(d,{label:"物料名称"},{default:a(()=>[e(r,{modelValue:o.materialName,"onUpdate:modelValue":l[2]||(l[2]=t=>o.materialName=t)},null,8,["modelValue"])]),_:1}),e(d,{label:"规格"},{default:a(()=>[e(r,{modelValue:o.spec,"onUpdate:modelValue":l[3]||(l[3]=t=>o.spec=t)},null,8,["modelValue"])]),_:1}),e(d,{label:"单位"},{default:a(()=>[e(r,{modelValue:o.unit,"onUpdate:modelValue":l[4]||(l[4]=t=>o.unit=t)},null,8,["modelValue"])]),_:1}),e(d,{label:"管理方式"},{default:a(()=>[e(R,{modelValue:o.manageMode,"onUpdate:modelValue":l[5]||(l[5]=t=>o.manageMode=t)},{default:a(()=>[e(Q,{label:"1"},{default:a(()=>[...l[14]||(l[14]=[m("精密件(SN)",-1)])]),_:1}),e(Q,{label:"2"},{default:a(()=>[...l[15]||(l[15]=[m("结构件(批次)",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),e(d,{label:"单台用量"},{default:a(()=>[e(g,{modelValue:o.unitQty,"onUpdate:modelValue":l[6]||(l[6]=t=>o.unitQty=t),min:0},null,8,["modelValue"])]),_:1}),e(d,{label:"损耗率%"},{default:a(()=>[e(g,{modelValue:o.lossRate,"onUpdate:modelValue":l[7]||(l[7]=t=>o.lossRate=t),min:0},null,8,["modelValue"])]),_:1}),e(d,{label:"需求量"},{default:a(()=>[e(g,{modelValue:o.requiredQty,"onUpdate:modelValue":l[8]||(l[8]=t=>o.requiredQty=t),min:0},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue"])]),_:1}),e(L,{data:j(H)},null,8,["data"])],64)}}};export{J as default};
@@ -1 +0,0 @@
import{n as V,w as l,r as a,u as b,o as y,a as s,e as x,f as i,d as v,l as C,E as n,h as k,v as h,i as B}from"./index-DtJUIYo6.js";const E={__name:"ChangePassword",setup(N){const p=b(),d=B(!1),e=C({oldPassword:"",newPassword:"",confirmPassword:""});async function m(){if(!e.oldPassword||!e.newPassword)return n.warning("请填写旧密码和新密码");if(e.newPassword!==e.confirmPassword)return n.warning("两次输入的新密码不一致");if(e.newPassword.length<6)return n.warning("新密码长度至少 6 位");d.value=!0;try{await k.post("/user/change-password",{oldPassword:e.oldPassword,newPassword:e.newPassword}),n.success("密码修改成功,请重新登录"),h(),p.replace("/login")}catch{}finally{d.value=!1}}function f(){e.oldPassword="",e.newPassword="",e.confirmPassword=""}return(P,o)=>{const c=a("el-alert"),w=a("el-input"),t=a("el-form-item"),u=a("el-button"),_=a("el-form"),g=a("el-card");return y(),V(g,{style:{"max-width":"480px","margin-top":"20px"}},{header:l(()=>[...o[4]||(o[4]=[v("b",null,"修改我的密码",-1)])]),default:l(()=>[s(c,{type:"warning",closable:!1,style:{"margin-bottom":"16px"},title:"密码修改成功后需重新登录"}),s(_,{model:e,"label-width":"100px",onSubmit:o[3]||(o[3]=x(()=>{},["prevent"]))},{default:l(()=>[s(t,{label:"旧密码"},{default:l(()=>[s(w,{modelValue:e.oldPassword,"onUpdate:modelValue":o[0]||(o[0]=r=>e.oldPassword=r),type:"password","show-password":"",placeholder:"请输入当前密码"},null,8,["modelValue"])]),_:1}),s(t,{label:"新密码"},{default:l(()=>[s(w,{modelValue:e.newPassword,"onUpdate:modelValue":o[1]||(o[1]=r=>e.newPassword=r),type:"password","show-password":"",placeholder:"至少 6 位"},null,8,["modelValue"])]),_:1}),s(t,{label:"确认新密码"},{default:l(()=>[s(w,{modelValue:e.confirmPassword,"onUpdate:modelValue":o[2]||(o[2]=r=>e.confirmPassword=r),type:"password","show-password":"",placeholder:"请再次输入新密码"},null,8,["modelValue"])]),_:1}),s(t,null,{default:l(()=>[s(u,{type:"primary",loading:d.value,onClick:m},{default:l(()=>[...o[5]||(o[5]=[i("保存",-1)])]),_:1},8,["loading"]),s(u,{onClick:f},{default:l(()=>[...o[6]||(o[6]=[i("重置",-1)])]),_:1})]),_:1})]),_:1},8,["model"])]),_:1})}}};export{E as default};
@@ -1 +0,0 @@
import{j as F,h as f,c as w,a as e,w as t,k as I,F as b,i as V,r as n,l as g,o as _,m as C,n as O,f as s,t as S,p as q,E as Q}from"./index-DtJUIYo6.js";import{a as T,P as A}from"./help-ByrA6SoP.js";const R={__name:"DailyPlan",setup(G){const m=g({orderNo:"",planDate:""}),c=V([]),y=V([]),o=g({show:!1,id:0,orderNo:"",planDate:"",planQty:1}),x=[{v:"PENDING",l:"待排产"},{v:"CONFIRMED",l:"已确认"}],M=d=>(x.find(l=>l.v===d)||{}).l||d;async function u(){c.value=await f.get("/daily-plans",{params:m})||[]}function Y(){Object.assign(o,{show:!0,id:0,orderNo:"",planDate:new Date().toISOString().slice(0,10),planQty:1})}function E(d){Object.assign(o,{show:!0,id:d.id,orderNo:d.orderNo,planDate:d.planDate,planQty:d.planQty})}async function U(){if(!o.orderNo||!o.planDate)return Q.warning("请选择工单号和排产日期");o.id?await f.put(`/daily-plans/${o.id}`,{...o}):await f.post("/daily-plans",{orderNo:o.orderNo,planDate:o.planDate,planQty:o.planQty}),Q.success("保存成功"),o.show=!1,u()}async function P(d){await q.confirm("确认删除该排产?","提示",{type:"warning"}),await f.delete(`/daily-plans/${d.id}`),u()}return F(async()=>{y.value=await f.get("/work-orders")||[],u()}),(d,l)=>{const k=n("el-option"),N=n("el-select"),p=n("el-form-item"),D=n("el-date-picker"),i=n("el-button"),v=n("el-form"),r=n("el-table-column"),$=n("el-table"),B=n("el-input-number"),h=n("el-dialog"),j=n("el-card");return _(),w(b,null,[e(j,null,{default:t(()=>[e(v,{inline:""},{default:t(()=>[e(p,{label:"工单号"},{default:t(()=>[e(N,{modelValue:m.orderNo,"onUpdate:modelValue":l[0]||(l[0]=a=>m.orderNo=a),filterable:"","allow-create":"",clearable:"",placeholder:"请选择/输入工单号",style:{width:"220px"},onChange:u},{default:t(()=>[(_(!0),w(b,null,C(y.value,a=>(_(),O(k,{key:a.workOrderNo,label:a.workOrderNo,value:a.workOrderNo},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),e(p,{label:"排产日期"},{default:t(()=>[e(D,{modelValue:m.planDate,"onUpdate:modelValue":l[1]||(l[1]=a=>m.planDate=a),type:"date","value-format":"YYYY-MM-DD",placeholder:"请选择日期",onChange:u},null,8,["modelValue"])]),_:1}),e(p,null,{default:t(()=>[e(i,{type:"primary",onClick:u},{default:t(()=>[...l[7]||(l[7]=[s("查询",-1)])]),_:1}),e(i,{type:"success",onClick:Y},{default:t(()=>[...l[8]||(l[8]=[s("新建排产",-1)])]),_:1})]),_:1})]),_:1}),e($,{data:c.value,border:"",size:"small"},{default:t(()=>[e(r,{prop:"orderNo",label:"工单号","min-width":"180"}),e(r,{prop:"planDate",label:"排产日期",width:"120"}),e(r,{prop:"planQty",label:"计划数量",width:"100"}),e(r,{prop:"completedQty",label:"已完成",width:"90"}),e(r,{label:"状态",width:"100"},{default:t(({row:a})=>[s(S(M(a.status)),1)]),_:1}),e(r,{prop:"operator",label:"操作人","min-width":"90"}),e(r,{label:"操作",width:"160"},{default:t(({row:a})=>[e(i,{size:"small",onClick:z=>E(a)},{default:t(()=>[...l[9]||(l[9]=[s("编辑",-1)])]),_:1},8,["onClick"]),e(i,{size:"small",type:"danger",onClick:z=>P(a)},{default:t(()=>[...l[10]||(l[10]=[s("删除",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"]),e(h,{modelValue:o.show,"onUpdate:modelValue":l[6]||(l[6]=a=>o.show=a),title:"新建/编辑排产",width:"460px"},{footer:t(()=>[e(i,{onClick:l[5]||(l[5]=a=>o.show=!1)},{default:t(()=>[...l[11]||(l[11]=[s("取消",-1)])]),_:1}),e(i,{type:"primary",onClick:U},{default:t(()=>[...l[12]||(l[12]=[s("保存",-1)])]),_:1})]),default:t(()=>[e(v,{model:o,"label-width":"90px"},{default:t(()=>[e(p,{label:"工单号"},{default:t(()=>[e(N,{modelValue:o.orderNo,"onUpdate:modelValue":l[2]||(l[2]=a=>o.orderNo=a),filterable:"","allow-create":"",placeholder:"请选择/输入工单号",style:{width:"100%"}},{default:t(()=>[(_(!0),w(b,null,C(y.value,a=>(_(),O(k,{key:a.workOrderNo,label:a.workOrderNo,value:a.workOrderNo},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),e(p,{label:"排产日期"},{default:t(()=>[e(D,{modelValue:o.planDate,"onUpdate:modelValue":l[3]||(l[3]=a=>o.planDate=a),type:"date","value-format":"YYYY-MM-DD",style:{width:"100%"}},null,8,["modelValue"])]),_:1}),e(p,{label:"计划数量"},{default:t(()=>[e(B,{modelValue:o.planQty,"onUpdate:modelValue":l[4]||(l[4]=a=>o.planQty=a),min:1,style:{width:"100%"}},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue"])]),_:1}),e(A,{data:I(T)},null,8,["data"])],64)}}};export{R as default};
@@ -1 +0,0 @@
import{j as x,c as h,a as e,w as o,k,F as N,h as T,r as a,i as d,l as z,o as C,g as _,f as K}from"./index-DtJUIYo6.js";import{k as U,P as E}from"./help-ByrA6SoP.js";const B={__name:"EventLog",setup(I){const n=z({orderNo:"",operator:"",eventType:""}),c=d([]),b=d(0),i=d(1),g=d(20);async function u(){const r=await T.get("/event-logs",{params:{...n,page:i.value,pageSize:g.value}});c.value=(r==null?void 0:r.list)||[],b.value=(r==null?void 0:r.total)||0}return x(u),(r,t)=>{const m=a("el-input"),s=a("el-form-item"),f=a("el-button"),y=a("el-form"),l=a("el-table-column"),v=a("el-table"),w=a("el-pagination"),V=a("el-card");return C(),h(N,null,[e(V,null,{default:o(()=>[e(y,{inline:""},{default:o(()=>[e(s,{label:"工单号"},{default:o(()=>[e(m,{modelValue:n.orderNo,"onUpdate:modelValue":t[0]||(t[0]=p=>n.orderNo=p),clearable:"",style:{width:"180px"},onKeyup:_(u,["enter"])},null,8,["modelValue"])]),_:1}),e(s,{label:"操作人"},{default:o(()=>[e(m,{modelValue:n.operator,"onUpdate:modelValue":t[1]||(t[1]=p=>n.operator=p),clearable:"",style:{width:"120px"},onKeyup:_(u,["enter"])},null,8,["modelValue"])]),_:1}),e(s,{label:"类型"},{default:o(()=>[e(m,{modelValue:n.eventType,"onUpdate:modelValue":t[2]||(t[2]=p=>n.eventType=p),clearable:"",style:{width:"180px"},onKeyup:_(u,["enter"])},null,8,["modelValue"])]),_:1}),e(s,null,{default:o(()=>[e(f,{type:"primary",onClick:u},{default:o(()=>[...t[4]||(t[4]=[K("查询",-1)])]),_:1})]),_:1})]),_:1}),e(v,{data:c.value,border:"",size:"small"},{default:o(()=>[e(l,{prop:"id",label:"ID",width:"60"}),e(l,{prop:"eventType",label:"事件类型","min-width":"150"}),e(l,{prop:"workOrderNo",label:"工单号","min-width":"130"}),e(l,{prop:"description",label:"描述","min-width":"160"}),e(l,{prop:"entityType",label:"实体",width:"130"}),e(l,{prop:"entityId",label:"实体ID",width:"120"}),e(l,{prop:"operator",label:"操作人",width:"90"}),e(l,{prop:"createdAt",label:"时间","min-width":"170"})]),_:1},8,["data"]),e(w,{"current-page":i.value,"onUpdate:currentPage":t[3]||(t[3]=p=>i.value=p),"page-size":g.value,total:b.value,layout:"total, prev, pager, next",background:"",style:{"margin-top":"10px"},onCurrentChange:u},null,8,["current-page","page-size","total"])]),_:1}),e(E,{data:k(U)},null,8,["data"])],64)}}};export{B as default};
@@ -1 +0,0 @@
.login-wrap[data-v-6b73698f]{height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#1f3b73,#2d5aa0)}.login-card[data-v-6b73698f]{width:360px;padding:10px 20px}.title[data-v-6b73698f]{text-align:center;margin:6px 0 24px;color:#333}
@@ -1 +0,0 @@
import{_ as x,c as k,a as o,w as t,r as l,u as b,b as S,o as E,d as N,e as z,f as d,g as B,E as c,h as _,s as C,i as p}from"./index-DtJUIYo6.js";const L={class:"login-wrap"},M={__name:"Login",setup(T){const g=b(),v=S(),a=p("admin"),s=p(""),r=p(!1);async function u(){if(!a.value||!s.value)return c.warning("请输入账号和密码");r.value=!0;try{const n=await _.post("/login",{username:a.value,password:s.value});C(n.accessToken,{username:a.value},n.refreshToken);const e=await _.get("/userinfo");localStorage.setItem("user",JSON.stringify(e)),/^\d+$/.test(s.value)&&c.warning("当前密码为纯数字,安全级别低,建议登录后立即修改密码"),g.replace(v.query.redirect||"/work-order")}catch{}finally{r.value=!1}}return(n,e)=>{const m=l("el-input"),f=l("el-form-item"),w=l("el-button"),y=l("el-form"),V=l("el-card");return E(),k("div",L,[o(V,{class:"login-card"},{default:t(()=>[e[5]||(e[5]=N("h2",{class:"title"},"MES 产线控制",-1)),o(y,{onSubmit:z(u,["prevent"])},{default:t(()=>[o(f,null,{default:t(()=>[o(m,{modelValue:a.value,"onUpdate:modelValue":e[0]||(e[0]=i=>a.value=i),placeholder:"用户名",size:"large"},{prefix:t(()=>[...e[2]||(e[2]=[d("👤",-1)])]),_:1},8,["modelValue"])]),_:1}),o(f,null,{default:t(()=>[o(m,{modelValue:s.value,"onUpdate:modelValue":e[1]||(e[1]=i=>s.value=i),type:"password",placeholder:"密码",size:"large","show-password":"",onKeyup:B(u,["enter"])},{prefix:t(()=>[...e[3]||(e[3]=[d("🔒",-1)])]),_:1},8,["modelValue"])]),_:1}),o(w,{type:"primary",size:"large",style:{width:"100%"},loading:r.value,onClick:u},{default:t(()=>[...e[4]||(e[4]=[d("登 录",-1)])]),_:1},8,["loading"])]),_:1})]),_:1})])}}},I=x(M,[["__scopeId","data-v-6b73698f"]]);export{I as default};
@@ -1 +0,0 @@
import{j as N,c as h,a as e,w as o,k as M,F as k,l as q,h as c,r as n,i as x,o as C,g as f,f as d,t as v,E as b}from"./index-DtJUIYo6.js";import{c as S,P as Y}from"./help-ByrA6SoP.js";const B={__name:"MaterialRequest",setup(E){const t=q({planDate:"",orderNo:"",status:""}),i=x([]);async function s(){i.value=await c.get("/material-requests",{params:t})||[]}async function w(){if(!t.planDate)return b.warning("请先选择排产日期");const p=await c.post("/material-requests/generate",{planDate:t.planDate});b.success(`已生成 ${(p==null?void 0:p.count)||0} 条备料`),s()}return N(()=>{t.planDate=new Date().toISOString().slice(0,10),s()}),(p,a)=>{const y=n("el-date-picker"),u=n("el-form-item"),m=n("el-input"),_=n("el-button"),g=n("el-form"),l=n("el-table-column"),D=n("el-table"),V=n("el-card");return C(),h(k,null,[e(V,null,{default:o(()=>[e(g,{inline:""},{default:o(()=>[e(u,{label:"日期"},{default:o(()=>[e(y,{modelValue:t.planDate,"onUpdate:modelValue":a[0]||(a[0]=r=>t.planDate=r),type:"date","value-format":"YYYY-MM-DD",onChange:s},null,8,["modelValue"])]),_:1}),e(u,{label:"工单号"},{default:o(()=>[e(m,{modelValue:t.orderNo,"onUpdate:modelValue":a[1]||(a[1]=r=>t.orderNo=r),clearable:"",style:{width:"160px"},onKeyup:f(s,["enter"])},null,8,["modelValue"])]),_:1}),e(u,{label:"状态"},{default:o(()=>[e(m,{modelValue:t.status,"onUpdate:modelValue":a[2]||(a[2]=r=>t.status=r),style:{width:"120px"},onKeyup:f(s,["enter"])},null,8,["modelValue"])]),_:1}),e(u,null,{default:o(()=>[e(_,{type:"primary",onClick:s},{default:o(()=>[...a[3]||(a[3]=[d("查询",-1)])]),_:1}),e(_,{type:"success",onClick:w},{default:o(()=>[...a[4]||(a[4]=[d("按日排产生成备料",-1)])]),_:1})]),_:1})]),_:1}),e(D,{data:i.value,border:"",size:"small"},{default:o(()=>[e(l,{prop:"requestNo",label:"备料单号","min-width":"180"}),e(l,{prop:"orderNo",label:"工单号","min-width":"130"}),e(l,{prop:"planDate",label:"排产日期",width:"110"}),e(l,{prop:"materialCode",label:"物料编码","min-width":"110"}),e(l,{prop:"materialName",label:"物料名称","min-width":"110"}),e(l,{prop:"unit",label:"单位",width:"70"}),e(l,{prop:"manageMode",label:"管理方式",width:"110"},{default:o(({row:r})=>[d(v(r.manageMode==="1"?"SN":"批次"),1)]),_:1}),e(l,{prop:"reqQty",label:"需求数量",width:"90"}),e(l,{prop:"status",label:"状态",width:"90"}),e(l,{prop:"operator",label:"操作人",width:"90"})]),_:1},8,["data"])]),_:1}),e(Y,{data:M(S)},null,8,["data"])],64)}}};export{B as default};
@@ -1 +0,0 @@
import{j as k,c as v,a as e,w as o,k as U,F as S,h as f,r as d,i as h,l as c,o as P,f as u,t as E,E as w}from"./index-DtJUIYo6.js";import{d as T,P as q}from"./help-ByrA6SoP.js";const M={__name:"PlcSend",setup(B){const a=c({orderNo:"",sn:"",stationNo:1,processCombination:""}),r=c({orderNo:"",status:""}),m=h([]);async function V(){if(!a.orderNo||!a.processCombination)return w.warning("请填写工单号和工序组合");try{await f.post("/plc/send-process",{...a}),w.success("工序码下发成功(未收到完成信号不会下发下一条)"),i()}catch{}}async function i(){m.value=await f.get("/plc/send-logs",{params:r})||[]}return k(i),(N,l)=>{const p=d("el-input"),s=d("el-form-item"),y=d("el-input-number"),_=d("el-button"),b=d("el-form"),x=d("el-divider"),n=d("el-table-column"),C=d("el-table"),g=d("el-card");return P(),v(S,null,[e(g,null,{default:o(()=>[e(b,{inline:""},{default:o(()=>[e(s,{label:"工单号"},{default:o(()=>[e(p,{modelValue:a.orderNo,"onUpdate:modelValue":l[0]||(l[0]=t=>a.orderNo=t),style:{width:"170px"}},null,8,["modelValue"])]),_:1}),e(s,{label:"工件SN"},{default:o(()=>[e(p,{modelValue:a.sn,"onUpdate:modelValue":l[1]||(l[1]=t=>a.sn=t),style:{width:"170px"}},null,8,["modelValue"])]),_:1}),e(s,{label:"工位"},{default:o(()=>[e(y,{modelValue:a.stationNo,"onUpdate:modelValue":l[2]||(l[2]=t=>a.stationNo=t),min:1,max:12},null,8,["modelValue"])]),_:1}),e(s,{label:"工序组合"},{default:o(()=>[e(p,{modelValue:a.processCombination,"onUpdate:modelValue":l[3]||(l[3]=t=>a.processCombination=t),placeholder:"如 135",style:{width:"110px"}},null,8,["modelValue"])]),_:1}),e(s,null,{default:o(()=>[e(_,{type:"primary",onClick:V},{default:o(()=>[...l[6]||(l[6]=[u("下发工序码",-1)])]),_:1})]),_:1})]),_:1}),e(x,{"content-position":"left"},{default:o(()=>[...l[7]||(l[7]=[u("下发日志",-1)])]),_:1}),e(b,{inline:""},{default:o(()=>[e(s,{label:"工单号"},{default:o(()=>[e(p,{modelValue:r.orderNo,"onUpdate:modelValue":l[4]||(l[4]=t=>r.orderNo=t),clearable:"",style:{width:"160px"}},null,8,["modelValue"])]),_:1}),e(s,{label:"状态"},{default:o(()=>[e(p,{modelValue:r.status,"onUpdate:modelValue":l[5]||(l[5]=t=>r.status=t),style:{width:"120px"}},null,8,["modelValue"])]),_:1}),e(s,null,{default:o(()=>[e(_,{onClick:i},{default:o(()=>[...l[8]||(l[8]=[u("刷新",-1)])]),_:1})]),_:1})]),_:1}),e(C,{data:m.value,border:"",size:"small"},{default:o(()=>[e(n,{prop:"id",label:"ID",width:"60"}),e(n,{prop:"orderNo",label:"工单号","min-width":"130"}),e(n,{prop:"sn",label:"SN","min-width":"130"}),e(n,{prop:"stationNo",label:"工位",width:"70"}),e(n,{prop:"processCombination",label:"工序组合",width:"100"}),e(n,{prop:"processCodes",label:"工序码",width:"120"}),e(n,{prop:"status",label:"状态",width:"90"}),e(n,{prop:"ack",label:"完成",width:"70"},{default:o(({row:t})=>[u(E(t.ack?"是":"否"),1)]),_:1}),e(n,{prop:"sendTime",label:"下发时间",width:"170"}),e(n,{prop:"doneTime",label:"完成时间",width:"170"}),e(n,{prop:"operator",label:"操作人",width:"90"})]),_:1},8,["data"])]),_:1}),e(q,{data:U(T)},null,8,["data"])],64)}}};export{M as default};
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
import{j as D,c as P,a as e,w as a,k as U,F as E,h as f,r as n,i as M,o as S,f as p,t as j,p as O,l as z,E as B}from"./index-DtJUIYo6.js";import{j as F,P as T}from"./help-ByrA6SoP.js";const h={__name:"ProductType",setup(I){const _=M([]),l=z({show:!1,id:0,name:"",code:"",category:"",remark:"",isActive:!0});async function g(){_.value=await f.get("/product-types")||[]}async function w(){const s=new Date,t=r=>String(r).padStart(2,"0"),u=`${s.getFullYear()}${t(s.getMonth()+1)}${t(s.getDate())}`,i=(_.value||[]).reduce((r,d)=>{const m=/^PROD-\d{8}-(\d+)$/.exec(d.code||"");return m?Math.max(r,parseInt(m[1])):r},0);return`PROD-${u}-${String(i+1).padStart(3,"0")}`}async function y(){Object.assign(l,{show:!0,id:0,name:"",code:"",category:"",remark:"",isActive:!0}),l.code=await w()}function b(s){Object.assign(l,{show:!0,...s})}async function V(){l.id?await f.put("/product-types",{...l}):await f.post("/product-types",{...l}),B.success("保存成功"),l.show=!1,g()}async function v(s){await O.confirm("确认删除?","提示",{type:"warning"}),await f.delete(`/product-types/${s.id}`),g()}return D(g),(s,t)=>{const u=n("el-button"),i=n("el-form-item"),r=n("el-form"),d=n("el-table-column"),m=n("el-tag"),k=n("el-table"),c=n("el-input"),x=n("el-switch"),C=n("el-dialog"),$=n("el-card");return S(),P(E,null,[e($,null,{default:a(()=>[e(r,{inline:""},{default:a(()=>[e(i,null,{default:a(()=>[e(u,{type:"primary",onClick:y},{default:a(()=>[...t[7]||(t[7]=[p("新增产品类型",-1)])]),_:1})]),_:1})]),_:1}),e(k,{data:_.value,border:"",size:"small"},{default:a(()=>[e(d,{prop:"id",label:"ID",width:"60"}),e(d,{prop:"name",label:"名称","min-width":"120"}),e(d,{prop:"code",label:"编码","min-width":"120"}),e(d,{prop:"category",label:"类别",width:"110"}),e(d,{prop:"isActive",label:"启用",width:"80"},{default:a(({row:o})=>[e(m,{type:o.isActive?"success":"info"},{default:a(()=>[p(j(o.isActive?"是":"否"),1)]),_:2},1032,["type"])]),_:1}),e(d,{prop:"remark",label:"备注","min-width":"160"}),e(d,{label:"操作",width:"140"},{default:a(({row:o})=>[e(u,{size:"small",onClick:A=>b(o)},{default:a(()=>[...t[8]||(t[8]=[p("编辑",-1)])]),_:1},8,["onClick"]),e(u,{size:"small",type:"danger",onClick:A=>v(o)},{default:a(()=>[...t[9]||(t[9]=[p("删除",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"]),e(C,{modelValue:l.show,"onUpdate:modelValue":t[6]||(t[6]=o=>l.show=o),title:l.id?"编辑产品类型":"新增产品类型",width:"460px"},{footer:a(()=>[e(u,{onClick:t[5]||(t[5]=o=>l.show=!1)},{default:a(()=>[...t[10]||(t[10]=[p("取消",-1)])]),_:1}),e(u,{type:"primary",onClick:V},{default:a(()=>[...t[11]||(t[11]=[p("保存",-1)])]),_:1})]),default:a(()=>[e(r,{model:l,"label-width":"80px"},{default:a(()=>[e(i,{label:"名称"},{default:a(()=>[e(c,{modelValue:l.name,"onUpdate:modelValue":t[0]||(t[0]=o=>l.name=o)},null,8,["modelValue"])]),_:1}),e(i,{label:"编码"},{default:a(()=>[e(c,{modelValue:l.code,"onUpdate:modelValue":t[1]||(t[1]=o=>l.code=o)},null,8,["modelValue"])]),_:1}),e(i,{label:"类别"},{default:a(()=>[e(c,{modelValue:l.category,"onUpdate:modelValue":t[2]||(t[2]=o=>l.category=o)},null,8,["modelValue"])]),_:1}),e(i,{label:"启用"},{default:a(()=>[e(x,{modelValue:l.isActive,"onUpdate:modelValue":t[3]||(t[3]=o=>l.isActive=o)},null,8,["modelValue"])]),_:1}),e(i,{label:"备注"},{default:a(()=>[e(c,{modelValue:l.remark,"onUpdate:modelValue":t[4]||(t[4]=o=>l.remark=o),type:"textarea"},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue","title"])]),_:1}),e(T,{data:U(F)},null,8,["data"])],64)}}};export{h as default};
@@ -1 +0,0 @@
.tip[data-v-6a0d2c1d]{color:#909399;font-size:13px;margin:0 0 10px}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
import{j as q,c as U,a as e,w as t,k as S,F as v,h as w,r as n,i as C,l as V,o as E,f as m,t as T,E as c}from"./index-DtJUIYo6.js";import{e as j,P as B}from"./help-ByrA6SoP.js";const D={__name:"Torque",setup(F){const s=V({sn:"",workOrderNo:""}),a=V({sn:"",workOrderNo:"",stationNo:"",strain:20,angle:90,operator:""}),i=C([]);async function p(){i.value=await w.get("/torque/records",{params:s})||[]}async function N(){if(!a.sn)return c.warning("请输入SN");await w.post("/torque/report",a),c.success("拧紧数据已上报"),Object.assign(a,{sn:"",workOrderNo:"",strain:20,angle:90}),p()}return q(p),(M,l)=>{const d=n("el-input"),r=n("el-form-item"),_=n("el-button"),f=n("el-form"),b=n("el-input-number"),y=n("el-collapse-item"),g=n("el-collapse"),u=n("el-table-column"),k=n("el-tag"),x=n("el-table"),O=n("el-card");return E(),U(v,null,[e(O,null,{default:t(()=>[e(f,{inline:""},{default:t(()=>[e(r,{label:"SN"},{default:t(()=>[e(d,{modelValue:s.sn,"onUpdate:modelValue":l[0]||(l[0]=o=>s.sn=o),clearable:"",style:{width:"170px"}},null,8,["modelValue"])]),_:1}),e(r,{label:"工单号"},{default:t(()=>[e(d,{modelValue:s.workOrderNo,"onUpdate:modelValue":l[1]||(l[1]=o=>s.workOrderNo=o),clearable:"",style:{width:"170px"}},null,8,["modelValue"])]),_:1}),e(r,null,{default:t(()=>[e(_,{type:"primary",onClick:p},{default:t(()=>[...l[8]||(l[8]=[m("查询",-1)])]),_:1})]),_:1})]),_:1}),e(g,{style:{"margin-bottom":"12px"}},{default:t(()=>[e(y,{title:"扫码录入拧紧数据",name:"1"},{default:t(()=>[e(f,{inline:""},{default:t(()=>[e(r,{label:"SN"},{default:t(()=>[e(d,{modelValue:a.sn,"onUpdate:modelValue":l[2]||(l[2]=o=>a.sn=o),style:{width:"150px"}},null,8,["modelValue"])]),_:1}),e(r,{label:"工单号"},{default:t(()=>[e(d,{modelValue:a.workOrderNo,"onUpdate:modelValue":l[3]||(l[3]=o=>a.workOrderNo=o),style:{width:"150px"}},null,8,["modelValue"])]),_:1}),e(r,{label:"工位"},{default:t(()=>[e(d,{modelValue:a.stationNo,"onUpdate:modelValue":l[4]||(l[4]=o=>a.stationNo=o),style:{width:"80px"}},null,8,["modelValue"])]),_:1}),e(r,{label:"扭矩"},{default:t(()=>[e(b,{modelValue:a.strain,"onUpdate:modelValue":l[5]||(l[5]=o=>a.strain=o),min:0},null,8,["modelValue"])]),_:1}),e(r,{label:"角度"},{default:t(()=>[e(b,{modelValue:a.angle,"onUpdate:modelValue":l[6]||(l[6]=o=>a.angle=o),min:0},null,8,["modelValue"])]),_:1}),e(r,{label:"操作人"},{default:t(()=>[e(d,{modelValue:a.operator,"onUpdate:modelValue":l[7]||(l[7]=o=>a.operator=o),style:{width:"100px"}},null,8,["modelValue"])]),_:1}),e(r,null,{default:t(()=>[e(_,{type:"primary",onClick:N},{default:t(()=>[...l[9]||(l[9]=[m("上报",-1)])]),_:1})]),_:1})]),_:1})]),_:1})]),_:1}),e(x,{data:i.value,border:"",size:"small"},{default:t(()=>[e(u,{prop:"sn",label:"SN","min-width":"130"}),e(u,{prop:"workOrderNo",label:"工单号","min-width":"130"}),e(u,{prop:"stationNo",label:"工位",width:"70"}),e(u,{prop:"torque",label:"扭矩(N·m)",width:"100"}),e(u,{prop:"angle",label:"角度(°)",width:"90"}),e(u,{prop:"result",label:"结果",width:"80"},{default:t(({row:o})=>[e(k,{type:o.result==="OK"?"success":"danger"},{default:t(()=>[m(T(o.result),1)]),_:2},1032,["type"])]),_:1}),e(u,{prop:"operator",label:"操作人",width:"90"}),e(u,{prop:"time",label:"时间","min-width":"170"})]),_:1},8,["data"])]),_:1}),e(B,{data:S(j)},null,8,["data"])],64)}}};export{D as default};
@@ -1 +0,0 @@
import{c as f,a as t,w as l,k as z,F as v,r as a,o as c,g as D,f as s,n as k,q as x,t as n,m as F,d as T,h as G,i as w}from"./index-DtJUIYo6.js";import{i as I,P as E}from"./help-ByrA6SoP.js";const U={__name:"Trace",setup(H){const p=w(""),o=w(null),_=w("");async function h(){if(p.value){_.value="",o.value=null;try{o.value=await G.get("/trace",{params:{sn:p.value}})}catch(u){_.value=u.message||"查询失败"}}}function d(u){return u?String(u).replace("T"," ").slice(0,19):"-"}return(u,m)=>{const V=a("el-input"),y=a("el-form-item"),K=a("el-button"),S=a("el-form"),C=a("el-alert"),i=a("el-descriptions-item"),q=a("el-descriptions"),A=a("el-timeline-item"),B=a("el-timeline"),b=a("el-tab-pane"),r=a("el-table-column"),O=a("el-tag"),N=a("el-table"),P=a("el-tabs"),j=a("el-card");return c(),f(v,null,[t(j,null,{default:l(()=>[t(S,{inline:""},{default:l(()=>[t(y,{label:"工件SN"},{default:l(()=>[t(V,{modelValue:p.value,"onUpdate:modelValue":m[0]||(m[0]=e=>p.value=e),style:{width:"220px"},placeholder:"输入SN查询追溯",onKeyup:D(h,["enter"])},null,8,["modelValue"])]),_:1}),t(y,null,{default:l(()=>[t(K,{type:"primary",onClick:h},{default:l(()=>[...m[1]||(m[1]=[s("追溯查询",-1)])]),_:1})]),_:1})]),_:1}),_.value?(c(),k(C,{key:0,title:_.value,type:"error","show-icon":"",closable:"",style:{"margin-bottom":"10px"}},null,8,["title"])):x("",!0),o.value?(c(),f(v,{key:1},[t(q,{column:4,border:"",style:{"margin-bottom":"12px"}},{default:l(()=>[t(i,{label:"SN"},{default:l(()=>{var e;return[s(n((e=o.value.workpiece)==null?void 0:e.sn),1)]}),_:1}),t(i,{label:"工单号"},{default:l(()=>{var e;return[s(n((e=o.value.workpiece)==null?void 0:e.orderNo),1)]}),_:1}),t(i,{label:"状态"},{default:l(()=>{var e;return[s(n((e=o.value.workpiece)==null?void 0:e.status),1)]}),_:1}),t(i,{label:"当前工序"},{default:l(()=>{var e;return[s(n((e=o.value.workpiece)==null?void 0:e.currentProcess),1)]}),_:1}),t(i,{label:"进线时间"},{default:l(()=>{var e;return[s(n(d((e=o.value.workpiece)==null?void 0:e.onlineAt)),1)]}),_:1}),t(i,{label:"完工时间"},{default:l(()=>{var e;return[s(n(d((e=o.value.workpiece)==null?void 0:e.doneAt)),1)]}),_:1})]),_:1}),t(P,null,{default:l(()=>[t(b,{label:"工序时间线"},{default:l(()=>[t(B,null,{default:l(()=>[(c(!0),f(v,null,F(o.value.processTimeline||[],e=>(c(),k(A,{key:e.id,timestamp:e.operator?e.operator+" · "+d(e.endedAt):d(e.endedAt),type:e.result==="NG"?"danger":"success"},{default:l(()=>[s(n(e.processName)+"(工序 "+n(e.processCode)+",工位 "+n(e.stationNo)+")— "+n(e.result),1)]),_:2},1032,["timestamp","type"]))),128))]),_:1})]),_:1}),t(b,{label:"步骤考核数据"},{default:l(()=>[t(N,{data:o.value.stepData||[],border:"",size:"small"},{default:l(()=>[t(r,{prop:"stepName",label:"步骤","min-width":"110"}),t(r,{prop:"criterionName",label:"考核项","min-width":"110"}),t(r,{prop:"value",label:"数值",width:"100"}),t(r,{prop:"isOK",label:"合格",width:"80"},{default:l(({row:e})=>[t(O,{type:e.isOK?"success":"danger"},{default:l(()=>[s(n(e.isOK?"OK":"NG"),1)]),_:2},1032,["type"])]),_:1}),t(r,{prop:"operator",label:"操作人",width:"90"})]),_:1},8,["data"])]),_:1}),t(b,{label:"拧紧数据"},{default:l(()=>[t(N,{data:o.value.torqueRecords||[],border:"",size:"small"},{default:l(()=>[t(r,{prop:"stationNo",label:"工位",width:"80"}),t(r,{prop:"torque",label:"扭矩",width:"100"}),t(r,{prop:"angle",label:"角度",width:"90"}),t(r,{prop:"result",label:"结果",width:"80"}),t(r,{prop:"operator",label:"操作人",width:"90"}),t(r,{prop:"time",label:"时间","min-width":"160"})]),_:1},8,["data"])]),_:1}),t(b,{label:"成品关联"},{default:l(()=>{var e,g;return[T("p",null,"批次号:"+n((((e=o.value.associationTrace)==null?void 0:e.batchItems)||[]).join(", ")||"无"),1),T("p",null,"精密件SN"+n((((g=o.value.associationTrace)==null?void 0:g.serialItems)||[]).join(", ")||"无"),1)]}),_:1})]),_:1})],64)):x("",!0)]),_:1}),t(E,{data:z(I)},null,8,["data"])],64)}}};export{U as default};
File diff suppressed because one or more lines are too long
@@ -1,34 +0,0 @@
import{_ as O,o,c as i,a as d,w as m,f as a,d as e,t as r,q as t,F as v,m as h,n as P,r as u,i as k}from"./index-DtJUIYo6.js";const g={class:"page-help"},C={class:"ph-inner"},y={class:"ph-banner"},L={class:"ph-banner-title"},R={key:0,class:"ph-overview"},V={key:1,class:"ph-section"},T={class:"ph-fname"},W={class:"ph-fsource"},b={class:"ph-fpurpose"},A={class:"ph-ffill"},B={key:0,class:"ph-sec-title"},G={key:1,class:"ph-sec-overview"},D={class:"ph-fname"},U={class:"ph-fsource"},x={class:"ph-fpurpose"},K={class:"ph-ffill"},I={__name:"PageHelp",props:{data:{type:Object,default:()=>({title:"操作说明",overview:"",fields:[]})}},setup(s){const c=k(!1);function w(){c.value=!0}return(Y,n)=>{const N=u("el-button"),M=u("el-tooltip"),S=u("el-empty"),_=u("el-drawer");return o(),i("div",g,[d(M,{content:"本页操作说明",placement:"left"},{default:m(()=>[d(N,{class:"help-fab",circle:"",onClick:w},{default:m(()=>[...n[1]||(n[1]=[a("?",-1)])]),_:1})]),_:1}),d(_,{modelValue:c.value,"onUpdate:modelValue":n[0]||(n[0]=l=>c.value=l),title:s.data.title||"操作说明",size:"520px","append-to-body":"",class:"ph-drawer"},{default:m(()=>[e("div",C,[e("div",y,[e("div",L,r(s.data.title||"操作说明"),1),n[2]||(n[2]=e("div",{class:"ph-banner-sub"},"页面整体说明",-1))]),s.data.overview?(o(),i("div",R,r(s.data.overview),1)):t("",!0),n[3]||(n[3]=e("div",{class:"ph-legend"},[e("span",{class:"lg"},[e("i",{class:"ic lg-source"}),a("来源:这个字段从哪来、谁填")]),e("span",{class:"lg"},[e("i",{class:"ic lg-purpose"}),a("用途:它起什么作用")]),e("span",{class:"lg"},[e("i",{class:"ic lg-fill"}),a("怎么填:具体填什么")])],-1)),s.data.fields&&s.data.fields.length?(o(),i("div",V,[(o(!0),i(v,null,h(s.data.fields,(l,f)=>(o(),i("div",{class:"ph-field",key:"top"+f},[e("div",T,[a(r(l.name)+" ",1),e("span",W,r(l.source),1)]),e("div",b,r(l.purpose),1),e("div",A,"👉 "+r(l.fill),1)]))),128))])):t("",!0),s.data.sections&&s.data.sections.length?(o(!0),i(v,{key:2},h(s.data.sections,(l,f)=>(o(),i("div",{key:f,class:"ph-section"},[l.title?(o(),i("div",B,r(l.title),1)):t("",!0),l.overview?(o(),i("div",G,r(l.overview),1)):t("",!0),(o(!0),i(v,null,h(l.fields,(p,E)=>(o(),i("div",{class:"ph-field",key:E},[e("div",D,[a(r(p.name)+" ",1),e("span",U,r(p.source),1)]),e("div",x,r(p.purpose),1),e("div",K,"👉 "+r(p.fill),1)]))),128))]))),128)):t("",!0),!s.data.fields&&!(s.data.sections&&s.data.sections.length)?(o(),P(S,{key:3,description:"暂无说明","image-size":70})):t("",!0)])]),_:1},8,["modelValue","title"])])}}},q=O(I,[["__scopeId","data-v-75d9d55f"]]),z={title:"产品类型(档案维护)",overview:`产品类型是"生产什么产品"的分类档案,是整条产线的源头基础数据。
生产主数据链条:产品类型 → 建工单(选产品类型) → 配物料清单(BOM) → 日排产 → 备料 → PLC/AGV 配送 → 工位装配。
必须先在这里维护好产品类型,后面所有环节(工单/BOM/备料/拧紧/追溯)才有可选对象。`,fields:[{name:"名称",source:"手工填写。用户自定义,无上游来源。",purpose:"产品类型的中文名,用于识别与下拉展示",fill:"如:智能电表、断路器、配电柜"},{name:"编码",source:"系统自动生成 + 可手动修改。新建时会自动带出(格式 PROD-YYYYMMDD-序号),你可直接使用或改为自定义编码;编辑时保留已存值。一个产品编码可对应多个工单(同一型号今天做一批、明天做一批,工单号不同,产品编码相同)。",purpose:"产品唯一编码。它是 MES 内部识别该产品的标识,决定该产品的物料清单(BOM)内容,也是工单、备料、拧紧、追溯的挂靠键。",fill:'建议用有意义的编码,如 METER-01。要点:①本编码与 WMS 是两套系统、互相解耦,MES 这边独立维护,WMS 那边各自单独录入;②成品入库时,由操作人员把本编码**手动录入 WMS**,两系统靠人工对齐;③如产品编码就是"产品类型",则直接沿用该类型编码即可;④建好后不要随意改,否则下游工单/追溯的关联会断。'},{name:"类别",source:"手工填写。可选,无上游来源。",purpose:"产品所属大类,便于分类统计",fill:"如:计量表 / 开关柜;可空"},{name:"启用",source:"开关选择。默认开启。",purpose:"启用后才允许在新建工单/备料的下拉里被选到",fill:"默认开启;暂时停产的可关闭(不删除,保留档案)"},{name:"备注",source:"手工填写。可选。",purpose:"补充说明",fill:"可不填"}]},F={title:"工单管理(新建 / 编辑工单)",overview:`工单 = 一个"合同/生产批次"的唯一载体,是生产执行和仓库出库挂靠的核心对象。
全流程:先有产品类型 → 建工单(选产品类型、定数量、定工序组合) → 进"物料清单"给该产品配料 → 行内"日排产"排哪天产多少 → 仓库按排产备料出库 → 产线装配/拧紧/报工 → 完工。
工单号会贯穿 备料单、拧紧查询、手动报工、工件追溯、操作日志 全链路。`,fields:[{name:"工单号",source:"系统自动生成(WO+时间戳),可手工改。新建时自动带出。",purpose:"唯一标识一个工单,备料/出库/报工/追溯都挂在此号下",fill:"打开新建对话框时已自动生成,一般不用改;如改动须保证唯一"},{name:"产品类型",source:'下拉选择。数据来自"产品类型"页面已启用的记录。',purpose:"说明这批生产的是什么产品,并决定物料清单内容",fill:'先到"产品类型"页面建好记录,再到这边下拉选择;没有可选项=还没建产品类型'},{name:"产品编码",source:"手工填写。通常与所选产品类型的编码一致。",purpose:"产品唯一编码,用于展示与追溯",fill:"如 METER-01,与产品类型编码对齐"},{name:"产品名称",source:"手工填写。通常与产品类型名称一致。",purpose:"产品中文名,用于展示",fill:"如 智能电表"},{name:"数量",source:"手工填写整数。",purpose:"本工单生产总数量(合同台数),决定需求量与排产上限",fill:"整数 ≥1,如 100"},{name:"工序组合",source:"手工填写数字序列。",purpose:"本工单要在产线执行的工序集合,PLC 按此组合下发到各工位",fill:"组合写入PLC135=只做第1/3/5序;全工序=123456789101112"},{name:"状态",source:"手动选择(新建时)。后续由系统流程自动推进。",purpose:"工单生命周期:创建→发布→生产→完成",fill:'新建时选"已创建",后续按流程推进无需手改'}],sections:[{title:'行内"日排产"弹窗',overview:'对当前这行工单,排"哪天生产多少台"。排产结果会通知仓库按此备料/配送。',fields:[{name:"日期",source:"手动选择日期。",purpose:"计划生产日期,仓库按它哪天备料",fill:"选一个日期,可对同一工单排未来多天"},{name:"计划数量",source:"手动填写整数。",purpose:"当天计划产量,作为仓库备料/AGV配送的前瞻依据",fill:"≤ 工单总数量;如今天产 20 台"}]},{title:'行内"工序组合"弹窗',overview:`对当前这行工单快速维护要执行的工序组合,PLC 按此组合下发到工位。
可自由拆组合、补工序(半成品再上线):如本应做第3/5序却做成了半成品,可在此把该件的组合改成只做漏掉的第2序,重上线完成闭环。`,fields:[{name:"工序组合",source:"人工自由维护。",purpose:"本工单在产线执行的工序集合,PLC 组合下发",fill:"只做第1/3/5序填 135;全序填 123456789101112;半成品补做第2序填 2"}]}]},H={title:"日排产(生产计划)",overview:`日排产 = 安排"哪个工单、在哪天、生产多少",是备料和出库的触发依据。
数据链路:工单(总数) → 日排产(按天拆分量,合计不得超过工单总数) → 仓库按日排产备料出库 → 产线按日生产。
可以按 工单号 / 排产日期 两个维度查询,也可直接新增/编辑/删除排产。`,fields:[{name:"工单号",source:'下拉选择。来自"工单管理"已建的工单。',purpose:"该排产对应哪个生产工单",fill:"选择工单号;也可手动输入未列出的工单号"},{name:"排产日期",source:"日历选择。",purpose:"计划在哪一天生产",fill:"选具体日期,如 2026-08-29"},{name:"计划数量",source:"手工填写整数。",purpose:"这一天计划生产多少件",fill:"整数≥1;注意:该工单所有日排产的数量合计不能超过工单总数量"},{name:"已完成",source:"系统自动累计。只读。",purpose:"该排产已实际完成多少件",fill:"无需填写"},{name:"状态",source:"系统维护。只读。",purpose:"排产执行状态(待排产/已确认)",fill:"无需填写"}]},Q={title:"物料清单(产品 BOM",overview:`物料清单 = 生产 1 台该产品需要哪些物料、各用多少。
按产品编码维护:同型号产品今天做一批、明天做一批,工单号不同、产品编码相同,共用这一份 BOM。
仓库(库房)按工单取其产品的 BOM 计算备料/出库需求量,并强约束累计出库 ≤ 需求总量。
职责分工:本页(MES)只维护「产品由哪几种料、各用几个」;每种物料叫什么、规格、是批次件还是 SN 件、库存有多少,统一在 WMS(库房)的「物料档案」里维护,两套系统互相解耦。
数据链路:先建「产品类型」→ 到本页选产品编码,为它逐条添加物料(编码要与 WMS 物料档案一致) → 之后仓库才能为对应工单领料。`,fields:[{name:"产品编码",source:"下拉/输入选择。来自「产品类型」管理里建的编码;同一型号可对应多个工单。",purpose:"要为哪个产品配置物料清单",fill:"选择产品编码后加载该产品已有清单"},{name:"物料编码",source:"手工填写。必须与 WMS(库房) 物料档案的编码一致。",purpose:"该物料在库房的全库唯一编码,两条系统靠它关联",fill:"如 螺丝=SCREW-M3、主控芯片=IC-001;编码对不上 WMS 将无法备料"},{name:"物料名称",source:"手工填写。",purpose:"物料中文名,便于识别",fill:"如 十字螺丝、主控芯片"},{name:"规格",source:"手工填写。",purpose:"物料规格型号",fill:"如 M3×8 / SMT-48脚"},{name:"单位",source:"手工填写。",purpose:"计量单位,用于算量",fill:"个 / 件 / 套 / kg"},{name:"管理方式",source:"单选。按物料类型决定,与 WMS 一致。",purpose:"精密件=逐件按SN管理;结构件=按批次管理",fill:'电子件选"精密件 SN";螺丝等标准件选"结构件 批次"'},{name:"单台用量",source:"手工填写。",purpose:"生产 1 台产品用的该物料数量",fill:"如每台 8 颗螺丝 → 填 8"},{name:"损耗率%",source:"手工填写。",purpose:"考虑报废/损耗的加放比例",fill:"如 2% 填 20=不计算损耗"},{name:"需求量",source:"自动计算 = 数量×单台用量×(1+损耗率),可覆盖。",purpose:"该物料总需求,出库不能超它",fill:"一般自动算,不必改"}]},J={title:"备料单(查询)",overview:`备料单按"日排产"自动算出某天需要的全部物料,仓库据此备料、由 AGV 配送到各工位(DOCK)。
本页是只读查询,不修改数据。
数据链路:日排产(工单内) → 本页按日期取那天所有工单的物料汇总 → 仓库出库 → AGV 配送。`,fields:[{name:"日期",source:"手动选择。筛选条件。",purpose:"查看哪一天的备料需求",fill:"选择某排产日期"},{name:"工单号",source:"手动输入。筛选条件。",purpose:"只查看指定工单的备料",fill:"可空,空=看全部工单"},{name:"状态",source:"下拉。数据来自备料执行状态。",purpose:"按备料进度筛选",fill:"可空"}]},X={title:"PLC 工序下发",overview:`把工序组合写入西门子 S7-1214 PLC 寄存器,产线传送带据此只执行对应工序。
系统遵循"未收到完成信号不下发下一条",确保产线不串序。
数据链路:工单(含工序组合) → 下发到 S7-1214 → PLC 驱动工位/传送带 → 收到完成信号再下发下一条。`,fields:[{name:"工单号",source:"手动输入/选择。来自工单。",purpose:"当前生产的工单,追溯依据",fill:"选择或输入工单号"},{name:"工件SN",source:"扫码枪扫描。来自工件条码。",purpose:"当前流经的工件唯一序列号",fill:"扫码枪扫入;可空(按工单整体下发)"},{name:"工位",source:"手动填写。",purpose:"下发到哪个工位(1~12)",fill:"输入 1~12 的整数"},{name:"工序组合",source:"手动填写。通常与工单的工序组合一致。",purpose:"该工位要执行的工序,PLC 组合执行",fill:"如 135(做第1/3/5序);全序=123456789101112"}]},Z={title:"拧紧数据(查询/录入)",overview:`接收丹尼科尔拧紧工具的采集结果(扭矩/角度/时间/结果/操作人),用于质量追溯。
数据在工位终端点"工序完成上报"后由拧紧枪数据同步到 MES。本页可查询,也可手工补录。`,fields:[{name:"SN",source:"扫码枪/手工。来自工件条码。",purpose:"被拧紧的工件唯一序列号",fill:"扫码枪扫描"},{name:"工单号",source:"自动带出/选择。来自工单。",purpose:"该工件所属工单",fill:"选择工单号"},{name:"工位",source:"手动填写。",purpose:"拧紧发生在哪道工位",fill:"如 3"},{name:"扭矩",source:"拧紧枪自动采集(丹尼科尔工具)。",purpose:"实际拧紧扭矩(N·m),判定是否达标",fill:"工具自动带出;补录时手填"},{name:"角度",source:"拧紧枪自动采集。",purpose:"实际旋转角度(°),判定滑牙/屈服",fill:"工具自动带出;补录时手填"},{name:"操作人",source:"登录账号自动带出。",purpose:"执行拧紧的人,用于追溯",fill:"默认当前登录用户,可改"}]},$={title:"手动报工(工位工序完成上报)",overview:`每个工位装配/检测相对工序完成后,在【手动报工】页选择工位、扫入工件SN、选工序号,系统按该工序已维护的【工艺参数】模板动态展开需要采集的参数,人工录入并提交。
提交后写工序实绩 + 步骤数据,系统按步骤考核标准自动判定 OK/NG。
数据链路:工艺参数(维护每道工序要收集哪些参数、判定标准) → 手动报工页扫SN逐参数录入 → 判 OK/NG → 工件追溯可见。`,fields:[{name:"工位",source:"下拉选择(1~12)。",purpose:"哪个工位在报工",fill:"选择工位 1~12"},{name:"工件SN",source:"扫码枪扫描。来自工件条码。",purpose:"工件的唯一序列号,报工对象",fill:"扫码枪扫入,触发载入参数模板"},{name:"工序号",source:"手动选择(1~12)。",purpose:"本次完成的工序,展开该工序的参数模板",fill:"选择 1~12"},{name:"各步骤采集值",source:"手工填写 或 拧紧枪自动带出(视采集方式)。字段由【工艺参数】维护页人为定义,可增加/删除/改采集方式与判定标准。",purpose:"收集该工序的扭矩/角度/尺寸等参数,按标准判定合格与否",fill:"逐条填采集值,未维护标准的步骤仅记录"}]},ee={title:"工艺参数(工序步骤与考核标准维护)",overview:`人为维护【每道工序要收集哪些参数】及【合格判定标准】,是手动报工的基础——报工页按这里的模板动态渲染参数输入框。
· 一道工序可有多个步骤(参数)
· 每步可选择采集方式:拧紧枪自动 / 手填 / 仅记录;
· 每步可设考核标准(如扭矩在 [35,45] N·m 为合格),报工时系统自动判 OK/NG。`,fields:[{name:"工序号",source:"手动选择(1~12)。",purpose:"给哪道工序配置步骤",fill:"选择工序号,加载该工序现有步骤"},{name:"步骤名称",source:"人为定义。",purpose:"该参数叫什么(如 装配完成/拧紧扭矩)",fill:"输入中文名称"},{name:"采集方式",source:"人为选择。",purpose:"该参数怎么来:拧紧枪自动/手填/仅记录",fill:"AUTO=拧紧枪自动;MANUAL=手填;NONE=仅记录"},{name:"是否为拧紧",source:"开关。",purpose:"标识是否属于拧紧采集",fill:"拧紧扭矩/角度步骤打开"},{name:"判定标准",source:"人为定义。可为一条或多条。",purpose:"报工时自动判定 OK/NG 的依据",fill:"如 扭矩 RANGE [35,45];角度 GE 90 等"}]},se={title:"工件追溯",overview:`输入工件 SN,查它的完整履历:进线/完工时间、各工序时间线、步骤考核数据(扭矩/角度)、拧紧记录、以及它用了哪些批次/精密件。
数据来源:全部由前端各环节自动写入(扫码报工、拧紧采集、PLC下发、工序完成),本页只读查询。`,fields:[{name:"工件SN",source:"扫码枪/手输。来自工件条码。",purpose:"要追溯的工件唯一序列号",fill:"扫 SN 或手动输入后点查询"}]},le={title:"角色权限管理(用户/角色/权限)",overview:`管控谁能登录、能看哪些菜单。建议只给操作员分配其工序所需菜单权限。
登录 token 有效期短(1800秒),超时自动失效需重新登录。`,sections:[{title:"用户(新建/编辑)",fields:[{name:"用户名",source:"手工填写。",purpose:"登录账号,唯一",fill:"如 operator1"},{name:"密码",source:"手工填写,保存时加密存储。",purpose:"登录密码",fill:"≥6位;编辑时留空=不修改"},{name:"姓名",source:"手工填写。",purpose:"真实姓名,操作日志追溯用",fill:"如 张三"},{name:"角色",source:'下拉选择。来自"角色"页已建的角色。',purpose:"决定该用户的菜单权限",fill:"选择已建角色"},{name:"状态",source:"选择。",purpose:"禁用后无法登录",fill:"启用 / 禁用"}]},{title:"角色(新建/编辑)",fields:[{name:"名称",source:"手工填写。",purpose:"角色中文名",fill:"如 装配工、质检员"},{name:"编码",source:"手工填写。",purpose:"角色唯一编码(SUPER_ADMIN 为内置超级管理员,勿改)",fill:"如 OPERATOR"},{name:"备注",source:"手工填写。",purpose:"说明",fill:"可空"},{name:"权限",source:'多选。来自"权限"页的权限码。',purpose:"勾选该角色可见的菜单/功能",fill:"勾选所需权限码(如 produce.workorder)"}]},{title:"权限(新增/编辑)",overview:"通常由系统预置,一般无需手动新增。",fields:[{name:"编码",source:"系统预置/手工。",purpose:"权限唯一码",fill:"如 produce.workorder"},{name:"名称",source:"手工填写。",purpose:"权限名",fill:"如 工单管理"},{name:"类型",source:"手工填写。",purpose:"MENU=菜单权限 / API=接口权限",fill:"如 MENU"},{name:"路径",source:"手工填写。",purpose:"MENU 对应的前端路由路径",fill:"如 /work-order"},{name:"排序",source:"手工填写。",purpose:"菜单显示顺序",fill:"数字,越小越靠前"}]}]},oe={title:"操作日志",overview:`记录所有关键业务操作(建工单、物料清单维护、备料、PLC下发、拧紧、扫码报工等),按工单号、操作人、实体可追溯。
数据由系统在各操作发生时自动写入,本页只读查询。`,fields:[{name:"工单号",source:"筛选条件。数据来自日志中的 workOrderNo 字段。",purpose:"按工单号过滤该工单的所有操作",fill:"输入工单号,可空=全部"},{name:"操作人",source:"筛选条件。数据来自日志中的 operator 字段。",purpose:"按操作人过滤",fill:"输入姓名/账号,可空=全部"},{name:"类型",source:"筛选条件。数据来自日志中的事件类型字段。",purpose:"按事件类型过滤",fill:"如 EVENT_WORK_ORDER / EVENT_TORQUE,可空"}]};export{q as P,H as a,Q as b,J as c,X as d,Z as e,ee as f,$ as g,F as h,se as i,z as j,oe as k,le as l};
@@ -1 +0,0 @@
.page-help[data-v-75d9d55f]{position:fixed;left:18px;bottom:18px;z-index:2050}.help-fab[data-v-75d9d55f]{width:42px;height:42px;background:#1668dc;color:#fff;font-weight:700;font-size:20px;box-shadow:0 3px 10px #16324f4d;transition:transform .15s}.help-fab[data-v-75d9d55f]:hover{background:#0e57c3;transform:scale(1.06)}.ph-inner[data-v-75d9d55f]{padding:0 6px 24px}.ph-banner[data-v-75d9d55f]{background:linear-gradient(120deg,#1668dc,#3a98f0);color:#fff;border-radius:10px;padding:16px 18px;margin-bottom:16px}.ph-banner-title[data-v-75d9d55f]{font-size:20px;font-weight:700}.ph-banner-sub[data-v-75d9d55f]{font-size:12px;opacity:.85;margin-top:4px}.ph-overview[data-v-75d9d55f]{color:#3f536e;line-height:1.8;font-size:14px;margin-bottom:16px;background:#f4f7fb;border:1px solid #e4ecf5;border-radius:8px;padding:12px 14px;white-space:pre-line}.ph-legend[data-v-75d9d55f]{display:flex;flex-wrap:wrap;gap:12px 16px;margin-bottom:16px;padding:10px 14px;background:#fafbfc;border:1px dashed #d9e0e8;border-radius:8px;font-size:12px;color:#6b7785}.ph-legend .lg[data-v-75d9d55f]{display:inline-flex;align-items:center;gap:6px}.ph-legend .ic[data-v-75d9d55f]{display:inline-block;width:10px;height:10px;border-radius:3px}.lg-source[data-v-75d9d55f]{background:#8fa5f5}.lg-purpose[data-v-75d9d55f]{background:#22b07d}.lg-fill[data-v-75d9d55f]{background:#f5a623}.ph-section[data-v-75d9d55f]{margin-bottom:18px}.ph-sec-title[data-v-75d9d55f]{font-size:15px;font-weight:700;color:#1b2a3a;margin:0 0 4px;padding-left:10px;border-left:4px solid #1668dc;line-height:1.4}.ph-sec-overview[data-v-75d9d55f]{color:#7a8694;font-size:13px;margin:4px 0 10px;line-height:1.7}.ph-field[data-v-75d9d55f]{background:#fff;border:1px solid #eef1f6;border-radius:8px;padding:10px 14px;margin-bottom:8px}.ph-fname[data-v-75d9d55f]{display:flex;align-items:center;gap:8px;font-weight:700;color:#1b2a3a;font-size:14px}.ph-fsource[data-v-75d9d55f]{font-weight:400;font-size:11px;color:#1668dc;background:#e8f1ff;border-radius:4px;padding:1px 8px}.ph-fpurpose[data-v-75d9d55f]{color:#22b07d;font-size:13px;line-height:1.6;margin-top:6px}.ph-fpurpose[data-v-75d9d55f]:before{content:"用途:";font-weight:600;color:#1b8d63}.ph-ffill[data-v-75d9d55f]{color:#8a5b00;font-size:13px;line-height:1.6;margin-top:4px}.ph-ffill[data-v-75d9d55f]:before{content:"怎么填:";font-weight:600;color:#8a5b00}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
.kpi-label[data-v-483d2fd9]{color:#909399;font-size:13px}.kpi-value[data-v-483d2fd9]{font-size:26px;font-weight:700;margin-top:4px;color:#303133}.entries[data-v-483d2fd9]{display:flex;flex-wrap:wrap;gap:10px}
@@ -1 +0,0 @@
import{_ as C,i as B,c as s,a as t,w as a,r as o,h as _,u as D,o as l,F as u,k as p,d as n,t as c,p as f,q as N,v as S,x as I,y as T,z as V,A as q,B as h,C as z,D as F,G as Q,H as A,f as E}from"./index-C_gZ2k2u.js";import{r as G}from"./request-DwGAFJaQ.js";import{f as H}from"./format-C9Ok6skr.js";const L={class:"kpi-label"},M={class:"kpi-value"},R={class:"entries"},$={__name:"Dashboard",setup(j){const k=D(),i=_({}),r=_(!1);async function m(){i.value=await G.get("/display/overview"),r.value=!0}B(m);const y=[{key:"totalQty",label:"在库总量"},{key:"lockedQty",label:"锁定量"},{key:"snInStock",label:"SN 在库数"},{key:"semiInStock",label:"半成品在库"},{key:"packageCount",label:"包装箱数"},{key:"batchCount",label:"批次数"},{key:"inToday",label:"今日入库单"},{key:"outToday",label:"今日出库单"}],v=[{path:"/inbound",title:"入库管理",icon:N},{path:"/outbound",title:"备料出库",icon:S},{path:"/inventory",title:"库存查询",icon:I},{path:"/inspection",title:"质量检验",icon:T},{path:"/stocktake",title:"库存盘点",icon:V},{path:"/semi",title:"半成品/成品",icon:q},{path:"/package",title:"包装绑定",icon:h},{path:"/ledger",title:"备料台账",icon:h},{path:"/base-data",title:"基础数据",icon:z},{path:"/display",title:"免登录大屏",icon:F}];return(J,K)=>{const d=o("el-card"),b=o("el-col"),g=o("el-row"),w=o("el-icon"),x=o("el-button");return l(),s("div",null,[t(g,{gutter:12},{default:a(()=>[(l(),s(u,null,p(y,e=>t(b,{key:e.key,xs:12,sm:8,md:6,style:{"margin-bottom":"12px"}},{default:a(()=>[t(d,{shadow:"hover"},{default:a(()=>[n("div",L,c(e.label),1),n("div",M,c(r.value?f(H)(i.value[e.key]):"—"),1)]),_:2},1024)]),_:2},1024)),64))]),_:1}),t(d,{shadow:"never",header:"快捷入口"},{default:a(()=>[n("div",R,[(l(),s(u,null,p(v,e=>t(x,{key:e.path,size:"large",onClick:O=>f(k).push(e.path)},{default:a(()=>[t(w,{style:{"margin-right":"6px"}},{default:a(()=>[(l(),Q(A(e.icon)))]),_:2},1024),E(c(e.title),1)]),_:2},1032,["onClick"])),64))])]),_:1})])}}},X=C($,[["__scopeId","data-v-483d2fd9"]]);export{X as default};
@@ -1 +0,0 @@
import{r as w}from"./request-DwGAFJaQ.js";import{f as o}from"./format-C9Ok6skr.js";import{_ as S,i as z,j as I,c as i,d as t,t as n,F as _,k,l as q,h,m as r,o as c,n as D}from"./index-C_gZ2k2u.js";const $={class:"screen"},N={class:"head"},T={class:"side right"},x={class:"date"},M={class:"time"},Q={class:"kpi-grid"},B={class:"kpi-value"},C={class:"kpi-label"},j={class:"zones"},F={class:"zone-list"},L={class:"zone-name"},O={class:"bar-wrap"},V={class:"zone-qty"},E={key:0,class:"empty"},H={__name:"Display",setup(U){const v=h(new Date);let y=null,m=null;const l=h({}),g=r(()=>{const a=Object.values(u.value).map(e=>Number(e.qty)||0);return Math.max(...a,1)}),u=r(()=>{const a=l.value.zoneDetail||{};return Object.entries(a).map(([e,s])=>({zone:e,qty:Number(s)||0})).sort((e,s)=>s.qty-e.qty)}),b=r(()=>[{key:"totalQty",label:"在库总量",value:o(l.value.totalQty)},{key:"lockedQty",label:"锁定量",value:o(l.value.lockedQty)},{key:"snInStock",label:"SN 在库",value:o(l.value.snInStock)},{key:"semiInStock",label:"半成品在库",value:o(l.value.semiInStock)},{key:"packageCount",label:"包装箱数",value:o(l.value.packageCount)},{key:"inToday",label:"今日入库单",value:o(l.value.inToday)},{key:"outToday",label:"今日出库单",value:o(l.value.outToday)}]),f=["周日","周一","周二","周三","周四","周五","周六"],d=r(()=>{const a=v.value,e=s=>String(s).padStart(2,"0");return{date:`${a.getFullYear()}-${e(a.getMonth()+1)}-${e(a.getDate())}`,time:`${e(a.getHours())}:${e(a.getMinutes())}:${e(a.getSeconds())}`,week:`星期${f[a.getDay()].replace("周","")}`}});async function p(){try{l.value=await w.get("/display/overview")}catch{}}return z(()=>{y=setInterval(()=>{v.value=new Date},1e3),p(),m=setInterval(p,5e3)}),I(()=>{clearInterval(y),clearInterval(m)}),(a,e)=>(c(),i("div",$,[t("header",N,[e[0]||(e[0]=t("div",{class:"side left"},"库房监控",-1)),e[1]||(e[1]=t("h1",{class:"title"},"库存动态大屏",-1)),t("div",T,[t("span",x,n(d.value.date),1),t("span",M,n(d.value.time),1),t("span",null,n(d.value.week),1)])]),t("section",Q,[(c(!0),i(_,null,k(b.value,s=>(c(),i("div",{key:s.key,class:"kpi"},[t("div",B,n(s.value),1),t("div",C,n(s.label),1)]))),128))]),t("section",j,[e[2]||(e[2]=t("div",{class:"zone-title"},"区域明细(区域 / 质量状态)",-1)),t("div",F,[(c(!0),i(_,null,k(u.value,s=>(c(),i("div",{key:s.zone,class:"zone-row"},[t("div",L,n(s.zone),1),t("div",O,[t("div",{class:"bar",style:D({width:`${s.qty/g.value*100}%`})},null,4)]),t("div",V,n(s.qty.toLocaleString("zh-CN")),1)]))),128)),u.value.length?q("",!0):(c(),i("div",E,"暂无区域数据…"))])]),e[3]||(e[3]=t("footer",{class:"foot"},"数据来源:WMS 后端 · 每 5 秒自动刷新",-1))]))}},A=S(H,[["__scopeId","data-v-e0ddabf0"]]);export{A as default};
@@ -1 +0,0 @@
.screen[data-v-e0ddabf0]{min-height:100vh;background:radial-gradient(ellipse at 50% 0%,rgba(0,170,255,.18),transparent 55%),linear-gradient(180deg,#04102a,#071e42 60%,#04102a);color:#d7ecff;display:flex;flex-direction:column;font-family:Microsoft YaHei,PingFang SC,sans-serif}.head[data-v-e0ddabf0]{display:flex;align-items:center;justify-content:space-between;padding:18px 36px 10px;border-bottom:1px solid rgba(64,158,255,.35)}.title[data-v-e0ddabf0]{margin:0;font-size:clamp(20px,2.6vw,34px);letter-spacing:8px;color:#fff;text-shadow:0 0 14px rgba(64,190,255,.9)}.side[data-v-e0ddabf0]{font-size:13px;color:#7fb8ff}.right[data-v-e0ddabf0]{text-align:right}.date[data-v-e0ddabf0]{margin-right:12px}.time[data-v-e0ddabf0]{font-size:22px;font-weight:700;color:#4fd7ff;margin-right:8px;font-variant-numeric:tabular-nums}.kpi-grid[data-v-e0ddabf0]{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:14px;padding:22px 36px 6px}.kpi[data-v-e0ddabf0]{border:1px solid rgba(64,158,255,.45);background:linear-gradient(180deg,#0d2f60bf,#071a3ad9);border-radius:8px;padding:18px 10px;text-align:center;box-shadow:inset 0 0 24px #2382ff40}.kpi-value[data-v-e0ddabf0]{font-size:clamp(28px,3vw,46px);font-weight:800;color:#61e6ff;text-shadow:0 0 16px rgba(80,220,255,.7);font-variant-numeric:tabular-nums}.kpi-label[data-v-e0ddabf0]{margin-top:6px;font-size:14px;color:#9cc7ff;letter-spacing:2px}.zones[data-v-e0ddabf0]{flex:1;padding:16px 36px 8px;overflow:auto}.zone-title[data-v-e0ddabf0]{font-size:16px;letter-spacing:3px;color:#bfe0ff;border-left:4px solid #409eff;padding-left:10px;margin-bottom:12px}.zone-row[data-v-e0ddabf0]{display:flex;align-items:center;gap:12px;padding:7px 0;border-bottom:1px dashed rgba(64,158,255,.15)}.zone-name[data-v-e0ddabf0]{width:200px;text-align:right;color:#cfe6ff;font-size:14px}.bar-wrap[data-v-e0ddabf0]{flex:1;height:16px;background:#13386e99;border-radius:9px;overflow:hidden}.bar[data-v-e0ddabf0]{height:100%;border-radius:9px;background:linear-gradient(90deg,#1673ff,#37e2ff);box-shadow:0 0 10px #37d2ffa6;transition:width .6s ease}.zone-qty[data-v-e0ddabf0]{width:90px;color:#61e6ff;font-weight:700;font-variant-numeric:tabular-nums}.empty[data-v-e0ddabf0]{color:#5f86b8;padding:30px 0;text-align:center}.foot[data-v-e0ddabf0]{padding:12px 36px 16px;text-align:center;color:#47709f;font-size:12px}
@@ -1 +0,0 @@
.dropzone[data-v-527961dc]{padding:30px 0;color:#606266}
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
.tip[data-v-c4d8daa0]{margin-left:10px;color:#909399;font-size:12px}
@@ -1 +0,0 @@
import{_ as U,h as s,I as $,i as A,O as C,c as E,a as t,w as l,p as R,F,r as n,o as K,f as u,e as M,d as P,t as q,E as p}from"./index-C_gZ2k2u.js";import{r as I}from"./request-DwGAFJaQ.js";import{c as D,P as O}from"./help-BKBuziS-.js";const j={class:"tip"},z={__name:"Inspection",setup(G){const i=s("BATCH"),f=s("合格"),d=s($()),_=s(),v=s(""),g=s(!1);A(()=>C(()=>{var a;return(a=_.value)==null?void 0:a.focus()}));async function V(){const a=v.value.trim();if(!a){p.warning("请扫入或输入目标编号");return}if(!d.value.trim()){p.warning("请填写检验员");return}g.value=!0;try{await I.post("/inspection/create",{targetType:i.value,targetId:a,status:f.value,inspector:d.value.trim()}),p.success(`检验已记录:${i.value} ${a}${f.value}`),v.value="",C(()=>{var e;return(e=_.value)==null?void 0:e.focus()})}finally{g.value=!1}}const m=s(""),c=s(!1);function N(){return[...new Set(String(m.value).split(/\s+/).map(a=>a.trim()).filter(Boolean))]}async function S(){const a=N();if(!a.length){p.warning("请录入待检编号(每行一个)");return}if(!d.value.trim()){p.warning("请填写检验员");return}c.value=!0;try{const e=await I.post("/inspection/batch-flip",{targetType:i.value,targetIds:a,status:f.value,inspector:d.value.trim()});p.success(`批量检验完成:共处理 ${(e==null?void 0:e.flipped)??a.length}`),m.value=""}finally{c.value=!1}}return(a,e)=>{const w=n("el-radio-button"),x=n("el-radio-group"),r=n("el-form-item"),T=n("el-radio"),y=n("el-input"),B=n("el-divider"),b=n("el-button"),k=n("el-form"),H=n("el-card");return K(),E(F,null,[t(H,{shadow:"never",style:{"max-width":"760px",margin:"0 auto"}},{default:l(()=>[t(k,{"label-width":"110px"},{default:l(()=>[t(r,{label:"目标类型"},{default:l(()=>[t(x,{modelValue:i.value,"onUpdate:modelValue":e[0]||(e[0]=o=>i.value=o)},{default:l(()=>[t(w,{value:"BATCH"},{default:l(()=>[...e[6]||(e[6]=[u("批次 BATCH",-1)])]),_:1}),t(w,{value:"SN"},{default:l(()=>[...e[7]||(e[7]=[u("序列号 SN",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),t(r,{label:"检验结论"},{default:l(()=>[t(x,{modelValue:f.value,"onUpdate:modelValue":e[1]||(e[1]=o=>f.value=o)},{default:l(()=>[t(T,{value:"合格"},{default:l(()=>[...e[8]||(e[8]=[u("合格",-1)])]),_:1}),t(T,{value:"不合格"},{default:l(()=>[...e[9]||(e[9]=[u("不合格",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),t(r,{label:"检验员"},{default:l(()=>[t(y,{modelValue:d.value,"onUpdate:modelValue":e[2]||(e[2]=o=>d.value=o),placeholder:"检验员姓名",clearable:"",style:{width:"260px"}},null,8,["modelValue"])]),_:1}),t(B,{"content-position":"left"},{default:l(()=>[...e[10]||(e[10]=[u("单个录入(扫码)",-1)])]),_:1}),t(r,{label:"扫码输入"},{default:l(()=>[t(y,{ref_key:"scanRef",ref:_,modelValue:v.value,"onUpdate:modelValue":e[3]||(e[3]=o=>v.value=o),autofocus:"",clearable:"",placeholder:"扫入批次号或 SN,回车提交",style:{width:"420px"},onKeyup:M(V,["enter"])},null,8,["modelValue"]),P("span",j,"当前目标:"+q(i.value==="BATCH"?"批次号":"SN 序列号"),1)]),_:1}),t(r,null,{default:l(()=>[t(b,{type:"primary",loading:g.value,onClick:V},{default:l(()=>[...e[11]||(e[11]=[u("提交检验",-1)])]),_:1},8,["loading"])]),_:1}),t(B,{"content-position":"left"},{default:l(()=>[...e[12]||(e[12]=[u("批量翻转",-1)])]),_:1}),t(r,{label:"批量编号"},{default:l(()=>[t(y,{modelValue:m.value,"onUpdate:modelValue":e[4]||(e[4]=o=>m.value=o),type:"textarea",rows:6,placeholder:"每行一个编号,支持扫码枪连续录入"},null,8,["modelValue"])]),_:1}),t(r,null,{default:l(()=>[t(b,{type:"primary",loading:c.value,onClick:S},{default:l(()=>[...e[13]||(e[13]=[u("批量提交",-1)])]),_:1},8,["loading"]),t(b,{onClick:e[5]||(e[5]=o=>m.value="")},{default:l(()=>[...e[14]||(e[14]=[u("清空",-1)])]),_:1})]),_:1})]),_:1})]),_:1}),t(O,{data:R(D)},null,8,["data"])],64)}}},W=U(z,[["__scopeId","data-v-c4d8daa0"]]);export{W as default};
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
.mb12[data-v-c6dca929]{margin-bottom:12px}.pager[data-v-c6dca929]{display:flex;justify-content:flex-end}
@@ -1 +0,0 @@
.mb12[data-v-0a6b9e76]{margin-bottom:12px}.pager[data-v-0a6b9e76]{display:flex;justify-content:flex-end;margin-top:10px}
@@ -1 +0,0 @@
import{_ as K,c as S,d as x,a as e,w as a,G as g,p as F,F as M,r as o,h as u,J as P,o as _,K as T,e as E,f as c,L as G,t as p,g as H}from"./index-C_gZ2k2u.js";import{r as I}from"./request-DwGAFJaQ.js";import{g as J,P as O}from"./help-BKBuziS-.js";const U={class:"pager"},j={__name:"Ledger",setup(A){const i=u(""),d=u(!1),v=u(!1),y=u([]),m=u(0),r=H({current:1,size:20});function N(t){return Math.max((t.totalQty||0)-(t.outQty||0),0)}async function b(){if(i.value.trim()){d.value=!0;try{const t=await I.get("/ledger/query",{params:{orderNo:i.value.trim(),page:r.current,pageSize:r.size}});y.value=(t==null?void 0:t.list)||[],m.value=(t==null?void 0:t.total)||0,v.value=!0}finally{d.value=!1}}}function f(){r.current=1,b()}function k(t){return t==="领料完结"?"success":t==="进行中"?"primary":"info"}return(t,s)=>{const z=o("el-input"),h=o("el-form-item"),C=o("el-button"),V=o("el-form"),w=o("el-card"),n=o("el-table-column"),B=o("el-tag"),L=o("el-table"),Q=o("el-pagination"),q=o("el-empty"),D=P("loading");return _(),S(M,null,[x("div",null,[e(w,{shadow:"never",class:"mb12"},{default:a(()=>[e(V,{inline:"",onSubmit:T(f,["prevent"])},{default:a(()=>[e(h,{label:"工单号"},{default:a(()=>[e(z,{modelValue:i.value,"onUpdate:modelValue":s[0]||(s[0]=l=>i.value=l),placeholder:"输入工单号查询物料台账",clearable:"",autofocus:"",style:{width:"280px"},onKeyup:E(f,["enter"])},null,8,["modelValue"])]),_:1}),e(h,null,{default:a(()=>[e(C,{type:"primary",loading:d.value,onClick:f},{default:a(()=>[...s[2]||(s[2]=[c("查询",-1)])]),_:1},8,["loading"])]),_:1})]),_:1})]),_:1}),v.value?(_(),g(w,{key:0,shadow:"never"},{header:a(()=>[c("工单 "+p(i.value)+" 备料台账(共 "+p(m.value)+" 条)",1)]),default:a(()=>[G((_(),g(L,{data:y.value,border:"","empty-text":"暂无台账数据"},{default:a(()=>[e(n,{prop:"orderNo",label:"工单号","min-width":"140"}),e(n,{prop:"materialCode",label:"物料编码","min-width":"150"}),e(n,{prop:"materialName",label:"物料名称","min-width":"150"},{default:a(({row:l})=>[c(p(l.materialName||"-"),1)]),_:1}),e(n,{prop:"totalQty",label:"需求总量",width:"100",align:"center"}),e(n,{prop:"outQty",label:"已出库",width:"90",align:"center"}),e(n,{label:"缺口",width:"90",align:"center"},{default:a(({row:l})=>[c(p(N(l)),1)]),_:1}),e(n,{label:"状态",width:"110",align:"center"},{default:a(({row:l})=>[e(B,{type:k(l.status),size:"small"},{default:a(()=>[c(p(l.status),1)]),_:2},1032,["type"])]),_:1})]),_:1},8,["data"])),[[D,d.value]]),x("div",U,[e(Q,{background:"",layout:"total, prev, pager, next",total:m.value,"current-page":r.current,"page-size":r.size,onCurrentChange:s[1]||(s[1]=l=>{r.current=l,b()})},null,8,["total","current-page","page-size"])])]),_:1})):(_(),g(q,{key:1,description:"请输入工单号查询"}))]),e(O,{data:F(J)},null,8,["data"])],64)}}},Y=K(j,[["__scopeId","data-v-0a6b9e76"]]);export{Y as default};
@@ -1 +0,0 @@
import{_ as v,c as V,a as s,w as r,r as a,u as k,b as h,o as x,d as u,e as q,f as E,s as R,E as B,g as C,h as c}from"./index-C_gZ2k2u.js";import{r as N}from"./request-DwGAFJaQ.js";const S={class:"login-page"},K={__name:"Login",setup(L){const f=k(),_=h(),d=c(),l=c(!1),o=C({username:"",password:""}),g={username:[{required:!0,message:"请输入用户名",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"}]};async function p(){await d.value.validate(),l.value=!0;try{const t=await N.post("/auth/login",{username:o.username,password:o.password});if(!(t!=null&&t.token))throw new Error("登录响应缺少 token");R(t.token,t.user||{}),B.success("登录成功");const e=_.query.redirect;f.push(e&&typeof e=="string"?e:"/")}finally{l.value=!1}}return(t,e)=>{const m=a("el-input"),i=a("el-form-item"),w=a("el-button"),b=a("el-form"),y=a("el-card");return x(),V("div",S,[s(y,{class:"card"},{default:r(()=>[e[3]||(e[3]=u("div",{class:"head"},[u("h2",null,"库房客户端"),u("p",null,"请使用 WMS 账号登录")],-1)),s(b,{ref_key:"formRef",ref:d,model:o,rules:g,"label-position":"top",onKeyup:q(p,["enter"])},{default:r(()=>[s(i,{label:"用户名",prop:"username"},{default:r(()=>[s(m,{modelValue:o.username,"onUpdate:modelValue":e[0]||(e[0]=n=>o.username=n),placeholder:"用户名",autofocus:""},null,8,["modelValue"])]),_:1}),s(i,{label:"密码",prop:"password"},{default:r(()=>[s(m,{modelValue:o.password,"onUpdate:modelValue":e[1]||(e[1]=n=>o.password=n),type:"password","show-password":"",placeholder:"密码"},null,8,["modelValue"])]),_:1}),s(w,{type:"primary",class:"btn",loading:l.value,onClick:p},{default:r(()=>[...e[2]||(e[2]=[E("登 录",-1)])]),_:1},8,["loading"])]),_:1},8,["model"])]),_:1})])}}},I=v(K,[["__scopeId","data-v-1dbd5754"]]);export{I as default};
@@ -1 +0,0 @@
.login-page[data-v-1dbd5754]{height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#1c3faa,#0a1330)}.card[data-v-1dbd5754]{width:380px}.head[data-v-1dbd5754]{text-align:center;margin-bottom:14px}.head h2[data-v-1dbd5754]{margin:0 0 6px}.head p[data-v-1dbd5754]{margin:0;color:#909399;font-size:13px}.btn[data-v-1dbd5754]{width:100%;margin-top:4px}
@@ -1,7 +0,0 @@
import{_ as E,I as K,i as T,c as M,d as D,a as t,w as n,G as $,p as O,F as I,h as y,r as i,J as Z,o as m,K as j,e as P,f as b,L as R,t as h,M as U,E as v,g as G,N as H,m as J}from"./index-C_gZ2k2u.js";import{r as k}from"./request-DwGAFJaQ.js";import{a as L,P as W}from"./help-BKBuziS-.js";const X={key:1,style:{color:"#67c23a"}},Y={__name:"Outbound",setup(ee){const N=G({orderNo:""}),x=K(),f=y(""),w=y(!1),V=y(!1),_=y([]),B=y([]);T(async()=>{try{const e=await k.get("/orders",{params:{page:1,pageSize:200}});B.value=Array.isArray(e)?e:(e==null?void 0:e.list)||[]}catch{B.value=[]}});const F=J(()=>_.value.filter(e=>e.status!=="领料完结"));function q(e){return Math.max((e.totalQty||0)-(e.outQty||0),0)}async function Q(e){const l=q(e);if(l<=0)return;const d=await k.get("/stock/query",{params:{type:"batch",materialCode:e.materialCode,page:1,pageSize:200}}),p=((d==null?void 0:d.batch)||[]).filter(a=>a.qualityStatus==="合格"&&a.zoneCode==="Z02").sort((a,r)=>String(a.batchNo).localeCompare(String(r.batchNo))),c=[];let u=l;for(const a of p){if(u<=0)break;const r=(a.quantity||0)-(a.lockedQty||0);if(r<=0)continue;const o=Math.min(r,u);c.push({batchNo:a.batchNo,qty:o,zoneCode:a.zoneCode}),u-=o}if(!c.length){v.warning(`物料 ${e.materialCode} 在合格区(Z02)无可用批次库存`);return}if(u>0){v.error(`可用量不足:缺口 ${l}Z02 仅可凑 ${l-u},还差 ${u}`);return}const C=c.map(a=>`· 批次 ${a.batchNo} 出库 ${a.qty}`).join(`
`);await H.confirm(`工单 ${e.orderNo} 物料 ${e.materialCode}
缺口 ${l},按 FIFO 分配如下:
${C}
操作人:${x}${f.value?`
目标口:${f.value}`:""}`,"确认自动分配出库",{type:"warning",confirmButtonText:"确认出库",cancelButtonText:"取消"});const s=[];let g="";for(const a of c){const r=await k.post("/outbound/create",{orderNo:e.orderNo,materialCode:e.materialCode,batchNo:a.batchNo,qty:a.qty,operator:x,targetDock:f.value.trim()||void 0});r!=null&&r.outboundNo&&s.push(r.outboundNo),g=(r==null?void 0:r.status)||g}const S=g==="领料完结";v.success(`出库完成:出库单号 ${s.join("、")};该物料${S?"已":"未"}领料完结`),await z()}function A(e){return e==="领料完结"?"success":e==="进行中"?"primary":"info"}async function z(){if(!N.orderNo.trim()){v.warning("请输入工单号");return}w.value=!0;try{const e=await k.get("/ledger/query",{params:{orderNo:N.orderNo.trim(),page:1,pageSize:100}});_.value=(e==null?void 0:e.list)||[],V.value=!0,_.value.length||v.info("该工单暂无台账记录")}finally{w.value=!1}}return(e,l)=>{const d=i("el-input"),p=i("el-form-item"),c=i("el-button"),u=i("el-form"),C=i("el-card"),s=i("el-table-column"),g=i("el-tag"),S=i("el-table"),a=i("el-empty"),r=Z("loading");return m(),M(I,null,[D("div",null,[t(C,{shadow:"never",class:"mb12"},{default:n(()=>[t(u,{inline:"","label-width":"90px",onSubmit:l[2]||(l[2]=j(()=>{},["prevent"]))},{default:n(()=>[t(p,{label:"工单号"},{default:n(()=>[t(d,{modelValue:N.orderNo,"onUpdate:modelValue":l[0]||(l[0]=o=>N.orderNo=o),placeholder:"输入工单号回车查询",clearable:"",autofocus:"",style:{width:"260px"},onKeyup:P(z,["enter"])},null,8,["modelValue"])]),_:1}),t(p,{label:"操作人"},{default:n(()=>[t(d,{"model-value":O(x),disabled:"",style:{width:"160px"}},null,8,["model-value"])]),_:1}),t(p,{label:"目标工位"},{default:n(()=>[t(d,{modelValue:f.value,"onUpdate:modelValue":l[1]||(l[1]=o=>f.value=o),placeholder:"可选,如 DOCK-A",clearable:"",style:{width:"180px"}},null,8,["modelValue"])]),_:1}),t(p,null,{default:n(()=>[t(c,{type:"primary",loading:w.value,onClick:z},{default:n(()=>[...l[3]||(l[3]=[b("查询备料台账",-1)])]),_:1},8,["loading"])]),_:1})]),_:1})]),_:1}),V.value?(m(),$(C,{key:0,shadow:"never"},{header:n(()=>[b(" 台账明细(共 "+h(_.value.length)+" 行,待补 "+h(F.value.length)+" 行) ",1)]),default:n(()=>[R((m(),$(S,{data:_.value,border:""},{default:n(()=>[t(s,{prop:"orderNo",label:"工单号","min-width":"140"}),t(s,{prop:"materialCode",label:"物料编码","min-width":"150"}),t(s,{prop:"materialName",label:"物料名称","min-width":"140"},{default:n(({row:o})=>[b(h(o.materialName||"-"),1)]),_:1}),t(s,{prop:"totalQty",label:"需求总量",width:"100",align:"center"}),t(s,{prop:"outQty",label:"已出库",width:"90",align:"center"}),t(s,{label:"缺口",width:"90",align:"center"},{default:n(({row:o})=>[D("span",{class:U({gap:q(o)>0})},h(q(o)),3)]),_:1}),t(s,{label:"状态",width:"110",align:"center"},{default:n(({row:o})=>[t(g,{type:A(o.status),size:"small"},{default:n(()=>[b(h(o.status),1)]),_:2},1032,["type"])]),_:1}),t(s,{label:"操作",width:"140",align:"center"},{default:n(({row:o})=>[o.status!=="领料完结"?(m(),$(c,{key:0,type:"primary",size:"small",onClick:te=>Q(o)},{default:n(()=>[...l[4]||(l[4]=[b("一键分配出库",-1)])]),_:1},8,["onClick"])):(m(),M("span",X,"已完结"))]),_:1})]),_:1},8,["data"])),[[r,w.value]])]),_:1})):(m(),$(a,{key:1,description:"请先按工单号查询备料台账"}))]),t(W,{data:O(L)},null,8,["data"])],64)}}},ne=E(Y,[["__scopeId","data-v-3f1b75c7"]]);export{ne as default};
@@ -1 +0,0 @@
.mb12[data-v-3f1b75c7]{margin-bottom:12px}.gap[data-v-3f1b75c7]{color:#f56c6c;font-weight:700}
@@ -1 +0,0 @@
.mb12[data-v-cd5c496f]{margin-bottom:12px}.mt12[data-v-cd5c496f]{margin-top:12px}.pager[data-v-cd5c496f]{display:flex;justify-content:flex-end;margin-top:10px}
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
.pager[data-v-4b96cb2e]{display:flex;justify-content:flex-end;margin-top:10px}
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
.mb12[data-v-bb344ff6]{margin-bottom:12px}.mt12[data-v-bb344ff6]{margin-top:12px}.tip[data-v-bb344ff6]{margin-left:10px;color:#909399;font-size:12px}.bad[data-v-bb344ff6]{color:#f56c6c;font-weight:700}
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
function u(e){if(!e)return"-";const t=new Date(typeof e=="number"?e*1e3:e);if(Number.isNaN(t.getTime()))return String(e);const n=r=>String(r).padStart(2,"0");return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}:${n(t.getSeconds())}`}function i(e){const t=Number(e);return Number.isNaN(t)?e??"-":t.toLocaleString("zh-CN")}function s(e){if(!e)return"-";const t=String(e);return/^\d+$/.test(t)?u(Number(t)).slice(0,10):t.slice(0,10)}export{s as a,u as b,i as f};
@@ -1,23 +0,0 @@
import{_ as k,o,c as i,a as f,w as m,f as n,d as e,t,l as r,F as v,k as S,G as y,r as c,h as M}from"./index-C_gZ2k2u.js";const E={class:"page-help"},x={class:"ph-inner"},C={class:"ph-banner"},Z={class:"ph-banner-title"},O={key:0,class:"ph-overview"},V={key:1,class:"ph-section"},T={class:"ph-fname"},B={class:"ph-fsource"},F={class:"ph-fpurpose"},I={class:"ph-ffill"},D={key:0,class:"ph-sec-title"},W={key:1,class:"ph-sec-overview"},H={class:"ph-fname"},P={class:"ph-fsource"},A={class:"ph-fpurpose"},G={class:"ph-ffill"},K={__name:"PageHelp",props:{data:{type:Object,default:()=>({title:"操作说明",overview:"",fields:[]})}},setup(s){const u=M(!1);function h(){u.value=!0}return(z,a)=>{const N=c("el-button"),w=c("el-tooltip"),_=c("el-empty"),g=c("el-drawer");return o(),i("div",E,[f(w,{content:"本页操作说明",placement:"left"},{default:m(()=>[f(N,{class:"help-fab",circle:"",onClick:h},{default:m(()=>[...a[1]||(a[1]=[n("?",-1)])]),_:1})]),_:1}),f(g,{modelValue:u.value,"onUpdate:modelValue":a[0]||(a[0]=l=>u.value=l),title:s.data.title||"操作说明",size:"520px","append-to-body":"",class:"ph-drawer"},{default:m(()=>[e("div",x,[e("div",C,[e("div",Z,t(s.data.title||"操作说明"),1),a[2]||(a[2]=e("div",{class:"ph-banner-sub"},"页面整体说明",-1))]),s.data.overview?(o(),i("div",O,t(s.data.overview),1)):r("",!0),a[3]||(a[3]=e("div",{class:"ph-legend"},[e("span",{class:"lg"},[e("i",{class:"ic lg-source"}),n("来源:这个字段从哪来、谁填")]),e("span",{class:"lg"},[e("i",{class:"ic lg-purpose"}),n("用途:它起什么作用")]),e("span",{class:"lg"},[e("i",{class:"ic lg-fill"}),n("怎么填:具体填什么")])],-1)),s.data.fields&&s.data.fields.length?(o(),i("div",V,[(o(!0),i(v,null,S(s.data.fields,(l,d)=>(o(),i("div",{class:"ph-field",key:"top"+d},[e("div",T,[n(t(l.name)+" ",1),e("span",B,t(l.source),1)]),e("div",F,t(l.purpose),1),e("div",I,"👉 "+t(l.fill),1)]))),128))])):r("",!0),s.data.sections&&s.data.sections.length?(o(!0),i(v,{key:2},S(s.data.sections,(l,d)=>(o(),i("div",{key:d,class:"ph-section"},[l.title?(o(),i("div",D,t(l.title),1)):r("",!0),l.overview?(o(),i("div",W,t(l.overview),1)):r("",!0),(o(!0),i(v,null,S(l.fields,(p,b)=>(o(),i("div",{class:"ph-field",key:b},[e("div",H,[n(t(p.name)+" ",1),e("span",P,t(p.source),1)]),e("div",A,t(p.purpose),1),e("div",G,"👉 "+t(p.fill),1)]))),128))]))),128)):r("",!0),!s.data.fields&&!(s.data.sections&&s.data.sections.length)?(o(),y(_,{key:3,description:"暂无说明","image-size":70})):r("",!0)])]),_:1},8,["modelValue","title"])])}}},R=k(K,[["__scopeId","data-v-e02e7155"]]),j={title:"入库(来料入账)",overview:`把到货的来料记入 WMS 库存。按物料类型分两种入库方式:
· 结构件(螺丝/机加工件) → 按【批次】入库,一批多件;
· 精密件(芯片/器件) → 按【SN 序列号】逐件扫码,可单件追溯。
物料类型由 WMS 的"物料档案"决定(精密件/结构件),入库方式随之自动给出。
入库是整个库存链路的第一环:入库(Held) → 质量检验(合格Z02) → 之后才能被出库锁定。`,sections:[{title:"Tab1 结构件入库(按批次)",overview:"适用于螺丝、机加工件等标准件,一次到货入一批。",fields:[{name:"物料",source:'下拉选择。数据来自 WMS"物料档案"里类型为"结构件"的物料。',purpose:"入库的是什么物料;档案里必须存在才能选到",fill:"选择物料编码,如 SCREW-M3;选不到=还没建该物料档案"},{name:"批次号",source:"留空系统自动生成(日期+序号);也可手工填。",purpose:"区别不同到货批次,实现先进先出(FIFO)",fill:"默认留空自动生成;供应商自带批号时可手填"},{name:"数量",source:"手工填写整数。",purpose:"本批到货数量",fill:"整数 ≥1"},{name:"区域",source:"下拉选择。数据来自库区字典。",purpose:"放到哪个库区(待检/合格/不合格…)",fill:'新到货一般先放"待检"区,检验合格后再转"合格"区(Z02)'},{name:"生产日期",source:"手动选择日期。",purpose:"生产时间,用于时效和批次管理",fill:"选择日期"},{name:"供应商",source:"手工填写。",purpose:"来料来源",fill:"供应商名称,可空"}]},{title:"Tab2 精密件 SN 入库(逐件)",overview:"适用于芯片、器件等需要单件追溯的来料,一件一个 SN。",fields:[{name:"物料",source:'下拉选择。来自"物料档案"类型为"精密件"的物料。',purpose:"入库的精密件物料",fill:"选择物料编码"},{name:"区域",source:"下拉选择。来自库区字典。",purpose:"放到哪个库区",fill:"可选,空则默认待检区"},{name:"扫码录入",source:"扫码枪连续扫码。来自每颗器件自带的 SN 条码。",purpose:"逐件登记 SN,实现单件追溯",fill:"扫入/粘贴 SN 后回车追加,可一次连续多条"}]},{title:"Tab3 Excel 批量导入",overview:"用于大批量结构件入库。列头顺序(首行忽略):物料编码 | 批次号(空自动生成) | 数量 | 生产日期 | 供应商 | 区域。",fields:[{name:"文件",source:"选择本地 .xlsx 文件。",purpose:"批量导入的物料清单",fill:"按列头顺序准备好 Excel,选择上传"}]}]},U={title:"出库(按工单领料)",overview:`仓库按工单台账为生产备料出库。系统强约束:单物料累计出库 ≤ 工单需求总量,超发走补料流程。
可一次出完,也可分多次、分批由 AGV 配送到各 DOCK(配送节奏由仓库决定)。
前置条件:必须先有"工单物料台账"(GOMES 工单+物料清单导入),且该物料在【合格区Z02】有足够库存。`,fields:[{name:"工单号",source:"手动输入。数据来自 MES 已建的工单及导入的物料台账。",purpose:"出库挂靠的工单,决定可领料总量与需求缺口",fill:"输入工单号回车,查询该工单的物料台账"},{name:"操作人",source:"登录账号自动带出。",purpose:"本次出库执行人,追溯用",fill:"自动,无需填"},{name:"目标工位",source:"手动填写。",purpose:"本次配送送达的接驳台/DOCK",fill:"如 DOCK-A,可空"},{name:"一键分配出库",source:"系统自动按 FIFO 分配。数据来自合格区Z02的批次库存。",purpose:"从合格区按先进先出凑够缺口并出库",fill:"点按钮,系统自动算批次并二次确认"}]},q={title:"库存查询",overview:`查看当前库存:结构件按批次台账(数量/锁定/区域),精密件按 SN 序列号(状态/区域)。
数据由入库、出库、盘点等业务实时维护,本页只读查询。`,fields:[{name:"物料编码",source:"筛选条件。",purpose:"只看某物料",fill:"输入编码,可空=全部"},{name:"库存类型",source:"单选。",purpose:"看批次台账还是 SN 序列",fill:"全部 / 批次 / SN 序列"},{name:"关键字",source:"筛选条件。",purpose:"按批次号/物料名称/SN 模糊过滤",fill:"输入关键字,可空"}]},J={title:"质量检验(来料检)",overview:`对入库的未检物料/SN 做检验:把"未检"翻转为【合格】或【不合格】。
合格后才能被出库锁定(出库自动分配只取合格区Z02)。
数据链路:入库(状态=未检) → 本页检验翻转 → 合格Z02 / 不合格隔离。`,fields:[{name:"目标类型",source:"单选。",purpose:"检验对象是批次还是 SN",fill:"批次 BATCH / 序列号 SN"},{name:"检验结论",source:"单选。",purpose:"判定结果",fill:"合格 / 不合格"},{name:"检验员",source:"手动填写(默认当前用户)。",purpose:"谁检验的,追溯用",fill:"检验员姓名"},{name:"扫码输入",source:"扫码枪。来自批次号/SN条码。",purpose:"单个待检目标编号",fill:"扫批次号或 SN,回车提交"},{name:"批量编号",source:"扫码枪连续录入。",purpose:"一次性翻转多个目标的检验状态",fill:"每行一个编号"}]},Q={title:"盘点(库存核对)",overview:`核对账面与实际库存,支持扫码快速盘点,完成时按差异修正库存。
流程:发起盘点(冻结快照) → 扫码录入实盘数(入库) → 完成并生成差异(可选:差异写回库存)。`,fields:[{name:"操作人",source:"登录账号自动带出。",purpose:"发起盘点人",fill:"自动"},{name:"发起盘点",source:"按钮操作。",purpose:"冻结当前库存快照,生成盘点单",fill:"点按钮发起"},{name:"差异写回库存",source:"开关。",purpose:"完成后是否用实盘差异修正账面库存",fill:"开=写回;关=仅记录差异"},{name:"目标编号",source:"扫码枪。来自批次号/SN条码。",purpose:"要盘点的批次号或 SN",fill:"扫批次号/SN,回车提交"},{name:"实盘数量",source:"扫码/手输。",purpose:"实际数到数量",fill:"非负整数;0=盘亏为零"}]},X={title:"包装绑定(箱号 ↔ SN",overview:`把若干精密件 SN 绑定到一个箱号,形成包装箱,用于发货/入库整箱追溯。
数据链路:拣选出的 SN → 绑到箱号 → 一个箱号代表一箱货。`,fields:[{name:"箱号",source:"扫码/手输。",purpose:"包装箱唯一号",fill:"扫描或手输箱号"},{name:"物料",source:"下拉选择(可空)。来自物料档案。",purpose:"箱内物料类型",fill:"可选"},{name:"操作人",source:"登录账号自动带出。",purpose:"绑定人",fill:"自动"},{name:"SN 录入",source:"扫码枪连续扫码。来自器件 SN 条码。",purpose:"装箱的 SN 清单",fill:"扫入 SN 回车追加"}]},Y={title:"半成品/成品(流转)",overview:`产线工位"暂存/退回"的半成品或完工成品可在此入库(记录已完成工序),需要时再出库(重上线),MES 从下一工序继续。
半成品生命周期:工位暂存退库 → 本页入库(记已完成工序) → 需要时本页出库→ MES 下发下一工序 → 工位继续装配。`,sections:[{title:"半成品/成品入库",overview:"把产线退回的半成品或成品收进库房。",fields:[{name:"物料",source:"下拉选择。来自物料档案。",purpose:"入库物料",fill:"选择物料编码"},{name:"已完成工序",source:'自动带出/手工填写。数据来自工位终端的"已完成工序"上报。',purpose:"该件做到第几道工序,重上线时 MES 从这里继续",fill:"如 135,可空"},{name:"工单号",source:"自动带出/手工填写。来自工单。",purpose:"来源工单",fill:"输入工单号"},{name:"区域",source:"手动填写(可空)。",purpose:"存放库区",fill:"如 Z05"},{name:"扫码录入",source:"扫码枪连续扫码。来自工件 SN 条码。",purpose:"半成品 SN 清单",fill:"扫入 SN 回车追加"}]},{title:"半成品出库(重上线)",overview:"把半成品重新送上线,MES 会从记录的下一个工序继续。",fields:[{name:"SN",source:"扫码枪/手输。来自工件 SN 条码。",purpose:"要重上线的半成品 SN",fill:"扫描或输入 SN,回车出库"}]}]},$={title:"工单物料台账",overview:`实时展示每个物料:需求总量、累计已出库、剩余缺口。
系统强约束累计出库 ≤ 需求总量,达到即"领料完结"。
数据链路:MES 工单+物料清单 → 导入本台账 → 出库时自动扣减累计,形成缺口/完结。`,fields:[{name:"工单号",source:"手动输入。来自 MES 工单。",purpose:"查看哪个工单的领料台账",fill:"输入工单号查询"}]},ee={title:"基础数据(区域 / 物料档案)",overview:`维护库房系统的基础字典,供入库/出库/库存等所有业务下拉框选择。
· 区域:货品存放的库区(如待检、合格Z02、不合格…);入库时要指明放到哪个区。
· 物料档案:定义每一种物料叫什么、什么规格、是【结构件(批次)】还是【精密件(SN)】,决定后续入库方式。
这两个字典是库房的第一道地基:先建好区域和物料,入库、检验、出库才能正常跑到数据。`,sections:[{title:"Tab1 区域维护",overview:'新增库区字典,供入库/半成品等页面的"区域"下拉使用。',fields:[{name:"区域编码",source:"手工填写,仓库自定义。",purpose:"库区唯一编号,入库/出库定位存放位置",fill:"如 Z02、Z05,建议字母+数字,唯一"},{name:"区域名称",source:"手工填写。",purpose:"库区中文名,便于识别",fill:"如 合格区、待检区、不合格区"},{name:"说明",source:"手工填写(可空)。",purpose:"补充描述",fill:"可空"}]},{title:"Tab2 物料档案",overview:'定义物料字典。此处维护的物料会出现在入库/出库等页面的"物料"下拉中;此处选"结构件/精密件"直接决定入库走批次还是 SN。',fields:[{name:"物料编码",source:"手工填写,仓库自定义(新增后不可改)。",purpose:"物料唯一编号",fill:"如 SCREW-M3;新增后不可改编码"},{name:"名称",source:"手工填写。",purpose:"物料名称",fill:"如 螺丝 M3"},{name:"简称",source:"手工填写(可空)。",purpose:"简写",fill:"可空"},{name:"规格",source:"手工填写(可空)。",purpose:"规格型号",fill:"可空"},{name:"单位",source:"手工填写。",purpose:"计量单位",fill:"如 个/套"},{name:"类型",source:"选择。语义由库房定:结构件按批次管理,精密件按 SN 逐件管理。",purpose:"决定入库方式:结构件走批次、精密件走 SN",fill:"结构件(批次) / 精密件(SN)"},{name:"物料类型",source:"选择(可空)。",purpose:"业务归类",fill:"标准件/电子件/包装件/半成品/成品"}]}]};export{R as P,U as a,q as b,J as c,Q as d,Y as e,X as f,$ as g,j as h,ee as i};
@@ -1 +0,0 @@
.page-help[data-v-e02e7155]{position:fixed;left:18px;bottom:18px;z-index:2050}.help-fab[data-v-e02e7155]{width:42px;height:42px;background:#1668dc;color:#fff;font-weight:700;font-size:20px;box-shadow:0 3px 10px #16324f4d;transition:transform .15s}.help-fab[data-v-e02e7155]:hover{background:#0e57c3;transform:scale(1.06)}.ph-inner[data-v-e02e7155]{padding:0 6px 24px}.ph-banner[data-v-e02e7155]{background:linear-gradient(120deg,#1668dc,#3a98f0);color:#fff;border-radius:10px;padding:16px 18px;margin-bottom:16px}.ph-banner-title[data-v-e02e7155]{font-size:20px;font-weight:700}.ph-banner-sub[data-v-e02e7155]{font-size:12px;opacity:.85;margin-top:4px}.ph-overview[data-v-e02e7155]{color:#3f536e;line-height:1.8;font-size:14px;margin-bottom:16px;background:#f4f7fb;border:1px solid #e4ecf5;border-radius:8px;padding:12px 14px;white-space:pre-line}.ph-legend[data-v-e02e7155]{display:flex;flex-wrap:wrap;gap:12px 16px;margin-bottom:16px;padding:10px 14px;background:#fafbfc;border:1px dashed #d9e0e8;border-radius:8px;font-size:12px;color:#6b7785}.ph-legend .lg[data-v-e02e7155]{display:inline-flex;align-items:center;gap:6px}.ph-legend .ic[data-v-e02e7155]{display:inline-block;width:10px;height:10px;border-radius:3px}.lg-source[data-v-e02e7155]{background:#8fa5f5}.lg-purpose[data-v-e02e7155]{background:#22b07d}.lg-fill[data-v-e02e7155]{background:#f5a623}.ph-section[data-v-e02e7155]{margin-bottom:18px}.ph-sec-title[data-v-e02e7155]{font-size:15px;font-weight:700;color:#1b2a3a;margin:0 0 4px;padding-left:10px;border-left:4px solid #1668dc;line-height:1.4}.ph-sec-overview[data-v-e02e7155]{color:#7a8694;font-size:13px;margin:4px 0 10px;line-height:1.7}.ph-field[data-v-e02e7155]{background:#fff;border:1px solid #eef1f6;border-radius:8px;padding:10px 14px;margin-bottom:8px}.ph-fname[data-v-e02e7155]{display:flex;align-items:center;gap:8px;font-weight:700;color:#1b2a3a;font-size:14px}.ph-fsource[data-v-e02e7155]{font-weight:400;font-size:11px;color:#1668dc;background:#e8f1ff;border-radius:4px;padding:1px 8px}.ph-fpurpose[data-v-e02e7155]{color:#22b07d;font-size:13px;line-height:1.6;margin-top:6px}.ph-fpurpose[data-v-e02e7155]:before{content:"用途:";font-weight:600;color:#1b8d63}.ph-ffill[data-v-e02e7155]{color:#8a5b00;font-size:13px;line-height:1.6;margin-top:4px}.ph-ffill[data-v-e02e7155]:before{content:"怎么填:";font-weight:600;color:#8a5b00}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long