TaskOperationPanel.vue 10.5 KB
<template>
	<div class="children-body">
		<div class="children-top-container" id="scrollBox">
			<!-- WMS 模块 -->
			<div class="children-item">
				<div class="children-title">WMS</div>
				<div class="square-box">
					<div v-for="(item, index) in wmsData" :key="index">
						<u-subsection v-if="item.ButtonShowType === 'SwitchButton'" v-model="item.Start" :list="item.ButtonName" @tab-change="(val) => handleSubsectionChange(val, item)" />
						<el-switch v-if="item.ButtonShowType === 'RadioButton'" v-model="value" active-color="#13ce66" inactive-color="#ff4949"></el-switch>
						<!-- 动态wms按钮 -->
						<button
							v-if="item.ButtonShowType === 'DefaultButton'"
							@mousedown="handleDown(item, 'wms')"
							@mouseup="handleUp(item, 'wms')"
							@mouseleave="handleUp(item, 'wms')"
							:class="{ disabled: isDeviceTaskReceived }"
							class="reset-btn"
							:style="{
								backgroundColor: item.ButtonStatus == 'True' ? item.ButtonTurnOnColor : item.ButtonTurnOffColor,
							}"
						>
							{{ item.ButtonName }}
						</button>
					</div>
				</div>
			</div>

			<!-- WCS 模块 - 修改为动态接口加载 -->
			<div class="children-item" v-show="isWcsTaskReceived && wcsData.length > 0">
				<div class="children-title">WCS</div>
				<div class="square-box">
					<div v-for="(item, index) in wcsData" :key="index">
						<u-subsection v-if="item.ButtonShowType === 'SwitchButton'" v-model="item.Start" :list="item.ButtonName" @tab-change="(val) => handleSubsectionChange(val, item)" />
						<el-switch v-if="item.ButtonShowType === 'RadioButton'" v-model="value" active-color="#13ce66" inactive-color="#ff4949"></el-switch>
						<!-- 动态WCS按钮 -->
						<button
							v-if="item.ButtonShowType === 'DefaultButton'"
							@mousedown="handleDown(item, 'wcs')"
							@mouseup="handleUp(item, 'wcs')"
							@mouseleave="handleUp(item, 'wcs')"
							class="reset-btn"
							:style="{
								backgroundColor: item.ButtonStatus == 'True' ? item.ButtonTurnOnColor : item.ButtonTurnOffColor,
							}"
						>
							{{ item.ButtonName }}
						</button>
					</div>
				</div>
			</div>

			<!-- 执行设备 模块 -->
			<div class="children-item" v-show="isequipment">
				<div class="children-title">{{ titleEquipment }}</div>
				<div class="square-box">
					<button
						v-for="(item, index) in equipmentData"
						:key="index"
						@mousedown="handleDown(item, 'equipment')"
						@mouseup="handleUp(item, 'equipment')"
						@mouseleave="handleUp(item, 'equipment')"
						class="reset-btn"
						:style="{
							backgroundColor: item.ButtonStatus == 'True' ? item.ButtonTurnOnColor : item.ButtonTurnOffColor,
						}"
					>
						{{ item.ButtonName }}
					</button>
				</div>
			</div>

			<!-- 开始库位 模块 -->
			<div class="children-item" v-show="isstartLocationt">
				<div class="children-title">{{ titlestartLocationt }}</div>
				<div class="square-box">
					<button
						v-for="(item, index) in startLocationtData"
						:key="index"
						@mousedown="handleDown(item, 'startLocation')"
						@mouseup="handleUp(item, 'startLocation')"
						@mouseleave="handleUp(item, 'startLocation')"
						class="reset-btn"
						:style="{
							backgroundColor: item.ButtonStatus == 'True' ? item.ButtonTurnOnColor : item.ButtonTurnOffColor,
						}"
					>
						{{ item.ButtonName }}
					</button>
				</div>
			</div>

			<!-- 结束库位 模块 -->
			<div class="children-item" v-show="isendLocationt">
				<div class="children-title">{{ titleendLocationt }}</div>
				<div class="square-box">
					<button
						v-for="(item, index) in endLocationtData"
						:key="index"
						@mousedown="handleDown(item, 'endLocation')"
						@mouseup="handleUp(item, 'endLocation')"
						@mouseleave="handleUp(item, 'endLocation')"
						class="reset-btn"
						:style="{
							backgroundColor: item.ButtonStatus == 'True' ? item.ButtonTurnOnColor : item.ButtonTurnOffColor,
						}"
					>
						{{ item.ButtonName }}
					</button>
				</div>
			</div>
		</div>
	</div>
