<template>
	<view>
		<uni-popup ref="popup" :maskClick='false'>
			<view class="">
				<view class="popup_box">

					<view class="pop_title uni-flex space-between">
						<view class="" style="font-size: 35rpx;">
							扫描箱码
						</view>

						<view class="">
							<image class="fr icons_scan_close" src="/static/icons/icons_scan_close.svg"
								@click="closeScanPopup()"></image>
						</view>
					</view>
					<!-- 	<view class="uni-flex uni-row" style="align-items: center;
						background-color: #fff; 
						margin-left: 20rpx;
						margin-right: 20rpx;
						padding:20rpx;
						border-radius: 8rpx;">
						<view class="uni-center">
							位置 :
						</view>
						<view class="" style="width: 75%;padding: 0rpx">
							<view class="uni-flex u-col-center uni-row" @click="showSelect">
								<view class="" style="margin-left: 15rpx;font-size: 30rpx;">
									{{positionInfo}}
								</view>
								<u-select v-model="show" mode="mutil-column-auto" :list="positionList" :defaultValue="defaultValueList"
									@confirm="confirmSelect"></u-select>
							</view>
						</view>
					</view> -->
					<!-- <u-line class='line_color'></u-line> -->

					<view class="uni-flex uni-row" style="align-items: center;
						background-color: #fff; 
						margin-left: 20rpx;
						margin-right: 20rpx;
						margin-top: 8rpx;
						border-radius: 8rpx;">
						<view class="uni-center" style="width: 25%; ">
							来源库位
						</view>
						<view class="" style="width: 75%; padding: 8rpx;">
							<uni-combox :candidates="fromLocationList" v-model="fromLocationCode" placeholder="请选择库位"
								@confirm="fromLocationUpdate"></uni-combox>
						</view>
					</view>

					<view class="">
						<view class="">
							<win-com-scan ref="comscan" placeholder="箱标签" @getResult="onScan" :clearResult="true"
								headerType="HPQ,HMQ" :isShowHistory="false">
							</win-com-scan>

							<view style="width: 100%;">
								<view style="width: 100%;" v-if="issueRecord.length>0">
									<view class="uni-flex uni-row space-between u-col-center">
										<view class="" style="padding: 10rpx;">
											历史记录
										</view>
										<view class="" style="padding-right: 10rpx;">
											<u-icon :name="expendIcon" size="35rpx" @click="expands()"></u-icon>
										</view>
									</view>
									<u-line class='line_color' style='padding-top: 10rpx;padding-bottom: 20rpx;'>
									</u-line>
									<scroll-view scroll-y="true" class="scroll-view"
										v-if="expand&&issueRecord.length>0">
										<view class="uni-flex u-col" v-for="(record,index) in issueRecord">
											<view style="width: 100%;">
												<uni-swipe-action ref="swipeAction">
													<uni-swipe-action-item @click="swipeClick($event,record,index)"
														:right-options="scanOptions">
														<view style="padding: 0px 10px">
															<balance :dataContent="record" :isShowFromLocation="false"
																:isShowStdPack="false"></balance>
														</view>
													</uni-swipe-action-item>
												</uni-swipe-action>
												<u-line class='line_color'></u-line>
											</view>
										</view>
									</scroll-view>
								</view>
							</view>
						</view>
					</view>
				</view>
			</view>
		</uni-popup>
		<balance-select ref="balanceSelect" @onSelectItem='selectBalanceItem'></balance-select>
		<comMessage ref="comMessage"></comMessage>
		<balance-qty-edit ref="balanceQtyEdit" @confirm="confirm" :isShowStatus="true"></balance-qty-edit>
	</view>
</template>

