<template>
	<view class="page-wraper">

		<view class="">
			<com-blank-view @goScan='showFromLocationPopup' v-if="detailSource.length==0"></com-blank-view>
		</view>
		<view class="page-wraper" v-if="detailSource.length>0">
			<view class="page-header">
				<view class="header_item">
					来源库位 : {{fromLocationCode}}
				</view>
				<u-line />
			</view>
			<view class="page-main">
				<scroll-view scroll-y="true" class="page-main-scroll">
					<view class="detail-list" v-for="(item, index) in detailSource" :key="item.id">
						<view class="">
							<record-com-detail-card :dataContent="item" :index="index" :settingParam="dataContent"
								:isShowFromLocation="false" @removeItem="removeItem(index,item)"
								:isShowToLocation="false"
								@updateData="updateData" @removePack="removePack">
							</record-com-detail-card>
						</view>

					</view>
				</scroll-view>
			</view>

			<view class="page-footer">
				<view class="uni-flex u-col-center space-between padding_10"
					style="background-color:ghostwhite; width: 100%; ">
					<view class="">
						<requiredLocation v-if="showToLoaction" title="目标库位" :locationCode="toLocationCode"
							@getLocation='getToLocationCode' :locationAreaTypeList="toLocationAreaTypeList"></requiredLocation>
					</view>
					<view class=" uni-flex uni-row">
						<button class="btn_single_commit" hover-class="btn_commit_after" @click="commit">提交</button>
					</view>
				</view>
			</view>
			<win-scan-button @goScan='openScanPopup'></win-scan-button>
		</view>
		<win-scan-pack-and-location ref="scanPopup" @getResult='getScanResult' :allowModifyLocation='false' :queryBalance="false">
		</win-scan-pack-and-location>
		<comMessage ref="comMessage"></comMessage>
		<win-scan-location ref="scanLocationCode" title="来源库位" @getLocation='getLocation'
			:locationAreaTypeList="fromLocationAreaTypeList"></win-scan-location>
			<balance-select ref="balanceSelect" @onSelectItem='selectBalanceItem'></balance-select>
	</view>
</template>

