<template>
  <div class="productInfoList-wrap">
    <!-- 搜索条件 -->
    <div class="table-page-search-wrapper">
      <a-form layout="inline" @keyup.enter.native="searchTable">
        <a-row :gutter="15">
          <a-col :md="4" :sm="24">
            <a-form-item label="产品名称">
              <a-input id="productInfoList-name" v-model.trim="queryParam.productName" allowClear placeholder="请输入产品名称"/>
            </a-form-item>
          </a-col>
          <a-col :md="4" :sm="24">
            <a-form-item label="产品编码">
              <a-input id="productInfoList-code" v-model.trim="queryParam.productCode" allowClear placeholder="请输入产品编码"/>
            </a-form-item>
          </a-col>
          <a-col :md="4" :sm="24" v-if="hasPrompActive">
            <a-form-item label="产品类型">
              <a-select allowClear v-model.trim="queryParam.promotionFlag" :dropdownMatchSelectWidth="false" placeholder="请选择产品类型">
                <a-select-option value="0">
                  正常产品
                </a-select-option>
                <a-select-option value="REGULAR">
                  正价产品（活动）
                </a-select-option>
                <a-select-option value="DISCOUNT">
                  特价产品
                </a-select-option>
                <a-select-option value="GIFT">
                  促销产品
                </a-select-option>
                <a-select-option value="convertPromoGiftsFlag" v-if="showConvertPromoGifts">
                  促销产品（转采购额）
                </a-select-option>
                <a-select-option value="GATE">
                  门槛产品
                </a-select-option>
              </a-select>
            </a-form-item>
          </a-col>
          <a-col :md="4" :sm="24">
            <a-form-item label="下推类型">
              <a-select allowClear v-model.trim="queryParam.pushProductType" :dropdownMatchSelectWidth="false" placeholder="请选择下推类型">
                <a-select-option value="">
                  全部产品
                </a-select-option>
                <a-select-option value="ABLE">
                  剩余待下推数量＞0的产品
                </a-select-option>
                <a-select-option value="ALL">
                  可全部下推的产品
                </a-select-option>
                <a-select-option value="NOTALL">
                  不可全部下推的产品
                </a-select-option>
              </a-select>
            </a-form-item>
          </a-col>
          <a-col :md="4" :sm="24">
            <a-form-item label="出库仓库">
              <chooseWarehouse ref="warehouse" v-model="queryParam.warehouseSn"></chooseWarehouse>
            </a-form-item>
          </a-col>
          <a-col :md="4" :sm="24" style="margin-bottom: 10px;">
            <a-button type="primary" @click="searchTable" :disabled="disabled" id="productInfoList-refresh">查询</a-button>
            <a-button style="margin-left: 5px" @click="resetSearchForm(null)" id="productInfoList-reset">重置</a-button>
          </a-col>
        </a-row>
      </a-form>
    </div>

    <!-- alert -->
    <div style="margin-bottom: 10px;display: flex;align-items: center;" v-if="detailData">
      <div style="display: flex;align-items: center;">
        <a-button id="dispatch-plAdd" type="primary" :disabled="newLoading" class="button-info" @click="handlePlAdd">批量添加</a-button>
        <a-button
          id="dispatch-plPurchase"
          type="primary"
          :disabled="newLoading"
          class="button-info"
          v-if="showConvertPromoGifts"
          @click="handlePlPurchase">批量转采购额</a-button>
        <a-button
          id="dispatch-plCancel"
          type="primary"
          v-if="hasNormalProduct"
          ghost
          style="margin-left:6px;"
          :disabled="newLoading"
          @click="handlePlCancel">批量取消</a-button>
        <a-button
          id="dispatch-cancelAll"
          type="primary"
          v-if="hasPrompActive&&hasNoPushedActive"
          ghost
          style="margin-left:6px;"
          :disabled="newLoading"
          @click="handleAllCancel">整单取消</a-button>
        <a-tooltip placement="top" v-if="hasPrompActive&&hasNoPushedActive" style="margin-left:6px;">
          <template slot="title">
            <span>参加促销活动的产品，不能单独取消，只能整单取消。</span>
          </template>
          <a-icon style="font-size: 14px;" type="question-circle" />
        </a-tooltip>
        <span style="margin-left: 10px;" v-if="selectedRowKeys.length">已选 {{ selectedRowKeys.length }} 项</span>
        <a-button
          @click="confirPurchaseModal"
          :loading="loading"
          type="primary"
          style="margin-left: 15px"
          class="button-info"
          id="dispatch-updateStock">整单转采购单</a-button>
      </div>
      <div style="padding-left: 20px;">
        总销售数量：<strong>{{ detailData&&(detailData.totalQty || detailData.totalQty==0) ? detailData.totalQty : '--' }}</strong>；
        已取消数量：<strong>{{ detailData&&(detailData.totalCancelQty || detailData.totalCancelQty==0) ? detailData.totalCancelQty : '--' }}</strong>；
        已下推数量：<strong>{{ detailData&&(detailData.totalPushedQty || detailData.totalPushedQty==0) ? detailData.totalPushedQty : '--' }}</strong>；
        待下推数量：<strong>{{ detailData&&(detailData.totalUnpushedQty || detailData.totalUnpushedQty==0) ? detailData.totalUnpushedQty : '--' }}</strong>；
        <span v-if="$hasPermissions('B_salesDispatch_salesPrice')">总售价：<strong>{{ detailData&&(detailData.totalAmount || detailData.totalAmount==0) ? toThousands(detailData.totalAmount) : '--' }}</strong>；</span>
        <span v-if="$hasPermissions('B_salesDispatch_costPrice')">总成本：<strong>{{ detailData&&(detailData.totalCost || detailData.totalCost==0) ? toThousands(detailData.totalCost) : '--' }}</strong>；</span>
        <span v-if="$hasPermissions('B_salesDispatch_costPrice')&&$hasPermissions('B_salesDispatch_salesPrice')">总毛利：<strong>{{ detailData&&(detailData.grossProfit || detailData.grossProfit==0) ? toThousands(detailData.grossProfit) : '--' }}</strong>；</span>
        <span v-if="$hasPermissions('B_salesDispatch_salesPrice')">已取消金额：<strong>{{ detailData&&(detailData.totalCancelAmount || detailData.totalCancelAmount==0) ? toThousands(detailData.totalCancelAmount) : '--' }}</strong>；</span>
        <span v-if="$hasPermissions('B_salesDispatch_salesPrice')">已下推金额：<strong>{{ detailData&&(detailData.totalPushedAmount || detailData.totalPushedAmount==0) ? toThousands(detailData.totalPushedAmount) :'--' }}</strong>；</span>
        <span v-if="$hasPermissions('B_salesDispatch_salesPrice')">待下推金额：<strong>{{ detailData&&(detailData.totalUnpushedAmount || detailData.totalUnpushedAmount==0) ? toThousands(detailData.totalUnpushedAmount) : '--' }}</strong>；</span>
        <span v-if="$hasPermissions('B_salesDispatch_salesPrice')&&detailData&&detailData.totalConvertPromoGiftsAmount" style="color:red;">促销产品转采购额金额：<strong>{{ toThousands(detailData.totalConvertPromoGiftsAmount) }}</strong>；</span>
      </div>
    </div>

    <a-spin :spinning="spinning" tip="Loading...">
      <ve-table
        border-y
        v-show="!showEmpty"
        :scroll-width="0"
        :max-height="tableHeight"
        :show-header="showTableHead"
        :row-style-option="{clickHighlight: true}"
        :cellSelectionOption="{enable: false}"
        :virtual-scroll-option="{enable: true}"
        :columns="columns"
        :table-data="tableData"
        row-key-field-name="id"
        :cell-style-option="cellStyleOption"
        :cell-span-option="cellSpanOption"
        :column-width-resize-option="columnWidthResizeOption"
        :checkbox-option="checkboxOption"
      />
      <div v-show="showEmpty" class="empty-data"><a-empty description="暂无产品" :image="simpleImage"/></div>
      <!-- 活动规则详情 -->
      <detailModal :openModal="openDetailModal" :itemSn="detailSn" @close="closeDetailModal"></detailModal>
      <!-- 转采购单 -->
      <toPurchaseModal :openModal="openPurchaseModal" @ok="showLockStockQty = true" @close="openPurchaseModal=false" ref="purchaseModal"></toPurchaseModal>
    </a-spin>

  </div>