<script>
	import winComScan from '@/mycomponents/scan/winComScan.vue'
	import balance from '@/mycomponents/balance/balance.vue'
	import balanceQtyEdit from '@/mycomponents/qty/balanceQtyEdit.vue'
	import balanceSelect from '@/mycomponents/balance/balanceSelect.vue'

	import {
		getDetailOption,
		getDetailEditRemoveOption
	} from '@/common/array.js';
	import {
		getWorkShopLineStation
	} from '@/api/request2.js';

	import {
		calc
	} from '@/common/calc.js';

	import {
		getBalanceByManagementPrecision
	} from '@/common/balance.js';

	export default {
		name: 'winScanPack',
		emits: ["afterScan"],
		components: {
			winComScan,
			balance,
			balanceQtyEdit,
			balanceSelect
		},
		props: {
			title: {
				type: String,
				default: ''
			},
		},
		data() {
			return {
				dataContent: {},
				jobContent: {},
				expendIcon: 'arrow-down',
				show: false,
				scanList: [],
				toLocation: null,
				toLocationCode: '',
				fromLocationList: [],
				fromLocationCode: '',
				fromLocation: null,
				issueRecord: [], //发料历史
				expand: true,
				scanOptions: {},
				editItem: {},
				positionInfo: "请选择位置",
				positionList: [],
				defaultValueList: [],
				fromInventoryStatuses: "",
				packageInfo: {},
				label: {}
			}
		},
		created() {

		},
		watch: {},
		mounted() {
			this.detailOptions = getDetailOption();
			this.scanOptions = getDetailEditRemoveOption();
		},
		methods: {
			openScanPopup(content, jobcontent) {
				this.issueRecord = [];
				this.dataContent = content;
				this.jobContent = jobcontent;
				this.initData();
				// this.positionInfo = this.jobContent.workShopCode + "-" + this.jobContent.subList[0].productionLineCode +
				// 	"-" + this.jobContent.subList[0].workStationCode
				setTimeout(res => {
					this.$refs.popup.open('bottom')
				}, 500)
			},

			closeScanPopup() {
				this.$refs.popup.close();
				this.$emit("closeScan")
				//清除数据，恢复默认值
				// Object.assign(this.$data, this.$options.data());
			},

			initData() {
				let that = this;
				that.fromLocationList = [];
				if (that.dataContent != null) {
					that.fromInventoryStatuses = this.jobContent.outInventoryStatuses
					that.toLocation = that.dataContent[0];
					that.toLocationCode = that.dataContent[0].toLocationCode;
					that.fromLocationList = that.getFromLocationList();
				}
			},

			showBalanceSelect(items) {
				this.$refs.balanceSelect.openPopup(items);
			},

			getFromLocationList() {
				let list = [];
				this.dataContent.forEach(location => {
					location.Items.forEach(item => {
						item.Locations.forEach(f => {
							let item = list.find(l => l == f.fromLocationCode);
							if (item == undefined) {
								list.push(f.fromLocationCode)
							}
						})
					})
				});

				this.fromLocationCode = list[0];
				return list;
			},

			fromLocationUpdate(fromlocation) {
				let location = this.fromLocationList.find(r => r == fromlocation)
				if (location == undefined) {
					this.fromLocationCode = ''
					this.showErrorMessage('发料库位【' + fromlocation + '】不存在')
				}
			},


			onScan(result) {
				if (this.toLocation && result.package.packUnit) {
					let item = this.toLocation.Items.find(r => r.itemCode == result.package.itemCode);
					if (result.package.packUnit !== item.packUnit) {
						this.$refs.comMessage.showQuestionMessage(
							'扫描物料包装【${result.package.packUnit}】与任务推荐包装规格【${item.packUnit}】不一致.是否要继续发料？', res => {
								if (res) {
									this.onScanResult(result)
								}
							});
					} else {
						this.onScanResult(result)
					}
				}
			},
			onScanResult(result) {
				try {
					let that = this;
					if (that.fromLocationCode == '') {
						that.showErrorMessage('请选择来源库位', res => {
							that.$refs.toLocationCombox.onFocus();
						});
						return;
					}

					that.label = result.label;
					that.packageInfo = result.package;
					// let packageInfo = result.package;
					let itemCode = result.label.itemCode;
					let packingCode = result.label.packingNumber;
					let lot = result.label.batch;
					let item = that.toLocation.Items.find(r => r.itemCode == itemCode);
					if (item == undefined) {
						that.showErrorMessage('未查找到物料【' + itemCode + '】的发料明细',
							res => {
								that.getfocus();
							}
						)
						return;
					} else {
						//查找库存信息
						uni.showLoading({
							title: '加载中',
							mask: true
						})
						getBalanceByManagementPrecision(result.label, that.fromLocationCode, that.fromInventoryStatuses,
							balanceRes => {
								if (balanceRes.success) {
									if (balanceRes.data.list.length == 0) {
										this.showErrorMessage('在来源库位[' + this.fromLocationCode + '],未查找到该包装的库存记录',
											res => {
												this.packGetFocus();
											})
									} else if (balanceRes.data.list.length == 1) {
										let balance = balanceRes.data.list[0];
										this.afterGetBalance(result.label, balance, that.packageInfo);
									} else {
										this.showBalanceSelect(balanceRes.data.list);
									}
								} else {
									this.showErrorMessage(balanceRes.message.message);
								}
								uni.hideLoading();
							});
					}
				} catch (e) {
					this.showErrorMessage(e.stack)
					uni.hideLoading();
				}
			},

			selectBalanceItem(balance) {
				this.afterGetBalance(this.label, balance, this.packageInfo);
			},

			afterGetBalance(label, balance, packageInfo) {
				let that = this;
				try {
					let itemCode = label.itemCode;
					let packingCode = label.packingNumber;
					let lot = label.batch;
					let item = that.toLocation.Items.find(r => r.itemCode == itemCode);
					let fromLocation = item.Locations.find(l => l.fromLocationCode == that.fromLocationCode);
					if (fromLocation != undefined) {
						let batch = fromLocation.Batchs.find(r => r.batch == lot);
						if (batch != undefined) {
							if (batch.Records == undefined) {
								batch.Records = [];
							}

							let record = batch.Records.find(r => r.packingNumber == packingCode);
							if (record == undefined) {
								//如果有推荐箱码
								if (batch.Recommends.length > 0) {
									let recommend = batch.Recommends.find(r => r.packingNumber == packingCode);
									if (recommend != undefined) {
										that.addRecord(batch, label, balance, packageInfo)
									} else {
										//允许修改箱码
										if (this.jobContent.allowModifyPackingNumber == 'TRUE') {
											that.addRecord(batch, label, balance, packageInfo);
										} else {
											that.showErrorMessage('未查找到该箱码【' + packingCode + '】的明细',
												res => {
													that.getfocus();
													return;
												}
											)
										}
									}
								} else {
									that.addRecord(batch, label, balance, packageInfo)
								}
								that.$emit("afterScan");
							} else {
								that.showErrorMessage('箱码【' + packingCode + '】已经扫描,请继续扫描下一箱',
									res => {
										that.getfocus();
									}
								)
							}

						} else {
							if (this.jobContent.allowModifyBatch == "TRUE") {
								this.showQuestionMessage('在【' + that.fromLocationCode + '】库位下,未查找到批次【' + lot +
									'】的发料明细,是否要继续发料?', res => {
										if (res) {
											let batch = that.createBatchInfo(label, balance, packageInfo);
											//新增加的批次赋值details
											if (fromLocation.Batchs.length > 0) {
												batch.detail = fromLocation.Batchs[0].detail;
											}
											fromLocation.Batchs.unshift(batch);
										}
									})
							} else {
								that.showErrorMessage('未查找到批次【' + lot + '】的发料明细',
									res => {
										that.getfocus();
									});
							}
						}
					} else {
						that.showErrorMessage('未查找到推荐库位【' + that.fromLocationCode + '】的发料明细',
							res => {
								that.getfocus();
							}
						)
					}
				} catch (e) {
					that.showErrorMessage(e.stack,
						res => {
							that.getfocus();
						}
					)
				}
			},

			createBatchInfo(data, balance, packageInfo) {
				let batch = {
					batch: data.batch,
					qty: 0,
					uom: data.uom,
					handleQty: Number(data.qty),
					Records: []
				}
				let record = this.creatRecord(data, balance, packageInfo);
				batch.Records.push(record);
				this.issueRecord.unshift(record)
				return batch;
			},

			creatRecord(label, balance, packageInfo) {
				balance.packQty = packageInfo.packQty
				balance.packUnit = packageInfo.packUnit
				let record = {
					scaned: true,
					itemCode: label.itemCode,
					packingNumber: label.packingNumber,
					batch: label.batch,
					qty: Number(balance.qty),
					// qty: Number(label.qty) > Number(balance.qty) ? Number(balance.qty) : Number(label.qty),
					uom: balance.uom,
					inventoryStatus: balance.inventoryStatus,
					balance: balance,
					toLocationCode: this.toLocationCode,
					supplierCode: label.supplierCode,
					packUnit: packageInfo.packUnit,
					packQty: packageInfo.packQty
				}
				return record;
			},

			calcBatchHandleQty(batch) {
				let handleQty = 0;
				batch.Records.forEach(res => {
					handleQty = calc.add(handleQty, res.qty)
				})
				batch.handleQty = handleQty;

			},

			addRecord(batch, label, balance, packageInfo) {
				let record = this.creatRecord(label, balance, packageInfo);
				batch.Records.push(record);
				this.issueRecord.unshift(record)
				this.calcBatchHandleQty(batch);
				this.getfocus();
			},

			getfocus() {
				if (this.$refs.comscan != undefined) {
					this.$refs.comscan.getfocus();
				}
			},

			losefocus() {
				if (this.$refs.comscan != undefined) {
					this.$refs.comscan.losefocus();
				}
			},

			expands() {
				this.expand = !this.expand;
				this.expendIcon = this.expand == true ? "arrow-down" : "arrow-up"
			},

			swipeClick(e, item, index) {
				if (e.content.text == "详情") {
					this.detail(item)
				} else if (e.content.text == "编辑") {
					this.edit(item)
				} else if (e.content.text == "移除") {
					this.remove(item, index)
				}
			},
			edit(item) {
				this.editItem = item;
				// item.balance.balanceQty = item.balance.qty;
				item.balance.balanceQty = item.balance.qty;
				this.$refs.balanceQtyEdit.openEditPopup(item.balance, item.qty);
			},

			detail(item) {
				this.showItem = item;
				this.$refs.receiptHint.openScanPopup()
			},
			remove(record, index) {
				this.showQuestionMessage("确定移除扫描信息?",
					res => {
						if (res) {
							record.qty = 0;
							this.issueRecord.splice(index, 1)

							let item = this.toLocation.Items.find(r => r.itemCode == record.itemCode);

							if (item != undefined) {

								item.Locations.forEach(l => {
									let batch = l.Batchs.find(b => b.packingNumber == record.packingNumber && b
										.batch == record.batch);

									if (batch && batch.Records && batch.Records.length > 0) {
										let rIndex = batch.Records.findIndex(r => r.packingNumber == record
											.packingNumber && r.batch == record.batch);
										batch.Records.splice(rIndex, 1);
									}

								})
							}
							this.$emit('updateData', item);
						}
					});
			},

			packGetFocus() {
				this.$refs.comscan.getfocus();
			},
			packLoseFocus() {
				this.$refs.comscan.losefocus();
			},
			showMessage(message, callback) {
				setTimeout(r => {
					this.packLoseFocus();
					this.$refs.comMessage.showMessage(message, callback);
				})
			},
			showErrorMessage(message, callback) {
				setTimeout(r => {
					this.packLoseFocus();
					this.$refs.comMessage.showErrorMessage(message, callback);

				})
			},
			showQuestionMessage(message, callback) {
				setTimeout(r => {
					this.packLoseFocus();
					this.$refs.comMessage.showQuestionMessage(message, callback);
				})
			},
			confirm(val) {
				this.editItem.qty = Number(val);
				this.$emit('updateData', this.editItem)
			},
			cancle() {
				this.closeScanPopup()
			}
		}
	}
</script>

<style lang="scss">
	button {
		border: none;
	}

	button::after {
		border: none
	}

	.scroll-view {
		overflow-y: scroll;
		height: auto;
		max-height: 300rpx;
		padding: 10rpx;
	}
</style>