<template>
	<gui-page :custom-header="true" :header-class="['gui-theme-background-color']">
		<template #gHeader>
			<view style="height:44px;" class="gui-flex gui-nowrap gui-rows gui-align-items-center">
				<!-- 使用组件实现返回按钮及返回首页按钮 -->
				<text style="font-size:44rpx;" class="gui-header-leader-btns gui-color-white font-icons"
					@tap="goBack">&#xe6c5;</text>
				<!-- 导航文本此处也可以是其他自定义内容 -->
				<text
					class="gui-h4 gui-blod gui-flex1 gui-text-center gui-ellipsis gui-color-white gui-primary-text">备料明细</text>
				<!-- 此处加一个右侧展位元素与左侧同宽，实现标题居中 -->
				<!-- 实际宽度请根据自己情况设置 -->
				<view style="width:40px;" />
				<!-- 如果右侧有其他内容可以利用条件编译和定位来实现-->
			</view>
		</template>
		<template #gBody>
			<view class="list-content">
				<view class="scan">
					<view class="scan-card">
						<uni-easyinput ref="easyinput" v-model="scanBatchNumber" :input-border="false"
							:clearable="false" type="text" focus @focus="handleInputFocus" placeholder="请扫描物料二维码"
							@confirm="handleKeydown" />
						<text class="font-icons" @click="handleScanMaterial">&#xe6b7;</text>
					</view>
				</view>
				<view class="tabs">
					<div class="tabs-list">
						<text :class="!isBefore?'tabs-item-active':'tabs-item'" @click="isBefore = false">备料需求</text>
						<text :class="isBefore?'tabs-item-active':'tabs-item'" @click="isBefore = true">已备物料</text>
					</div>
				</view>
				<view v-if="!isBefore" class="custom-table">
					<uni-table border stripe empty-text="暂无更多数据">
						<!-- 表头行 -->
						<uni-tr class="custom-table-head">
							<uni-th align="center" width="180px">物料</uni-th>
							<uni-th align="center" width="120px">应备数</uni-th>
							<uni-th align="center" width="120px">已备数</uni-th>
						</uni-tr>
						<!-- 表格数据行 -->
						<uni-tr v-for="(item, key) in tableData" :key="key" @click="handleToDetails(item)">
							<uni-td align="center">{{ item.materialNo }}({{ item.materialName }})</uni-td>
							<uni-td align="center">{{ item.shouldPrepareQty }}</uni-td>
							<uni-td align="center"
								style="color: orange;font-weight: bold;">{{ item.preparedQty }}</uni-td>
						</uni-tr>
					</uni-table>
				</view>
				<view v-else class="custom-table">
					<uni-table border stripe empty-text="暂无更多数据">
						<uni-tr class="custom-table-head">
							<uni-th align="center" width="180px">物料</uni-th>
							<uni-th align="center" width="120px">应备数</uni-th>
							<uni-th align="center" width="120px">已备数</uni-th>
						</uni-tr>
						<uni-tr v-for="(item, key) in beforeTableData" :key="key">
							<uni-td align="center">{{ item.materialNo }}({{ item.materialName }})</uni-td>
							<uni-td align="center">{{ item.shouldPrepareQty }}</uni-td>
							<uni-td align="center">{{ item.preparedQty }}</uni-td>
						</uni-tr>
					</uni-table>
				</view>
				<view class="card-list-item"
					style="margin: 12px 0;display: grid;grid-template-columns: 1fr;grid-template-rows: 1fr;"
					@click="handleBtnLight">
					<view class="sign-btn">
						<text
							:style="['font-size: 14px;font-weight: bold;', isLightText?'color: rgba(0, 160, 233, 1)':'']">签收</text>
						<view style="width: 0px;">
							<uni-easyinput ref="signInput" v-model="signText" @focus="handleInputFocus"
								:input-border="false" :clearable="false" type="text" @confirm="handleComplete" />
						</view>
					</view>
				</view>
				<gui-modal ref="modalForm" :custom-class="['gui-bg-white', 'gui-dark-bg-level-3', 'gui-border-radius']"
					title="提示">
					<template #content>
						<view class="gui-padding gui-bg-gray gui-dark-bg-level-2">
							<text class="gui-block gui-text-center gui-text gui-color-gray"
								style="line-height:100rpx; padding:10rpx;">备料超出，是否拆分？</text>
						</view>
					</template>

					<!-- 利用 flex 布局 可以放置多个自定义按钮哦  -->
					<template #btns>
						<view class="gui-flex gui-row gui-space-between operation-flex">
							<view hover-class="gui-tap" class="modal-btns gui-flex1" @tap="modalForm.close()">
								<text class="modal-btns gui-color-gray">取消</text>
							</view>
							<view class="line" />
							<view hover-class="gui-tap" class="modal-btns gui-flex1" @tap="handleSplitMaterial">
								<text class="modal-btns gui-primary-color">确认</text>
							</view>
						</view>
					</template>
				</gui-modal>
				<uni-popup ref="errorTip" type="dialog">
					<uni-popup-dialog type="error" cancel-text="关闭" confirm-text="确认" title="提示"
						:content="errorTipMessage" @confirm="handleCloseErrorTipsModal"
						@close="handleCloseErrorTipsModal" />
				</uni-popup>
			</view>
		</template>
	</gui-page>