</template>

<script>
import { commonMixin } from '@/utils/mixin'
import { STable, VSelect } from '@/components'
import { Empty } from 'ant-design-vue'
import detailModal from '@/views/promotionRulesManagement/dealerPromotions/detailModal.vue'
import toPurchaseModal from './toPurchaseModal'
import chooseWarehouse from '@/views/common/chooseWarehouse'
// 接口
import { salesDetailAllList, salesPromoDetailCount, salesDetaiCount } from '@/api/salesDetailNew'
import { salesPromoQueryList, getCreatePurchaseFlag } from '@/api/salesNew'

export default {
  name: 'QueryPart',
  mixins: [commonMixin],
  components: { STable, VSelect, chooseWarehouse, detailModal, toPurchaseModal },
  props: {
    newLoading: { // loading
      type: Boolean,
      default: false
    },
    maxHeight: { // 最大高度
      type: [String, Number],
      default: '300'
    },
    showHeader: { // 是否显示表格头部
      type: Boolean,
      default: true
    }
  },
  data () {
    return {
      loading: false,
      advanced: true, // 高级搜索 展开/关闭
      openDetailModal: false, // 活动规则详情弹框
      openPurchaseModal: false, // 转采购单弹框
      simpleImage: Empty.PRESENTED_IMAGE_SIMPLE,
      detailSn: null, // 活动详情sn
      productType: [], // 产品类型
      salesBillSn: '', // 销售单sn
      detailData: null, // 详情数据
      queryParam: {
        pushProductType: '', // 类型
        productCode: '', //  产品编码
        productName: '', //  产品名称
        promotionFlag: undefined, //  是否促销品
        brandSn: undefined, //  产品品牌
        productTypeSn1: '', //  产品一级分类
        productTypeSn2: '', //  产品二级分类
        productTypeSn3: '', //  产品三级分类
        salesBillSn: '', // 销售单sn
        warehouseSn: undefined, // 仓库sn
        convertPromoGiftsFlag: undefined // 转采购额
      },
      disabled: false, //  查询、重置按钮是否可操作
      activeList: [], // 活动列表
      spinning: false,
      dataSource: [], // 原始数据
      tableData: [], // 表格数据
      cellStyleOption: {
        bodyCellClass: ({ row, column, rowIndex }) => {
          if (row.id.indexOf('promo-') >= 0 && column.field === 'no') {
            return 'table-body-cell-no'
          }
        }
      },
      // 可拖曳调整列宽
      columnWidthResizeOption: {
        enable: true,
        minWidth: 50
      },
      // 自定义单元格
      cellSpanOption: {
        bodyCellSpan: this.bodyCellSpan
      },
      showEmpty: false, // 空图片
      showTableHead: true, // 表格头部
      disableSelectedRowKeys: [], // 禁用数据
      selectedRowKeys: [], // 已选数据
      colspanNums: 16, // 列合并数量
      hasNormalProduct: false, // 是否有正常产品
      showLockStockQty: false // 是否显示锁定库存列
    }
  },
  computed: {
    // 表格高度
    tableHeight () {
      return (this.showEmpty ? 200 : this.maxHeight) + 'px'
    },
    // 是否有促销活动产品
    hasPrompActive () {
      return this.detailData && this.detailData.promoFlag == 1
    },
    // 是否有下推产品
    hasNoPushedActive () {
      return this.detailData && this.detailData.totalPushedQty == 0 || !this.detailData.totalPushedQty
    },
    // 是否有转采购额
    hasConvertPromoGifts () {
      return this.detailData && this.detailData.totalConvertPromoGiftsAmount > 0
    },
    // 是否显示转采购额选项
    showConvertPromoGifts () {
      return this.activeList && this.activeList.find(item => item.promotionRule && item.promotionRule.convertExpenseFlag == 1 && item.promotionRule.promotionRuleType == 'BUY_PROD_GIVE_PROD')
    },
    // 表格复选框
    checkboxOption () {
      return {
        disableSelectedRowKeys: this.disableSelectedRowKeys,
        selectedRowKeys: this.selectedRowKeys,
        // 行选择改变事件
        selectedRowChange: ({ row, isSelected, selectedRowKeys }) => {
          this.selectedRowChange({ row, isSelected, selectedRowKeys })
        },
        // 全选改变事件
        selectedAllChange: ({ isSelected, selectedRowKeys }) => {
          this.selectedAllChange({ isSelected, selectedRowKeys })
        }
      }
    },
    columns () {
      const _this = this
      // 价格
      const priceFormat = function (record, data, h) {
        return (
          <div>
            {_this.toThousands(data)}
            {record.promotionFlag == 'GIFT' || record.promotionFlag == 'DISCOUNT' ? (
              <span title="原价">（{ _this.toThousands(record.origPrice)}）</span>
            ) : ''}
          </div>
        )
      }
      // 数字
      const numsFormat = function (data) {
        return data || data == 0 ? data : '--'
      }
      // 单号
      const codeFormat = function (record, data, h) {
        let ftext = ''
        let fcolor = ''
        if (record.promotionFlag == 'GIFT') {
          ftext = '促'
          fcolor = '#52c41a'
        }
        if (record.promotionFlag == 'GATE') {
          ftext = '槛'
          fcolor = '#108ee9'
        }

        return (
          <div>
            <span style="padding-right: 15px;">{data}</span>
            {ftext ? (<a-badge count={ftext} number-style={{ backgroundColor: fcolor, zoom: '80%' }}></a-badge>) : ''}
            {record.bakConvertPromoGiftsQty ? (<a-badge count="转" number-style={{ backgroundColor: '#ffaa00', zoom: '80%' }}></a-badge>) : ''}
            {Number(record.stockQty || 0) < Number(record.unpushedQty || 0) ? (<a-badge count="缺" number-style={{ zoom: '80%' }}></a-badge>) : ''}
          </div>
        )
      }
      // 取消数量输入框
      const inputFormat = function (record, data, h) {
        if (record.unpushedQty > 0) {
          return (
            <div>
              <a-input-number
                id={'dispacth-cancelNums-' + record.productSn}
                size="small"
                value={record.cancelNums}
                onChange={e => _this.cancelNumsChange(e, record)}
                precision={0}
                min={0}
                max={record.unpushedQty}
                style="width: 100%;"
                placeholder="请输入" />
            </div>
          )
        }
        return '--'
      }
      // 转采购额数量输入框
      const inputFormat1 = function (record, data, h) {
        if (record.unpushedQty >= 0 && record.convertPromoGiftsFlag) {
          // 已选
          if (_this.selectedRowKeys.includes(record.id)) {
            return (
              <div>
                <a-input-number
                  id={'dispacth-maxConvertNums-' + record.productSn}
                  size="small"
                  value={record.convertPromoGiftsQty}
                  onChange={e => _this.convertPromoGiftsChange(e, record)}
                  precision={0}
                  min={0}
                  max={record.maxConvertNums}
                  style="width: 100%;"
                  placeholder="请输入" />
              </div>
            )
          } else {
            return record.convertPromoGiftsQty || 0
          }
        }
        return '--'
      }
      // 操作按钮
      const actionFormat = function (record, data, h) {
        if (record.unpushedQty > 0) {
          return (
            <div>
              <a-button
                id={'dispacth-handleAdd-' + record.productSn}
                size="small"
                type="link"
                class="button-info"
                onClick={() => _this.handleAdd(record)}
              >添加</a-button>
            </div>
          )
        }
        return '--'
      }
      // 编号，并且格式化活动分类行
      const noFormat = function (record, data, h) {
        const isBuyPSendP = record.promo && record.promo.promotionRule.convertExpenseFlag == 1 && record.promo.promotionRule.promotionRuleType == 'BUY_PROD_GIVE_PROD'
        return (
          <div>
            {record.id.indexOf('promo-') >= 0 ? (
              <div class="active-title">
                {record.promo ? (
                  <div>
                    <strong style="font-size:14px;">{record.promo.promotion.description} </strong>
                    <span>({record.promo.promotionRule.description})</span>
                    <span id={'dispacth-desc-' + record.promo.promoRuleSn} style="margin-left:20px;color:#00aaff;cursor: pointer;" onClick={() => _this.showDesc(record.promo)}>
                      <a-icon title="查看活动详情" type="eye"/> 活动详情
                    </span>
                  </div>
                ) : (<div></div>)}
                <div>
                  款数：<strong>{record.total && record.total.totalCategory || '--'}</strong>；
                  数量：<strong>{record.total && record.total.totalQty || '--'}</strong>；
                  {_this.$hasPermissions('B_salesEdit_salesPrice') ? (<span>总金额：<strong>{record.total && record.total.totalAmount || '--'}</strong>；</span>) : ('')}
                  {_this.$hasPermissions('B_salesEdit_salesPrice') && record.promo && record.total && record.total.lossAmount ? (<span>优惠金额：<strong>{record.total.lossAmount}</strong>；</span>) : ('')}
                  {_this.$hasPermissions('B_salesEdit_salesPrice') && record.promo && record.total && record.total.cgejyAmount > 0 && !isBuyPSendP ? (<span>采购额结余：<strong>{_this.toThousands(record.total.cgejyAmount)}</strong>；</span>) : ('')}
                  {_this.$hasPermissions('B_salesEdit_salesPrice') && record.promo && record.total && record.total.cgejyAmount < 0 && !isBuyPSendP ? (<span>采购额超出：<strong>{_this.toThousands(record.total.cgeccAmount)}</strong>；</span>) : ('')}
                  {_this.$hasPermissions('B_salesEdit_salesPrice') && record.promo && record.total && record.total.totalPromoGiftsAmount && isBuyPSendP ? (<span>促销产品转采购额金额：<strong>{_this.toThousands(record.total && record.total.totalPromoGiftsAmount) || '--'}</strong>；</span>) : ('')}
                  {record.expenseAccountFlag != 'WAIT' ? record.expenseAccountFlagDictValue : ''}
                </div>
              </div>
            ) : (<span>{data}</span>)}
          </div>
        )
      }

      let arr = [
        { title: '', field: '', key: 'acheck', width: 50, type: 'checkbox', align: 'center' },
        { title: '序号', field: 'no', key: 'a', width: 50, align: 'center', operationColumn: false, renderBodyCell: ({ row, column, rowIndex }, h) => { return noFormat(row, row[column.field], h) } },
        { title: '产品编码', field: 'productCode', key: 'b', width: 150, align: 'left', operationColumn: false, renderBodyCell: ({ row, column, rowIndex }, h) => { return codeFormat(row, row[column.field], h) } },
        { title: '产品名称', field: 'productName', key: 'c', width: 220, align: 'left', operationColumn: false, ellipsis: { showTitle: true }, renderBodyCell: ({ row, column, rowIndex }, h) => { return row[column.field] || '--' } },
        { title: '原厂编码', field: 'productOrigCode', key: 'd', width: 150, align: 'left', operationColumn: false, ellipsis: { showTitle: true }, renderBodyCell: ({ row, column, rowIndex }, h) => { return row[column.field] || '--' } },
        { title: '出库仓库', field: 'warehouseName', key: 'e', width: 100, align: 'center', operationColumn: false, renderBodyCell: ({ row, column, rowIndex }, h) => { return row[column.field] || '--' } }
      ]
      this.colspanNums = this.showConvertPromoGifts ? 7 : 6
      if (this.$hasPermissions('B_salesDispatch_salesPrice')) { //  售价权限
        this.colspanNums = this.colspanNums + 1
        arr.push({ title: '销售价', field: 'price', width: 80, key: 'f', align: 'right', operationColumn: false, renderBodyCell: ({ row, column, rowIndex }, h) => { return priceFormat(row, row[column.field], h) } })
      }
      if (this.$hasPermissions('B_salesDispatch_costPrice')) { // 成本价权限
        this.colspanNums = this.colspanNums + 1
        arr.push({ title: '成本价', field: 'showCost', width: 80, key: 'g', align: 'right', operationColumn: false, renderBodyCell: ({ row, column, rowIndex }, h) => { return _this.toThousands(row[column.field]) || '--' } })
      }
      this.colspanNums = this.colspanNums + 8
      arr = arr.concat([
        { title: '单位', field: 'productOrigUnit', key: 'i', width: 80, align: 'center', operationColumn: false, renderBodyCell: ({ row, column, rowIndex }, h) => { return row[column.field] || '--' } },
        { title: '可用库存', field: 'stockQty', width: 80, key: 'j', align: 'center', fixed: 'right', operationColumn: false, renderBodyCell: ({ row, column, rowIndex }, h) => { return numsFormat(row[column.field]) } }
      ])
      if (this.showLockStockQty) {
        this.colspanNums = this.colspanNums + 1
        arr.push({ title: '锁定库存', field: 'lockStockQty', width: 80, key: 'jk', align: 'center', fixed: 'right', operationColumn: false, renderBodyCell: ({ row, column, rowIndex }, h) => { return numsFormat(row[column.field]) } })
      }
      arr = arr.concat([
        { title: '销售数量', field: 'qty', width: 80, key: 'k', align: 'center', operationColumn: false, renderBodyCell: ({ row, column, rowIndex }, h) => { return numsFormat(row[column.field]) } },
        { title: '已取消', field: 'cancelQty', width: 80, key: 'o', align: 'center', operationColumn: false, renderBodyCell: ({ row, column, rowIndex }, h) => { return numsFormat(row[column.field]) } },
        { title: '已下推', field: 'pushedQty', width: 80, key: 'p', align: 'center', operationColumn: false, renderBodyCell: ({ row, column, rowIndex }, h) => { return numsFormat(row[column.field]) } },
        { title: '待下推', field: 'unpushedQty', width: 80, key: 'q', align: 'center', operationColumn: false, renderBodyCell: ({ row, column, rowIndex }, h) => { return numsFormat(row[column.field]) } },
        { title: '取消数量', field: 'cancelNums', width: 80, key: 'r', align: 'center', fixed: 'right', operationColumn: false, renderBodyCell: ({ row, column, rowIndex }, h) => { return inputFormat(row, row[column.field], h) } }
      ])
      // 是否显示转采购额
      if (this.showConvertPromoGifts) {
        arr.push({ title: '转采购额数量',
          field: 'convertPromoGiftsQty',
          width: 80,
          key: 'z',
          align: 'center',
          fixed: 'right',
          operationColumn: false,
          renderBodyCell: ({ row, column, rowIndex }, h) => {
            return inputFormat1(row, row[column.field], h)
          } })
      }
      arr.push({ title: '操作', field: 'action', width: 80, key: 's', align: 'center', fixed: 'right', operationColumn: false, renderBodyCell: ({ row, column, rowIndex }, h) => { return actionFormat(row, row[column.field], h) } })

      return arr
    }
  },
  methods: {
    // 查看活动详情
    showDesc (row) {
      this.detailSn = row.promoRuleSn
      this.openDetailModal = true
    },
    // 关闭详情弹窗
    closeDetailModal () {
      this.detailSn = null
      this.openDetailModal = false
    },
    // 合并活动分类单元格
    bodyCellSpan ({ row, column, rowIndex }) {
      if (row.id.indexOf('promo-') >= 0) {
        if (column.field == 'no') {
          return {
            rowspan: 1,
            colspan: this.colspanNums
          }
        } else {
          return {
            rowspan: 0,
            colspan: 0
          }
        }
      }
    },
    // 取消数量变更
    cancelNumsChange (v, record) {
      record.cancelNums = v
      this.dataSource.splice()
    },
    // 转采购数量变更
    convertPromoGiftsChange (v, record) {
      record.convertPromoGiftsQty = v
      this.dataSource.splice()
    },
    // 选择单元格
    selectedRowChange ({ row, isSelected, selectedRowKeys }) {
      // console.log(row, isSelected, selectedRowKeys);
      this.selectedRowKeys = selectedRowKeys
      if (!isSelected) {
        row.convertPromoGiftsQty = row.bakConvertPromoGiftsQty
      }
    },
    // 全选行
    selectedAllChange ({ isSelected, selectedRowKeys }) {
      this.selectedRowKeys = selectedRowKeys
      // 取消全选后，重置数量
      if (!isSelected && this.showConvertPromoGifts) {
        this.dataSource.filter(item => item.convertPromoGiftsQty).map(item => {
          item.convertPromoGiftsQty = item.bakConvertPromoGiftsQty
        })
      }
    },
    // 获取销售单参与的活动列表
    getActiveList () {
      salesPromoQueryList({ salesBillSn: this.salesBillSn }).then(res => {
        if (res.status == 200) {
          this.activeList = res.data.filter(item => item.enabledFlag == 1) || []
        }
        this.$nextTick(() => {
          this.searchTable()
        })
      })
    },
    // 查询列表
    async searchTable () {
      this.selectedRowKeys = []
      this.disableSelectedRowKeys = []
      this.dataSource = []
      this.disabled = true
      this.spinning = true
      this.queryParam.salesBillSn = this.salesBillSn
      this.queryParam.showStock = true
      const params = this.queryParam
      // 获取活动列表
      const active = this.activeList
      // 正常产品
      const hasSearchNormal = !params.promotionFlag || params.promotionFlag == 0
      const proList = hasSearchNormal ? await salesDetailAllList(params).then(res => res.data) : []
      const norTotal = hasSearchNormal ? await salesDetaiCount(params).then(res => res.data) : null
      // 是否有正常产品
      this.hasNormalProduct = proList.length > 0
      // 没有活动时不显示统计
      let listData = active.length ? (proList.length ? [{
        id: 'promo-normal',
        total: norTotal
      }, ...proList] : []) : proList

      if (params.promotionFlag != 0) {
        // 循环获取活动产品
        for (let i = 0; i < active.length; i++) {
          const promo = active[i]
          const activeParams = {
            promoRuleSn: promo.promoRuleSn,
            promoSn: promo.promoSn,
            salesPromoSn: promo.salesPromoSn,
            ...params
          }

          // 获取活动产品统计
          const acTotal = await salesPromoDetailCount(activeParams).then(res => res.data)
          if (acTotal) {
            // 采购额结余
            acTotal.cgejyAmount = (Number(acTotal.totalPromoGiftsAmount || 0) - Number(acTotal.totalUsePromoGiftsAmount || 0)).toFixed(2)
            // 采购额超出
            acTotal.cgeccAmount = (Number(acTotal.totalUsePromoGiftsAmount || 0) - Number(acTotal.totalPromoGiftsAmount || 0)).toFixed(2)
          }

          // 有数据时才调用接口，避免做无用的调用
          if (acTotal && acTotal.totalQty) {
            // 获取活动产品列表
            const aclist = await salesDetailAllList(activeParams).then(res => res.data)
            const retList = aclist.length ? [{
              id: 'promo-' + i,
              promo: promo,
              total: acTotal
            }, ...aclist] : []
            // 将活动产品数据拼接
            listData = aclist && aclist.length ? listData.concat(retList) : listData
          }
        }

        // 如果活动没有任何产品
        if (active.length) {
          const hasAcp = listData.filter(item => item.id != 'promo-normal').filter(item => item.id.indexOf('promo-') >= 0)
          if (hasAcp && hasAcp.length == 0) {
            listData = listData.filter(item => item.id.indexOf('promo-') < 0) || []
          }
        }
      }
      this.dataSource = listData

      // 格式化数据
      let f = 0
      this.dataSource.map((item, i) => {
        const isTjRow = item.id.indexOf('promo-') >= 0
        if (isTjRow) { f = f - 1 }
        item.no = i + 1 + f
        const productCode = (item.productEntity && item.productEntity.code) || (item.dealerProductEntity && item.dealerProductEntity.code)
        const productName = (item.productEntity && item.productEntity.name) || (item.dealerProductEntity && item.dealerProductEntity.name)
        const productOrigCode = (item.productEntity && item.productEntity.origCode) || (item.dealerProductEntity && item.dealerProductEntity.origCode)
        const productOrigUnit = (item.productEntity && item.productEntity.unit) || (item.dealerProductEntity && item.dealerProductEntity.unit)
        item.productCode = productCode || '--'
        item.productName = productName || '--'
        item.productOrigCode = productOrigCode == ' ' ? '--' : productOrigCode
        item.productOrigUnit = productOrigUnit || '--'
        item.cancelNums = item.unpushedQty

        if (item.convertPromoGiftsFlag == 1) {
          item.maxConvertNums = item.unpushedQty + item.convertPromoGiftsQty
        } else {
          item.maxConvertNums = 0
        }
        // 转采购额数量
        item.bakConvertPromoGiftsQty = item.convertPromoGiftsQty

        // 库存为0或待下推数为0，不可添加
        if (!item.convertPromoGiftsQty && (!item.unpushedQty || item.unpushedQty < 0) || isTjRow) {
          this.disableSelectedRowKeys.push(item.id)
        }
      })
      this.showEmpty = this.dataSource.length <= 0
      this.tableData = this.dataSource
      this.spinning = false
      this.disabled = false
    },
    //  重置
    resetSearchForm (detailData) {
      this.queryParam.pushProductType = ''
      this.queryParam.productCode = ''
      this.queryParam.productName = ''
      this.queryParam.promotionFlag = undefined
      this.queryParam.brandSn = undefined
      this.queryParam.productTypeSn1 = ''
      this.queryParam.productTypeSn2 = ''
      this.queryParam.productTypeSn3 = ''
      this.queryParam.warehouseSn = undefined
      this.queryParam.convertPromoGiftsFlag = undefined
      this.productType = []
      this.dataSource = []
      this.clearSelectTable()
      this.searchTable()

      if (detailData) {
        this.detailData = detailData
      }
    },
    pageInit (salesBillSn, detailData) {
      this.salesBillSn = salesBillSn
      this.detailData = detailData
      // 获取活动列表
      this.getActiveList()
      // 是否转过采购单
      this.hasCreatePurchaseFlag()
    },
    // 清空选项
    clearSelectTable () {
      this.selectedRowKeys = []
    },
    // 添加
    handleAdd (row) {
      if (row && row.productEntity && row.productEntity.productBrandName == '箭冠' && row.productEntity.productTypeName3 == '轮胎') {
        if (!row.lockStockQty) {
          this.$message.warning('锁定库存为0，不可添加！')
        } else {
          this.$emit('addProduct', [row.salesBillDetailSn])
        }
      } else {
        if (row.stockQty > 0) { //  可用库存大于0才可添加
          this.$emit('addProduct', [row.salesBillDetailSn])
        } else {
          this.$message.warning('库存为0，不可添加！')
        }
      }
    },
    // 批量转采购额
    handlePlPurchase () {
      const _this = this
      const chooseList = this.selectedRowKeys
      if (chooseList.length == 0) {
        _this.$message.warning('请先选择产品！')
        return
      }
      const chooseRow = this.dataSource.filter(item => chooseList.includes(item.id) && item.convertPromoGiftsFlag == 1)
      const noChooseRow = this.dataSource.filter(item => chooseList.includes(item.id) && !item.convertPromoGiftsFlag)
      const obj = []
      const noObj = []
      noChooseRow && noChooseRow.map(item => {
        noObj.push(item.productCode)
      })
      chooseRow && chooseRow.map(item => {
        obj.push({
          'convertPromoGiftsQty': item.convertPromoGiftsQty,
          'salesBillDetailSn': item.salesBillDetailSn
        })
      })

      if (obj.length) {
        this.$confirm({
          title: '提示',
          content: <div><div style="text-align:center;padding:10px 0;font-weight:bold;">确定将选中的促销产品转成采购额吗？</div>{noObj.length ? <div style="text-align:center;"><div>总共选择了 {chooseList.length} 个产品，其中 {obj.length} 个产品可转采购额。</div><div style="color:red;"> 产品 ({noObj.toString()}) 不可转采购额!</div></div> : ''}<div style="font-size:12px;color:#999;padding:10px 0;text-align:center;">
当该销售单完结后，可将采购额转成费用报销单。</div></div>,
          centered: true,
          closable: true,
          class: 'confirm-center',
          onOk () {
            _this.$emit('convertPromoGifts', obj)
          }
        })
      } else {
        _this.$message.warning('所选产品都不可转采购额！')
      }
    },
    // 批量添加
    handlePlAdd () {
      const _this = this
      const chooseList = this.selectedRowKeys
      if (chooseList.length == 0) {
        _this.$message.warning('请先选择产品！')
        return
      }

      // 库存为0的产品，不包括箭冠轮胎产品
      const noStockRow = this.dataSource.filter(item => chooseList.includes(item.id) && !item.stockQty && item.productEntity && item.productEntity.productBrandName != '箭冠' && item.productEntity.productTypeName3 != '轮胎')
      // 锁定库存为0的产品，只判断箭冠轮胎产品
      const noLockStockRow = this.dataSource.filter(item => chooseList.includes(item.id) && item.productEntity && item.productEntity.productBrandName == '箭冠' && item.productEntity.productTypeName3 == '轮胎' && !item.lockStockQty)

      // 库存为0产品编码列表
      const noObj = []
      const noObjSn = []
      noStockRow && noStockRow.map(item => {
        noObj.push(item.productCode)
        noObjSn.push(item.salesBillDetailSn)
      })
      // 锁定库存为0的产品
      const noLockObj = []
      const noLockObjSn = []
      noLockStockRow && noLockStockRow.map(item => {
        noLockObj.push(item.productCode)
        noLockObjSn.push(item.salesBillDetailSn)
      })

      // 可添加产品，不包括库存未0和箭冠轮胎锁定库存为0的产品
      const chooseRow = this.dataSource.filter(item => {
        return chooseList.includes(item.id) && !noObjSn.includes(item.salesBillDetailSn) && !noLockObjSn.includes(item.salesBillDetailSn)
      })
      // 可添加产品sn列表
      const obj = []
      chooseRow && chooseRow.map(item => {
        obj.push(item.salesBillDetailSn)
      })
      if (obj.length) {
        this.$confirm({
          title: '提示',
          content: <div><div style="text-align:center;padding:10px 0;font-weight:bold;">确认要批量添加到待下推列表吗？</div>{(noObj.length || noLockObj.length) ? <div><div>总共选择了 {chooseList.length} 个产品，其中 {obj.length} 个产品可添加。</div>{noObj.length ? <div>产品 ({noObj.toString()}) 因库存为0不可添加!</div> : ''}</div> : ''}<div>{noLockObj.length ? <div>产品 ({noLockObj.toString()}) 因锁定库存为0不可添加!</div> : ''}</div></div>,
          centered: true,
          closable: true,
          class: 'confirm-center',
          onOk () {
            _this.$emit('addProduct', obj)
          }
        })
      } else {
        _this.$message.warning(noLockObj.length ? '所选产品锁定库存都为0，不可添加！' : '所选产品库存都为0，不可添加！')
      }
    },
    // 整单取消
    handleAllCancel () {
      const _this = this
      this.$confirm({
        title: '提示',
        content: '确定整单取消订单？',
        centered: true,
        closable: true,
        onOk () {
          _this.$emit('cancelAll')
        }
      })
    },
    // 批量取消
    handlePlCancel () {
      const _this = this
      const chooseList = this.selectedRowKeys
      if (chooseList.length == 0) {
        _this.$message.warning('请先选择产品！')
        return
      }
      const chooseRow = this.dataSource.filter(item => chooseList.includes(item.id) && item.id.indexOf('promo-') < 0)
      const hasActive = chooseRow && chooseRow.filter(item => item.promotionFlag != 0)
      if (hasActive.length > 0) {
        _this.$message.warning('参与促销的产品只可进行整单取消！')
        return
      }
      const obj = []
      chooseRow && chooseRow.map(item => {
        obj.push({
          'cancelQty': item.cancelNums,
          'salesBillDetailSn': item.salesBillDetailSn
        })
      })

      this.$emit('cancelProduct', obj)
    },
    // 确认整单转采购单
    confirPurchaseModal () {
      this.loading = true
      getCreatePurchaseFlag({ salesBillSn: this.salesBillSn }).then(res => {
        if (res.status == '200') {
          // 没有转过
          if (res.data == 0) {
            this.showPurchaseModal()
          } else {
            // 转过，弹确认框
            const _this = this
            this.$confirm({
              title: '提示',
              content: '已转过采购单，是否再次转单？',
              centered: true,
              closable: true,
              onOk () {
                _this.showPurchaseModal()
              }
            })
          }
        }
        this.loading = false
      })
    },
    // 打开转采购单弹框
    showPurchaseModal () {
      this.openPurchaseModal = true
      this.$refs.purchaseModal.setDetail(this.detailData)
    },
    // 是否转过采购单
    hasCreatePurchaseFlag () {
      getCreatePurchaseFlag({ salesBillSn: this.salesBillSn }).then(res => {
        this.showLockStockQty = res.data && res.data == 1
      })
    }
  }
}
</script>
<style lang="less">
    .empty-data{
        color: #999;
        text-align: center;
        padding: 20px;
    }
  .ve-table-body-td{
    .active-title{
      display: flex;
      align-items: center;
      justify-content: space-between;
      padding: 10px;
      background: #f3f8fa;
    }
  }
  .ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body tr.ve-table-body-tr td.table-body-cell-no,
  .ve-table .ve-table-container .ve-table-content-wrapper table.ve-table-content tbody.ve-table-body tr.ve-table-expand-tr td.table-body-cell-no{
    padding: 0;
  }
  .ve-table .ve-table-container .ve-table-content-wrapper{
      border-bottom: 1px solid #ddd;
    }
</style>
