409 lines
12 KiB
Vue
409 lines
12 KiB
Vue
<template>
|
||
<view class="container">
|
||
<view class="topBox">
|
||
<!-- <view>
|
||
<span>任务编号:</span>
|
||
<span>111223334455555</span>
|
||
</view>
|
||
<view>
|
||
<span>任务描述:</span>
|
||
<span>样品入库</span>
|
||
</view>
|
||
<view>
|
||
<span>物料编码:</span>
|
||
<span>112222323</span>
|
||
</view>
|
||
<view>
|
||
<span>作业数量:</span>
|
||
<span>4</span>
|
||
</view>
|
||
<view>
|
||
<span>起始位置:</span>
|
||
<span>A1111111</span>
|
||
</view>
|
||
<view>
|
||
<span>目标位置:</span>
|
||
<span>G222222</span>
|
||
</view>
|
||
<view>
|
||
<span>创建时间:</span>
|
||
<span>2025-07-01 11::11::22</span>
|
||
</view>
|
||
<view>
|
||
<span>启用联动:</span>
|
||
</view> -->
|
||
<uv-form labelPosition="left" :model="taskDetail" ref="form" labelWidth="120">
|
||
<uv-form-item label="任务编号" borderBottom >
|
||
<uv-input v-model="taskDetail.taskNo" border="none">
|
||
</uv-input>
|
||
</uv-form-item>
|
||
<uv-form-item label="任务描述" borderBottom >
|
||
<uv-input v-model="taskDetail.taskDtl" border="none">
|
||
</uv-input>
|
||
</uv-form-item>
|
||
<uv-form-item label="物料编码" borderBottom >
|
||
<uv-input v-model="taskDetail.mid" border="none">
|
||
</uv-input>
|
||
</uv-form-item>
|
||
<!-- <uv-form-item label="作业数量" borderBottom >
|
||
<uv-input v-model="taskDetail.num" border="none">
|
||
</uv-input>
|
||
</uv-form-item> -->
|
||
<uv-form-item label="起始位置" borderBottom >
|
||
<uv-input v-model="taskDetail.sourceName" border="none">
|
||
</uv-input>
|
||
</uv-form-item>
|
||
<uv-form-item label="目标位置" borderBottom >
|
||
<uv-input v-model="taskDetail.targetName" border="none">
|
||
</uv-input>
|
||
</uv-form-item>
|
||
<uv-form-item label="创建时间" >
|
||
<uv-input v-model="taskDetail.createTime" border="none">
|
||
</uv-input>
|
||
</uv-form-item>
|
||
</uv-form>
|
||
</view>
|
||
<view class="lineBox"></view>
|
||
<view class="statusBox">
|
||
<view class="titleBox">运行状态</view>
|
||
<view class="statusShowBox">
|
||
<view v-for="(item, index) in taskTips" :key="index" class="everyLine">{{ item }}</view>
|
||
<!-- <view class="everyLine">发送物资移库出入台指令成功</view>
|
||
<view class="everyLine">发送物资移库出入台指令成功</view>
|
||
<view class="everyLine">发送物资移库出入台指令成功</view>
|
||
<view>发送物资移库出入台指令成功</view>
|
||
<view>发送物资移库出入台指令成功</view>
|
||
<view>发送物资移库出入台指令成功</view>
|
||
<view>发送物资移库出入台指令成功</view>
|
||
<view>发送物资移库出入台指令成功</view>
|
||
<view>发送物资移库出入台指令成功</view>
|
||
<view>发送物资移库出入台指令成功</view>
|
||
<view>发送物资移库出入台指令成功</view>
|
||
<view>发送物资移库出入台指令成功</view>
|
||
<view>发送物资移库出入台指令成功</view>
|
||
<view>发送物资移库出入台指令成功</view> -->
|
||
</view>
|
||
</view>
|
||
<view class="btn">
|
||
<!-- :disabled="endTask" -->
|
||
<view class="everyBtn"><uv-button type="primary" shape="circle" text="执行任务" class="mainBtn" @click="startTask" :disabled="endTask"></uv-button></view>
|
||
<!-- <view class="everyBtn"><uv-button type="error" :plain="true" shape="circle" text="取消任务" @click="submit" :disabled="endTask"></uv-button></view> -->
|
||
<view class="everyBtn"><uv-button type="error" :plain="true" shape="circle" text="删除任务" @click="delTaskFun" ></uv-button></view>
|
||
<!-- :disabled="endTask" -->
|
||
</view>
|
||
<uv-modal ref="modal" title="提示" cancelText="取消" showCancelButton content='确定要删除吗?' @confirm="confirmDel"></uv-modal>
|
||
</view>
|
||
</template>
|
||
<script >
|
||
// import {executeTask,agvStatus,taskDetailF,wcsTask,wcsStatus} from "@/api/dispatch"
|
||
import {executeTask,agvStatus,wcsTask,wcsStatus,outGoods,taskDetailF,delTask} from "@/api/dispatch"
|
||
export default{
|
||
data(){
|
||
return{
|
||
taskDetail:{
|
||
taskNo:"",
|
||
taskDtl:"",
|
||
mid:"",
|
||
num:null,
|
||
sourceName:"",
|
||
targetName:"",
|
||
createTime:"",
|
||
taskType:"",
|
||
id:null
|
||
},
|
||
taskStatus:false, //任务状态
|
||
endTask:false,
|
||
taskTips:[],
|
||
wcs_TaskID:-1
|
||
}
|
||
},
|
||
onLoad(options){
|
||
// console.log(11111)
|
||
if(options){
|
||
// console.log(options)
|
||
this.taskDetailFun(options.id)
|
||
}
|
||
// console.log(options)
|
||
},
|
||
methods:{
|
||
//任务详情
|
||
taskDetailFun(id){
|
||
taskDetailF(id).then(res => {
|
||
// console.log(1111)
|
||
if(res.code==200){
|
||
this.taskDetail = res.data
|
||
if(this.taskDetail.taskStatus==2 || this.taskDetail.taskStatus==1){
|
||
this.endTask = true
|
||
}
|
||
}
|
||
// console.log(res)
|
||
})
|
||
|
||
},
|
||
//执行任务
|
||
startTask(){
|
||
if(this.taskStatus){
|
||
uni.showToast({
|
||
title: '任务执行中,请勿重复执行',
|
||
icon: 'error',
|
||
mask: true
|
||
})
|
||
return
|
||
}
|
||
if(this.taskDetail.taskType=='0'){ //上架
|
||
this.in_storage()
|
||
}else if(this.taskDetail.taskType=='1'){ //下架
|
||
this.out_storage()
|
||
}
|
||
// if(!confirm("确定执行调度任务?")){
|
||
// return
|
||
// }
|
||
},
|
||
async in_storage(){
|
||
this.taskStatus = true
|
||
// console.log(2222)
|
||
var first = this.taskDetail.targetName.substr(0,1);
|
||
var aindex = this.taskDetail.targetName.substr(5,1);
|
||
let requestId = ""
|
||
if(first == "A"){
|
||
var owner = "wms";
|
||
var type = 0;
|
||
var priority = 1;
|
||
// var sourceName = startLoc;
|
||
var agvTargetName = "V01-010101"; //履带的位置叫V01-010101,也是叉车要放货的位置;页面上输入的起始位置V01-230101,指的是叉车取货的开始位置
|
||
if(aindex == '5' || aindex == '6')
|
||
{
|
||
agvTargetName = "V01-090101";
|
||
}
|
||
// 调用AGV执行接口
|
||
// const agvObj = {"taskNo":this.taskDetail.taskNo,"owner":owner, "type":type, "priority":priority, "sourceName":this.taskDetail.sourceName, "targetName":agvTargetName}
|
||
const agvObj = {"id":this.taskDetail.id,"targetName":agvTargetName,"materialStatus":1}
|
||
const agvResult = await executeTask(agvObj)
|
||
// console.log(1111111)
|
||
// console.log(agvResult)
|
||
// return
|
||
//调用AGV成功
|
||
// agvResult.code==200
|
||
if(agvResult.code==200){
|
||
requestId = agvResult.data.requestId
|
||
this.taskTips.push("发送物资移库出入台指令成功")
|
||
var flag2 = false;
|
||
var ishow = false;
|
||
if(this.taskDetail.targetName == "A01-040903" || this.taskDetail.targetName == "A01-043204"){
|
||
|
||
}else{
|
||
const that = this
|
||
var timId2 = setInterval(function(){
|
||
if(flag2) return;
|
||
flag2 = true;
|
||
//获取AGV执行任务的状态
|
||
agvStatus({"requestId": requestId,"status":"TAKE_DOWN_COMPLETED"}).then(res => {
|
||
flag2 = false;
|
||
if(res.code==200 && res.data !=201){
|
||
clearInterval(timId2);
|
||
that.taskTips.push("AGV放货至出入台完成")
|
||
var Materialstatus = 1;
|
||
if(that.taskDetail.mid == "" || that.taskDetail.mid == "0" || that.taskDetail.mid == 0)
|
||
{
|
||
Materialstatus = 0;
|
||
}
|
||
// this.taskTips.push("WCS入库指令发送成功")
|
||
// 向WCS发送入库指令(可能后端自动调用)
|
||
wcsTask({"taskNo":that.taskDetail.taskNo,"materialStatus":Materialstatus,"Location":that.taskDetail.targetName,"mid":that.taskDetail.mid,"num":that.taskDetail.num}).then(res=>{
|
||
if(res.code==200){
|
||
that.wcs_TaskID = res.taskId;
|
||
that.taskTips.push("WCS入库指令发送成功")
|
||
}else{
|
||
that.taskTips.push("WCS入库指令发送失败!")
|
||
}
|
||
})
|
||
}else{
|
||
if(!ishow)
|
||
{
|
||
that.taskTips.push("等待AGV指令执行完成......")
|
||
ishow = true;
|
||
}
|
||
}
|
||
|
||
})
|
||
},5000)
|
||
}
|
||
var flag3 = false;
|
||
var wcs_finish = false;
|
||
const that = this
|
||
var timId3 = setInterval(function(){
|
||
// console.log(11111111)
|
||
// console.log(that.wcs_TaskID)
|
||
if(!flag3){
|
||
flag3 = true;
|
||
if(!wcs_finish){
|
||
wcsStatus({"TaskID": that.wcs_TaskID}).then(res=>{
|
||
flag3 = false;
|
||
if(res.code==200 && res.msg=="200"){
|
||
clearInterval(timId3);
|
||
wcs_finish = true;
|
||
that.taskTips.push("立库物资上架完成")
|
||
//后端修改的任务状态,所以不调接口,直接提示任务完成
|
||
that.taskTips.push("作业任务完成!")
|
||
that.taskStatus = false;
|
||
that.endTask = true
|
||
}
|
||
})
|
||
}
|
||
}
|
||
},5000)
|
||
|
||
|
||
}
|
||
// const agvResult = await taskList({pageNum: 1,pageSize: 10})
|
||
// console.log(11111)
|
||
// console.log(agvResult)
|
||
|
||
}else if(first == "B"){
|
||
//1、给AGV发指令
|
||
//2、检测AGV执行结果
|
||
}
|
||
},
|
||
//下架
|
||
out_storage(){
|
||
this.taskStatus = true
|
||
//1、调用WCS发送下架指令
|
||
var first = this.taskDetail.sourceName.substr(0,1);
|
||
let requestId = ""
|
||
if(first == "A"){
|
||
var Materialstatus = 1;
|
||
if(this.taskDetail.mid == "" || this.taskDetail.mid == "0" || this.taskDetail.mid == 0)
|
||
{
|
||
Materialstatus = 0;
|
||
}
|
||
|
||
//调立库(后端调立库、调叉车)
|
||
executeTask({"id":this.taskDetail.id,"targetName":this.taskDetail.targetName,"materialStatus":Materialstatus}).then(res=>{
|
||
if(res.code==200){
|
||
// this.wcs_TaskID = res.TaskID;
|
||
requestId = res.data.requestId
|
||
this.taskTips.push("向WCS发送物资出库指令成功")
|
||
this.taskTips.push("发送AGV取货指令成功")
|
||
//调AGV
|
||
// var sourceName = "V01-010101";
|
||
// const agvObj = {"id":this.taskDetail.id}
|
||
// executeTask(agvObj).then(res=>{
|
||
// if(res.code==200){
|
||
// requestId = res.requestId
|
||
// this.taskTips.push("发送AGV取货指令成功")
|
||
// //agvLinkWcs
|
||
// }
|
||
// })
|
||
}else{
|
||
uni.showToast({
|
||
title: '任务执行中,操作失败',
|
||
icon: 'error',
|
||
mask: true
|
||
})
|
||
this.taskStatus = false;
|
||
return
|
||
}
|
||
})
|
||
//定时查询 叉车 执行状态
|
||
let flag3 = false;
|
||
var agv_finish = false;
|
||
const that = this
|
||
let timId3 = setInterval(function(){
|
||
if(!flag3){
|
||
flag3 = true;
|
||
if(!agv_finish){
|
||
// END_ARRIVE
|
||
agvStatus({"requestId": requestId,"status":"TAKE_DOWN_COMPLETED"}).then(res=>{
|
||
flag3 = false;
|
||
if(res.code == 200 && res.data != 201){
|
||
clearInterval(timId3);
|
||
agv_finish = true;
|
||
that.taskTips.push("物资移库完成")
|
||
that.taskTips.push("作业任务完成")
|
||
that.taskStatus = false;
|
||
that.endTask = true
|
||
that.$forceUpdate();
|
||
}
|
||
})
|
||
}
|
||
}
|
||
},8000)
|
||
|
||
}else{
|
||
uni.showToast({
|
||
title: '起始位置有误',
|
||
icon: 'error',
|
||
mask: true
|
||
})
|
||
|
||
}
|
||
|
||
},
|
||
//删除任务
|
||
delTaskFun(){
|
||
// this.taskDetail
|
||
this.$refs.modal.open();
|
||
},
|
||
confirmDel(){
|
||
delTask(this.taskDetail.id).then(res=>{
|
||
|
||
if(res.code==200){
|
||
uni.showToast({
|
||
title: '操作成功',
|
||
icon: 'success',
|
||
mask: true
|
||
})
|
||
uni.navigateTo({
|
||
url: '/pagesDispatch/dispatchList',
|
||
})
|
||
}
|
||
})
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
<style scoped lang="scss">
|
||
.container{
|
||
// height: calc(100vh - var(--window-top));
|
||
height: 100vh;
|
||
.topBox{
|
||
padding:0 40rpx;
|
||
height: 40%;
|
||
}
|
||
// background-color: #ededed;
|
||
.lineBox{
|
||
background-color: #ededed;
|
||
height: 40rpx;
|
||
margin-top: 40rpx;
|
||
margin-bottom: 20rpx;
|
||
}
|
||
.statusBox{
|
||
height: 42%;
|
||
|
||
padding:0 20rpx;
|
||
.titleBox{
|
||
// padding-left: 20rpx;
|
||
margin-bottom: 20rpx;
|
||
// font-size: 28rpx;
|
||
font-weight: bold;
|
||
}
|
||
.statusShowBox{
|
||
// background-color: #ededed;
|
||
height: 80%;
|
||
border-radius: 20rpx;
|
||
border:2rpx solid rgb(214, 215, 217);
|
||
overflow: auto;
|
||
.everyLine{
|
||
line-height: 40rpx;
|
||
}
|
||
}
|
||
}
|
||
.btn{
|
||
display: flex;
|
||
justify-content: space-around;
|
||
.everyBtn{
|
||
width: 30%;
|
||
}
|
||
}
|
||
}
|
||
</style> |