</template>

<script>
	import {
		onReachBottom
	} from '@dcloudio/uni-app'
	import {
		ref,
		onMounted,
		defineComponent,
		onBeforeMount
	} from 'vue'
	export default defineComponent({
		setup(options) {
			const popup = ref()
			const queryParams = ref({
				pageSize: 20,
				pageNo: 1,
				masterId: options?.id ?? '',
				wmsProductionWorkOrderBomId: options?.id ?? ''
			})
			const errorTip = ref('')
			const errorTipMessage = ref('')
			const easyinput = ref('')
			const errorState = ref(0)
			const modalForm = ref()
			const parentRow = uni.getStorageSync('masterId') ?? {}
			const masterId = ref('')
			const signInput = ref()
			const signText = ref('')
			const isLightText = ref('')
			const scanBatchNumber = ref('')
			const isBefore = ref(false)
			const tableData = ref([])
			const beforeTableData = ref([])
			const scanMaterialList = ref([])
			// 当前处理的数据行
			const fdIndex = ref(-1)
			// 当前扫描的物料
			const currentScanMaterial = ref([])

			onBeforeMount(() => {
				masterId.value = JSON.parse(parentRow)?.id
			})

			const search = function() {
				uni.$reqGet('getPrepareMatersDetails', {
						masterId: masterId.value
					})
					.then(({
						code,
						data,
						msg
					}) => {
						if (code === 0) {
							uni.setStorageSync('ids', JSON.stringify(data?.list[0]))
							tableData.value.length = 0
							beforeTableData.value.length = 0
							data?.list?.forEach(item => {
								if (item.shouldPrepareQty === item.preparedQty) {
									beforeTableData.value.push(item)
								} else {
									tableData.value.push(item)
								}
							})
						} else {
							uni.showToast({
								title: msg,
								icon: 'none',
								duration: 2000
							})
						}
					})
			}

			onMounted(() => {
				search()
			})

			const goBack = function() {
				if (uni.getStorageSync('ids')) {
					uni.removeStorageSync('ids')
				}
				uni.$goBack('/pages/workbranch/warehouse/production/prepareMaterials')
			}

			const handleScanMaterial = function() {
				// #ifdef APP-PLUS
				const mpaasScanModule = uni.requireNativePlugin('Mpaas-Scan-Module')
				mpaasScanModule.mpaasScan({
						// 扫码识别类型，参数可多选，qrCode、barCode，不设置，默认识别所有
						'scanType': ['qrCode', 'barCode'],
						// 是否隐藏相册，默认false不隐藏
						'hideAlbum': false
					},
					(ret) => {
						if (ret.resp_code === 1000) {
							uni.$reqGet('scanPrepareMaterial', {
									qrCode: ret.resp_result
								})
								.then(async ({
									code,
									data,
									msg
								}) => {
									if (code === 0) {
										scanBatchNumber.value = ret.resp_result
										if (Object.prototype.toString.call(data) ===
											'[object Array]') {
											fdIndex.value = tableData.value.findIndex(item => item
												?.materialNo === data[0]?.materialNo)
										}
										if (fdIndex.value !== -1) {
											currentScanMaterial.value = data[0] ?? []
											if (tableData.value[fdIndex.value].shouldPrepareQty >
												tableData.value[fdIndex.value].preparedQty) {
												uni.$reqPost('scanToPrepare', {
														id: masterId.value,
														materials: data
													})
													.then(res => {
														if (res.code === 0) {
															if (res.data === 0) {
																search()
																setInputFocus()
															} else if (res.data === 1) {
																modalForm.value.open()
															}
														} else {
															// #ifdef APP-PLUS
															plus.device.beep(2)
															// #endif
															errorTipMessage.value = res.msg
															errorTip.value.open()
															errorState.value = 0
														}
													})
											}
										} else {
											// #ifdef APP-PLUS
											plus.device.beep(2)
											// #endif
											errorTipMessage.value = '请扫描所需物料的物料条码'
											errorTip.value.open()
											errorState.value = 0
										}
									} else {
										// #ifdef APP-PLUS
										plus.device.beep(2)
										// #endif
										errorTipMessage.value = msg
										errorTip.value.open()
										errorState.value = 0
									}
								})
						}
					})
				// #endif
			}

			const handleToNavigate = function() {
				uni.navigateTo({
					url: '/pages/workbranch/warehouse/production/materialIssuance'
				})
			}

			const handleComplete = function(e) {
				// #ifdef APP-PLUS
				// 扫描员工工号
				uni.$reqPost('scanPrepareMaterialSign', {
						encodedEmployeeId: e,
						id: masterId.value
					})
					.then(({
						code,
						data,
						msg
					}) => {
						if (code === 0) {
							uni.showToast({
								title: '签收成功',
								icon: 'none',
								duration: 2000
							})
							setTimeout(() => {
								goBack();
							}, 500)
						} else {
							// #ifdef APP-PLUS
							plus.device.beep(2)
							// #endif
							errorTipMessage.value = msg
							errorTip.value.open()
							errorState.value = -1
						}
						isLightText.value = false
						signText.value = ''
					})
				// #endif
			}

			// 物料拆分
			const handleSplitMaterial = function() {
				uni.$reqPost('prepareSplit', {
						prepareId: masterId.value,
						id: scanBatchNumber.value,
						inQty: currentScanMaterial.value?.receiptQty,
						splitQty: tableData.value[fdIndex.value].preparedQty - currentScanMaterial.value
							?.receiptQty
					})
					.then(res => {
						search()
						modalForm.value.close()
						if (res.code === 0) {
							// 调取打印机拆分物料后打印标签
							uni.showToast({
								title: '拆分完毕',
								icon: 'none',
								duration: 2000
							})
						} else {
							// #ifdef APP-PLUS
							plus.device.beep(2)
							// #endif
							errorTipMessage.value = res.msg
							errorTip.value.open()
							errorState.value = 0
						}
					})
			}

			const handleKeydown = function(e) {
				uni.$reqGet('scanPrepareMaterial', {
						qrCode: e
					})
					.then(async ({
						code,
						data,
						msg
					}) => {
						scanBatchNumber.value = e
						if (Object.prototype.toString.call(data) === '[object Array]') {
							fdIndex.value = tableData.value.findIndex(item => item?.materialNo ===
								data[0]?.materialNo)
						}
						if (fdIndex.value !== -1) {
							currentScanMaterial.value = data[0] ?? []
							if (tableData.value[fdIndex.value].shouldPrepareQty > tableData.value[
									fdIndex.value].preparedQty) {
								uni.$reqPost('scanToPrepare', {
										id: masterId.value,
										materials: data
									})
									.then(res => {
										if (res.code === 0) {
											if (res.data === 0) {
												search()
												setInputFocus()
											} else if (res.data === 1) {
												modalForm.value.open()
											}
										} else {
											// #ifdef APP-PLUS
											plus.device.beep(2)
											// #endif
											errorTipMessage.value = res.msg
											errorTip.value.open()
											errorState.value = 0
										}
									})
							}
						} else {
							// #ifdef APP-PLUS
							plus.device.beep(2)
							// #endif
							errorTipMessage.value = '请扫描所需物料的物料条码'
							errorTip.value.open()
							errorState.value = 0
						}
					})
			}

			const handleToDetails = function(ret) {
				uni.navigateTo({
					url: '/pages/workbranch/warehouse/production/mixMaterialDetail'
				})
				uni.setStorageSync('mixMaterialDetail', JSON.stringify(ret))
			}

			// 设置高亮
			const handleBtnLight = function() {
				// #ifdef APP-PLUS
				signInput.value.onBlur()
				isLightText.value = true
				signInput.value.onFocus()
				// #endif
			}

			const setInputFocus = function() {
				scanBatchNumber.value = ''
				easyinput.value.onBlur()
				easyinput.value.onFocus()
			}

			// 关闭错误信息弹窗
			const handleCloseErrorTipsModal = async function() {
				errorTip.value.close()
				if (errorState.value === 0) {
					await setInputFocus()
				}
			}

			// 禁用软键盘
			const handleInputFocus = function() {
				setTimeout(() => {
					uni.hideKeyboard()
				}, 100)
			}

			// uniapp移动端触底事件
			onReachBottom(() => {
				queryParams.value.pageNo += 1
				uni.$reqGet('getPrepareMaterialList', queryParams.value)
					.then(({
						data
					}) => {
						Array.prototype.push.call(scanMaterialList.value, ...data?.list ?? [])
					})
			})
			return {
				option: [{
					text: '删除',
					style: {
						backgroundColor: '#dd524d'
					}
				}],
				goBack,
				popup,
				signText,
				isBefore,
				tableData,
				beforeTableData,
				signInput,
				modalForm,
				easyinput,
				errorTip,
				errorTipMessage,
				handleInputFocus,
				isLightText,
				handleBtnLight,
				handleKeydown,
				scanBatchNumber,
				handleScanMaterial,
				handleToNavigate,
				scanMaterialList,
				handleComplete,
				handleSplitMaterial,
				handleToDetails,
				handleCloseErrorTipsModal
			}
		}
	})
