<template>
|
<el-container>
|
<el-col>
|
<el-row :span="1">
|
<div class="card-page">
|
<el-button
|
v-for="device in deviceList"
|
:key="device.id"
|
type="primary"
|
:plain="selectedDeviceId !== device.id"
|
@click="chooseDevice(device.id)"
|
>
|
{{ device.name }}
|
</el-button>
|
</div>
|
</el-row>
|
<el-row :span="1">
|
<div class="card-container">
|
<el-card class="other-box-card" v-for="deviceInfo in devicePointData" :key="deviceInfo.id">
|
<div slot="header" class="linefix">
|
<span>{{ deviceInfo.text }}</span>
|
<div :class="['lineStatus', { 'device-status-0': deviceInfo.plcStatus === true }, { 'device-status-1': deviceInfo.plcStatus === false }]"></div>
|
</div>
|
<div class="otherValuefix" >
|
<el-form label-position="left" label-width="90px">
|
<el-form-item label="WMS明细单号" v-if="deviceInfo.type==5">
|
<el-input v-model="deviceInfo.orderNo" readonly></el-input>
|
</el-form-item>
|
<el-form-item label="任务号">
|
<el-input v-model="deviceInfo.taskNo"></el-input>
|
</el-form-item>
|
<el-form-item label="批次号">
|
<el-input v-model="deviceInfo.lotNo" readonly></el-input>
|
</el-form-item>
|
<el-form-item label="物料编码">
|
<el-input v-model="deviceInfo.skuNo" readonly></el-input>
|
</el-form-item>
|
<el-form-item label="物料名称">
|
<el-input v-model="deviceInfo.skuName" readonly></el-input>
|
</el-form-item>
|
<el-form-item label="分拣线编号" v-if="deviceInfo.type==5">
|
<el-input v-model="deviceInfo.lineNo" readonly></el-input>
|
</el-form-item>
|
<el-form-item label="绑定状态">
|
<el-input :value="deviceInfo.status === '0' ? '未绑定' : '已绑定'" readonly></el-input>
|
</el-form-item>
|
<el-form-item label="抓箱品种">
|
<el-input v-model="deviceInfo.pzNo" readonly></el-input>
|
</el-form-item>
|
<el-form-item label="托盘号">
|
<el-input readonly></el-input>
|
</el-form-item>
|
<el-form-item label="插码箱数" v-if="deviceInfo.type==5">
|
<el-input readonly></el-input>
|
</el-form-item>
|
<el-form-item label="拆垛箱数" v-if="deviceInfo.type==6">
|
<el-input readonly></el-input>
|
</el-form-item>
|
<el-form-item label="整跺箱数">
|
<el-input readonly></el-input>
|
</el-form-item>
|
<el-form-item label="完成箱数">
|
<el-input readonly></el-input>
|
</el-form-item>
|
<!-- <el-form-item label="WMS下发数量">
|
<el-input v-model="deviceInfo.qty" readonly></el-input>
|
</el-form-item> -->
|
<el-form-item label="状态">
|
<el-input :value="deviceInfo.plcStatus ? '在线' : '离线'" readonly></el-input>
|
</el-form-item>
|
</el-form>
|
</div>
|
<!-- 设备类型为码垛机器人 -->
|
<div v-if="deviceInfo.type==5" class="otherButtonfix">
|
<el-form label-position="left">
|
<el-form-item>
|
<el-button type="primary" @click="openBindDialog(deviceInfo.id)">绑定</el-button>
|
<el-button @click="closeBindDialog(deviceInfo.lotNo)">结批</el-button>
|
</el-form-item>
|
</el-form>
|
</div>
|
</el-card>
|
</div>
|
</el-row>
|
</el-col>
|
|
<!-- 绑定任务弹框 -->
|
<el-dialog v-model="bindDialogVisible" title="选择数据">
|
<el-table
|
:data="bindData"
|
highlight-current-row
|
@row-click="handleRowClick"
|
>
|
<el-table-column prop="orderNo" label="WMS下发单号" show-overflow-tooltip="" />
|
<el-table-column prop="taskNo" label="任务号" show-overflow-tooltip="" />
|
<el-table-column prop="lotNo" label="批次号" show-overflow-tooltip="" />
|
<el-table-column prop="skuNo" label="物料编码" show-overflow-tooltip="" />
|
<el-table-column prop="skuName" label="物料名称" show-overflow-tooltip="" />
|
<el-table-column prop="boxType" label="规格" show-overflow-tooltip="" />
|
<el-table-column prop="qty" label="总箱数/计划箱数/预估箱数" show-overflow-tooltip="" />
|
</el-table>
|
<div slot="footer" class="dialog-footer">
|
<el-button @click="bindDialogVisible = false">取消</el-button>
|
<el-button type="primary" @click="confirmBinding">确认</el-button>
|
</div>
|
</el-dialog>
|
</el-container>
|
</template>
|
|
<script lang="ts" setup>
|
import { ref, onMounted } from 'vue';
|
import { GetWcsPackPlcList,GetWcsPackStationPlcList,BindTaskForPLC,CloseTaskForPLC } from '/@/api/wcs/wcsDevice';
|
import { pageWcsOderTask } from '/@/api/device/wcsOderTask';
|
import { ElMessageBox,ElMessage } from 'element-plus';
|
import { signalR,stopConnection } from './signalR';
|
//连接signalR 监听变更
|
onMounted(async () => {
|
signalR.off('PublicCheckTask');
|
signalR.on('PublicCheckTask', (data: any) => {
|
//todo 需要测试
|
// if (data.type == 0) {
|
|
// }
|
var index = devicePointData.value.findIndex(s => s.id == data.id);
|
if (index !== -1) {
|
devicePointData.value.splice(index, 1, data);
|
}
|
});
|
});
|
|
//设备数据
|
const deviceList=ref<any>([]);
|
//设备对应工位数据
|
const devicePointData = ref<any>([]);
|
//选中设备ID
|
const selectedDeviceId=ref<any>();
|
//选中工位ID
|
const selectedStationId=ref<any>();
|
|
const bindDialogVisible = ref(false);
|
const bindData = ref<any>([]);
|
const selectedRow = ref<any>(null);
|
const queryParams = ref<any>({});
|
const tableParams = ref({
|
page: 1,
|
pageSize: 20,
|
total: 0,
|
});
|
|
//获取设备对应的工位数据
|
const fetchStationData = async (plcId: any) => {
|
const res2 = await GetWcsPackStationPlcList({ plcId });
|
devicePointData.value = res2.data.result;
|
};
|
// 获取设备数据
|
const fetchPLCDeviceData = async () => {
|
var res = await GetWcsPackPlcList();
|
deviceList.value = res.data.result;
|
|
if (deviceList.value.length > 0) {
|
selectedDeviceId.value = deviceList.value[0].id;
|
await fetchStationData(selectedDeviceId.value);
|
}
|
};
|
fetchPLCDeviceData();
|
|
//切换设备
|
function chooseDevice(id) {
|
selectedDeviceId.value = id;
|
fetchStationData(selectedDeviceId.value);
|
}
|
|
const handleQuery = async () => {
|
var res = await pageWcsOderTask(Object.assign(queryParams.value, tableParams.value));
|
bindData.value = res.data.result?.items ?? [];
|
tableParams.value.total = res.data.result?.total;
|
};
|
//打开绑定弹框
|
function openBindDialog(id) {
|
selectedStationId.value=null;
|
selectedRow.value=null;
|
|
selectedStationId.value=id;
|
bindDialogVisible.value = true;
|
|
handleQuery();
|
}
|
//点击行时设置选中行
|
function handleRowClick(row) {
|
selectedRow.value = row;
|
}
|
|
//确认绑定操作
|
function confirmBinding() {
|
if (selectedRow.value) {
|
//手动绑定任务到PLC
|
bindTaskForPLC(selectedStationId.value,selectedRow.value.id);
|
|
bindDialogVisible.value = false;
|
} else {
|
ElMessage.error('请选择要绑定的任务!');
|
}
|
}
|
const bindTaskForPLC = async (deviceId: any,oderTaskId:any) => {
|
const res = await BindTaskForPLC({ deviceId,oderTaskId });
|
if(res.status==200){
|
ElMessage.success('绑定成功!');
|
// 刷新
|
fetchStationData(selectedDeviceId.value);
|
}
|
}
|
//结批操作
|
function closeBindDialog(lotNo){
|
// if(lotNo==''){
|
// ElMessage.error('该工位未绑定任务!');
|
// return;
|
// }
|
ElMessageBox.confirm(`确定对该批次任务结批吗?`, '提示', {
|
confirmButtonText: '确定',
|
cancelButtonText: '取消',
|
type: 'warning',
|
})
|
.then(async () => {
|
closeTaskForPLC(lotNo);
|
})
|
.catch(() => {});
|
}
|
const closeTaskForPLC = async (lotNo: string) => {
|
const res = await CloseTaskForPLC({ lotNo });
|
if(res.status==200){
|
ElMessage.success('结批成功!');
|
// 刷新
|
fetchStationData(selectedDeviceId.value);
|
}
|
}
|
|
</script>
|
|
<style scoped>
|
.card-page {
|
width: 100%;
|
height: 50px;
|
display: flex;
|
text-align: center;
|
justify-content: center;
|
align-items: center;
|
text-align: center;
|
}
|
.card-page>button {
|
width: 150px;
|
height: 30px;
|
}
|
.card-container {
|
display: grid;
|
grid-template-columns: repeat(6, 1fr);
|
gap: 10px;
|
}
|
.other-box-card {
|
box-sizing: border-box;
|
background: linear-gradient(135deg, #66ccff, #3399ff);
|
}
|
.lineStatus{
|
position: absolute;
|
right: 0;
|
float: right;
|
height: 20px;
|
width: 20px;
|
border-radius: 20px;
|
background-color: #67C23A;
|
}
|
.linefix{
|
border-bottom: 1px solid rgb(197, 195, 195);
|
display: flex;
|
align-items: center;
|
height: 40px;
|
position: relative;
|
color: #fff;
|
}
|
.otherValuefix{
|
width: 100%;
|
height: 540px;
|
padding: 10px;
|
border-bottom: 1px solid rgb(197, 195, 195);
|
}
|
.otherButtonfix{
|
width: 100%;
|
height: 60px;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
padding: 0;
|
}
|
.device-status-0{
|
background-color: #58f709;
|
}
|
.device-status-1{
|
background-color: red;
|
}
|
.dialog-footer {
|
display: flex;
|
justify-content: flex-end;
|
margin-top: 20px;
|
}
|
.divDisplay{
|
display:none
|
}
|
</style>
|
|