常熟吴彦祖 3 months ago
parent
commit
821704728e
  1. 7
      src/api/automatedWarehouse/callOutToStation.js
  2. 1
      src/router/index.js
  3. 6
      src/views/main.vue
  4. 18
      src/views/modules/automatedWarehouse/callOut.vue
  5. 483
      src/views/modules/automatedWarehouse/callOutToStation.vue

7
src/api/automatedWarehouse/callOutToStation.js

@ -0,0 +1,7 @@
import { createAPI } from "@/utils/httpRequest.js";
// ========== Call料到指定位置相关 ========== - rqrq
// Call料并运输到指定区域/站点 - rqrq
export const callOutToStation = data => createAPI(`/wcsIntegration/callOutToStation`, 'post', data)

1
src/router/index.js

@ -132,6 +132,7 @@ const globalRoutes = [
{path: "/palletManualMove",name: "palletManualMove", component: resolve => require(["@/views/modules/automatedWarehouse/palletManualMove.vue"], resolve), meta: { transition: 'instant' ,preload: true,keepAlive: true}}, {path: "/palletManualMove",name: "palletManualMove", component: resolve => require(["@/views/modules/automatedWarehouse/palletManualMove.vue"], resolve), meta: { transition: 'instant' ,preload: true,keepAlive: true}},
{path: "/emptyPalletAssembly",name: "emptyPalletAssembly", component: resolve => require(["@/views/modules/automatedWarehouse/emptyPalletAssembly.vue"], resolve), meta: { transition: 'instant' ,preload: true,keepAlive: true}}, {path: "/emptyPalletAssembly",name: "emptyPalletAssembly", component: resolve => require(["@/views/modules/automatedWarehouse/emptyPalletAssembly.vue"], resolve), meta: { transition: 'instant' ,preload: true,keepAlive: true}},
{path: "/cancelWcsPallet",name: "cancelWcsPallet", component: resolve => require(["@/views/modules/automatedWarehouse/cancelWcsPallet.vue"], resolve), meta: { transition: 'instant' ,preload: true,keepAlive: true}}, {path: "/cancelWcsPallet",name: "cancelWcsPallet", component: resolve => require(["@/views/modules/automatedWarehouse/cancelWcsPallet.vue"], resolve), meta: { transition: 'instant' ,preload: true,keepAlive: true}},
{path: "/callOutToStation",name: "callOutToStation", component: resolve => require(["@/views/modules/automatedWarehouse/callOutToStation.vue"], resolve), meta: { transition: 'instant' ,preload: true,keepAlive: true}},
] ]

6
src/views/main.vue

@ -137,6 +137,12 @@
</div> </div>
<div class="menu-text">Call料</div> <div class="menu-text">Call料</div>
</div> </div>
<div class="menu-item" @click="navigateWithWarehouseCheck('callOutToStation')">
<div class="menu-icon purchase">
<van-icon name="shopping-cart-o" size="24" />
</div>
<div class="menu-text">立库取货</div>
</div>
<div class="menu-item" @click="navigateWithWarehouseCheck('palletPacking')"> <div class="menu-item" @click="navigateWithWarehouseCheck('palletPacking')">
<div class="menu-icon purchase"> <div class="menu-icon purchase">
<van-icon name="shopping-cart-o" size="24" /> <van-icon name="shopping-cart-o" size="24" />

18
src/views/modules/automatedWarehouse/callOut.vue

@ -26,9 +26,9 @@
placeholder="请输入物料编码" placeholder="请输入物料编码"
class="form-input" class="form-input"
clearable clearable
@blur="handlePartNoBlur"
/> />
</div> </div>
<!-- @blur="handlePartNoBlur"-->
<!-- 栈板编码搜索框 - rqrq --> <!-- 栈板编码搜索框 - rqrq -->
<div class="input-group"> <div class="input-group">
<label class="input-label">栈板编码</label> <label class="input-label">栈板编码</label>
@ -39,14 +39,14 @@
clearable clearable
/> />
</div> </div>
<div class="input-group">
<label class="input-label">物料名称</label>
<el-input
v-model="formData.partDesc"
disabled
class="form-input"
/>
</div>
<!-- <div class="input-group">-->
<!-- <label class="input-label">物料名称</label>-->
<!-- <el-input-->
<!-- v-model="formData.partDesc"-->
<!-- disabled-->
<!-- class="form-input"-->
<!-- />-->
<!-- </div>-->
<div class="input-group"> <div class="input-group">
<label class="input-label">批号</label> <label class="input-label">批号</label>