</script>

<style lang="scss" scoped>
	.gui-header-leader-btns {
		color: black;
		font-size: 24px !important;
		margin-left: 24rpx;
	}

	.list-content {
		margin-top: 80px;
		background-color: #edeeee;
	}

	.card-list-flexbox {
		display: flex;
		flex-direction: row;
		align-items: center;
		flex-wrap: wrap;
		margin: 3px 2px;

		.card-list-item {
			width: 750rpx;
			height: 40px;
			margin: 2rpx 0;
			display: flex;
			flex-direction: row;
			align-items: center;
			justify-content: space-between;
			background-color: #fff;

			uni-text {
				font-size: 14px;
				height: 50rpx;
				text-align: left;
				padding: 0 12px;
				display: flex;
				flex-direction: row;
				align-items: center;
			}

			.text-1 {
				flex: 1;
				height: 40px;
				justify-content: flex-start;
			}

			.text-2 {
				flex: 3;
				height: 40px;
				justify-content: flex-end;
				margin-right: 4px;
				padding: 2px 6px;
			}
		}

	}

	.card-list-flexbox:nth-of-type(2) {
		margin-top: 48px;
	}

	.fixedTop {
		bottom: 0 !important;
		top: 3.25rem !important;
	}

	.popup-content {
		height: 75vh;
		overflow-y: scroll;
		background-color: #edeeee;
	}

	.font-icons {
		width: 40px;
		font-size: 20px;
	}

	.scan {
		height: 45px;
		width: calc(100% - 48px);
		margin: 12px;
		padding: 0 12px;
		display: flex;
		justify-content: space-between;
		align-items: center;
		border-radius: 6px;
		background-color: white;

		.scan-card {
			width: 100%;
			display: grid;
			grid-template-rows: 1fr;
			grid-template-columns: 7fr 2fr;
			align-items: center;

			input {
				height: 35px;
				line-height: 35px;
			}

			text {
				width: 100%;
				text-align: right;
			}
		}
	}

	.custom-table {
		height: calc(100vh - 265px);
		min-height: 230px;
		margin: 5px 0;
		// min-height: 600px;
		overflow-y: scroll;
	}

	.modal-btns {
		height: 100rpx;
		line-height: 100rpx;
		display: flex;
		justify-content: center;
		align-items: center;
	}

	.line {
		margin-top: 10rpx;
		height: 80rpx;
		width: 1rpx;
		background-color: #dcdcdc;
	}

	.tabs {
		width: 100%;
		height: 45px;
		display: flex;
		align-items: flex-end;
		padding: 0 2px;
		background-color: white;
		
		.tabs-list {
			border-radius: 3px;
			overflow: hidden;
		}
	
		.tabs-item {
			display: inline-block;
			width: 72px;
			height: 30px;
			line-height: 30px;
			padding: 0 8px;
			font-size: 14px;
			font-weight: bold;
			text-align: center;
			color: black;
			border-bottom: 1.5px dashed #00a0e9;
			transition: all .5s ease-in-out;
		}
	
		.tabs-item-active {
			position: relative;
			display: inline-block;
			width: 72px;
			height: 30px;
			line-height: 30px;
			padding: 0 8px;
			font-size: 14px;
			font-weight: bold;
			text-align: center;
			color: white;
			border-left: 1px solid #00a0e9;
			border-top: 1px solid #00a0e9;
			border-right: 1px solid #00a0e9;
			border-bottom: 1.5px solid #00a0e9;
			border-radius: 5px 5px 0 0;
			animation: .3s linear show;
			background-color: #00a0e9;
		}
	
		.tabs-item-active::before {
			content: '';
			position: absolute;
			left: -10px;
			bottom: 0;
			width: 10px;
			height: 10px;
			background: radial-gradient(circle at 0% 25%, transparent 10px, #00a0e9 0)
		}
	
		.tabs-item-active::after {
			content: '';
			position: absolute;
			right: -10px;
			bottom: 0;
			width: 10px;
			height: 10px;
			background: radial-gradient(circle at 100% 25%, transparent 10px, #00a0e9 0)
		}
	}
	
	@keyframes show {
		from {
			transform: translateY(5%);
		}
	
		to {
			transform: translateY(0%);
		}
	}

	.sign-btn {
		display: flex;
		align-items: center;
		justify-content: center;
		margin: 0 8px;
		border: 1px solid #999999;
		background-color: white;
		border-radius: 6px;
	}
</style>