<script>
  import useColumns from "./columns";
  import {EXIST} from "@/api/business/purchase/catalogue";
  import {ITEM, SAVE} from "@/api/business/purchase/apply";
  import {tax, unit, currency} from "@/components/popover-select-v2/fetch";
  // 用于回显参照框数据
  import {getRefer} from '@/api/purchase/basic.js'

  const fetchExist = async (prop) => {
    try {
      // try
      const {code, data} = await EXIST(prop);
      if (code === 200) return data;
    } catch (err) {
      // catch
      console.error(err);
    } finally {
      // finally
    }
  };

  export default {
    name: "CopyDrawer",
    props: {
      dict: {
        type: Object,
      },
      selectData: {
        type: [Array],
        require: true,
      },
    },
    components: {
      ElSuperForm: () => import("@/components/super-form/index.vue"),
      ElSuperTable: () => import("@/components/super-table/index.vue"),
      ElSuperUxTable: () => import("@/components/super-ux-table/index.vue"),
      ElPopoverSelectV2: () => import("@/components/popover-select-v2/index.vue"),
    },
    data() {
      const {
        TabColumns,
        TableColumns,
        TabColumns: [
          {
            item: {key: tabName},
          },
        ],
      } = useColumns();
      const rules = this.$init.rules([...TabColumns, ...TableColumns]);
      const params = this.$init.params([...TabColumns, ...TableColumns]);
      return {
        title: "复 制",
        width: "100%",
        visible: false,
        loading: false,
        rules: rules,
        params: params,
        tabName: tabName,
        TabColumns: TabColumns,
        TableColumns: TableColumns,
        delDemandItemList: [],
      };
    },
    computed: {
      disabled: {
        get() {
          const {
            selectData: {length},
          } = this.$props;
          if (length !== 1) {
            return true;
          }
        },
        set() {
        },
      },
    },
    watch: {},
    methods: {
      //
      async changeMaterialName(prop) {
        const {selectData} = prop;
        const {
          puOrg,
          customer,
          supplier,
          currency,
          currencyCode,
          currencyName,
        } = this.params;
        const {nickName: createByName} = this.$store.state.user;
        if (selectData.length) {
          this.params[this.tabName].splice(-1);
        }
        for (const item of selectData) {
          this.loading = true;
          const {tax: taxName, unitName, code: materialCode} = item;
          // task 1
          const {ntaxrate} = await tax(taxName);
          // task 2
          const {
            id: puUnit,
            code: puUnitCode,
            name: puUnitName,
          } = await unit(unitName);
          // task 3
          const {
            recentlyPrice = "0",
            isApprovalFirst = "N",
            purchasequantity,
            recentlyPriceDate
          } = await fetchExist({puOrg, customer, supplier, materialCode, priceType: prop.row.priceType});
          this.loading = false;
          await this.onRowAdd(this.tabName, {
            ...item,
            currency: currency,
            currencyCode: currencyCode,
            currencyName: currencyName,
            unit: puUnit,
            unitCode: puUnitCode,
            unitName: puUnitName,
            puUnit: puUnit,
            puUnitCode: puUnitCode,
            puUnitName: puUnitName,
            recentlyPrice,
            recentlyPriceDate: recentlyPriceDate,
            isApprovalFirst,
            yPurchaseQuantity: purchasequantity,
            tax: Number(ntaxrate === "0E-8" ? 0 : ntaxrate),
            createByName: createByName,
            updateByName: createByName,
            id: null,
          });
        }
      },
      //
      async changeCustomerName(prop) {
        console.log("prop", prop)
        const {
          puOrg,
          supplier,
          currency,
          currencyCode,
          currencyName,
        } = this.params;
        const {
          recentlyPrice,
          isApprovalFirst,
          purchasequantity,
          recentlyPriceDate
        } = await fetchExist({
          puOrg,
          supplier,
          materialCode: prop.row.materialCode,
          customer: prop.row.customerName ? prop.row.customer : '',
          customerName: prop.row.customerName,
          priceType: prop.row.priceType
        });
        prop.row.yPurchaseQuantity = purchasequantity
        prop.row.recentlyPrice = recentlyPrice
        prop.row.isApprovalFirst = isApprovalFirst
        prop.row.recentlyPriceDate = recentlyPriceDate
      },
      //
      async fetchItem(prop) {
        try {
          // try
          this.loading = true;
          const {tabName, TabColumns} = this;
          const {TableColumns} = TabColumns.find(
            ({item: {key}}) => key === tabName
          );
          console.log('看看prop', prop)
          const {code, data} = await ITEM(prop, true);
          if (code === 200) {
            this.params = data;
            this.params.priceApplyItems = data.priceApplyItems.map((item) => ({
              ...this.$init.params(TableColumns),
              ...item,
              id: null,
            }));
            this.params.id = null;
          } else {
            this.visible = false;
          }
        } catch (err) {
          // catch
          console.error(err);
          this.visible = false;
        } finally {
          // finally
          this.loading = false;
        }
      },
      //
      async onOpen() {
        this.visible = true;
        const {
          selectData: [{id}],
        } = this.$props;
        this.params.id = null;
        this.params.createBy = null;
        this.params.priceCode = null;
        this.params.createByName = null;
        this.params.effectiveDate = null;
        this.params.priceApplyOrgs = [];
        this.params.priceApplyItems = this.params.priceApplyItems.map((item) => ({
          ...item,
          id: null,
          applyId: null,
          createByName: null,
          updateByName: null,
          delFlag: 0,
        }));
        await this.fetchItem(id);
      },
      //
      async onHide() {
        const {TabColumns, TableColumns} = useColumns();
        this.visible = false;
        this.params = this.$init.params([...TabColumns, ...TableColumns]);
        this.$emit("success");
        this.delDemandItemList = []
      },
      //
      async onRowAdd(prop, pushParams = {}) {
        this.$refs.superForm.validate(async (valid) => {
          if (valid) {
            const {TabColumns} = this;
            const {TableColumns} = TabColumns.find(
              ({item: {key}}) => key === prop
            );
            this.params[prop].push({
              delFlag: "0",
              ...this.$init.params(TableColumns),
              ...pushParams,
            });
          }
        });
      },
      //
      async onRowRemove(prop, scope) {
        // const {$index} = scope;
        // this.params[prop].splice($index, 1);
        scope.row.delFlag = '2'
        let delList = []
        delList = this.params[prop].filter(item => {
          return item.delFlag == '2'
        })
        this.params[prop] = this.params[prop].filter(item => {
          return item.delFlag == '0'
        })
        this.delDemandItemList.push(...delList)
      },
      //
      async useSubmit(prop) {
        this.$refs[prop].validate(async (valid) => {
          console.log(this.params);
          if (valid) {
            try {
              this.loading = true;
              let list = []
              list.push(...this.params.priceApplyItems, ...this.delDemandItemList)
              this.params.priceApplyItems = this.params.priceApplyItems.filter(
                (item) => item.materialName
              );
              // 深拷贝一下参数对象
              let param = JSON.parse(JSON.stringify(this.params))
              // console.log('深拷贝对象',param);
              param.priceApplyItems = list
              param.priceApplyItems.forEach((item, index) => {
                item.$index = index
              });
              let tishi = param.priceApplyItems.filter(item => {return (item.priceDiffer && item.delFlag == '0' && item.priceDiffer !== 0)})
              console.log('筛选', tishi)
              let tishiMsg = tishi.map(item => {
                return `第${item.$index+1}行为价格调整`
              })
              console.log(tishiMsg)
              if(tishiMsg.length !== 0) {
                this.$modal.confirm(tishiMsg+ '请核对后再次提交').then(async () =>{
                  const {msg, code} = await SAVE(param);
                  if (code === 200) {
                    this.onHide();
                    this.$emit("success");
                    this.$notify.success(msg);
                    this.delDemandItemList = []
                  }
                }).catch(() => {});
              } else {
                  const {msg, code} = await SAVE(param);
                  if (code === 200) {
                    this.onHide();
                    this.$emit("success");
                    this.$notify.success(msg);
                    this.delDemandItemList = []
                  }
              }
            } catch (err) {
              // catch
              console.error(err);
            } finally {
              // finally
              this.loading = false;
            }
          } else {
            return false;
          }
        });
      },
      // 粘贴
      async pasteMe(e, scope, index, prop) {
        this.$modal.loading("正在处理数据...");
        e.preventDefault() //阻止默认粘贴事件
        let source = e.clipboardData.getData("Text");
        console.log('scope', scope.column.property)
        console.log('index', index)
        // 首先对源头进行解析
        let rows = source.split("\r\n"); // 拆成一个数组
        // 数组去除空字符串
        rows = rows.filter(item => {
          return item && item.trim()
        })
        if (rows.length < 100) {
          if(scope.column.property == 'materialCode') {
            let rowList = []
            let newLine = []
            await getRefer({ type: 'MATERIAL_PARAM', materialCodeList: rows }).then(res => {
              if (res.code === 200) {
                rowList = res.rows
              }
            }).catch(err => {
              this.$modal.closeLoading();
            })
            const {
              puOrg,
              customer,
              customerName,
              supplier,
              currency,
              currencyCode,
              currencyName,
            } = this.params;
            const {TabColumns} = this;
            const {TableColumns} = TabColumns.find(
              ({item: {key}}) => key === prop
            );
            // console.log('kk', TableColumns)
            // console.log('this.$init.params(TableColumns)', this.$init.params(TableColumns))
            for (let i = 0; i<rowList.length; i++) {
              let line = {...this.$init.params(TableColumns)}
              console.log('line',line)
              const {nickName: createByName} = this.$store.state.user;
              const {ntaxrate} = await tax(rowList[i].materialRateName);
              // task 2
              const {
                id: puUnit,
                code: puUnitCode,
                name: puUnitName,
              } = await unit(rowList[i].unitIdName);
              // task 3
              const {
                recentlyPrice = "0",
                isApprovalFirst = "N",
                purchasequantity,
                recentlyPriceDate
              } = await fetchExist({puOrg, customer, supplier, materialCode: rowList[i].code, customerName: "", priceType: line.priceType});
              line.delFlag = '0'
              line.materialCode = rowList[i].code
              line.material = rowList[i].id
              line.materialName = rowList[i].name
              line.specification = rowList[i].specification
              line.model = rowList[i].model
              line.manufacturerName = rowList[i].manufacturerIdName
              line.unit = puUnit,
              line.unitCode = puUnitCode,
              line.unitName = puUnitName,
              line.puUnit  = puUnit,
              line.puUnitCode = puUnitCode,
              line.puUnitName = puUnitName,
              line.recentlyPrice = recentlyPrice
              line.isApprovalFirst = isApprovalFirst
              line.recentlyPriceDate = recentlyPriceDate,
              line.yPurchaseQuantity = purchasequantity,
              line.tax = Number(ntaxrate === "0E-8" ? 0 : ntaxrate),
              line.createByName = createByName,
              line.updateByName = createByName,
              line.currency = currency
              line.currencyCode = currencyCode
              line.currencyName = currencyName
              newLine.push(line)
              console.log('临时数组', newLine)
            }
            // 删除指定下标
            this.params[prop].splice(index,this.params[prop].length - index,...newLine)
            this.$modal.closeLoading();
            this.$modal.notifySuccess("共粘贴" + rowList.length + '条数据');

          } else if(scope.column.property == 'taxPrice') {
            console.log('复制内容：', rows)
            // let newLine = []
            // const {TabColumns} = this;
            // const {TableColumns} = TabColumns.find(
            //   ({item: {key}}) => key === prop
            // );
            if(this.params[prop].length <= 1) {
              this.params[prop][index].taxPrice = rows[0]
              // for (let i = 0; i<rows.length; i++) {
              //   let line = {...this.$init.params(TableColumns)}
              //   line.taxPrice = rows[i]
              //   newLine.push(line)
              // }
              // // 删除指定下标
              // this.params[prop].splice(index,this.params[prop].length - index,...newLine)
              // this.$modal.notifySuccess("共粘贴" + rows.length + '条数据');
              this.$modal.closeLoading();
            } else {
              for(let i = index , j = 0; i < this.params[prop].length; i++, j++) {
                this.params[prop][i].taxPrice = rows[j]
              }
              // this.$refs.table.doLayout()
              // console.log(this.params[prop])
              this.$modal.closeLoading();
            }
          } else if(scope.column.property == 'supplierName') {
            if(this.params[prop].length <= 1) {
              this.params[prop][index].supplierName = rows[0]
              this.$modal.closeLoading();
            } else {
              for(let i = index , j = 0; i < this.params[prop].length; i++, j++) {
                this.params[prop][i].supplierName = rows[j]
              }
              this.$modal.closeLoading();
            }
          } else if(scope.column.property == 'bidPrice') {
            if(this.params[prop].length <= 1) {
              this.params[prop][index].bidPrice = rows[0]
              this.$modal.closeLoading();
            } else {
              for(let i = index , j = 0; i < this.params[prop].length; i++, j++) {
                this.params[prop][i].bidPrice = rows[j]
              }
              this.$modal.closeLoading();
            }
          } else if(scope.column.property == 'unitPrice') {
            if(this.params[prop].length <= 1) {
              this.params[prop][index].unitPrice = rows[0]
              this.$modal.closeLoading();
            } else {
              for(let i = index , j = 0; i < this.params[prop].length; i++, j++) {
                this.params[prop][i].unitPrice = rows[j]
              }
              this.$modal.closeLoading();
            }
          } else if(scope.column.property == 'supplierName1') {
            if(this.params[prop].length <= 1) {
              this.params[prop][index].supplierName1 = rows[0]
              this.$modal.closeLoading();
            } else {
              for(let i = index , j = 0; i < this.params[prop].length; i++, j++) {
                this.params[prop][i].supplierName1 = rows[j]
              }
              this.$modal.closeLoading();
            }
          } else if(scope.column.property == 'bidPrice1') {
            if(this.params[prop].length <= 1) {
              this.params[prop][index].bidPrice1 = rows[0]
              this.$modal.closeLoading();
            } else {
              for(let i = index , j = 0; i < this.params[prop].length; i++, j++) {
                this.params[prop][i].bidPrice1 = rows[j]
              }
              this.$modal.closeLoading();
            }
          } else if(scope.column.property == 'unitPrice1') {
            if(this.params[prop].length <= 1) {
              this.params[prop][index].unitPrice1 = rows[0]
              this.$modal.closeLoading();
            } else {
              for(let i = index , j = 0; i < this.params[prop].length; i++, j++) {
                this.params[prop][i].unitPrice1 = rows[j]
              }
              this.$modal.closeLoading();
            }
          } else if(scope.column.property == 'supplierName2') {
            if(this.params[prop].length <= 1) {
              this.params[prop][index].supplierName2 = rows[0]
              this.$modal.closeLoading();
            } else {
              for(let i = index , j = 0; i < this.params[prop].length; i++, j++) {
                this.params[prop][i].supplierName2 = rows[j]
              }
              this.$modal.closeLoading();
            }
          } else if(scope.column.property == 'bidPrice2') {
            if(this.params[prop].length <= 1) {
              this.params[prop][index].bidPrice2 = rows[0]
              this.$modal.closeLoading();
            } else {
              for(let i = index , j = 0; i < this.params[prop].length; i++, j++) {
                this.params[prop][i].bidPrice2 = rows[j]
              }
              this.$modal.closeLoading();
            }
          } else if(scope.column.property == 'unitPrice2') {
            if(this.params[prop].length <= 1) {
              this.params[prop][index].unitPrice2 = rows[0]
              this.$modal.closeLoading();
            } else {
              for(let i = index , j = 0; i < this.params[prop].length; i++, j++) {
                this.params[prop][i].unitPrice2 = rows[j]
              }
              this.$modal.closeLoading();
            }
          } 

        } else {
          this.$modal.notifyWarning("复制长度不能超过100!");
          this.$modal.closeLoading();
        }
      },
    },
    created() {
    },
    mounted() {
    },
    destroyed() {
    },
  };
