| | |
| | | <template> |
| | | <el-container> |
| | | <div class="card-container"> |
| | | <el-card class="other-box-card" v-for="deviceInfo in deviceList" :key="deviceInfo.id"> |
| | | <div slot="header" class="linefix"> |
| | | <span>{{ deviceInfo.name }}</span> |
| | | <div :class="['lineStatus', { 'device-status-0': deviceInfo.status === 0 }, { 'device-status-1': deviceInfo.status === 1 }]"></div> |
| | | </div> |
| | | <div class="otherValuefix" > |
| | | <el-form label-position="left" label-width="90px"> |
| | | <el-form-item label="WMS明细单号"> |
| | | <el-input></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="任务号"> |
| | | <el-input v-model="deviceInfo.taskNumber"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="物料编码"> |
| | | <el-input></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="物料名称"> |
| | | <el-input></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="包装名称"> |
| | | <el-input></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="状态"> |
| | | <el-input></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="抓箱品种"> |
| | | <el-input></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="DB记录箱数"> |
| | | <el-input></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="托盘号"> |
| | | <el-input></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="码垛箱数"> |
| | | <el-input></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="WMS下发数量"> |
| | | <el-input></el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | <div class="otherButtonfix"> |
| | | <el-form label-position="left"> |
| | | <el-form-item> |
| | | <el-button type="primary">绑定</el-button> |
| | | <el-button>结批</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </el-card> |
| | | <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']"></div> |
| | | <!-- <div :class="['lineStatus', { 'device-status-0': deviceInfo.status === 0 }, { 'device-status-1': deviceInfo.status === 1 }]"></div> --> |
| | | </div> |
| | | <div class="otherValuefix" > |
| | | <el-form label-position="left" label-width="90px"> |
| | | <el-form-item label="WMS明细单号"> |
| | | <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="分拣线编号"> |
| | | <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="插码数量"> |
| | | <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> |
| | | </div> |
| | | <div v-if="!deviceInfo.text.includes('拆垛')" 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-container> |
| | | </el-dialog> |
| | | </el-container> |
| | | </template> |
| | | |
| | | <script lang="ts" setup> |
| | | import { ref, reactive } from 'vue'; |
| | | <script lang="ts" setup> |
| | | import { ref } from 'vue'; |
| | | import { GetWcsPackPlcList,GetWcsPackStationPlcList,BindTaskForPLC,CloseTaskForPLC } from '/@/api/wcs/wcsDevice'; |
| | | import { pageWcsOderTask } from '/@/api/device/wcsOderTask'; |
| | | import { ElMessageBox,ElMessage } from 'element-plus'; |
| | | |
| | | const deviceList=[ |
| | | { |
| | | id: 1, |
| | | name: '1号码垛机器人', |
| | | taskNumber: 'T000001', |
| | | taskType: '', |
| | | plc: '', |
| | | wcs: '', |
| | | status: 0 |
| | | }, |
| | | { |
| | | id: 2, |
| | | name: '2号码垛机器人', |
| | | taskNumber: '', |
| | | taskType: '', |
| | | plc: '', |
| | | wcs: '', |
| | | status: 1 |
| | | }, |
| | | { |
| | | id: 3, |
| | | name: '3号码垛机器人', |
| | | taskNumber: '', |
| | | taskType: '', |
| | | plc: '', |
| | | wcs: '', |
| | | status: 0 |
| | | },{ |
| | | id: 4, |
| | | name: '4号码垛机器人', |
| | | taskNumber: '', |
| | | taskType: '', |
| | | plc: '', |
| | | wcs: '', |
| | | status: 1 |
| | | },{ |
| | | id: 5, |
| | | name: '5号码垛机器人', |
| | | taskNumber: '', |
| | | taskType: '', |
| | | plc: '', |
| | | wcs: '', |
| | | status: 0 |
| | | },{ |
| | | id: 6, |
| | | name: '6号码垛机器人', |
| | | taskNumber: '', |
| | | taskType: '', |
| | | plc: '', |
| | | wcs: '', |
| | | status: 0 |
| | | } |
| | | ] |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .card-container { |
| | | display: grid; |
| | | grid-template-columns: repeat(6, 1fr); |
| | | gap: 10px; |
| | | //设备数据 |
| | | 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); |
| | | } |
| | | .other-box-card { |
| | | box-sizing: border-box; |
| | | }; |
| | | 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; |
| | |
| | | align-items: center; |
| | | height: 40px; |
| | | position: relative; |
| | | color: #fff; |
| | | } |
| | | .otherValuefix{ |
| | | width: 100%; |
| | | height: 600px; |
| | | height: 540px; |
| | | padding: 10px; |
| | | border-bottom: 1px solid rgb(197, 195, 195); |
| | | } |
| | | .otherButtonfix{ |
| | | width: 100%; |
| | | height: 100px; |
| | | height: 60px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | padding: 0; |
| | | } |
| | | .device-status-0{ |
| | | background-color: #67C23A; |
| | | background-color: #58f709; |
| | | } |
| | | .device-status-1{ |
| | | background-color: red; |
| | | } |
| | | </style> |
| | | .dialog-footer { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | margin-top: 20px; |
| | | } |
| | | .divDisplay{ |
| | | display:none |
| | | } |
| | | </style> |
| | | |