<script>
	import {
		repleinshRecordSubmit,
		validateItemAndLocation,
		getPutawayRecommendLocation,
		getBalanceByFilter
	} from '@/api/request2.js';

	import {
		goHome,
		updateTitle,
		getCurrDateTime,
		getPackingNumberAndBatchByList,
		deepCopyData
	} from '@/common/basic.js';

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

	import {
		getInventoryStatusDesc,
		getDirectoryItemArray
	} from '@/common/directory.js';

	import {
		getBusinessType,
		createItemInfo,
		createDetailInfo,
		calcHandleQty
	} from '@/common/record.js';

	import {
		getManagementPrecisions,
		getPrecisionStrategyList,
		getPrecisionStrategyParams
	} from '@/common/balance.js';

	import winScanButton from '@/mycomponents/scan/winScanButton.vue'
	import winScanPack from '@/mycomponents/scan/winScanPack.vue'
	import requiredLocation from '@/mycomponents/location/requiredLocation.vue'
	import comBlankView from '@/mycomponents/common/comBlankView.vue'
	import winScanLocation from "@/mycomponents/scan/winScanLocation.vue"
	import winScanPackAndLocation from "@/mycomponents/scan/winScanPackAndLocation.vue"
	import recordComDetailCard from '@/mycomponents/record/recordComDetailCard.vue'
	import balanceSelect from '@/mycomponents/balance/balanceSelect.vue'

	export default {
		components: {
			winScanButton,
			winScanPack,
			requiredLocation,
			comBlankView,
			winScanLocation,
			winScanPackAndLocation,
			recordComDetailCard,
			balanceSelect
		},
		data() {
			return {
				id: '',
				dataContent: {}, //内容
				detailSource: [], //绑定在页面上的数据源
				fromLocationCode: "",
				fromLocationAreaTypeList: [],
				toLocationAreaTypeList: [],
				inInventoryStatus: "", //目标入库库存状态
				outInventoryStatus: "", //来源出库库存状态
				businessType: {},
				showToLoaction: true,
				recommendLocationList: [], //推荐库位列表
				fromWarehouseCode: '', //来源仓库
				businessTypeCode: "Repleinment",
				toLocationCode:"",
				resultData:{}
			};
		},
		onLoad(option) {
			this.clear();
			getBusinessType(this.businessTypeCode, res => {
				if (res.success) {
					this.businessType = res.businessType;
					this.fromLocationAreaTypeList = res.fromLocationAreaTypeList;
					this.toLocationAreaTypeList = res.toLocationAreaTypeList;
					this.showFromLocationPopup();
				} else {
					this.showErrorMessage(res.message)
				}
			});
		},
		//返回首页
		onNavigationBarButtonTap(e) {
			if (e.index === 0) {
				goHome();
			}
		},
		//拦截返回按钮事件
		onBackPress(e) {},

		onPullDownRefresh() {},

		mounted() {},

		methods: {
			getBalance(label, packageInfo, callback) {
				var filters = []
			
				if (packageInfo.parentNumber) {
					var packingNumber = packageInfo.parentNumber + "," + label.packingNumber;
					filters.push({
						column: "packingNumber",
						action: "in",
						value: packingNumber
					})
				} else {
					filters.push({
						column: "packingNumber",
						action: "==",
						value: label.packingNumber
					})
				}
			
				filters.push({
					column: "itemCode",
					action: "==",
					value: label.itemCode
				})
				filters.push({
					column: "batch",
					action: "==",
					value: label.batch
				})
			
				if (this.fromInventoryStatuses != null && this.fromInventoryStatuses != "") {
					filters.push({
						column: "inventoryStatus",
						action: "in",
						value: this.fromInventoryStatuses
					})
				}
			
				var params = {
					filters: filters,
					pageNo: 1,
					pageSize: 100,
				}
				getBalanceByFilter(params).then(res => {
					callback(res.data)
				}).catch(err => {
					this.showErrorMessage(err.message);
				})
			},
			getScanResult(result) {
				this.resultData=result;
				let packageInfo = result.package;
				this.getBalance(result.label, packageInfo, balances =>{
					
				//扫描的是外包装
				let s = '';
				if (!result.package.parentNumber) {
					if (balances.list.length == 0) {
						this.showErrorMessage('未查找到该包装的库存信息,请重新扫描')
					} else {
						let newBalances = balances.list.filter(b => b.locationCode == this
							.fromLocationCode);
						if (newBalances.length == 0) {
							this.showErrorMessage('未查找到该包装的库存信息,请重新扫描')
						} else if (newBalances.length == 1) {
							let balance = newBalances[0];
							result.balance=balance;
							this.afterGetBalance(result);
						} else {
							this.showBalanceSelect(newBalances);
						}
					}
				} else {
					//扫描的是小包装
					if (balances.list.length == 0) {
						this.showErrorMessage('未查找到该包装的库存信息,请重新扫描')
					} else {
						//小包装库存
						let subPackitems = balances.list.filter(r => r.packingNumber == packageInfo
							.number)
						//外包装库存
						let subParentPackitems = balances.list.filter(r => r.packingNumber ==
							packageInfo
							.parentNumber&&r.locationCode==this.fromLocationCode)
				
				
						//小包装没有库存，
						if (subPackitems.length == 0) {
							//外包装有库存，出库后剩余库存未转换为出库包装规格
							
							if (subParentPackitems.length > 0) {
								if(subParentPackitems.length==1){
									let balance = subParentPackitems[0];
									balance.qty=packageInfo.qty;
									result.balance =balance;
									this.afterGetBalance(result);
								}else {
									this.showBalanceSelect(subParentPackitems);
								}
								
							} else {
								this.showErrorMessage('按外包装【' + packageInfo.parentNumber + '】和子包装【' +
									packageInfo.number + '】都未查找到库存余额')
							}
						} else {
							var locationCode = this.fromLocationCode
							if(balances.list==1){
								 locationCode=balances.list[0].locationCode
							}else {
								var manyBlances = balances.list.filter(r=>r.locationCode!=this.fromLocationCode)
								if(manyBlances.length>0){
									locationCode = manyBlances[0].locationCode;
								}
							}
							this.showErrorMessage('该包装【' + packageInfo.number + '】在库位【' + 
								locationCode +
								'】已经有库存余额,请重新扫描')
						}
				
				
					}
				}	
					
				})
				
			},
			
			showBalanceSelect(items) {
				this.$refs.balanceSelect.openPopup(items);
			},
			
			selectBalanceItem(balance) {
				this.resultData.balance =balance;
				this.afterGetBalance(this.resultData);
			},
			
			afterGetBalance(result){
				let balance = result.balance;
				let label = result.label;
				let pack = result.package;
				let packUnit = pack.packUnit;
				let packQty =pack.packQty
				var item = this.detailSource.find(res => {
					if (res.itemCode == balance.itemCode) {
						return res
					}
				})
				if (this.fromWarehouseCode == '') {
					this.fromWarehouseCode = balance.warehouseCode;
				}
				if (item == undefined) {
					
					var itemp = createItemInfo(balance, pack);
					let newDetail = createDetailInfo(balance, pack); //
					newDetail.parentNumber =pack.parentNumber;
					newDetail.packingNumber =pack.number
					newDetail.packUnit =packUnit;
					newDetail.packQty=packQty;
					itemp.subList.push(newDetail);
					this.detailSource.push(itemp)
					calcHandleQty(this.detailSource);

				} else {
					var detail = item.subList.find(r => {
						if (r.packingNumber == pack.number &&
							r.batch == balance.batch &&
							r.locationCode == balance.locationCode &&
							r.inventoryStatus == balance.inventoryStatus) {
							return r;
						}
					})
					if (detail == undefined) {
							let newDetail = createDetailInfo(balance, pack);
							newDetail.parentNumber =pack.parentNumber;
							newDetail.packingNumber =pack.number
							newDetail.packUnit =packUnit;
							newDetail.packQty=packQty;
							item.subList.push(newDetail);
							calcHandleQty(this.detailSource);
					} else {
						if (detail.scaned == true) {
							this.showErrorMessage("箱码[" + detail.packingNumber + "]批次[" + balance.batch + "]已经在列表中")
						}
					}
				}
			},

			showErrorMessage(message) {
				this.$refs.comMessage.showErrorMessage(message, res => {
					if (res) {}
				});
			},


			updateData() {
				calcHandleQty(this.detailSource);
				for (var i = 0; i < this.detailSource.length; i++) {
					let item = this.detailSource[i];
					if (item.qty == 0) {
						this.detailSource.splice(i, 1)
					}
				}
				this.$forceUpdate();
				
			},

			removeItem(index, item) {
				this.detailSource.splice(index, 1)
				this.updateData();
			},

			removePack() {
				for (var i = 0; i < this.detailSource.length; i++) {
					var item = this.detailSource[i];
					if (item.subList.length == 0) {
						this.detailSource.splice(i, 1)
					}
				}
				this.updateData();
			},

			openScanPopup() {
				if (this.fromLocationCode == "") {
					this.showFromLocationPopup();
					return
				}
				this.$refs.scanPopup.openScanPopupForType(this.fromLocationCode, this.businessType);
			},

			showFromLocationPopup() {
				this.$nextTick(() => {
					this.$refs.scanLocationCode.openScanPopup();
				})
			},

			closeScanPopup() {
				if (this.$refs.scanPopup != undefined) {
					this.$refs.scanPopup.closeScanPopup();
				}
			},

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

			scanLocationCode(location, code) {
				this.toLocationCode = code
			},

			commit() {
				if(this.toLocationCode==""){
					this.showMessage("请输入目标库位")
					return;
				}
				
				this.detailSource.forEach(item=>{
					item.subList.forEach(detail=>{
						detail.toLocationCode=this.toLocationCode
						detail.fromLocation =this.fromLocationCode
					})
				})
				
				uni.showLoading({
					title: "提交中....",
					mask: true
				});

				//记录有目标库位，需要查询管理模式
				let precisionStrategyParams = getPrecisionStrategyParams(this.detailSource);
				//2:获取管理模式，封装参数
				getPrecisionStrategyList(precisionStrategyParams, res => {
					if (res.success) {
						this.managementList = res.list;
						var params = this.setRecordParams()
						console.log("提交参数", JSON.stringify(params));

						repleinshRecordSubmit(params).then(res => {
							uni.hideLoading()
							if (res.data) {
								this.showCommitSuccessMessage("提交成功<br>生成直接补料记录<br>" + res.data)
							} else {
								this.showErrorMessage("提交失败[" + res.msg + "]")
							}
						}).catch(error => {
							uni.hideLoading()
							this.showErrorMessage(error)
						})
					} else {
						uni.hideLoading();
						this.showErrorMessage(res.message);
					}
				});
			},


			setRecordParams() {
				var subList = []
				var creator = this.$store.state.user.id
				this.detailSource.forEach(item => {
					item.subList.forEach(detail => {
						if (detail.scaned) {
							var info = getPackingNumberAndBatchByList(this.managementList, detail.itemCode,
								detail.packingNumber, detail.toLocationCode, detail.batch);
							var submitItem = deepCopyData(detail)
							submitItem.toPackingNumber = info.packingNumber;
							submitItem.toBatch = info.batch;
							submitItem.toContainerNumber = detail.containerNumber;

							submitItem.fromPackingNumber = info.packingNumber;
							submitItem.fromBatch = info.batch;
							submitItem.fromContainerNumber = detail.containerNumber;

							submitItem.fromLocationCode = detail.locationCode;
							submitItem.toLocationCode = detail.toLocationCode;

							// detail.toInventoryStatus = detail.inventoryStatus
							// detail.toLocationCode = detail.toLocationCode
							submitItem.qty = detail.handleQty;
							submitItem.package = "";
							submitItem.recordList=[
								{
									toInventoryStatus:detail.inventoryStatus,
									fromPackingNumber:info.packingNumber,
									fromParentPackingNumber: detail.parentNumber,
									fromBatch:info.batch,
									
									toPackingNumber:info.packingNumber,
									
									toBatch:info.batch,
									fromLocationCode:detail.locationCode,
									toLocationCode:detail.toLocationCode,
									handleQty:detail.handleQty,
									fromPackUnit:detail.packUnit,
									toPackUnit:detail.packUnit,
									fromPackQty:detail.packQty,
									toPackQty:detail.packQty
								}
							]
							subList.push(submitItem)
						}
					})
				})
				if (subList.length > 0) {
					this.dataContent.toWarehouseCode = subList[0].toWarehouseCode;
				}
				this.dataContent.subList = subList
				this.dataContent.creator = creator;
				this.dataContent.fromWarehouseCode = this.fromWarehouseCode;
				return this.dataContent;
			},

			showMessage(message) {
				this.$refs.comMessage.showMessage(message, res => {
					if (res) {}
				});
			},

			showScanMessage(message) {
				this.$refs.comMessage.showScanMessage(message);
			},

			afterCloseMessage() {
				this.scanPopupGetFocus();
			},

			closeScanMessage() {
				this.scanPopupGetFocus();
			},
			getLocation(location, code) {
				this.getFromLocationCode(location, code)
			},
			getFromLocationCode(location, code) {
				this.fromLocationCode = code;
				this.openScanPopup();
			},
			getToLocationCode(location, code) {
				if (this.fromLocationCode == code) {
					uni.showToast({
						title: "来源库位[" + this.fromLocationCode + "]不能与目标库位[" + code + "]一致",
						duration: 2000
					})
					return
				}
				this.toLocationCode = code;
			},

			showCommitSuccessMessage(hint) {
				this.$refs.comMessage.showSuccessMessage(hint, res => {
					this.clear();
				})
			},

			clear() {
				this.fromLocationCode = '';
				this.fromWarehouseCode = '';
				this.toWarehouseCode = '';
				this.detailSource = [];
				this.toLocationCode = "";
			}
		}
	}
</script>

<style scoped lang="scss">
	page {
		width: 100%;
		height: 100%;
		background-color: #fff;
	}

	.page-wraper {
		display: flex;
		flex-direction: column;
		width: 100%;
		height: 100%;
	}


	.page-main {
		flex: 1;
		position: relative;
	}

	.page-main-scroll {
		position: absolute;
		left: 0;
		right: 0;
		top: 0;
		bottom: 0;
	}

	.page-main-list {
		/*  height: 80rpx;
	    line-height: 80rpx; */
		text-align: center;
		background: #e0e0e0;

	}
</style>