</template>

<script>
import USubsection from './subsection.vue' // 保持原有路径

export default {
	components: {
		USubsection,
	},
	props: {
		// 接收父组件传递的核心数据
		wmsData: {
			type: Array,
			default: () => [],
		},
		wcsData: {
			type: Array,
			default: () => [],
		},
		equipmentData: {
			type: Array,
			default: () => [],
		},
		startLocationtData: {
			type: Array,
			default: () => [],
		},
		endLocationtData: {
			type: Array,
			default: () => [],
		},
		titleEquipment: {
			type: String,
			default: '',
		},
		titlestartLocationt: {
			type: String,
			default: '',
		},
		titleendLocationt: {
			type: String,
			default: '',
		},
		isDeviceTaskReceived: {
			type: Boolean,
			default: false,
		},
		isWcsTaskReceived: {
			type: Boolean,
			default: false,
		},
		isequipment: {
			type: Boolean,
			default: false,
		},
		isendLocationt: {
			type: Boolean,
			default: false,
		},
		isstartLocationt: {
			type: Boolean,
			default: false,
		},
		TaskId: {
			type: Number,
			default: 1234,
		},
		baseUrlButton: {
			type: String,
			default: 'http://127.0.0.1:6002/api/BulletinBoard/Mes/V1/ReadData1',
		},
		baseUrlOffTwo: {
			type: String,
			default: 'http://127.0.0.1:6002/api/BulletinBoard/Mes/V1/ReadData1',
		},
	},
	data() {
		return {
			// 仅保留子组件自身的状态(与原代码一致)
			isLongPress: false,
			pressTimer: null,
			value: true,
			currentButtonContext: null,
			lastSwitchActiveTab: null,
			lastSwitchList: [],
			tabClickTimer: null,
		}
	},
	methods: {
		// 抽离原有的按钮事件相关方法(逻辑完全不变)
		handleDown(item, moduleType) {
			this.isLongPress = false
			clearTimeout(this.pressTimer)
			this.currentButtonContext = { item, moduleType }
			this.pressTimer = setTimeout(() => {
				this.isLongPress = true
				this.apiLongPress(item, moduleType)
			}, 500)
		},
		handleUp(item, moduleType) {
			clearTimeout(this.pressTimer)
			if (this.isLongPress) {
				this.apiRelease(item, moduleType)
			}
			this.isLongPress = false
			this.currentButtonContext = null
		},
		apiLongPress(item, moduleType) {
			if (moduleType == 'wms') {
				if (item.EquipmentButtonActions.length == 1) {
					this.wcsPressbtn(item, moduleType)
				}
			} else {
				let logTitle = '执行设备'
				let requestBody = {
					equipmentID: item.EquipmentID,
					buttonID: item.ButtonID,
					buttonActionType: 'press',
				}
				if (moduleType === 'wcs') {
					logTitle = 'WCS模块'
				} else if (moduleType === 'startLocation') {
					logTitle = '开始库位'
				} else if (moduleType === 'endLocation') {
					logTitle = '结束库位'
				}
				const opt = {
					urlSuffix: window.baseOnLineOrOff ? this.baseUrlButton : this.baseUrlOffTwo,
					logTitle: logTitle,
					isUrlALL: true,
					headers: window.baseOnLineOrOff,
					header: window.baseOnLineOrOff,
					type: 'post',
					data: {
						requestMethod: 'post',
						requestUrl: '/api/Button/SendEquipmentButtonAction',
						requestService: 'WCS',
						requestBody: requestBody,
					},
				}
				''.ajax(this, opt, (res) => {
					if (res.data.code == 200) {
						this.$message({
							message: res.data.message,
							type: 'success',
						})
					} else {
						this.$message({
							message: res.data.message,
							type: 'warning',
						})
					}
				})
			}
		},
		wcsPressbtn(item, moduleType) {
			let requestBody = { id: this.TaskId }
			const opt = {
				urlSuffix: window.baseOnLineOrOff ? this.baseUrlButton : this.baseUrlOffTwo,
				logTitle: 'wms按下',
				isUrlALL: true,
				headers: window.baseOnLineOrOff,
				header: window.baseOnLineOrOff,
				type: 'post',
				data: {
					requestMethod: 'post',
					requestUrl: item[0].ActionPLCAddress,
					requestService: 'WMS',
					requestBody: requestBody,
				},
			}
			''.ajax(this, opt, (res) => {
				if (res.data.code == 200) {
					this.$message({
						message: res.data.message,
						type: 'success',
					})
				} else {
					this.$message({
						message: res.data.message,
						type: 'warning',
					})
				}
			})
		},
		apiRelease(item, moduleType) {
			if (moduleType == 'wms') {
				return
			}
			let logTitle = '执行设备'
			let requestBody = {
				equipmentID: item.EquipmentID,
				buttonID: item.ButtonID,
				buttonActionType: 'release',
			}
			if (moduleType === 'wcs') {
				logTitle = 'WCS模块'
			} else if (moduleType === 'startLocation') {
				logTitle = '开始库位'
			} else if (moduleType === 'endLocation') {
				logTitle = '结束库位'
			}
			const opt = {
				urlSuffix: window.baseOnLineOrOff ? this.baseUrlButton : this.baseUrlOffTwo,
				logTitle: logTitle,
				isUrlALL: true,
				headers: window.baseOnLineOrOff,
				header: window.baseOnLineOrOff,
				type: 'post',
				data: {
					requestMethod: 'post',
					requestUrl: '/api/Button/SendEquipmentButtonAction',
					requestService: 'WCS',
					requestBody: requestBody,
				},
			}
			''.ajax(this, opt, (res) => {
				if (res.data.code == 200) {
					this.$message({
						message: res.data.message,
						type: 'success',
					})
				} else {
					this.$message({
						message: res.data.message,
						type: 'warning',
					})
				}
			})
		},
		handleSubsectionChange(activeValue, itemData) {
			let requestBody = ''
			let tempUrl = ''
			let tempTpel = ''
			if (activeValue == 1) {
				requestBody = itemData.EquipmentButtonActions[0].ActionWriteValue
				tempUrl = itemData.EquipmentButtonActions[0].ActionPLCAddress
				tempTpel = itemData.EquipmentButtonActions[0].ActionRequestType
			} else {
				requestBody = itemData.EquipmentButtonActions[1].ActionWriteValue
				tempUrl = itemData.EquipmentButtonActions[1].ActionPLCAddress
				tempTpel = itemData.EquipmentButtonActions[1].ActionRequestType
			}
			const opt = {
				urlSuffix: window.baseOnLineOrOff ? this.baseUrlButton : this.baseUrlOffTwo,
				logTitle: '大滑动开关',
				isUrlALL: true,
				headers: window.baseOnLineOrOff,
				header: window.baseOnLineOrOff,
				type: 'post',
				data: {
					requestMethod: tempTpel,
					requestUrl: tempUrl,
					requestService: 'WCS',
					requestBody: requestBody,
				},
			}
			''.ajax(this, opt, (res) => {
				if (res.data.code == 200) {
					this.$message({
						message: res.data.message,
						type: 'success',
					})
				} else {
					this.$message({
						message: res.data.message,
						type: 'warning',
					})
				}
			})
		},
	},
	beforeDestroy() {
		if (this.pressTimer) clearTimeout(this.pressTimer)
		if (this.tabClickTimer) clearTimeout(this.tabClickTimer)
	},
}
</script>

<!-- 样式无需修改,原样式文件路径保持不变 -->
<style src="./taskModel.css" scoped></style>