指令、任务管理

This commit is contained in:
2024-07-18 15:40:32 +08:00
parent 2a02886a3d
commit c0fb3571e1
14 changed files with 421 additions and 151 deletions

View File

@@ -56,6 +56,22 @@
}
}
,{
"path" : "pages/modules/command-manage",
"style" :
{
"navigationStyle": "custom"
}
}
,{
"path" : "pages/modules/task-manage",
"style" :
{
"navigationStyle": "custom"
}
}
],
"globalStyle": {
// "pageOrientation": "landscape",

View File

@@ -35,7 +35,9 @@
{id: '1', name: '工单管理', icon: 'RF01', path: '/pages/modules/man-paichan'},
{id: '2', name: '涂线板', icon: 'RF02', path: '/pages/modules/wire-board'},
{id: '3', name: '物料库存', icon: 'RF03', path: '/pages/modules/mater-inventory'},
{id: '4', name: '库存管理', icon: 'RF04', path: '/pages/modules/point-manage'}
{id: '4', name: '库存管理', icon: 'RF04', path: '/pages/modules/point-manage'},
{id: '5', name: '指令管理', icon: 'RF05', path: '/pages/modules/command-manage'},
{id: '6', name: '任务管理', icon: 'RF06', path: '/pages/modules/task-manage'}
]
};
},

View File

