<template>
  <view class="page-wraper">
    <view class="">
      <com-blank-view @goScan="showFromLocationPopup" v-if="recommendList.length == 0"></com-blank-view>
    </view>
    <view class="page-wraper" v-if="recommendList.length > 0">
      <!-- <view class="page-header">
				<view class="header_item">
					来源库位 : {{fromLocationCode}}
				</view>
				<view class='split_line'></view>
			</view> -->

      <view class="page-header">
        <view class="header_item" style="font-size: 35rpx; padding: 10rpx">
          <uni-collapse ref="collapse">
            <uni-collapse-item :open="true">
              <template v-slot:title>
                <view class="card_itemName" style="padding: 3px 5px; font-size: 28rpx"> 先进先出推荐信息 </view>
              </template>
              <view class="detail-list" v-for="(recommend, index) in recommendList" :key="recommend.id">
                <view class="card_view">
                  <text class="card_item_code">物料代码</text>
                  <text class="card_content">{{ recommend.itemCode }}</text>
                </view>
                <balance :dataContent="recommend" :isShowStatus="false"></balance>
              </view>
            </uni-collapse-item>
          </uni-collapse>
        </view>
      </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="uni-row uni-flex">
            <text>生产线:</text>
            <view class="uni-flex u-col-center uni-row" @click="showSelect">
              <view class="" style="margin-left: 20rpx">
                {{ positionInfo }}
              </view>
              <u-select v-model="show" mode="mutil-column-auto" :list="positionList" @confirm="confirmSelect"></u-select>
            </view>
          </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="onScan" :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 { issueRecordSubmit, getWorkShopLineStation, getBalanceByFilter, getBalanceByBatchOffShelf } from '@/api/request2.js'

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

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

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