483
src/views/modules/automatedWarehouse/callOutToStation.vue

@ -0,0 +1,483 @@
<template>
<div>
<div class="pda-container">
<!-- 头部栏 - rqrq -->
<div class="header-bar">
<div class="header-left" @click="handleBack">
<i class="el-icon-arrow-left"></i>
<span>Call料到指定位置</span>
</div>
<div class="header-right" @click="$router.push({ path: '/' })">
首页
</div>
</div>
<div class="table-body" style="max-height: 500px; overflow-y: auto;">
<div class="main-content form-section">
<!-- 表单区域 - rqrq -->
<div class="input-group">
<label class="input-label">物料编码</label>
<el-input
v-model="formData.partNo"
placeholder="请输入物料编码"
class="form-input"
clearable
/>
</div>
<!-- @blur="handlePartNoBlur"-->
<!-- 栈板编码搜索框 - rqrq -->
<div class="input-group">
<label class="input-label">栈板编码</label>
<el-input
v-model="formData.palletId"
placeholder="请输入栈板编码"
class="form-input"
clearable
/>
</div>
<!-- <div class="input-group">-->
<!-- <label class="input-label">物料名称</label>-->
<!-- <el-input-->
<!-- v-model="formData.partDesc"-->
<!-- disabled-->
<!-- class="form-input"-->
<!-- />-->
<!-- </div>-->
<div class="input-group">
<label class="input-label">批号</label>
<el-input
v-model="formData.batchNo"
class="form-input"
clearable
/>
</div>
<div class="bottom-actions" style="display: flex; gap: 10px; flex-wrap: nowrap;">
<button class="action-btn secondary" @click="confirmDo" style="flex: 1;">
查询
</button>
<button class="action-btn secondary" @click="cleanData" style="flex: 1;">
清空
</button>
<button
class="action-btn secondary"
@click="handleTransportPallet"
:disabled="!selectedPallet"
style="flex: 1;"
>
运输栈板
</button>
</div>
</div>
<!-- 栈板列表 - rqrq单选模式-->
<div v-if="palletList.length > 0" class="rma-list">
<div class="list-title" style="flex: 0.75">可用栈板列表单选</div>
<el-form>
<el-row v-for="(pallet, index) in palletList" :key="index" class="rma-row">
<el-col :span="24">
<div class="rma-item" @click="selectPallet(pallet)" :class="{ 'selected': isSelected(pallet) }">
<div class="item-info">
<span class="part-no">栈板号: {{ pallet.palletId }}</span>
<!-- rqrq - 如果有物料编码显示明细否则只显示栈板 -->
<span class="batch-qty" v-if="pallet.partNo">
物料: {{ pallet.partNo }} | 数量: {{ pallet.qty }}
</span>
<span class="batch-qty" v-if="pallet.partNo && pallet.batchNo">
| 批号: {{ pallet.batchNo }}
</span>
<span class="batch-qty" v-if="pallet.partNo && pallet.wdr">
| WDR: {{ pallet.wdr }}
</span>
<span class="batch-qty" v-if="pallet.partNo && pallet.expiredDate">
| 失效日期: {{ pallet.expiredDate }}
</span>
</div>
<div class="item-status">
<i class="el-icon-check" v-if="isSelected(pallet)"></i>
</div>
</div>
</el-col>
</el-row>
</el-form>
</div>
</div>
</div>
<!-- 选择区域和站点弹窗 - rqrq -->
<el-dialog
title="选择目标位置"
:visible.sync="locationModalVisible"
width="90%"
:close-on-click-modal="false"
:show-close="false"
:modal="true"
:modal-append-to-body="true"
:append-to-body="true"
>
<div class="location-selection">
<!-- 选择区域 - rqrq -->
<div class="input-group">
<label class="input-label">选择区域</label>
<el-select
v-model="selectedArea"
placeholder="请选择区域"
style="width: 100%;"
@change="handleAreaChange"
>
<el-option
v-for="area in areaOptions"
:key="area.areaId"
:label="area.areaDesc"
:value="area.areaId"
/>
</el-select>
</div>
<!-- 选择站点 - rqrq -->
<div class="input-group">
<label class="input-label">选择站点</label>
<el-select
v-model="selectedStation"
placeholder="请选择站点"
style="width: 100%;"
:disabled="!selectedArea"
>
<el-option label="自动分配" value=""></el-option>
<el-option
v-for="station in stationOptions"
:key="station.stationId"
:label="`${station.stationId} (${station.stationCode})`"
:value="station.stationCode"
/>
</el-select>
</div>
</div>
<div slot="footer" class="dialog-footer" style="display: flex; gap: 8px;">
<button class="action-btn secondary" @click="locationModalVisible=false" style="flex: 1;">
取消
</button>
<button
class="action-btn primary"
@click="handleConfirmLocation"
:disabled="submitLoading || !selectedArea"
style="flex: 1;">
{{ submitLoading ? '处理中...' : '确认' }}
</button>
</div>
</el-dialog>
</div>
</template>
<script>
import {
getShopOrderFromIFSWithOrderNo,
getPalletList
} from '../../../api/automatedWarehouse/callOut'
import {
getAreaOptionsForChange,
getStationsByArea
} from '../../../api/automatedWarehouse/palletChangeStation'
import {
callOutToStation
} from '../../../api/automatedWarehouse/callOutToStation'
export default {
data() {
return {
site: localStorage.getItem('site'),
username: localStorage.getItem('username'),
// - rqrq
formData: {
palletId: '',
partNo: '',
partDesc: '',
batchNo: '',
site: localStorage.getItem('site')
},
// - rqrq
palletList: [],
selectedPallet: null, // - rqrq
// - rqrq
locationModalVisible: false,
selectedArea: '',
selectedStation: '',
areaOptions: [],
stationOptions: [],
// - rqrq
loading: false,
submitLoading: false
};
},
methods: {
// - rqrq
handleBack() {
this.$router.back();
},
// - rqrq
async handlePartNoBlur() {
const partNo = this.formData.partNo;
if (!partNo) {
this.formData.partDesc = '';
return;
}
this.loading = true;
getShopOrderFromIFSWithOrderNo({
site: this.formData.site,
partNo: partNo
}).then(({ data }) => {
this.loading = false;
if (data.code === 0) {
let rows = data.rows
if (rows.length > 0) {
this.formData.partDesc = rows[0].description || '';
} else {
this.formData.partDesc = '';
this.$alert('没有找到该物料编码', '错误', {
confirmButtonText: '确定',
})
}
} else {
this.formData.partDesc = '';
this.$alert(data.msg, '错误', {
confirmButtonText: '确定',
})
}
})
},
// - rqrq
confirmDo() {
if ((!this.formData.partNo || this.formData.partNo === '') &&
(!this.formData.palletId || this.formData.palletId === '')) {
this.$message.error('请输入物料编码或栈板编码');
return;
}
const queryParams = {
site: this.formData.site
};
if (this.formData.palletId && this.formData.palletId.trim()) {
queryParams.palletId = this.formData.palletId.trim();
}
if (this.formData.partNo && this.formData.partNo.trim()) {
queryParams.partNo = this.formData.partNo.trim();
}
if (this.formData.batchNo && this.formData.batchNo.trim()) {
queryParams.batchNo = this.formData.batchNo.trim();
}
getPalletList(queryParams).then(({ data }) => {
if (data && data.code === 0) {
this.palletList = data.rows || [];
if (this.palletList.length === 0) {
this.$message.warning('未找到满足条件的栈板');
} else {
this.$message.success(`找到 ${this.palletList.length} 个栈板`);
}
this.selectedPallet = null; // - rqrq
} else {
this.$message.error(data.msg || '查询失败');
this.palletList = [];
this.selectedPallet = null;
}
}).catch(error => {
console.error('查询栈板列表失败:', error);
this.$message.error('查询失败');
this.palletList = [];
this.selectedPallet = null;
});
},
// - rqrq
selectPallet(pallet) {
if (this.selectedPallet && this.selectedPallet.palletId === pallet.palletId) {
// - rqrq
this.selectedPallet = null;
this.$message.success('已取消选择');
} else {
// - rqrq
this.selectedPallet = {
site: pallet.site,
palletId: pallet.palletId,
partNo: pallet.partNo || '',
qty: pallet.qty || 0,
batchNo: pallet.batchNo || this.formData.batchNo || ''
};
this.$message.success(`已选择栈板: ${pallet.palletId}`);
}
},
// - rqrq
isSelected(pallet) {
return this.selectedPallet && this.selectedPallet.palletId === pallet.palletId;
},
// - rqrq
handleTransportPallet() {
if (!this.selectedPallet) {
this.$message.error('请选择一个栈板');
return;
}
// - rqrq
this.loadAreaOptions();
this.locationModalVisible = true;
},
// - rqrq
loadAreaOptions() {
getAreaOptionsForChange({
site: this.site
}).then(({ data }) => {
if (data.code === 0) {
this.areaOptions = data.rows || [];
} else {
this.areaOptions = [];
this.$message.error('获取区域选项失败');
}
}).catch(error => {
console.error('获取区域选项失败:', error);
this.areaOptions = [];
});
},
// - rqrq
handleAreaChange(areaId) {
this.selectedStation = '';
this.stationOptions = [];
if (!areaId) {
return;
}
getStationsByArea({
site: this.site,
areaId: areaId
}).then(({ data }) => {
if (data.code === 0) {
this.stationOptions = data.rows || [];
} else {
this.stationOptions = [];
this.$message.error('获取站点选项失败');
}
}).catch(error => {
console.error('获取站点选项失败:', error);
this.stationOptions = [];
});
},
// - rqrq
handleConfirmLocation() {
if (!this.selectedArea) {
this.$message.error('请选择目标区域');
return;
}
// - rqrq
this.$confirm('确定要叫料并运输到指定位置?', '提示', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.submitLoading = true;
const params = {
site: this.site,
palletId: this.selectedPallet.palletId,
partNo: this.selectedPallet.partNo,
qty: this.selectedPallet.qty,
batchNo: this.selectedPallet.batchNo,
targetArea: this.selectedArea,
targetStation: this.selectedStation || '', // - rqrq
username: this.username
};
// - rqrq
callOutToStation(params).then(({ data }) => {
if (data && data.code === 0) {
this.$message.success('任务下达成功');
this.locationModalVisible = false;
this.cleanData();
} else {
this.$alert(data.msg || '任务下达失败', '错误', {
confirmButtonText: '确定'
});
}
}).catch(error => {
console.error('任务下达失败:', error);
this.$message.error(error.message || '任务下达失败');
}).finally(() => {
this.submitLoading = false;
});
}).catch(() => {
// - rqrq
});
},
// - rqrq
cleanData() {
this.formData = {
palletId: '',
partNo: '',
partDesc: '',
batchNo: '',
site: localStorage.getItem('site')
};
this.palletList = [];
this.selectedPallet = null;
this.selectedArea = '';
this.selectedStation = '';
this.areaOptions = [];
this.stationOptions = [];
}
},
mounted() {
}
};
</script>
<style scoped>
/* 按钮禁用状态样式 - rqrq */
.action-btn:disabled {
opacity: 0.6;
cursor: not-allowed;
background-color: #ccc !important;
border-color: #ccc !important;
}
/* 位置选择区域样式 - rqrq */
.location-selection {
padding: 10px 0;
}
.dialog-footer {
text-align: center;
}
/* 修复模态框层级问题 - rqrq */
::v-deep .el-dialog__wrapper {
z-index: 2000 !important;
}
::v-deep .el-overlay {
z-index: 2000 !important;
}
</style>
Loading…
Cancel
Save