@@ -3,17 +3,19 @@
<nav-bar title="设置" :inner2="true" @goIn="goIn" :show1="false"></nav-bar>
<view class="zd_content">
<view class="zd_wrapper">
<view class="input-wrap">
<view class="input-label">服务器地址</view>
<view class="setup-item">
<view class="setup-label">LMS地址</view>
<input type="text" class="setup-input" placeholder="请输入服务器地址" v-model="addrip">
</view>
</view>
<!-- <view class="zd_wrapper">
<view class="input-wrap">
<view class="input-label">刷新时间(s)</view>
<input type="text" class="setup-input" placeholder="请输入刷新时间" v-model="setTime">
<view class="setup-item">
<view class="setup-label">ACS地址</view>
<input type="text" class="setup-input" placeholder="请输入ACS地址" v-model="acsip">
</view>
</view> -->
<!-- <view class="setup-item">
<view class="setup-label">刷新时间(s)</view>
<input type="text" class="setup-input" placeholder="请输入刷新时间" v-model="setTime">
</view> -->
</view>
</view>
<view class="submit-bar">
<button class="submit-button" @click="_submit">确认</button>
@@ -29,9 +31,8 @@
},
data() {
return {
options: [],
index: '',
addrip: this.$store.getters.baseUrl,
acsip: this.$store.getters.acsUrl,
setTime: this.$store.getters.setTime / 1000
};
},
@@ -49,15 +50,22 @@
})
return
}
if (this.setTime === '') {
if (this.acsip === '') {
uni.showToast({
title: '请填写刷新时间',
title: '请填写ACS地址',
icon: 'none'
})
return
}
// if (this.setTime === '') {
// uni.showToast({
// title: '请填写刷新时间',
// icon: 'none'
// })
// return
// }
// 存值
this.$store.dispatch('setConfig',{baseUrl: this.addrip, setTime: this.setTime * 1000, setPrintName: this.index})
this.$store.dispatch('setConfig',{baseUrl: this.addrip, acsUrl: this.acsip, setTime: this.setTime * 1000})
uni.redirectTo({
url: '/pages/login/login'
})
@@ -68,15 +76,16 @@
<style lang="stylus">
@import '../../common/style/mixin.styl';
.input-wrap
.setup-item
width 100%
_fj()
.input-label
wh(200rpx, 58rpx)
_font(28rpx,58rpx,#464646)
margin-bottom 40rpx
.setup-label
_font(24rpx,40rpx,#000)
.setup-input
_wh(calc(100% - 200rpx), 58rpx)
_wh(100%, 80rpx)
background #fff
_font(28rpx,58rpx,#323232)
padding 0 10rpx
_font(28rpx,80rpx,#323232)
padding 0 28rpx
border 2px solid #e9ecf3
border-radius 12rpx
</style>

View File

@@ -0,0 +1,166 @@
<template>
<view class="zd_container">
<nav-bar title="指令管理"></nav-bar>
<view class="zd_content">
<view class="zd_wrapper">
<view class="filter_item">
<view class="filter_label">关键字</view>
<view class="filter_input_wraper">
<input type="text" class="filter_input" v-model="val1">
</view>
</view>
<view class="filter_item">
<view class="filter_label">起始设备</view>
<view class="filter_input_wraper">
<search-box
v-model="val2"
/>
</view>
</view>
<view class="filter_item">
<view class="filter_label">目标设备</view>
<view class="filter_input_wraper">
<search-box
v-model="val3"
/>
</view>
</view>
</view>
<view class="zd_wrapper grid-wraper">
<view class="slide_new">
<table>
<thead>
<tr>
<th>任务号</th>
<th>指令号</th>
<th>起点</th>
<th>终点</th>
<th>状态</th>
<th>执行步骤</th>
<th>载具号</th>
<th>优先级</th>
<th>时间</th>
<th>agv车号</th>
</tr>
</thead>
<tbody>
<tr v-for="(e, i) in dataList" :key="i" @click="toCheck(e)" :class="{'checked': e.inst_uuid === pkId}">
<td>{{e.task_no}}</td>
<td>{{e.instruction_code}}</td>
<td>{{e.start_devicecode}}</td>
<td>{{e.next_devicecode}}</td>
<td>{{e.inst_status_name}}</td>
<td>{{e.inst_step}}</td>
<td>{{e.carrier}}</td>
<td>{{e.priority}}</td>
<td>{{e.create_time}}</td>
<td>{{e.carno}}</td>
</tr>
</tbody>
</table>
</view>
</view>
</view>
<view class="zd-row submit-bar_new">
<button class="zd-col-6 submit-button_new" :class="{'btn-disabled': !pkId}" :disabled="disabled" @tap="toSure1('1')">指令撤销</button>
<button class="zd-col-6 submit-button_new" :class="{'btn-disabled': !pkId}" :disabled="disabled" @tap="toSure2('2')">重新下发</button>
<button class="zd-col-6 submit-button_new" :class="{'btn-disabled': !pkId}" :disabled="disabled" @tap="toSure3('3')">强制完成</button>
<button class="zd-col-5 submit-button_new" :disabled="disabled" @tap="_handInsts">查询</button>
</view>
</view>
</template>
<script>
import NavBar from '@/components/NavBar.vue'
import SearchBox from '@/components/SearchBox.vue'
import {handInsts, handInst} from '@/utils/getData2.js'
export default {
components: {
NavBar,
SearchBox
},
data() {
return {
val1: '',
val2: '',
val3: '',
data: [],
dataList: [],
disabled: false,
pkId: ''
};
},
created () {
this._handInsts(this.val1, this.val2, this.val3)
},
methods: {
async _handInsts () {
this.show = false
try {
let res = await handInsts(this.val1, this.val2, this.val3)
this.data = [...res.data]
this.dataList = [...this.data]
} catch (e) {
uni.showToast({
title: res.message,
icon: 'none'
})
}
},
async _handInst (type) {
this.disabled = true
if (!this.pkId) {
this.disabled = false
return
}
try {
let res = await handInst(type, this.pkId)
this.disabled = false
this.pkId = ''
this._handInsts()
uni.showToast({
title: res.message,
icon: 'none'
})
} catch (e) {
this.disabled = false
}
},
toCheck (e) {
this.pkId = this.pkId === e.inst_uuid ? '' : e.inst_uuid
},
toSure1 (type) {
this.disabled = true
if (!this.pkId) {
this.disabled = false
return
}
this._handInst(type)
},
toSure2 (type) {
this.disabled = true
if (!this.pkId) {
this.disabled = false
return
}
this._handInst(type)
},
toSure3 (type) {
this.disabled = true
if (!this.pkId) {
this.disabled = false
return
}
this._handInst(type)
}
}
}
</script>
<style lang="stylus">
// .submit-bar
// justify-content: space-around;
// .submit-button
// margin: 0 0px 10px 0;
</style>

View File

@@ -0,0 +1,151 @@
<template>
<view class="zd_container">
<nav-bar title="任务管理"></nav-bar>
<view class="zd_content">
<view class="zd_wrapper">
<view class="filter_item">
<view class="filter_label">关键字</view>
<view class="filter_input_wraper">
<input type="text" class="filter_input" v-model="val1">
</view>
</view>
<view class="filter_item">
<view class="filter_label">起始设备</view>
<view class="filter_input_wraper">
<search-box
v-model="val2"
/>
</view>
</view>
<view class="filter_item">
<view class="filter_label">目标设备</view>
<view class="filter_input_wraper">
<search-box
v-model="val3"
/>
</view>
</view>
</view>
<view class="zd_wrapper grid-wraper">
<view class="slide_new">
<table>
<thead>
<tr>
<th>任务号</th>
<th>起点</th>
<th>终点</th>
<th>状态</th>
<th>优先级</th>
<th>时间</th>
<th>载具号</th>
</tr>
</thead>
<tbody>
<tr v-for="(e, i) in dataList" :key="i" @click="toCheck(e)" :class="{'checked': e.task_uuid === pkId}">
<td>{{e.task_no}}</td>
<td>{{e.start_devicecode}}</td>
<td>{{e.next_devicecode}}</td>
<td>{{e.task_status_name}}</td>
<td>{{e.priority}}</td>
<td>{{e.create_time}}</td>
<td>{{e.carrier}}</td>
</tr>
</tbody>
</table>
</view>
</view>
</view>
<view class="zd-row submit-bar_new">
<button class="zd-col-8 submit-button_new" :class="{'btn-disabled': !pkId}" :disabled="disabled" @tap="toSure1('1')">重新生成</button>
<button class="zd-col-8 submit-button_new" :class="{'btn-disabled': !pkId}" :disabled="disabled" @tap="toSure2('2')">强制完成</button>
<button class="zd-col-5 submit-button_new" :disabled="disabled" @tap="_handTasks">查询</button>
</view>
</view>
</template>
<script>
import NavBar from '@/components/NavBar.vue'
import SearchBox from '@/components/SearchBox.vue'
import {handTasks, handTaskoperation} from '@/utils/getData2.js'
export default {
components: {
NavBar,
SearchBox
},
data() {
return {
val1: '',
val2: '',
val3: '',
data: [],
dataList: [],
disabled: false,
pkId: ''
};
},
created () {
this._handTasks()
},
methods: {
async _handTasks () {
this.show = false
try {
let res = await handTasks(this.val1, this.val2, this.val3)
this.data = [...res.data]
this.dataList = [...this.data]
} catch (e) {
uni.showToast({
title: res.message,
icon: 'none'
})
}
},
async _handTaskoperation (type) {
this.disabled = true
if (!this.pkId) {
this.disabled = false
return
}
try {
let res = await handTaskoperation(type, this.pkId)
this.disabled = false
this.pkId = ''
this._handTasks()
uni.showToast({
title: res.message,
icon: 'none'
})
} catch (e) {
this.disabled = false
}
},
toCheck (e) {
this.pkId = this.pkId === e.task_uuid ? '' : e.task_uuid
},
toSure1 (type) {
this.disabled1 = true
if (!this.pkId) {
this.disabled1 = false
return
}
this._handTaskoperation(type)
},
toSure2 (type) {
this.disabled2 = true
if (!this.pkId) {
this.disabled2 = false
return
}
this._handTaskoperation(type)
}
}
}
</script>
<style lang="stylus">
// .submit-bar
// justify-content: space-around;
// .submit-button
// margin: 0 0px 10px 0;
</style>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
static/image/menu/RF05.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
static/image/menu/RF06.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -1 +0,0 @@
import request from './request.js'

View File

@@ -1,5 +1,4 @@
import request from './request.js'
import request1 from './request1.js'
// 版本更新测试
export const pdaUpdate = () => request({
@@ -97,4 +96,49 @@ export const changePointQty = (id, qty) => request({
group_id: id,
qty: qty
}
})
/**
* 指令管理
*/
// 1.1 查询未完成指令(生成任务号为-开头)
export const handInsts = (key, scode, ncode) => request({
url:'api/hand/insts',
acsurl: true,
data: {
keyword: key,
start_devicecode: scode,
next_devicecode: ncode
}
})
// 1.2 指令操作
export const handInst = (type, id) => request({
url:'api/hand/inst',
acsurl: true,
data: {
type: type,
inst_uuid: id
}
})
/**
* 任务管理
*/
// 1.1 1.1 查询无指令的任务(任务号为-开头)
export const handTasks = (key, scode, ncode) => request({
url:'api/hand/tasks',
acsurl: true,
data: {
keyword: key,
start_devicecode: scode,
next_devicecode: ncode
}
})
// 1.2 任务操作
export const handTaskoperation = (type, id) => request({
url:'api/hand/taskoperation',
acsurl: true,
data: {
type: type,
task_uuid: id
}
})

View File

@@ -5,6 +5,7 @@ const request = (params) => {
let url = params.url;
let method = params.method || 'POST';
let data = params.data || {};
let acsurl = params.acsurl
// data.token = "default-access_token"
// if (!params.token) {
// let token = uni.getStorageSync('token');
@@ -34,7 +35,10 @@ const request = (params) => {
}
// data = qs.stringify(data)
}
const requestUrl = `${store.getters.baseUrl}/` + url;
let requestUrl = `${store.getters.baseUrl}/` + url;
if (acsurl) {
requestUrl = `${store.getters.acsUrl}/` + url;
}
uni.showLoading({
title: '加载中...'
});

View File

@@ -1,126 +0,0 @@
import store from '@/vuex/store'
const request1 = (params) => {
let _self = this;
let url = params.url;
let method = params.method || 'POST';
let data = params.data || {};
// data.token = "default-access_token"
// if (!params.token) {
// let token = uni.getStorageSync('token');
// if (!token) {
// uni.navigateTo({
// url: '/pages/login/login'
// });
// } else {
// data.token = '179509245-9c91827e0224bdc18d0b118b8be1b5af';
// }
// }
let token = ''
if (store.getters.saveToken !== '') {
token = store.getters.saveToken
}
let defaultOpot = {
// 'Content-Type': 'application/x-www-form-urlencoded',
'Terminal-Type': 'innerH5',
'Content-Type': 'application/json;charset=UTF-8',
}
let header = {}
method = method.toUpperCase()
if (method == 'POST') {
header = {
'Content-Type': 'application/json;charset=UTF-8',
'Authorization': token
}
// data = qs.stringify(data)
}
const requestUrl = url;
uni.showLoading({
title: '加载中...'
});
return new Promise((resolve, reject) => {
uni.request({
url: requestUrl,
method: method,
header: Object.assign({}, defaultOpot, header),
data: data,
dataType: 'json',
})
.then(res => { // 成功
if (res.length === 1) {
uni.showModal({
content: 'request:fail',
showCancel: false
})
reject('request:fail')
} else if (res[1] && res[1].statusCode === 400) {
uni.showModal({
content: res[1].data.message,
showCancel: false
})
reject(res[1].data.message)
} else if (res[1] && res[1].statusCode === 401) {
uni.showModal({
content: res[1].data.message,
showCancel: false
})
store.dispatch('delUserInfo', '')
uni.redirectTo({
url: '/pages/login/login'
})
} else if (res[1] && res[1].statusCode === 200) {
let {
data: dataType
} = res[1]
resolve(dataType)
// switch (dataType.code * 1) { // 拦截返回参数
// case 0:
// resolve(dataType)
// break;
// case 1003:
// uni.showModal({
// title: '登录已过期',
// content: '很抱歉,登录已过期,请重新登录',
// confirmText: '重新登录',
// success: function(res) {
// if (res.confirm) {
// uni.navigateTo({
// // 切记这儿需要哈pages.json保持一致不能有.vue后缀
// url: '/pages/login/login'
// });
// } else if (res.cancel) {
// console.log('用户点击取消');
// }
// }
// })
// break;
// case -1:
// uni.showModal({
// title: '请求数据失败',
// content: '获取数据失败!',
// confirmText: '确定',
// showCancel: false,
// success: function(res) {
// if (res.confirm) {} else if (res.cancel) {
// console.log('用户点击取消');
// }
// }
// })
// break
// }
}else {
uni.showModal({
content: res[1].data.message,
showCancel: false
})
reject(res[1].data.message)
}
})
.catch(err => { // 错误
reject(err)
})
.finally(() => {
uni.hideLoading();
})
})
}
export default request1

View File

@@ -1,8 +1,10 @@
import * as types from '../types'
const baseUrl = process.env.NODE_ENV === 'development' ? 'http://10.1.3.90:8010' : 'http://10.1.3.90:8010'
const acsUrl = process.env.NODE_ENV === 'development' ? 'http://10.1.3.90:8010' : 'http://10.1.3.90:8010'
const state = {
baseUrl: uni.getStorageSync('baseUrl') || baseUrl,
acsUrl: uni.getStorageSync('acsUrl') || acsUrl,
setTime: uni.getStorageSync('setTime') || 5000,
setPrintName: uni.getStorageSync('setPrintName') || '',
loginName: uni.getStorageSync('loginName') ? uni.getStorageSync('loginName') : '',
@@ -11,6 +13,7 @@ const state = {
}
const getters = {
baseUrl: state => state.baseUrl,
acsUrl: state => state.acsUrl,
setTime: state => state.setTime,
setPrintName: state => state.setPrintName,
loginName: state => state.loginName,
@@ -20,6 +23,7 @@ const getters = {
const actions = {
setConfig ({commit}, res) {
uni.setStorageSync('baseUrl', res.baseUrl)
uni.setStorageSync('acsUrl', res.acsUrl)
uni.setStorageSync('setTime', res.setTime)
uni.setStorageSync('setPrintName', res.setPrintName)
commit(types.COM_CONFIG, res)
@@ -49,6 +53,7 @@ const actions = {
const mutations = {
[types.COM_CONFIG] (state, res) {
state.baseUrl = res.baseUrl
state.acsUrl = res.acsUrl
state.setTime = res.setTime
state.setPrintName = res.setPrintName
},