import { getBusinessType, createItemInfo, createDetailInfo, calcTreeHandleQty, 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 recordDetailCard from '@/mycomponents/record/recordDetailCard.vue'
import balanceSelect from '@/mycomponents/balance/balanceSelect.vue'
import balance from '@/mycomponents/balance/balance.vue'

export default {
  components: {
    winScanButton,
    winScanPack,
    requiredLocation,
    comBlankView,
    winScanLocation,
    winScanPackAndLocation,
    recordComDetailCard,
    recordDetailCard,
    balanceSelect,
    balance
  },
  data() {
    return {
      id: '',
      dataContent: {}, // 内容
      detailSource: [], // 绑定在页面上的数据源
      fromLocationInfo: {},
      fromLocationCode: '',
      fromLocationAreaTypeList: [],
      toLocationAreaTypeList: [],
      inInventoryStatus: '', // 目标入库库存状态
      outInventoryStatus: '', // 来源出库库存状态
      businessType: {},
      showToLoaction: true,
      recommendLocationList: [], // 推荐库位列表
      fromWarehouseCode: '', // 来源仓库
      businessTypeCode: 'Issue',
      positionList: [],
      show: false,
      positionInfo: '请选择生产线',
      resultData: {},
      recommendList: []
    }
  },
  onLoad(option) {
    uni.setNavigationBarTitle({
      title: option.title
    })
    this.clearData()
    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)
      }
    })

    // if (this.positionList.length == 0) {
    getWorkShopLineStation()
      .then((res) => {
        if (res.data != null && res.data.length > 0) {
          this.positionList = res.data
        } else {
          this.showErrorMessage('未查找到位置信息')
        }
      })
      .catch((error) => {
        this.showErrorMessage(error)
      })
    // }
  },
  // 返回首页
  onNavigationBarButtonTap(e) {
    if (e.index === 0) {
      goHome()
    }
  },
  // 拦截返回按钮事件
  onBackPress(e) {},

  onPullDownRefresh() {},

  mounted() {},

  methods: {
    getBalance(label, packageInfo, callback) {
      const filters = []

      if (packageInfo.parentNumber) {
        const 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
        })
      }

      const params = {
        filters,
        pageNo: 1,
        pageSize: 100
      }
      getBalanceByFilter(params)
        .then((res) => {
          callback(res.data)
        })
        .catch((err) => {
          this.showErrorMessage(err.message)
        })
    },

    getScanResult(result) {
      this.resultData = result
      const packageInfo = result.package
      this.getBalance(result.label, packageInfo, (balances) => {
        // 扫描的是外包装
        const s = ''
        if (!result.package.parentNumber) {
          if (balances.list.length == 0) {
            this.showErrorMessage('未查找到该包装的库存信息,请重新扫描')
          } else {
            const newBalances = balances.list.filter((b) => b.locationCode == this.fromLocationCode)
            if (newBalances.length == 0) {
              this.showErrorMessage('未查找到该包装的库存信息,请重新扫描')
            } else if (newBalances.length == 1) {
              const balance = newBalances[0]
              result.balance = balance
              this.afterGetBalance(result)
            } else {
              this.showBalanceSelect(newBalances)
            }
          }
        } else {
          // 扫描的是小包装
          if (balances.list.length == 0) {
            this.showErrorMessage('未查找到该包装的库存信息,请重新扫描')
          } else {
            // 小包装库存
            const subPackitems = balances.list.filter((r) => r.packingNumber == packageInfo.number)
            // 外包装库存
            const 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) {
                  const 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 {
              let locationCode = this.fromLocationCode
              if (balances.list == 1) {
                locationCode = balances.list[0].locationCode
              } else {
                const manyBlances = balances.list.filter((r) => r.locationCode != this.fromLocationCode)
                if (manyBlances.length > 0) {
                  locationCode = manyBlances[0].locationCode
                }
              }
              this.showErrorMessage(`该包装【${packageInfo.number}】在库位【${locationCode}】已经有库存余额,请重新扫描`)
            }
          }
        }
      })
    },

    onScan(result) {
      const that = this
      const pack = result.package
      if (that.recommendList.length > 0) {
        const recommend = that.recommendList.filter((r) => r.itemCode == pack.itemCode)
        if (recommend.length == 0) {
          this.showErrorMessage(`物料代码【${pack.itemCode}】不在推荐列表中`)
        } else {
          const batch = recommend.find((r) => r.batch == pack.batch)
          if (batch == undefined) {
            that.showErrorMessage(`扫描的批次【${pack.batch}】,不是系统推荐的批次,不满足系统的先进先出规则,请重新扫描物料`)
          } else {
            this.getScanResult(result)
          }
        }
      } else {
        this.getRecommendInfo(result)
      }
    },

    getRecommendInfo(result) {
      const that = this
      uni.showLoading({
        title: '加载中...',
        mask: true
      })
      const item = {
        itemCode: result.package.itemCode,
        qty: result.package.qty
      }
      getBalanceByBatchOffShelf(item.itemCode, item.qty, 'issue')
        .then((res) => {
          if (res.data == null) {
            that.showErrorMessage('未获取到推荐信息')
          } else {
            if (res.data.length > 0) {
              that.recommendList = res.data
              that.recommendList.forEach((r) => (r.locationCode = r.fromLocationCode))
              const recommendInfo = res.data[0]
              if (recommendInfo.batch != result.package.batch) {
                that.showErrorMessage(`扫描的批次【${result.package.batch}】,不是系统推荐的批次【${recommendInfo.batch}】,不满足系统的先进先出规则,请重新扫描`)
              } else {
                this.getScanResult(result)
              }
            } else {
              that.showErrorMessage('未查找到物料的推荐信息')
            }
            uni.hideLoading()
          }
        })
        .catch((error) => {
          uni.hideLoading()
          that.showErrorMessage(error)
        })
    },

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

    selectBalanceItem(balance) {
      this.resultData.balance = balance
      this.afterGetBalance(this.resultData)
    },

    afterGetBalance(result) {
      const { balance } = result
      const { label } = result
      const pack = result.package
      const { packUnit } = pack
      const { packQty } = pack
      const item = this.detailSource.find((res) => {
        if (res.itemCode == balance.itemCode) {
          return res
        }
      })
      if (this.fromWarehouseCode == '') {
        this.fromWarehouseCode = balance.warehouseCode
      }
      if (item == undefined) {
        const itemp = createItemInfo(balance, pack)
        const 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 {
        const 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) {
          const 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}]已经在列表中`)
        }
      }
    },

    getScanResult1(result) {
      const { balance } = result
      const { label } = result
      const pack = result.package
      const { packUnit } = pack
      const { packQty } = pack
      const item = this.detailSource.find((res) => {
        if (res.itemCode == balance.itemCode) {
          return res
        }
      })
      if (this.fromWarehouseCode == '') {
        this.fromWarehouseCode = balance.warehouseCode
      }
      if (item == undefined) {
        const itemp = createItemInfo(balance, pack)
        const newDetail = createDetailInfo(balance, pack) //
        newDetail.packUnit = packUnit
        newDetail.packQty = packQty
        itemp.subList.push(newDetail)
        this.detailSource.push(itemp)
        calcHandleQty(this.detailSource)
      } else {
        const detail = item.subList.find((r) => {
          if (r.packingNumber == balance.packingNumber && r.batch == balance.batch && r.locationCode == balance.locationCode && r.inventoryStatus == balance.inventoryStatus) {
            return r
          }
        })
        if (detail == undefined) {
          const newDetail = createDetailInfo(balance, pack)
          newDetail.packUnit = packUnit
          newDetail.packQty = packQty
          item.subList.push(newDetail)
          calcHandleQty(this.detailSource)
        } else if (detail.scaned == true) {
          this.showErrorMessage(`箱码[${balance.packingNumber}批次[${balance.batch}]已经在列表中`)
        }
      }
    },

    // 获取推荐库位
    getRecommendLocation(balance, pack, callback) {
      uni.showLoading({
        title: '扫描中...',
        mask: true
      })
      const recommend = this.recommendLocationList.find((r) => r.itemCode == balance.itemCode)
      if (recommend == undefined) {
        const param = {
          itemCode: balance.itemCode,
          batch: balance.batch,
          inventoryStatus: balance.inventoryStatus,
          supplierCode: pack.supplierCode,
          businessCode: this.businessTypeCode
        }
        console.log(JSON.stringify(param))
        getPutawayRecommendLocation(param)
          .then((res) => {
            this.recommendLocationList.push({
              itemCode: balance.itemCode,
              locationCode: res.data.code
            })
            callback(res.data)
            uni.hideLoading()
          })
          .catch((error) => {
            uni.hideLoading()
            this.showErrorMessage(error)
            uni.hideLoading()
          })
      } else {
        callback(recommend)
      }
    },

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

    calcTreeHandleQty() {
      for (const item of this.detailSource) {
        item.qty = 0
        for (const detail of item.subList) {
          if (detail != undefined) {
            item.qty = calc.add(item.qty, detail.qty)
          }
        }
      }
      this.$forceUpdate()
    },

    showSelect() {
      // if (this.editPosition) {
      this.show = true
      // }
    },

    confirmSelect(e) {
      this.positionInfo = `${e[0].label}-${e[1].label}-${e[2].label}`
      console.log('位置', this.positionInfo)
      this.workshopCode = e[0].value
      this.productionLineCode = e[1].value
      this.workStationCode = e[2].value
      this.workShopName = e[0].label
      this.productionLineName = e[1].label
      this.workStationName = e[2].label

      const shop = this.positionList.find((shop) => shop.value == this.workshopCode)
      if (shop != undefined && shop.children != undefined) {
        const prodLine = shop.children.find((line) => line.value == this.productionLineCode)
        if (prodLine != undefined && prodLine.children != undefined) {
          const station = prodLine.children.find((r) => r.value == this.workStationCode)
          if (station.rawLocationCode == '' && station.rawLocationCode == null) {
            this.showErrorMessage(`${this.workStationName}的原材料库位为空,请重新选择`)
            return
          }
          this.rawLocationCode = station.rawLocationCode
          this.fgLocationCode = station.fgLocationCode
        } else {
          this.showErrorMessage('生产线-工位基础信息维护错误')
        }
      } else {
        this.showErrorMessage('车间-生产线基础信息维护错误')
      }

      // 赋值到库位代码
      let toLocationCode = ''
      this.positionList.forEach((item) => {
        if (this.workshopCode == item.value) {
          // 车间
          item.children.find((child) => {
            if (this.productionLineCode == child.value) {
              toLocationCode = child.children.find((subChild) => this.workStationCode == subChild.value).rawLocationCode
            }
          })
        }
      })
      this.detailSource.forEach((item) => {
        item.subList.forEach((detail) => {
          detail.toLocationCode = toLocationCode
        })
      })
    },

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

    removePack() {
      for (let i = 0; i < this.detailSource.length; i++) {
        const 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
    // 	this.toLocationCode = location;

    // },

    commit() {
      uni.showLoading({
        title: '提交中....',
        mask: true
      })

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

          issueRecordSubmit(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() {
      const subList = []
      const creator = this.$store.state.user.id
      this.detailSource.forEach((item) => {
        item.subList.forEach((detail) => {
          if (detail.scaned) {
            const info = getPackingNumberAndBatchByList(this.managementList, detail.itemCode, detail.packingNumber, detail.toLocationCode, detail.batch)
            const 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,
                fromParentPackingNumber: detail.parentNumber,
                fromPackingNumber: info.packingNumber,
                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.fromLocationInfo = location
      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.clearData()
      })
    },

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

    clearData() {
      this.fromLocationInfo = {}
      this.fromLocationCode = ''
      this.fromWarehouseCode = ''
      this.toWarehouseCode = ''
      this.detailSource = []
      this.positionInfo = '请选择生产线'
    }
  }
}
</script>

<style scoped lang="scss"></style>
