|
|
|
@ -1,412 +1,419 @@ |
|
|
|
<template> |
|
|
|
<div class="production-inbound-pda"> |
|
|
|
<van-nav-bar title="生产入库" left-arrow @click-left="$router.back()" /> |
|
|
|
|
|
|
|
<!-- 功能选择 --> |
|
|
|
<div class="function-selector" v-if="!selectedFunction"> |
|
|
|
<div class="function-card" @click="selectFunction('package')"> |
|
|
|
<div class="function-icon">📦</div> |
|
|
|
<div class="function-title">包装创建</div> |
|
|
|
<div class="function-desc">扫描通知单,创建生产入库包装</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<div class="function-card" @click="selectFunction('pallet')"> |
|
|
|
<div class="function-icon">🏗️</div> |
|
|
|
<div class="function-title">装托盘</div> |
|
|
|
<div class="function-desc">扫描包装,装载到托盘</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<div class="function-card" @click="selectFunction('register')"> |
|
|
|
<div class="function-icon">📋</div> |
|
|
|
<div class="function-title">入库登记</div> |
|
|
|
<div class="function-desc">扫描包装,完成入库登记</div> |
|
|
|
<div> |
|
|
|
<div class="pda-container"> |
|
|
|
<div class="status-bar"> |
|
|
|
<div class="goBack" @click="$router.back()"><i class="el-icon-arrow-left"></i>上一页</div> |
|
|
|
<div class="goBack">生产入库</div> |
|
|
|
<div class="network" style="color: #fff" @click="$router.push({ path: '/' })">🏠首页</div> |
|
|
|
</div> |
|
|
|
<div style="overflow-y: auto"> |
|
|
|
<!-- 功能选择 --> |
|
|
|
<div class="function-selector" v-if="!selectedFunction"> |
|
|
|
<div class="function-card" @click="selectFunction('package')"> |
|
|
|
<div class="function-icon">📦</div> |
|
|
|
<div class="function-title">包装创建</div> |
|
|
|
<div class="function-desc">扫描通知单,创建生产入库包装</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<div class="function-card" @click="selectFunction('return')"> |
|
|
|
<div class="function-icon">↩️</div> |
|
|
|
<div class="function-title">退库操作</div> |
|
|
|
<div class="function-desc">扫描单元,执行退库操作</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<div class="function-card" @click="selectFunction('pallet')"> |
|
|
|
<div class="function-icon">🏗️</div> |
|
|
|
<div class="function-title">装托盘</div> |
|
|
|
<div class="function-desc">扫描包装,装载到托盘</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 包装创建 --> |
|
|
|
<div class="package-create" v-if="selectedFunction === 'package'"> |
|
|
|
<div class="pda-header"> |
|
|
|
<button class="back-btn" @click="goBack">← 返回</button> |
|
|
|
<h2>包装创建</h2> |
|
|
|
</div> |
|
|
|
<div class="function-card" @click="selectFunction('register')"> |
|
|
|
<div class="function-icon">📋</div> |
|
|
|
<div class="function-title">入库登记</div> |
|
|
|
<div class="function-desc">扫描包装,完成入库登记</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 通知单输入 --> |
|
|
|
<div class="input-section" v-if="!notifyInfo.notifyNo"> |
|
|
|
<div class="input-group"> |
|
|
|
<label>通知单号</label> |
|
|
|
<div class="input-with-scan"> |
|
|
|
<input |
|
|
|
v-model="packageForm.notifyNo" |
|
|
|
placeholder="请输入或扫描通知单号" |
|
|
|
@keyup.enter="loadNotifyInfo" |
|
|
|
/> |
|
|
|
<button @click="loadNotifyInfo" class="scan-btn">确认</button> |
|
|
|
<div class="function-card" @click="selectFunction('return')"> |
|
|
|
<div class="function-icon">↩️</div> |
|
|
|
<div class="function-title">退库操作</div> |
|
|
|
<div class="function-desc">扫描单元,执行退库操作</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 通知单信息 --> |
|
|
|
<div class="notify-info" v-if="notifyInfo.notifyNo"> |
|
|
|
<div class="section-header"> |
|
|
|
<h3>通知单信息</h3> |
|
|
|
<button @click="resetNotify" class="reset-btn">重新选择</button> |
|
|
|
</div> |
|
|
|
<div class="info-card"> |
|
|
|
<div class="info-row"> |
|
|
|
<span class="label">通知单号:</span> |
|
|
|
<span class="value">{{ notifyInfo.notifyNo }}</span> |
|
|
|
<!-- 包装创建 --> |
|
|
|
<div class="package-create" v-if="selectedFunction === 'package'"> |
|
|
|
<div class="pda-header"> |
|
|
|
<button class="back-btn" @click="goBack">← 返回</button> |
|
|
|
<h2>包装创建</h2> |
|
|
|
</div> |
|
|
|
<div class="info-row"> |
|
|
|
<span class="label">站点:</span> |
|
|
|
<span class="value">{{ notifyInfo.site }}</span> |
|
|
|
</div> |
|
|
|
<div class="info-row"> |
|
|
|
<span class="label">申请人:</span> |
|
|
|
<span class="value">{{ notifyInfo.userName }}</span> |
|
|
|
</div> |
|
|
|
<div class="info-row"> |
|
|
|
<span class="label">状态:</span> |
|
|
|
<span class="value">{{ notifyInfo.status }}</span> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 物料清单 --> |
|
|
|
<div class="materials-section" v-if="materialList.length"> |
|
|
|
<div class="section-header"> |
|
|
|
<h4>物料清单</h4> |
|
|
|
<!-- 通知单输入 --> |
|
|
|
<div class="input-section" v-if="!notifyInfo.notifyNo"> |
|
|
|
<div class="input-group"> |
|
|
|
<label>通知单号</label> |
|
|
|
<div class="input-with-scan"> |
|
|
|
<input |
|
|
|
v-model="packageForm.notifyNo" |
|
|
|
placeholder="请输入或扫描通知单号" |
|
|
|
@keyup.enter="loadNotifyInfo" |
|
|
|
/> |
|
|
|
<button @click="loadNotifyInfo" class="scan-btn">确认</button> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<div class="material-list"> |
|
|
|
<div v-for="material in materialList" :key="material.partNo" class="material-item"> |
|
|
|
<div class="material-info"> |
|
|
|
<div class="part-no">{{ material.partNo }}</div> |
|
|
|
<div class="part-desc">{{ material.partDesc }}</div> |
|
|
|
<div class="qty-info"> |
|
|
|
需求: {{ material.requireQty }} | |
|
|
|
已入库: {{ material.inboundQty }} | |
|
|
|
待入库: {{ material.pendingQty }} |
|
|
|
|
|
|
|
<!-- 通知单信息 --> |
|
|
|
<div class="notify-info" v-if="notifyInfo.notifyNo"> |
|
|
|
<div class="section-header"> |
|
|
|
<h3>通知单信息</h3> |
|
|
|
<button @click="resetNotify" class="reset-btn">重新选择</button> |
|
|
|
</div> |
|
|
|
<div class="info-card"> |
|
|
|
<div class="info-row"> |
|
|
|
<span class="label">通知单号:</span> |
|
|
|
<span class="value">{{ notifyInfo.notifyNo }}</span> |
|
|
|
</div> |
|
|
|
<div class="info-row"> |
|
|
|
<span class="label">站点:</span> |
|
|
|
<span class="value">{{ notifyInfo.site }}</span> |
|
|
|
</div> |
|
|
|
<div class="info-row"> |
|
|
|
<span class="label">申请人:</span> |
|
|
|
<span class="value">{{ notifyInfo.userName }}</span> |
|
|
|
</div> |
|
|
|
<div class="info-row"> |
|
|
|
<span class="label">状态:</span> |
|
|
|
<span class="value">{{ notifyInfo.status }}</span> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 物料清单 --> |
|
|
|
<div class="materials-section" v-if="materialList.length"> |
|
|
|
<div class="section-header"> |
|
|
|
<h4>物料清单</h4> |
|
|
|
</div> |
|
|
|
<div class="material-list"> |
|
|
|
<div v-for="material in materialList" :key="material.partNo" class="material-item"> |
|
|
|
<div class="material-info"> |
|
|
|
<div class="part-no">{{ material.partNo }}</div> |
|
|
|
<div class="part-desc">{{ material.partDesc }}</div> |
|
|
|
<div class="qty-info"> |
|
|
|
需求: {{ material.requireQty }} | |
|
|
|
已入库: {{ material.inboundQty }} | |
|
|
|
待入库: {{ material.pendingQty }} |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 包装创建表单 --> |
|
|
|
<div class="create-form"> |
|
|
|
<div class="section-header"> |
|
|
|
<h4>创建包装</h4> |
|
|
|
</div> |
|
|
|
<div class="input-group"> |
|
|
|
<label>物料编码</label> |
|
|
|
<input v-model="packageForm.partNo" placeholder="请输入物料编码" /> |
|
|
|
</div> |
|
|
|
<div class="input-group"> |
|
|
|
<label>包装数量</label> |
|
|
|
<input v-model="packageForm.qty" type="number" placeholder="请输入包装数量" /> |
|
|
|
</div> |
|
|
|
<div class="input-group"> |
|
|
|
<label>批次号</label> |
|
|
|
<input v-model="packageForm.batchNo" placeholder="请输入批次号(可选)" /> |
|
|
|
</div> |
|
|
|
<button @click="createPackage" class="confirm-btn" :disabled="!packageForm.partNo || !packageForm.qty"> |
|
|
|
创建包装 |
|
|
|
</button> |
|
|
|
</div> |
|
|
|
<!-- 包装创建表单 --> |
|
|
|
<div class="create-form"> |
|
|
|
<div class="section-header"> |
|
|
|
<h4>创建包装</h4> |
|
|
|
</div> |
|
|
|
<div class="input-group"> |
|
|
|
<label>物料编码</label> |
|
|
|
<input v-model="packageForm.partNo" placeholder="请输入物料编码" /> |
|
|
|
</div> |
|
|
|
<div class="input-group"> |
|
|
|
<label>包装数量</label> |
|
|
|
<input v-model="packageForm.qty" type="number" placeholder="请输入包装数量" /> |
|
|
|
</div> |
|
|
|
<div class="input-group"> |
|
|
|
<label>批次号</label> |
|
|
|
<input v-model="packageForm.batchNo" placeholder="请输入批次号(可选)" /> |
|
|
|
</div> |
|
|
|
<button @click="createPackage" class="confirm-btn" :disabled="!packageForm.partNo || !packageForm.qty"> |
|
|
|
创建包装 |
|
|
|
</button> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 已创建包装列表 --> |
|
|
|
<div class="created-packages" v-if="createdPackages.length"> |
|
|
|
<div class="section-header"> |
|
|
|
<h4>已创建包装 ({{ createdPackages.length }})</h4> |
|
|
|
</div> |
|
|
|
<div class="package-list"> |
|
|
|
<div v-for="pkg in createdPackages" :key="pkg.unitId" class="package-item"> |
|
|
|
<div class="package-info"> |
|
|
|
<div class="unit-id">{{ pkg.unitId }}</div> |
|
|
|
<div class="part-info">{{ pkg.partNo }} - {{ pkg.partDesc }}</div> |
|
|
|
<div class="qty-info">数量: {{ pkg.qty }}</div> |
|
|
|
<!-- 已创建包装列表 --> |
|
|
|
<div class="created-packages" v-if="createdPackages.length"> |
|
|
|
<div class="section-header"> |
|
|
|
<h4>已创建包装 ({{ createdPackages.length }})</h4> |
|
|
|
</div> |
|
|
|
<div class="package-actions"> |
|
|
|
<button @click="printLabel(pkg)" class="print-btn">打印</button> |
|
|
|
<div class="package-list"> |
|
|
|
<div v-for="pkg in createdPackages" :key="pkg.unitId" class="package-item"> |
|
|
|
<div class="package-info"> |
|
|
|
<div class="unit-id">{{ pkg.unitId }}</div> |
|
|
|
<div class="part-info">{{ pkg.partNo }} - {{ pkg.partDesc }}</div> |
|
|
|
<div class="qty-info">数量: {{ pkg.qty }}</div> |
|
|
|
</div> |
|
|
|
<div class="package-actions"> |
|
|
|
<button @click="printLabel(pkg)" class="print-btn">打印</button> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 装托盘 --> |
|
|
|
<div class="pallet-pack" v-if="selectedFunction === 'pallet'"> |
|
|
|
<div class="pda-header"> |
|
|
|
<button class="back-btn" @click="goBack">← 返回</button> |
|
|
|
<h2>装托盘</h2> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 托盘输入 --> |
|
|
|
<div class="input-section"> |
|
|
|
<div class="input-group"> |
|
|
|
<label>托盘编码</label> |
|
|
|
<div class="input-with-scan"> |
|
|
|
<input |
|
|
|
v-model="palletForm.palletUnitId" |
|
|
|
placeholder="请扫描托盘编码" |
|
|
|
/> |
|
|
|
<button @click="scanPallet" class="scan-btn">扫描</button> |
|
|
|
<!-- 装托盘 --> |
|
|
|
<div class="pallet-pack" v-if="selectedFunction === 'pallet'"> |
|
|
|
<div class="pda-header"> |
|
|
|
<button class="back-btn" @click="goBack">← 返回</button> |
|
|
|
<h2>装托盘</h2> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 包装扫描 --> |
|
|
|
<div class="scan-section"> |
|
|
|
<div class="section-header"> |
|
|
|
<h3>扫描包装</h3> |
|
|
|
</div> |
|
|
|
<div class="input-group"> |
|
|
|
<label>包装编码</label> |
|
|
|
<div class="input-with-scan"> |
|
|
|
<input |
|
|
|
v-model="scannedPackageId" |
|
|
|
placeholder="请扫描包装编码" |
|
|
|
@keyup.enter="scanPackageForPallet" |
|
|
|
/> |
|
|
|
<button @click="scanPackageForPallet" class="scan-btn">扫描</button> |
|
|
|
<!-- 托盘输入 --> |
|
|
|
<div class="input-section"> |
|
|
|
<div class="input-group"> |
|
|
|
<label>托盘编码</label> |
|
|
|
<div class="input-with-scan"> |
|
|
|
<input |
|
|
|
v-model="palletForm.palletUnitId" |
|
|
|
placeholder="请扫描托盘编码" |
|
|
|
/> |
|
|
|
<button @click="scanPallet" class="scan-btn">扫描</button> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 已扫描包装列表 --> |
|
|
|
<div class="scanned-packages" v-if="scannedPackages.length"> |
|
|
|
<div class="section-header"> |
|
|
|
<h4>已扫描包装 ({{ scannedPackages.length }})</h4> |
|
|
|
</div> |
|
|
|
<div class="package-list"> |
|
|
|
<div v-for="(pkg, index) in scannedPackages" :key="pkg.unitId" class="package-item"> |
|
|
|
<div class="package-info"> |
|
|
|
<div class="unit-id">{{ pkg.unitId }}</div> |
|
|
|
<div class="part-info">{{ pkg.partNo }} - {{ pkg.partDesc }}</div> |
|
|
|
<div class="qty-info">数量: {{ pkg.qty }}</div> |
|
|
|
<!-- 包装扫描 --> |
|
|
|
<div class="scan-section"> |
|
|
|
<div class="section-header"> |
|
|
|
<h3>扫描包装</h3> |
|
|
|
</div> |
|
|
|
<div class="package-actions"> |
|
|
|
<button @click="removePackage(index)" class="remove-btn">移除</button> |
|
|
|
<div class="input-group"> |
|
|
|
<label>包装编码</label> |
|
|
|
<div class="input-with-scan"> |
|
|
|
<input |
|
|
|
v-model="scannedPackageId" |
|
|
|
placeholder="请扫描包装编码" |
|
|
|
@keyup.enter="scanPackageForPallet" |
|
|
|
/> |
|
|
|
<button @click="scanPackageForPallet" class="scan-btn">扫描</button> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<button @click="confirmPackToPallet" class="confirm-btn" :disabled="!palletForm.palletUnitId"> |
|
|
|
确认装托盘 |
|
|
|
</button> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 入库登记 --> |
|
|
|
<div class="inbound-register" v-if="selectedFunction === 'register'"> |
|
|
|
<div class="pda-header"> |
|
|
|
<button class="back-btn" @click="goBack">← 返回</button> |
|
|
|
<h2>入库登记</h2> |
|
|
|
</div> |
|
|
|
<!-- 已扫描包装列表 --> |
|
|
|
<div class="scanned-packages" v-if="scannedPackages.length"> |
|
|
|
<div class="section-header"> |
|
|
|
<h4>已扫描包装 ({{ scannedPackages.length }})</h4> |
|
|
|
</div> |
|
|
|
<div class="package-list"> |
|
|
|
<div v-for="(pkg, index) in scannedPackages" :key="pkg.unitId" class="package-item"> |
|
|
|
<div class="package-info"> |
|
|
|
<div class="unit-id">{{ pkg.unitId }}</div> |
|
|
|
<div class="part-info">{{ pkg.partNo }} - {{ pkg.partDesc }}</div> |
|
|
|
<div class="qty-info">数量: {{ pkg.qty }}</div> |
|
|
|
</div> |
|
|
|
<div class="package-actions"> |
|
|
|
<button @click="removePackage(index)" class="remove-btn">移除</button> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 通知单输入 --> |
|
|
|
<div class="input-section" v-if="!registerForm.notifyNo"> |
|
|
|
<div class="input-group"> |
|
|
|
<label>通知单号</label> |
|
|
|
<div class="input-with-scan"> |
|
|
|
<input |
|
|
|
v-model="tempNotifyNo" |
|
|
|
placeholder="请输入通知单号" |
|
|
|
@keyup.enter="setNotifyForRegister" |
|
|
|
/> |
|
|
|
<button @click="setNotifyForRegister" class="scan-btn">确认</button> |
|
|
|
<button @click="confirmPackToPallet" class="confirm-btn" :disabled="!palletForm.palletUnitId"> |
|
|
|
确认装托盘 |
|
|
|
</button> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 库位输入 --> |
|
|
|
<div class="input-section" v-if="registerForm.notifyNo"> |
|
|
|
<div class="input-group"> |
|
|
|
<label>库位</label> |
|
|
|
<input v-model="registerForm.locationId" placeholder="请输入库位" /> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 包装扫描 --> |
|
|
|
<div class="scan-section" v-if="registerForm.notifyNo"> |
|
|
|
<div class="section-header"> |
|
|
|
<h3>扫描包装</h3> |
|
|
|
</div> |
|
|
|
<div class="input-group"> |
|
|
|
<label>包装编码</label> |
|
|
|
<div class="input-with-scan"> |
|
|
|
<input |
|
|
|
v-model="scannedPackageId" |
|
|
|
placeholder="请扫描包装编码" |
|
|
|
@keyup.enter="scanPackageForRegister" |
|
|
|
/> |
|
|
|
<button @click="scanPackageForRegister" class="scan-btn">扫描</button> |
|
|
|
<!-- 入库登记 --> |
|
|
|
<div class="inbound-register" v-if="selectedFunction === 'register'"> |
|
|
|
<div class="pda-header"> |
|
|
|
<button class="back-btn" @click="goBack">← 返回</button> |
|
|
|
<h2>入库登记</h2> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 已扫描包装列表 --> |
|
|
|
<div class="scanned-packages" v-if="scannedPackages.length"> |
|
|
|
<div class="section-header"> |
|
|
|
<h4>待入库包装 ({{ scannedPackages.length }})</h4> |
|
|
|
</div> |
|
|
|
<div class="package-list"> |
|
|
|
<div v-for="(pkg, index) in scannedPackages" :key="pkg.unitId" class="package-item"> |
|
|
|
<div class="package-info"> |
|
|
|
<div class="unit-id">{{ pkg.unitId }}</div> |
|
|
|
<div class="part-info">{{ pkg.partNo }} - {{ pkg.partDesc }}</div> |
|
|
|
<div class="qty-info">数量: {{ pkg.qty }}</div> |
|
|
|
<!-- 通知单输入 --> |
|
|
|
<div class="input-section" v-if="!registerForm.notifyNo"> |
|
|
|
<div class="input-group"> |
|
|
|
<label>通知单号</label> |
|
|
|
<div class="input-with-scan"> |
|
|
|
<input |
|
|
|
v-model="tempNotifyNo" |
|
|
|
placeholder="请输入通知单号" |
|
|
|
@keyup.enter="setNotifyForRegister" |
|
|
|
/> |
|
|
|
<button @click="setNotifyForRegister" class="scan-btn">确认</button> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<div class="package-actions"> |
|
|
|
<button @click="removePackage(index)" class="remove-btn">移除</button> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 库位输入 --> |
|
|
|
<div class="input-section" v-if="registerForm.notifyNo"> |
|
|
|
<div class="input-group"> |
|
|
|
<label>库位</label> |
|
|
|
<input v-model="registerForm.locationId" placeholder="请输入库位" /> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<button @click="confirmInboundRegister" class="confirm-btn" :disabled="!registerForm.locationId"> |
|
|
|
确认入库 |
|
|
|
</button> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<!-- 包装扫描 --> |
|
|
|
<div class="scan-section" v-if="registerForm.notifyNo"> |
|
|
|
<div class="section-header"> |
|
|
|
<h3>扫描包装</h3> |
|
|
|
</div> |
|
|
|
<div class="input-group"> |
|
|
|
<label>包装编码</label> |
|
|
|
<div class="input-with-scan"> |
|
|
|
<input |
|
|
|
v-model="scannedPackageId" |
|
|
|
placeholder="请扫描包装编码" |
|
|
|
@keyup.enter="scanPackageForRegister" |
|
|
|
/> |
|
|
|
<button @click="scanPackageForRegister" class="scan-btn">扫描</button> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 退库操作 --> |
|
|
|
<div class="return-operation" v-if="selectedFunction === 'return'"> |
|
|
|
<div class="pda-header"> |
|
|
|
<button class="back-btn" @click="goBack">← 返回</button> |
|
|
|
<h2>退库操作</h2> |
|
|
|
</div> |
|
|
|
<!-- 已扫描包装列表 --> |
|
|
|
<div class="scanned-packages" v-if="scannedPackages.length"> |
|
|
|
<div class="section-header"> |
|
|
|
<h4>待入库包装 ({{ scannedPackages.length }})</h4> |
|
|
|
</div> |
|
|
|
<div class="package-list"> |
|
|
|
<div v-for="(pkg, index) in scannedPackages" :key="pkg.unitId" class="package-item"> |
|
|
|
<div class="package-info"> |
|
|
|
<div class="unit-id">{{ pkg.unitId }}</div> |
|
|
|
<div class="part-info">{{ pkg.partNo }} - {{ pkg.partDesc }}</div> |
|
|
|
<div class="qty-info">数量: {{ pkg.qty }}</div> |
|
|
|
</div> |
|
|
|
<div class="package-actions"> |
|
|
|
<button @click="removePackage(index)" class="remove-btn">移除</button> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 通知单输入 --> |
|
|
|
<div class="input-section" v-if="!returnForm.notifyNo"> |
|
|
|
<div class="input-group"> |
|
|
|
<label>通知单号</label> |
|
|
|
<div class="input-with-scan"> |
|
|
|
<input |
|
|
|
v-model="tempNotifyNo" |
|
|
|
placeholder="请输入通知单号" |
|
|
|
@keyup.enter="loadInboundRecords" |
|
|
|
/> |
|
|
|
<button @click="loadInboundRecords" class="scan-btn">查询</button> |
|
|
|
<button @click="confirmInboundRegister" class="confirm-btn" :disabled="!registerForm.locationId"> |
|
|
|
确认入库 |
|
|
|
</button> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 入库记录选择 --> |
|
|
|
<div class="records-section" v-if="inboundRecords.length"> |
|
|
|
<div class="section-header"> |
|
|
|
<h3>选择入库记录</h3> |
|
|
|
</div> |
|
|
|
<div class="record-list"> |
|
|
|
<div v-for="record in inboundRecords" :key="record.transNo" |
|
|
|
class="record-item" |
|
|
|
:class="{ selected: selectedRecord === record.transNo }" |
|
|
|
@click="selectRecord(record)"> |
|
|
|
<div class="record-info"> |
|
|
|
<div class="trans-no">{{ record.transNo }}</div> |
|
|
|
<div class="trans-date">{{ record.transDate | formatDate }}</div> |
|
|
|
<div class="qty-info"> |
|
|
|
入库: {{ record.inboundQty }} | |
|
|
|
已退: {{ record.returnedQty }} | |
|
|
|
可退: {{ record.availableReturnQty }} |
|
|
|
<!-- 退库操作 --> |
|
|
|
<div class="return-operation" v-if="selectedFunction === 'return'"> |
|
|
|
<div class="pda-header"> |
|
|
|
<button class="back-btn" @click="goBack">← 返回</button> |
|
|
|
<h2>退库操作</h2> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 通知单输入 --> |
|
|
|
<div class="input-section" v-if="!returnForm.notifyNo"> |
|
|
|
<div class="input-group"> |
|
|
|
<label>通知单号</label> |
|
|
|
<div class="input-with-scan"> |
|
|
|
<input |
|
|
|
v-model="tempNotifyNo" |
|
|
|
placeholder="请输入通知单号" |
|
|
|
@keyup.enter="loadInboundRecords" |
|
|
|
/> |
|
|
|
<button @click="loadInboundRecords" class="scan-btn">查询</button> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 退库方式选择 --> |
|
|
|
<div class="return-type-section" v-if="selectedRecord"> |
|
|
|
<div class="section-header"> |
|
|
|
<h4>退库方式</h4> |
|
|
|
</div> |
|
|
|
<div class="radio-group"> |
|
|
|
<label class="radio-item"> |
|
|
|
<input type="radio" v-model="returnType" value="quantity" /> |
|
|
|
<span>按数量退库</span> |
|
|
|
</label> |
|
|
|
<label class="radio-item"> |
|
|
|
<input type="radio" v-model="returnType" value="unit" /> |
|
|
|
<span>按单元退库</span> |
|
|
|
</label> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 按数量退库 --> |
|
|
|
<div class="quantity-return" v-if="returnType === 'quantity'"> |
|
|
|
<div class="input-group"> |
|
|
|
<label>退库数量</label> |
|
|
|
<input v-model="returnForm.returnQty" type="number" placeholder="请输入退库数量" /> |
|
|
|
</div> |
|
|
|
<div class="input-group"> |
|
|
|
<label>退库原因</label> |
|
|
|
<input v-model="returnForm.returnReason" placeholder="请输入退库原因" /> |
|
|
|
</div> |
|
|
|
<button @click="confirmReturn" class="confirm-btn" :disabled="!returnForm.returnQty || !returnForm.returnReason"> |
|
|
|
确认退库 |
|
|
|
</button> |
|
|
|
</div> |
|
|
|
<!-- 入库记录选择 --> |
|
|
|
<div class="records-section" v-if="inboundRecords.length"> |
|
|
|
<div class="section-header"> |
|
|
|
<h3>选择入库记录</h3> |
|
|
|
</div> |
|
|
|
<div class="record-list"> |
|
|
|
<div v-for="record in inboundRecords" :key="record.transNo" |
|
|
|
class="record-item" |
|
|
|
:class="{ selected: selectedRecord === record.transNo }" |
|
|
|
@click="selectRecord(record)"> |
|
|
|
<div class="record-info"> |
|
|
|
<div class="trans-no">{{ record.transNo }}</div> |
|
|
|
<div class="trans-date">{{ record.transDate | formatDate }}</div> |
|
|
|
<div class="qty-info"> |
|
|
|
入库: {{ record.inboundQty }} | |
|
|
|
已退: {{ record.returnedQty }} | |
|
|
|
可退: {{ record.availableReturnQty }} |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 按单元退库 --> |
|
|
|
<div class="unit-return" v-if="returnType === 'unit'"> |
|
|
|
<div class="scan-section"> |
|
|
|
<div class="input-group"> |
|
|
|
<label>单元编码</label> |
|
|
|
<div class="input-with-scan"> |
|
|
|
<input |
|
|
|
v-model="scannedUnitId" |
|
|
|
placeholder="请扫描单元编码" |
|
|
|
@keyup.enter="scanUnitForReturn" |
|
|
|
/> |
|
|
|
<button @click="scanUnitForReturn" class="scan-btn">扫描</button> |
|
|
|
<!-- 退库方式选择 --> |
|
|
|
<div class="return-type-section" v-if="selectedRecord"> |
|
|
|
<div class="section-header"> |
|
|
|
<h4>退库方式</h4> |
|
|
|
</div> |
|
|
|
<div class="radio-group"> |
|
|
|
<label class="radio-item"> |
|
|
|
<input type="radio" v-model="returnType" value="quantity" /> |
|
|
|
<span>按数量退库</span> |
|
|
|
</label> |
|
|
|
<label class="radio-item"> |
|
|
|
<input type="radio" v-model="returnType" value="unit" /> |
|
|
|
<span>按单元退库</span> |
|
|
|
</label> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 已扫描单元列表 --> |
|
|
|
<div class="scanned-units" v-if="scannedUnits.length"> |
|
|
|
<div class="section-header"> |
|
|
|
<h4>已扫描单元 ({{ scannedUnits.length }})</h4> |
|
|
|
<!-- 按数量退库 --> |
|
|
|
<div class="quantity-return" v-if="returnType === 'quantity'"> |
|
|
|
<div class="input-group"> |
|
|
|
<label>退库数量</label> |
|
|
|
<input v-model="returnForm.returnQty" type="number" placeholder="请输入退库数量" /> |
|
|
|
</div> |
|
|
|
<div class="input-group"> |
|
|
|
<label>退库原因</label> |
|
|
|
<input v-model="returnForm.returnReason" placeholder="请输入退库原因" /> |
|
|
|
</div> |
|
|
|
<button @click="confirmReturn" class="confirm-btn" :disabled="!returnForm.returnQty || !returnForm.returnReason"> |
|
|
|
确认退库 |
|
|
|
</button> |
|
|
|
</div> |
|
|
|
<div class="unit-list"> |
|
|
|
<div v-for="(unit, index) in scannedUnits" :key="unit.unitId" class="unit-item"> |
|
|
|
<div class="unit-info"> |
|
|
|
<div class="unit-id">{{ unit.unitId }}</div> |
|
|
|
<div class="part-info">{{ unit.partNo }} - {{ unit.partDesc }}</div> |
|
|
|
<div class="qty-info">数量: {{ unit.qty }}</div> |
|
|
|
|
|
|
|
<!-- 按单元退库 --> |
|
|
|
<div class="unit-return" v-if="returnType === 'unit'"> |
|
|
|
<div class="scan-section"> |
|
|
|
<div class="input-group"> |
|
|
|
<label>单元编码</label> |
|
|
|
<div class="input-with-scan"> |
|
|
|
<input |
|
|
|
v-model="scannedUnitId" |
|
|
|
placeholder="请扫描单元编码" |
|
|
|
@keyup.enter="scanUnitForReturn" |
|
|
|
/> |
|
|
|
<button @click="scanUnitForReturn" class="scan-btn">扫描</button> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 已扫描单元列表 --> |
|
|
|
<div class="scanned-units" v-if="scannedUnits.length"> |
|
|
|
<div class="section-header"> |
|
|
|
<h4>已扫描单元 ({{ scannedUnits.length }})</h4> |
|
|
|
</div> |
|
|
|
<div class="unit-actions"> |
|
|
|
<button @click="removeUnit(index)" class="remove-btn">移除</button> |
|
|
|
<div class="unit-list"> |
|
|
|
<div v-for="(unit, index) in scannedUnits" :key="unit.unitId" class="unit-item"> |
|
|
|
<div class="unit-info"> |
|
|
|
<div class="unit-id">{{ unit.unitId }}</div> |
|
|
|
<div class="part-info">{{ unit.partNo }} - {{ unit.partDesc }}</div> |
|
|
|
<div class="qty-info">数量: {{ unit.qty }}</div> |
|
|
|
</div> |
|
|
|
<div class="unit-actions"> |
|
|
|
<button @click="removeUnit(index)" class="remove-btn">移除</button> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<div class="input-group"> |
|
|
|
<label>退库原因</label> |
|
|
|
<input v-model="returnForm.returnReason" placeholder="请输入退库原因" /> |
|
|
|
</div> |
|
|
|
|
|
|
|
<button @click="confirmReturn" class="confirm-btn" :disabled="!scannedUnits.length || !returnForm.returnReason"> |
|
|
|
确认退库 |
|
|
|
</button> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<div class="input-group"> |
|
|
|
<label>退库原因</label> |
|
|
|
<input v-model="returnForm.returnReason" placeholder="请输入退库原因" /> |
|
|
|
<!-- 加载提示 --> |
|
|
|
<div class="loading" v-if="loading"> |
|
|
|
<div class="loading-spinner"></div> |
|
|
|
<div class="loading-text">{{ loadingText }}</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<button @click="confirmReturn" class="confirm-btn" :disabled="!scannedUnits.length || !returnForm.returnReason"> |
|
|
|
确认退库 |
|
|
|
</button> |
|
|
|
<!-- 消息提示 --> |
|
|
|
<div class="message" v-if="message" :class="messageType"> |
|
|
|
{{ message }} |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 加载提示 --> |
|
|
|
<div class="loading" v-if="loading"> |
|
|
|
<div class="loading-spinner"></div> |
|
|
|
<div class="loading-text">{{ loadingText }}</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 消息提示 --> |
|
|
|
<div class="message" v-if="message" :class="messageType"> |
|
|
|
{{ message }} |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</template> |
|
|
|
|
|
|
|
|