207 lines
4.5 KiB
Vue
207 lines
4.5 KiB
Vue
|
|
<template>
|
|||
|
|
<view>
|
|||
|
|
<t-emp />
|
|||
|
|
<view class="btns">
|
|||
|
|
<button type="primary" class="btn" @click="search">查询</button>
|
|||
|
|
<button type="primary" class="btn" @click="endAll" :disabled="searchEqpWithEmp.length===0">全部下机</button>
|
|||
|
|
</view>
|
|||
|
|
<h2 class="endableEqp">可下机设备</h2>
|
|||
|
|
<view class="eqps" v-for="(item, index) in searchEqpWithEmp" :key="index">
|
|||
|
|
<view class="info">
|
|||
|
|
<view class="item">设备编码:{{ item.eqpCode }}</view>
|
|||
|
|
<view class="item">设备名称:{{ item.eqpName }}</view>
|
|||
|
|
</view>
|
|||
|
|
<button type="primary" class="end" @click="end(index)">下机</button>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script>
|
|||
|
|
import {
|
|||
|
|
addEnd,
|
|||
|
|
listEmpEqpHistory
|
|||
|
|
} from '@/api/basic/empEqpHistory.js'
|
|||
|
|
|
|||
|
|
import {
|
|||
|
|
listEmployee
|
|||
|
|
} from '@/api/mes/jobIn.js'
|
|||
|
|
|
|||
|
|
import {
|
|||
|
|
getInfo
|
|||
|
|
} from '@/api/login.js'
|
|||
|
|
|
|||
|
|
export default {
|
|||
|
|
data() {
|
|||
|
|
return {
|
|||
|
|
empCode: this.$store.state.employee.empCode,
|
|||
|
|
empName: this.$store.state.employee.empName,
|
|||
|
|
eqpCode: null,
|
|||
|
|
eqpName: null,
|
|||
|
|
searchEqpWithEmp: [],
|
|||
|
|
endEqp: []
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
methods: {
|
|||
|
|
//根据员工姓名和员工编号来查询已上机但并未下机的设备
|
|||
|
|
//注:只用一个字段无法精确查找,可能查找到老员工
|
|||
|
|
search() {
|
|||
|
|
this.searchEqpWithEmp = [];
|
|||
|
|
listEmpEqpHistory({
|
|||
|
|
empName: this.empName,
|
|||
|
|
empCode: this.empCode
|
|||
|
|
}).then(async res => {
|
|||
|
|
if (res.rows.length > 0) {
|
|||
|
|
for (var i in res.rows) {
|
|||
|
|
//判断是否下机
|
|||
|
|
if (!res.rows[i].endTime) {
|
|||
|
|
this.searchEqpWithEmp.push({
|
|||
|
|
eqpCode: res.rows[i].equipmentCode,
|
|||
|
|
eqpName: res.rows[i].equipmentTitle
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (this.searchEqpWithEmp.length === 0) {
|
|||
|
|
return uni.showToast({
|
|||
|
|
title: '未查询到已上机设备',
|
|||
|
|
icon: 'none'
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
this.$modal.showToast('没有可下机设备')
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
end(index) {
|
|||
|
|
this.$modal.loading('操作中')
|
|||
|
|
addEnd({
|
|||
|
|
empCode: this.empCode,
|
|||
|
|
eqpCode: this.searchEqpWithEmp[index].eqpCode
|
|||
|
|
}).then(res => {
|
|||
|
|
this.$modal.closeLoading();
|
|||
|
|
this.$modal.msgSuccess("下机成功!")
|
|||
|
|
this.search()
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
endAll() {
|
|||
|
|
// 确认存在可下机设备
|
|||
|
|
if (this.searchEqpWithEmp.length === 0) {
|
|||
|
|
return uni.showToast({
|
|||
|
|
title: '没有可下机设备',
|
|||
|
|
icon: 'none'
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 确认操作弹窗
|
|||
|
|
uni.showModal({
|
|||
|
|
title: '操作确认',
|
|||
|
|
content: `确定要下机全部${this.searchEqpWithEmp.length}台设备吗?`,
|
|||
|
|
success: async (res) => {
|
|||
|
|
if (res.confirm) {
|
|||
|
|
try {
|
|||
|
|
this.$modal.loading('批量下机中...')
|
|||
|
|
|
|||
|
|
// 创建所有设备的Promise数组
|
|||
|
|
const requests = this.searchEqpWithEmp.map(device =>
|
|||
|
|
addEnd({
|
|||
|
|
empCode: this.empCode, // 使用动态empCode
|
|||
|
|
eqpCode: device.eqpCode
|
|||
|
|
})
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// 并发执行所有请求
|
|||
|
|
const results = await Promise.all(requests)
|
|||
|
|
|
|||
|
|
// 检查所有结果
|
|||
|
|
const allSuccess = results.every(res => res.code === 200)
|
|||
|
|
if (allSuccess) {
|
|||
|
|
this.$modal.msgSuccess(`成功下机${results.length}台设备`)
|
|||
|
|
this.search() // 刷新列表
|
|||
|
|
} else {
|
|||
|
|
uni.showToast({
|
|||
|
|
title: '部分设备下机失败',
|
|||
|
|
icon: 'none'
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
} catch (error) {
|
|||
|
|
uni.showToast({
|
|||
|
|
title: '批量下机操作异常',
|
|||
|
|
icon: 'none'
|
|||
|
|
})
|
|||
|
|
} finally {
|
|||
|
|
this.$modal.closeLoading()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style scoped lang="scss">
|
|||
|
|
page {
|
|||
|
|
padding: 60rpx 40rpx;
|
|||
|
|
color: #000;
|
|||
|
|
font-size: 40rpx;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.empName {
|
|||
|
|
display: inline-block;
|
|||
|
|
margin-left: 80rpx;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.btns {
|
|||
|
|
margin-top: 100rpx;
|
|||
|
|
display: flex;
|
|||
|
|
justify-content: space-between;
|
|||
|
|
|
|||
|
|
.btn {
|
|||
|
|
width: 300rpx;
|
|||
|
|
height: 100rpx;
|
|||
|
|
margin: 0;
|
|||
|
|
font-size: 40rpx;
|
|||
|
|
background-color: deepskyblue;
|
|||
|
|
border: none;
|
|||
|
|
color: #fff;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.endableEqp {
|
|||
|
|
margin: 60rpx 0 40rpx;
|
|||
|
|
text-align: center;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.eqps {
|
|||
|
|
display: flex;
|
|||
|
|
justify-content: space-between;
|
|||
|
|
align-items: center;
|
|||
|
|
position: relative;
|
|||
|
|
width: 100%;
|
|||
|
|
padding: 20rpx;
|
|||
|
|
border: 1px solid #ccc;
|
|||
|
|
border-radius: 10rpx;
|
|||
|
|
margin-bottom: 20rpx;
|
|||
|
|
background-color: #f9f9f9;
|
|||
|
|
|
|||
|
|
.info {
|
|||
|
|
flex: 1;
|
|||
|
|
margin-right: 20rpx;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.item {
|
|||
|
|
margin-bottom: 10rpx;
|
|||
|
|
font-weight: bold;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.end {
|
|||
|
|
position: absolute;
|
|||
|
|
top: 20rpx;
|
|||
|
|
right: 20rpx;
|
|||
|
|
width: 200rpx;
|
|||
|
|
height: 90rpx;
|
|||
|
|
background-color: deepskyblue;
|
|||
|
|
border: none;
|
|||
|
|
color: #fff;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</style>
|