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