Browse Source

检验合格入库

master
han\hanst 3 months ago
parent
commit
b5bc25d635
  1. 28
      src/views/modules/automatedWarehouse/palletAssembly.vue
  2. 11
      src/views/modules/other-transaction/index.vue
  3. 26
      src/views/modules/other-transaction/inventory-move.vue
  4. 40
      src/views/modules/other-transaction/other-inbound.vue
  5. 58
      src/views/modules/other-transaction/other-outbound.vue
  6. 16
      src/views/modules/recv/inspectionResults.vue
  7. 26
      src/views/modules/recv/qualifiedStorage.vue
  8. 45
      src/views/modules/recv/recv.vue
  9. 14
      src/views/modules/recv/unqualifiedProcess.vue

28
src/views/modules/automatedWarehouse/palletAssembly.vue

@ -24,7 +24,10 @@
style="flex: 0.75;"
clearable
@keyup.enter.native="handlePalletScan"
@focus.native="$event.target.setAttribute('inputmode', 'none')"
inputmode="none"
autocomplete="off"
autocorrect="off"
spellcheck="false"
ref="palletInput"
/>
<button
@ -264,7 +267,10 @@
clearable
:disabled="operationType === 'in' && !currentSelectedPosition"
@keyup.enter.native="handleLabelScan"
@focus.native="$event.target.setAttribute('inputmode', 'none')"
inputmode="none"
autocomplete="off"
autocorrect="off"
spellcheck="false"
ref="scanInput"
/>
</div>
@ -833,7 +839,7 @@ export default {
this.scanCode = '';
this.currentSelectedPosition = '';
this.needRefreshOnClose = false;
// - rqrq
if (this.operationType === 'in') {
this.scanLayer = 1;
@ -851,7 +857,7 @@ export default {
// - rqrq
loadLayerOptions() {
console.log('开始加载层数选项 - rqrq,maxLayer=' + this.currentMaxLayer);
getPalletDetails({
site: this.site,
palletId: this.palletCode,
@ -860,13 +866,13 @@ export default {
}).then(({ data }) => {
if (data && data.code === 0) {
const details = data.details || [];
// - rqrq
let maxExistingLayer = 0;
if (details.length > 0) {
maxExistingLayer = Math.max(...details.map(d => d.layer || 0));
}
// maxLayer - rqrq
if (this.currentMaxLayer === 0) {
// maxLayer=0+1 - rqrq
@ -879,7 +885,7 @@ export default {
this.scanLayerOptions = Array.from({ length: this.currentMaxLayer }, (_, i) => i + 1);
console.log('限高模式 - maxLayer:' + this.currentMaxLayer + ' - rqrq');
}
// - rqrq
this.loadAvailablePositions();
} else {
@ -894,11 +900,11 @@ export default {
// - rqrq
loadAvailablePositions() {
console.log('开始加载位置网格 - rqrq,layer=' + this.scanLayer);
// - rqrq
this.positionGridLoading = true;
this.availablePositions = []; //
getAvailablePositionsForLayer({
site: this.site,
palletId: this.palletCode,
@ -1010,10 +1016,10 @@ export default {
this.$message.success('扫进成功');
this.needRefreshOnClose = true;
this.scanCode = '';
// - rqrq
this.loadLayerOptions();
// - rqrq
this.$refs.scanInput.focus();
} else {

11
src/views/modules/other-transaction/index.vue

@ -59,13 +59,6 @@ export default {
to: "receiveFromTransit",
disabled: false,
},
{
icon: "exchange",
label: "移库",
iconClass: "inventory-move",
to: "inventory-move",
disabled: false,
},
/* {
icon: "records",
label: "单独CALL料",
@ -210,10 +203,6 @@ export default {
box-shadow: 0 4px 8px rgba(245, 34, 45, 0.3);
}
.menu-icon.inventory-move {
background: linear-gradient(135deg, #722ed1 0%, #9254de 100%);
box-shadow: 0 4px 8px rgba(114, 46, 209, 0.3);
}
.menu-text {
font-size: 10px;

26
src/views/modules/other-transaction/inventory-move.vue

@ -15,6 +15,10 @@
prefix-icon="el-icon-search"
@keyup.enter.native="handleScan"
ref="scanInput"
inputmode="none"
autocomplete="off"
autocorrect="off"
spellcheck="false"
/>
<div class="mode-switch">
<el-switch
@ -246,12 +250,12 @@ export default {
if (this.scannedItems.length > 0) {
const firstItemExpiryDate = this.scannedItems[0].expiredDate;
const currentExpiryDate = huInfo.expiredDate;
//
if (firstItemExpiryDate && currentExpiryDate) {
const firstDate = new Date(firstItemExpiryDate).toDateString();
const currentDate = new Date(currentExpiryDate).toDateString();
if (firstDate !== currentDate) {
this.$message.error(`HandlingUnit的过期日期不一致,无法一起移库。已扫描的过期日期:${firstDate},当前扫描的过期日期:${currentDate}`);
return;
@ -369,16 +373,16 @@ export default {
moveReason: '',
targetLocationId: ''
};
//
this.scannedItems = [];
//
this.scanCode = '';
//
this.isRemoveMode = false;
//
this.$nextTick(() => {
if (this.$refs.scanInput) {
@ -556,7 +560,7 @@ export default {
/* 物料信息卡片 */
.material-info-card {
background: white;
margin: 4px 16px;
margin: 4px 4px;
padding: 6px 20px;
border-radius: 8px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
@ -627,7 +631,7 @@ export default {
justify-content: space-between;
padding: 6px 8px;
background: white;
margin: 0 16px;
margin: 0 4px;
margin-top: 4px;
border-radius: 8px 8px 0 0;
border-bottom: 2px solid #17B3A3;
@ -653,7 +657,7 @@ export default {
/* 标签列表 */
.label-list {
background: white;
margin: 0 16px 12px;
margin: 0 4px 4px;
border-radius: 0 0 8px 8px;
overflow: hidden;
}
@ -685,7 +689,7 @@ export default {
text-align: center;
color: #999;
background: white;
margin: 0 16px;
margin: 0 4px;
border-radius: 8px;
}
@ -761,7 +765,7 @@ export default {
}
.material-info-card {
margin: 4px 12px;
margin: 4px 4px;
padding: 6px 16px;
}

40
src/views/modules/other-transaction/other-inbound.vue

@ -15,6 +15,10 @@
prefix-icon="el-icon-search"
@keyup.enter.native="handleScan"
ref="scanInput"
inputmode="none"
autocomplete="off"
autocorrect="off"
spellcheck="false"
/>
<div class="mode-switch">
<el-switch
@ -71,7 +75,7 @@
:key="label.id"
:class="index < scannedItems.length - 1 ? 'bottom-line-row' : ''"
style="border: 1px solid #e0e0e0; border-radius: 4px; margin-bottom: 8px; padding: 8px;">
<el-col :span="12">
<el-col :span="16">
<el-form-item label="HandlingUnit">
<span>{{ label.unitId }}</span>
</el-form-item>
@ -81,26 +85,26 @@
<span>{{ label.partNo }}</span>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="数量">
<span>{{ label.qty }} {{ label.unit || '个' }}</span>
</el-form-item>
</el-col>
<el-col :span="24" v-if="label.partDesc">
<el-form-item label="物料描述">
<span>{{ label.partDesc }}</span>
</el-form-item>
</el-col>
<el-col :span="12" v-if="label.batchNo">
<el-col :span="10" v-if="label.batchNo">
<el-form-item label="批次号">
<span>{{ label.batchNo }}</span>
</el-form-item>
</el-col>
<el-col :span="12" v-if="label.locationId">
<el-col :span="10" v-if="label.locationId">
<el-form-item label="库位">
<span>{{ label.locationId }}</span>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="数量">
<span>{{ label.qty }} {{ label.unit}}</span>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
@ -174,17 +178,17 @@ export default {
// 1
const bottomActions = document.querySelector('.bottom-actions');
if (bottomActions) {
bottomActions.scrollIntoView({
behavior: 'smooth',
block: 'end'
bottomActions.scrollIntoView({
behavior: 'smooth',
block: 'end'
});
return;
}
// 2
const scrollContainer = document.querySelector('.pda-container > div[style*="overflow-y"]') ||
const scrollContainer = document.querySelector('.pda-container > div[style*="overflow-y"]') ||
document.querySelector('.pda-container > div:nth-child(2)');
if (scrollContainer) {
scrollContainer.scrollTo({
top: scrollContainer.scrollHeight,
@ -493,7 +497,7 @@ export default {
/* 物料信息卡片 */
.material-info-card {
background: white;
margin: 4px 16px;
margin: 4px 4px;
padding: 6px 20px;
border-radius: 8px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
@ -564,7 +568,7 @@ export default {
justify-content: space-between;
padding: 6px 8px;
background: white;
margin: 0 16px;
margin: 0 4px;
margin-top: 4px;
border-radius: 8px 8px 0 0;
border-bottom: 2px solid #17B3A3;
@ -590,7 +594,7 @@ export default {
/* 标签列表 */
.label-list {
background: white;
margin: 0 16px 12px;
margin: 0 4px 4px;
border-radius: 0 0 8px 8px;
overflow: hidden;
}
@ -622,7 +626,7 @@ export default {
text-align: center;
color: #999;
background: white;
margin: 0 16px;
margin: 0 4px;
border-radius: 8px;
}
@ -677,7 +681,7 @@ export default {
}
.material-info-card {
margin: 4px 12px;
margin: 4px 4px;
padding: 6px 16px;
}

58
src/views/modules/other-transaction/other-outbound.vue

@ -15,6 +15,10 @@
prefix-icon="el-icon-search"
@keyup.enter.native="handleScan"
ref="scanInput"
inputmode="none"
autocomplete="off"
autocorrect="off"
spellcheck="false"
/>
<div class="mode-switch">
<el-switch
@ -61,7 +65,7 @@
:key="label.id"
:class="index < scannedItems.length - 1 ? 'bottom-line-row' : ''"
style="border: 1px solid #e0e0e0; border-radius: 4px; margin-bottom: 8px; padding: 8px;">
<el-col :span="12">
<el-col :span="16">
<el-form-item label="HandlingUnit">
<span>{{ label.unitId }}</span>
</el-form-item>
@ -71,26 +75,26 @@
<span>{{ label.partNo }}</span>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="数量">
<span>{{ label.qty }} {{ label.unit || '个' }}</span>
</el-form-item>
</el-col>
<el-col :span="24" v-if="label.partDesc">
<el-form-item label="物料描述">
<span>{{ label.partDesc }}</span>
</el-form-item>
</el-col>
<el-col :span="12" v-if="label.batchNo">
<el-col :span="10" v-if="label.batchNo">
<el-form-item label="批次号">
<span>{{ label.batchNo }}</span>
</el-form-item>
</el-col>
<el-col :span="12" v-if="label.locationId">
<el-col :span="10" v-if="label.locationId">
<el-form-item label="库位">
<span>{{ label.locationId }}</span>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="数量">
<span>{{ label.qty }} {{ label.unit}}</span>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
@ -297,7 +301,7 @@ export default {
</script>
<style scoped>
/* 复用其它入库的样式 */
/* 复用unqualifiedProcess.vue的样式 */
.pda-container {
width: 100%;
height: 100vh;
@ -323,7 +327,7 @@ export default {
font-weight: 500;
}
/* 搜索容器样式 */
/* 搜索容器 */
.search-container {
padding: 12px 16px;
background: white;
@ -361,11 +365,19 @@ export default {
.custom-switch {
transform: scale(1.3);
}
/* 中间文字 */
.switch-text {
position: absolute;
left: 25%;
transform: translateX(-50%);
top: 50%;
transform: translateY(-50%) translateX(-50%);
font-size: 12px;
font-weight: 500;
color: #606266;
white-space: nowrap;
pointer-events: none;
z-index: 1;
top: 53%;
transform: translate(-50%, -50%);
font-size: 12px;
@ -378,6 +390,15 @@ export default {
.switch-text2 {
position: absolute;
left: 75%;
transform: translateX(-50%);
top: 50%;
transform: translateY(-50%) translateX(-50%);
font-size: 12px;
font-weight: 500;
color: #606266;
white-space: nowrap;
pointer-events: none;
z-index: 1;
top: 53%;
transform: translate(-50%, -50%);
font-size: 12px;
@ -396,7 +417,7 @@ export default {
/* 物料信息卡片 */
.material-info-card {
background: white;
margin: 4px 16px;
margin: 4px 4px;
padding: 6px 20px;
border-radius: 8px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
@ -444,11 +465,6 @@ export default {
flex-direction: column;
}
.form-item.full-width {
flex: none;
width: 100%;
}
.form-label {
font-size: 11px;
color: #666;
@ -472,7 +488,7 @@ export default {
justify-content: space-between;
padding: 6px 8px;
background: white;
margin: 0 16px;
margin: 0 4px;
margin-top: 4px;
border-radius: 8px 8px 0 0;
border-bottom: 2px solid #17B3A3;
@ -498,7 +514,7 @@ export default {
/* 标签列表 */
.label-list {
background: white;
margin: 0 16px 12px;
margin: 0 4px 4px;
border-radius: 0 0 8px 8px;
overflow: hidden;
}
@ -530,7 +546,7 @@ export default {
text-align: center;
color: #999;
background: white;
margin: 0 16px;
margin: 0 4px;
border-radius: 8px;
}
@ -585,7 +601,7 @@ export default {
}
.material-info-card {
margin: 4px 12px;
margin: 4px 4px;
padding: 6px 16px;
}

16
src/views/modules/recv/inspectionResults.vue

@ -1,6 +1,7 @@
<template>
<div>
<div class="pda-container">
<div class="pda-container" v-loading="loading" element-loading-text="查询中..."
element-loading-spinner="el-icon-loading" element-loading-background="rgba(255, 255, 255, 0.5)">
<div class="status-bar">
<div class="goBack" @click="handleBack"><i class="el-icon-arrow-left"></i>上一页</div>
<div class="goBack">检验不合格处理</div>
@ -107,7 +108,8 @@ export default {
unqualifiedList: [],
scannedItems: [],
selectedItem: {},
site: localStorage.getItem('site')
site: localStorage.getItem('site'),
loading: false // loading
};
},
methods: {
@ -132,10 +134,12 @@ export default {
//
searchUnqualifiedList() {
this.loading = true; // loading
const params = {
site: this.site
};
if (this.scanCode && (this.scanCode.startsWith('PO') || this.scanCode.startsWith('REC'))) {
if (this.scanCode) {
params.transNo = this.scanCode;
}
@ -163,6 +167,8 @@ export default {
this.$refs.scanCodeRef.blur();
}
});
}).finally(() => {
this.loading = false; // loading
});
this.scanCode = '';
@ -170,6 +176,8 @@ export default {
// HandlingUnit
scanHandlingUnit() {
this.loading = true; // loading
const params = {
site: this.site,
unitId: this.scanCode.trim()
@ -222,6 +230,8 @@ export default {
this.$refs.scanCodeRef.blur();
}
});
}).finally(() => {
this.loading = false; // loading
});
this.scanCode = '';

26
src/views/modules/recv/qualifiedStorage.vue

@ -6,7 +6,7 @@
<div class="goBack">检验合格入库</div>
<div class="network" style="color: #fff" @click="$router.push({ path: '/' })">🏠首页</div>
</div>
<!-- 全页面Loading -->
<div v-if="loading || scanLoading" class="page-loading-overlay">
<div class="page-loading-content">
@ -16,12 +16,13 @@
</div>
</div>
</div>
<div style="overflow-y: auto" :class="{ 'content-disabled': loading || scanLoading }">
<!-- Step 1: 扫描采购单号查询接收记录 -->
<div v-if="processFlag === 1">
<div class="scan-box" style="margin: 2px;">
<el-input clearable v-model="scanCode" placeholder="扫描或输入采购单号"
:editable="false"
@keyup.enter.native="searchReceiptList" ref="scanCodeRef" />
</div>
<div class="item-list" v-if="receiptList.length > 0" style="margin: 2px;">
@ -69,17 +70,23 @@
<div class="form-row">
<div class="form-item">
<label class="form-label">物料编码</label>
<el-input v-model="selectedReceipt.sourcePartNo" disabled size="small" />
<span >
{{ selectedReceipt.sourcePartNo }}
</span>
</div>
<div class="form-item">
<label class="form-label">到货数量</label>
<el-input v-model="selectedReceipt.qtyArrived" disabled size="small" />
<span v-model="selectedReceipt.qtyArrived">
{{selectedReceipt.qtyArrived}}
</span>
</div>
</div>
<div class="form-row">
<div class="form-item">
<label class="form-label">物料描述</label>
<el-input v-model="selectedReceipt.description" disabled size="small" />
<span v-model="selectedReceipt.description" >
{{selectedReceipt.description}}
</span>
</div>
</div>
</div>
@ -111,7 +118,6 @@
<div class="input-form">
<div class="form-row">
<div class="form-item">
<label class="form-label">目标库位</label>
<el-input
v-model="targetLocationId"
placeholder="请扫描或输入目标库位"
@ -295,10 +301,10 @@ export default {
if (data.code === 0) {
this.receiptList = data.rows || [];
if (this.receiptList.length === 0) {
this.$message.success("暂无ARRIVED状态的接收记录");
this.$message.success("暂无To be Received状态的接收记录");
}
} else {
this.$message.error(data.msg || "查询失败");
this.$message.error("查询失败");
}
//
this.$nextTick(() => {
@ -739,10 +745,6 @@ export default {
}
/* 表单样式 */
.input-form {
margin-top: 8px;
}
.form-row {
display: flex;
gap: 12px;

45
src/views/modules/recv/recv.vue

@ -11,6 +11,10 @@
<div v-if="processFlag === 1">
<div class="scan-box" style="margin: 2px;">
<el-input clearable v-model="scanCode" placeholder="扫描PO条码或输入PO号"
inputmode="none"
autocomplete="off"
autocorrect="off"
spellcheck="false"
@keyup.enter.native="searchPoList" ref="scanCodeRef" />
</div>
<div class="item-list" v-if="poList.length > 0" style="margin: 2px;">
@ -78,7 +82,10 @@
<el-date-picker v-model="recvItem.manufactureDate"
type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
placeholder="选择制造日期" style="width: 100%"
:editable="false" />
inputmode="none"
autocomplete="off"
autocorrect="off"
spellcheck="false" />
</el-form-item></el-col>
<el-col :span="12"><el-form-item label="供应商批次">
<el-input v-model="recvItem.supplierBatchNo" placeholder="请输入供应商批次" />
@ -89,7 +96,10 @@
<el-col :span="12"><el-form-item label="到达日期">
<el-date-picker v-model="recvItem.arrivalDate" type="date" format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss" placeholder="选择到达日期" style="width: 100%"
:editable="false" />
inputmode="none"
autocomplete="off"
autocorrect="off"
spellcheck="false" />
</el-form-item></el-col>
<el-col :span="12"><el-form-item label="库位"><el-input v-model="recvItem.locationNo" placeholder="请输入库位" /></el-form-item></el-col>
<el-col :span="12"><el-form-item label="批号"><el-input v-model="recvItem.batchNo" placeholder="请输入批号" /></el-form-item></el-col>
@ -199,7 +209,7 @@ export default {
});
},
async recvLine(row) {
if (row.receiveCaseDB!='INVDIR' && row.receiveCaseDB!='QAINV') {
if (row.receiveCaseDB!='INVDIR' && row.receiveCaseDB!='QAINV' && row.receiveCaseDB!='ARRINV') {
return this.$message.warning("该采购订单行的收货方式为"+row.receiveCase+",无法接收");
}
if (row.poStatus === 'Stopped' || row.poStatus === 'Closed' || row.poStatus === 'Cancelled' || row.poStatus === 'Planned') {
@ -382,38 +392,11 @@ export default {
this.$message.error(`打印失败: ${error.message || error}`)
}
},
//
blurAllInputs() {
//
const inputs = document.querySelectorAll('input, textarea, select, [contenteditable="true"]');
inputs.forEach(input => {
if (input === document.activeElement) {
input.blur();
}
});
}
},
mounted() {
this.$nextTick(() => this.$refs.scanCodeRef.focus());
//
this.handleTouchMove = () => {
this.blurAllInputs();
};
//
document.addEventListener('touchmove', this.handleTouchMove, { passive: true });
//
document.addEventListener('scroll', this.handleTouchMove, { passive: true });
},
beforeDestroy() {
//
if (this.handleTouchMove) {
document.removeEventListener('touchmove', this.handleTouchMove);
document.removeEventListener('scroll', this.handleTouchMove);
}
},
};
</script>

14
src/views/modules/recv/unqualifiedProcess.vue

@ -19,6 +19,10 @@
prefix-icon="el-icon-search"
@keyup.enter.native="handleScan"
ref="scanInput"
inputmode="none"
autocomplete="off"
autocorrect="off"
spellcheck="false"
/>
<div class="mode-switch">
<el-switch
@ -505,7 +509,7 @@ export default {
/* 物料信息卡片 */
.material-info-card {
background: white;
margin: 4px 16px;
margin: 4px 4px;
padding: 6px 20px;
border-radius: 8px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
@ -584,7 +588,7 @@ export default {
justify-content: space-between;
padding: 6px 8px;
background: white;
margin: 0 16px;
margin: 0 4px;
margin-top: 4px;
border-radius: 8px 8px 0 0;
border-bottom: 2px solid #17B3A3;
@ -628,7 +632,7 @@ export default {
/* 标签列表 */
.label-list {
background: white;
margin: 0 16px 12px;
margin: 0 4px 4px;
border-radius: 0 0 8px 8px;
overflow: hidden;
}
@ -898,12 +902,12 @@ export default {
}
.material-info-card {
margin: 4px 12px;
margin: 4px 4px;
padding: 6px 16px;
}
.section-title {
margin: 0 12px;
margin: 0 4px;
margin-top: 4px;
}

Loading…
Cancel
Save