</script>
<template>
  <el-button
    v-bind="$attrs"
    v-on="$listeners"
    :disabled="disabled"
    @click="onOpen"
  >
    {{ title }}
    <el-drawer
      :show-close="false"
      :size="width"
      :title="title"
      :visible.sync="visible"
      append-to-body
      destroy-on-close
      @close="onHide"
    >
      <template slot="title">
        <span>{{ title }}</span>
        <el-button
          type="primary"
          :size="$attrs.size"
          :loading="loading"
          @click="useSubmit('superForm')"
        >
          确 认
        </el-button>
        <el-button :size="$attrs.size" :loading="loading" @click="onHide">
          取 消
        </el-button>
      </template>
      <el-super-form
        v-model="params"
        :dict="dict"
        :rules="rules"
        :size="$attrs.size"
        :columns="TableColumns"
        ref="superForm"
        label-width="auto"
        label-position="right"
        style="padding: 18px"
      >
      </el-super-form>
      <el-tabs v-model="tabName" style="padding: 0 18px 18px">
        <el-tab-pane
          v-for="({ item, TableColumns: columns }, index) in TabColumns"
          :key="index"
          :label="item.title"
          :name="item.key"
          lazy
        >
          <div v-loading="loading" style="height: 250px; display: flex">
            <el-super-ux-table
              index
              v-model="params[item.key]"
              :dict="dict"
              :ref="tabName"
              height="250"
              :columns="columns"
              :size="$attrs.size"
            >
              <template slot="materialName" slot-scope="scope">
                <component
                  v-bind="scope.attr"
                  v-model="scope.row[scope.item.key]"
                  :size="$attrs.size"
                  :source.sync="scope.row"
                  @change="changeMaterialName({ ...scope, selectData: $event })"
                >
                </component>
              </template>
              <template slot="materialCode" slot-scope="scope">
                <component
                  v-bind="scope.attr"
                  v-model="scope.row[scope.item.key]"
                  :size="$attrs.size"
                  :source.sync="scope.row"
                  @paste.native="pasteMe($event, scope, scope.rowIndex, tabName)"
                >
                </component>
              </template>
              <template slot="taxPrice" slot-scope="scope">
                <component
                  v-bind="scope.attr"
                  v-model="scope.row[scope.item.key]"
                  :size="$attrs.size"
                  :source.sync="scope.row"
                  @paste.native="pasteMe($event, scope, scope.rowIndex, tabName)"
                >
                </component>
              </template>
              <template slot="supplierName" slot-scope="scope">
                <component
                  v-bind="scope.attr"
                  v-model="scope.row[scope.item.key]"
                  :size="$attrs.size"
                  :source.sync="scope.row"
                  @paste.native="pasteMe($event, scope, scope.rowIndex, tabName)"
                >
                </component>
              </template>
              <template slot="bidPrice" slot-scope="scope">
                <component
                  v-bind="scope.attr"
                  v-model="scope.row[scope.item.key]"
                  :size="$attrs.size"
                  :source.sync="scope.row"
                  @paste.native="pasteMe($event, scope, scope.rowIndex, tabName)"
                >
                </component>
              </template>
              <template slot="unitPrice" slot-scope="scope">
                <component
                  v-bind="scope.attr"
                  v-model="scope.row[scope.item.key]"
                  :size="$attrs.size"
                  :source.sync="scope.row"
                  @paste.native="pasteMe($event, scope, scope.rowIndex, tabName)"
                >
                </component>
              </template>
              <template slot="supplierName1" slot-scope="scope">
                <component
                  v-bind="scope.attr"
                  v-model="scope.row[scope.item.key]"
                  :size="$attrs.size"
                  :source.sync="scope.row"
                  @paste.native="pasteMe($event, scope, scope.rowIndex, tabName)"
                >
                </component>
              </template>
              <template slot="bidPrice1" slot-scope="scope">
                <component
                  v-bind="scope.attr"
                  v-model="scope.row[scope.item.key]"
                  :size="$attrs.size"
                  :source.sync="scope.row"
                  @paste.native="pasteMe($event, scope, scope.rowIndex, tabName)"
                >
                </component>
              </template>
              <template slot="unitPrice1" slot-scope="scope">
                <component
                  v-bind="scope.attr"
                  v-model="scope.row[scope.item.key]"
                  :size="$attrs.size"
                  :source.sync="scope.row"
                  @paste.native="pasteMe($event, scope, scope.rowIndex, tabName)"
                >
                </component>
              </template>
              <template slot="supplierName2" slot-scope="scope">
                <component
                  v-bind="scope.attr"
                  v-model="scope.row[scope.item.key]"
                  :size="$attrs.size"
                  :source.sync="scope.row"
                  @paste.native="pasteMe($event, scope, scope.rowIndex, tabName)"
                >
                </component>
              </template>
              <template slot="bidPrice2" slot-scope="scope">
                <component
                  v-bind="scope.attr"
                  v-model="scope.row[scope.item.key]"
                  :size="$attrs.size"
                  :source.sync="scope.row"
                  @paste.native="pasteMe($event, scope, scope.rowIndex, tabName)"
                >
                </component>
              </template>
              <template slot="unitPrice2" slot-scope="scope">
                <component
                  v-bind="scope.attr"
                  v-model="scope.row[scope.item.key]"
                  :size="$attrs.size"
                  :source.sync="scope.row"
                  @paste.native="pasteMe($event, scope, scope.rowIndex, tabName)"
                >
                </component>
              </template>
              <template slot="customerName" slot-scope="scope">
                <component
                  v-bind="scope.attr"
                  v-model="scope.row[scope.item.key]"
                  :size="$attrs.size"
                  :source.sync="scope.row"
                  @input="changeCustomerName({ ...scope, selectData: $event })"
                >
                </component>
              </template>
              <ux-table-column fixed="right" label="操作" width="100">
                <template slot="header" slot-scope="scope">
                  <el-button :size="$attrs.size" @click="onRowAdd(tabName)">
                    新增
                  </el-button>
                </template>
                <template slot-scope="scope">
                  <el-button
                    :size="$attrs.size"
                    @click.native.prevent="onRowRemove(tabName, scope)"
                  >
                    删除
                  </el-button>
                </template>
              </ux-table-column>
            </el-super-ux-table>
          </div>
        </el-tab-pane>
      </el-tabs>
    </el-drawer>
  </el-button>
</template>

<style scoped></style>
