feat: 五项目业务实现并对接完成

- MES(B): 工单/BOM/备料/工序字典/PLC下发/拧紧/扫码报工/半成品/AGV/追溯逻辑,WMS与海康RCS客户端,看板Redis缓存API(概览/设备/进度/报警/趋势)+SSE
- WMS(C): JWT滑动续签、Excel导入、盘点、内部API、种子数据、独立Postgres配置
- WMS客户端(E): Go网关8891反向代理+内嵌Vue3十页
- 工位终端(D): SQLite本地缓存+模拟拧紧源+内嵌Vue3页面
- Dashboard(A): 看板数据改接MES内部缓存API,SSE实时刷新+vite代理
- 清理各项目球形磨遗留代码,新增部署手册.md
This commit is contained in:
SunYF
2026-08-27 19:50:57 +08:00
parent c85c3bd6f1
commit a2afd2f6dc
335 changed files with 87495 additions and 7357 deletions
@@ -0,0 +1 @@
.kpi-label[data-v-4c5428a8]{color:#909399;font-size:13px}.kpi-value[data-v-4c5428a8]{font-size:26px;font-weight:700;margin-top:4px;color:#303133}.entries[data-v-4c5428a8]{display:flex;flex-wrap:wrap;gap:10px}
@@ -0,0 +1 @@
import{_ as x,i as C,c as s,a as t,w as a,r as o,h as u,u as B,o as l,F as _,k as p,d as n,t as c,p as k,q as D,v as N,x as S,y as I,z as T,A as V,B as q,C as z,D as F,G as Q,f as A}from"./index-VJa6cW1h.js";import{r as E}from"./request-43HjEGU6.js";import{f as G}from"./format-C9Ok6skr.js";const L={class:"kpi-label"},M={class:"kpi-value"},R={class:"entries"},$={__name:"Dashboard",setup(j){const f=B(),i=u({}),r=u(!1);async function h(){i.value=await E.get("/display/overview"),r.value=!0}C(h);const m=[{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:"今日出库单"}],y=[{path:"/inbound",title:"入库管理",icon:D},{path:"/outbound",title:"备料出库",icon:N},{path:"/inventory",title:"库存查询",icon:S},{path:"/inspection",title:"质量检验",icon:I},{path:"/stocktake",title:"库存盘点",icon:T},{path:"/package",title:"包装绑定",icon:V},{path:"/ledger",title:"物料台账",icon:q},{path:"/display",title:"免登录大屏",icon:z}];return(H,J)=>{const d=o("el-card"),v=o("el-col"),b=o("el-row"),g=o("el-icon"),w=o("el-button");return l(),s("div",null,[t(b,{gutter:12},{default:a(()=>[(l(),s(_,null,p(m,e=>t(v,{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?k(G)(i.value[e.key]):"—"),1)]),_:2},1024)]),_:2},1024)),64))]),_:1}),t(d,{shadow:"never",header:"快捷入口"},{default:a(()=>[n("div",R,[(l(),s(_,null,p(y,e=>t(w,{key:e.path,size:"large",onClick:K=>k(f).push(e.path)},{default:a(()=>[t(g,{style:{"margin-right":"6px"}},{default:a(()=>[(l(),F(Q(e.icon)))]),_:2},1024),A(c(e.title),1)]),_:2},1032,["onClick"])),64))])]),_:1})])}}},W=x($,[["__scopeId","data-v-4c5428a8"]]);export{W as default};
@@ -0,0 +1 @@
.screen[data-v-92c557d6]{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-92c557d6]{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-92c557d6]{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-92c557d6]{font-size:13px;color:#7fb8ff}.right[data-v-92c557d6]{text-align:right}.date[data-v-92c557d6]{margin-right:12px}.time[data-v-92c557d6]{font-size:22px;font-weight:700;color:#4fd7ff;margin-right:8px;font-variant-numeric:tabular-nums}.kpi-grid[data-v-92c557d6]{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:14px;padding:22px 36px 6px}.kpi[data-v-92c557d6]{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-92c557d6]{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-92c557d6]{margin-top:6px;font-size:14px;color:#9cc7ff;letter-spacing:2px}.zones[data-v-92c557d6]{flex:1;padding:16px 36px 8px;overflow:auto}.zone-title[data-v-92c557d6]{font-size:16px;letter-spacing:3px;color:#bfe0ff;border-left:4px solid #409eff;padding-left:10px;margin-bottom:12px}.zone-row[data-v-92c557d6]{display:flex;align-items:center;gap:12px;padding:7px 0;border-bottom:1px dashed rgba(64,158,255,.15)}.zone-name[data-v-92c557d6]{width:200px;text-align:right;color:#cfe6ff;font-size:14px}.bar-wrap[data-v-92c557d6]{flex:1;height:16px;background:#13386e99;border-radius:9px;overflow:hidden}.bar[data-v-92c557d6]{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-92c557d6]{width:90px;color:#61e6ff;font-weight:700;font-variant-numeric:tabular-nums}.empty[data-v-92c557d6]{color:#5f86b8;padding:30px 0;text-align:center}.foot[data-v-92c557d6]{padding:12px 36px 16px;text-align:center;color:#47709f;font-size:12px}
@@ -0,0 +1 @@
import{r as w}from"./request-43HjEGU6.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-VJa6cW1h.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-92c557d6"]]);export{A as default};
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
.dropzone[data-v-dbe6c848]{padding:30px 0;color:#606266}
@@ -0,0 +1 @@
import{_ as $,h as s,I as A,i as H,N as C,D as R,w as l,r as n,o as D,a as t,f as u,e as E,d as K,t as M,E as p}from"./index-VJa6cW1h.js";import{r as N}from"./request-43HjEGU6.js";const q={class:"tip"},j={__name:"Inspection",setup(z){const i=s("BATCH"),f=s("合格"),d=s(A()),_=s(),v=s(""),g=s(!1);H(()=>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 N.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 S(){return[...new Set(String(m.value).split(/\s+/).map(a=>a.trim()).filter(Boolean))]}async function k(){const a=S();if(!a.length){p.warning("请录入待检编号(每行一个)");return}if(!d.value.trim()){p.warning("请填写检验员");return}c.value=!0;try{const e=await N.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"),I=n("el-form"),U=n("el-card");return D(),R(U,{shadow:"never",style:{"max-width":"760px",margin:"0 auto"}},{default:l(()=>[t(I,{"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:E(V,["enter"])},null,8,["modelValue"]),K("span",q,"当前目标:"+M(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:k},{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})}}},J=$(j,[["__scopeId","data-v-43efd0b5"]]);export{J as default};
@@ -0,0 +1 @@
.tip[data-v-43efd0b5]{margin-left:10px;color:#909399;font-size:12px}
@@ -0,0 +1 @@
.mb12[data-v-bb2aae60]{margin-bottom:12px}.pager[data-v-bb2aae60]{display:flex;justify-content:flex-end}
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
import{_ as K,c as S,a as e,w as a,D as g,r as o,h as u,J as L,o as _,H as M,e as T,f as c,K as E,t as p,d as H,g as I}from"./index-VJa6cW1h.js";import{r as J}from"./request-43HjEGU6.js";const O={class:"pager"},U={__name:"Ledger",setup(j){const i=u(""),d=u(!1),v=u(!1),y=u([]),m=u(0),r=I({current:1,size:20});function x(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 J.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 N(t){return t==="领料完结"?"success":t==="进行中"?"primary":"info"}return(t,s)=>{const k=o("el-input"),h=o("el-form-item"),z=o("el-button"),C=o("el-form"),w=o("el-card"),n=o("el-table-column"),V=o("el-tag"),B=o("el-table"),D=o("el-pagination"),Q=o("el-empty"),q=L("loading");return _(),S("div",null,[e(w,{shadow:"never",class:"mb12"},{default:a(()=>[e(C,{inline:"",onSubmit:M(f,["prevent"])},{default:a(()=>[e(h,{label:"工单号"},{default:a(()=>[e(k,{modelValue:i.value,"onUpdate:modelValue":s[0]||(s[0]=l=>i.value=l),placeholder:"输入工单号查询物料台账",clearable:"",autofocus:"",style:{width:"280px"},onKeyup:T(f,["enter"])},null,8,["modelValue"])]),_:1}),e(h,null,{default:a(()=>[e(z,{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(()=>[E((_(),g(B,{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(x(l)),1)]),_:1}),e(n,{label:"状态",width:"110",align:"center"},{default:a(({row:l})=>[e(V,{type:N(l.status),size:"small"},{default:a(()=>[c(p(l.status),1)]),_:2},1032,["type"])]),_:1})]),_:1},8,["data"])),[[q,d.value]]),H("div",O,[e(D,{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:"请输入工单号查询"}))])}}},G=K(U,[["__scopeId","data-v-5eda71fb"]]);export{G as default};
@@ -0,0 +1 @@
.mb12[data-v-5eda71fb]{margin-bottom:12px}.pager[data-v-5eda71fb]{display:flex;justify-content:flex-end;margin-top:10px}
@@ -0,0 +1 @@
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-VJa6cW1h.js";import{r as N}from"./request-43HjEGU6.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-371b5b41"]]);export{I as default};
@@ -0,0 +1 @@
.login-page[data-v-371b5b41]{height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#1c3faa,#0a1330)}.card[data-v-371b5b41]{width:380px}.head[data-v-371b5b41]{text-align:center;margin-bottom:14px}.head h2[data-v-371b5b41]{margin:0 0 6px}.head p[data-v-371b5b41]{margin:0;color:#909399;font-size:13px}.btn[data-v-371b5b41]{width:100%;margin-top:4px}
@@ -0,0 +1,7 @@
import{_ as Q,I as E,c as B,a as t,w as n,D as C,r as i,h as $,J as K,o as m,H as T,e as F,p as I,f as y,K as Z,t as g,d as j,L as A,E as h,g as R,M as U,m as H}from"./index-VJa6cW1h.js";import{r as z}from"./request-43HjEGU6.js";const J={key:1,style:{color:"#67c23a"}},L={__name:"Outbound",setup(G){const v=R({orderNo:""}),k=E(),f=$(""),N=$(!1),S=$(!1),_=$([]),D=H(()=>_.value.filter(e=>e.status!=="领料完结"));function x(e){return Math.max((e.totalQty||0)-(e.outQty||0),0)}async function q(){if(!v.orderNo.trim()){h.warning("请输入工单号");return}N.value=!0;try{const e=await z.get("/ledger/query",{params:{orderNo:v.orderNo.trim(),page:1,pageSize:100}});_.value=(e==null?void 0:e.list)||[],S.value=!0,_.value.length||h.info("该工单暂无台账记录")}finally{N.value=!1}}async function M(e){const l=x(e);if(l<=0)return;const d=await z.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){h.warning(`物料 ${e.materialCode} 在合格区(Z02)无可用批次库存`);return}if(u>0){h.error(`可用量不足:缺口 ${l}Z02 仅可凑 ${l-u},还差 ${u}`);return}const w=c.map(a=>`· 批次 ${a.batchNo} 出库 ${a.qty}`).join(`
`);await U.confirm(`工单 ${e.orderNo} 物料 ${e.materialCode}
缺口 ${l},按 FIFO 分配如下:
${w}
操作人:${k}${f.value?`
目标口:${f.value}`:""}`,"确认自动分配出库",{type:"warning",confirmButtonText:"确认出库",cancelButtonText:"取消"});const s=[];let b="";for(const a of c){const r=await z.post("/outbound/create",{orderNo:e.orderNo,materialCode:e.materialCode,batchNo:a.batchNo,qty:a.qty,operator:k,targetDock:f.value.trim()||void 0});r!=null&&r.outboundNo&&s.push(r.outboundNo),b=(r==null?void 0:r.status)||b}const V=b==="领料完结";h.success(`出库完成:出库单号 ${s.join("、")};该物料${V?"已":"未"}领料完结`),await q()}function O(e){return e==="领料完结"?"success":e==="进行中"?"primary":"info"}return(e,l)=>{const d=i("el-input"),p=i("el-form-item"),c=i("el-button"),u=i("el-form"),w=i("el-card"),s=i("el-table-column"),b=i("el-tag"),V=i("el-table"),a=i("el-empty"),r=K("loading");return m(),B("div",null,[t(w,{shadow:"never",class:"mb12"},{default:n(()=>[t(u,{inline:"","label-width":"90px",onSubmit:l[2]||(l[2]=T(()=>{},["prevent"]))},{default:n(()=>[t(p,{label:"工单号"},{default:n(()=>[t(d,{modelValue:v.orderNo,"onUpdate:modelValue":l[0]||(l[0]=o=>v.orderNo=o),placeholder:"输入工单号回车查询",clearable:"",autofocus:"",style:{width:"260px"},onKeyup:F(q,["enter"])},null,8,["modelValue"])]),_:1}),t(p,{label:"操作人"},{default:n(()=>[t(d,{"model-value":I(k),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:N.value,onClick:q},{default:n(()=>[...l[3]||(l[3]=[y("查询台账",-1)])]),_:1},8,["loading"])]),_:1})]),_:1})]),_:1}),S.value?(m(),C(w,{key:0,shadow:"never"},{header:n(()=>[y(" 台账明细(共 "+g(_.value.length)+" 行,待补 "+g(D.value.length)+" 行) ",1)]),default:n(()=>[Z((m(),C(V,{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})=>[y(g(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})=>[j("span",{class:A({gap:x(o)>0})},g(x(o)),3)]),_:1}),t(s,{label:"状态",width:"110",align:"center"},{default:n(({row:o})=>[t(b,{type:O(o.status),size:"small"},{default:n(()=>[y(g(o.status),1)]),_:2},1032,["type"])]),_:1}),t(s,{label:"操作",width:"140",align:"center"},{default:n(({row:o})=>[o.status!=="领料完结"?(m(),C(c,{key:0,type:"primary",size:"small",onClick:P=>M(o)},{default:n(()=>[...l[4]||(l[4]=[y("一键分配出库",-1)])]),_:1},8,["onClick"])):(m(),B("span",J,"已完结"))]),_:1})]),_:1},8,["data"])),[[r,N.value]])]),_:1})):(m(),C(a,{key:1,description:"请先按工单号查询物料台账"}))])}}},Y=Q(L,[["__scopeId","data-v-45b686a5"]]);export{Y as default};
@@ -0,0 +1 @@
.mb12[data-v-45b686a5]{margin-bottom:12px}.gap[data-v-45b686a5]{color:#f56c6c;font-weight:700}
@@ -0,0 +1 @@
.mb12[data-v-54bf0b78]{margin-bottom:12px}.mt12[data-v-54bf0b78]{margin-top:12px}.pager[data-v-54bf0b78]{display:flex;justify-content:flex-end;margin-top:10px}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
.mb12[data-v-7156950b]{margin-bottom:12px}.mt12[data-v-7156950b]{margin-top:12px}.tip[data-v-7156950b]{margin-left:10px;color:#909399;font-size:12px}.bad[data-v-7156950b]{color:#f56c6c;font-weight:700}
@@ -0,0 +1 @@
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};
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
+13
View File
@@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>北自所库房客户端</title>
<script type="module" crossorigin src="/assets/index-VJa6cW1h.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-CCWXL7WO.css">
</head>
<body>
<div id="app"></div>
</body>
</html>