<template>
  <div class="app-container">
    <el-card>
      <div slot="header" class="card-title">{{ $t("收款单详情") }}</div>
      <el-descriptions :column="3" border>
        <el-descriptions-item :label="$t('收款单编号')">{{
          form.receiptNo
        }}</el-descriptions-item>
        <el-descriptions-item :label="$t('状态')">
          <dict-tag :type="DICT_TYPE.ECW_RECEIPT_STATE" :value="form.state" />
        </el-descriptions-item>
        <el-descriptions-item :label="$t('客户')">{{
          form.customerName
        }}</el-descriptions-item>
        <el-descriptions-item :label="$t('部门')">{{
          form.departmentName
        }}</el-descriptions-item>
        <el-descriptions-item :label="$t('业务员')">{{
          form.salesmanName
        }}</el-descriptions-item>
        <!-- <el-descriptions-item :label="$t('手续费(RMB)')">{{ form.feeRate }}</el-descriptions-item> -->
        <el-descriptions-item :label="$t('备注')">{{
          form.remark
        }}</el-descriptions-item>
      </el-descriptions>
    </el-card>
    <el-card class="card">
      <div slot="header" class="card-title">{{ $t("应收明细") }}</div>
      <el-table :data="list" border>
        <el-table-column :label="$t('订单号')" align="center" prop="orderNo" />
        <el-table-column :label="$t('提单号')" align="center" prop="tidanNo" />
        <el-table-column :label="$t('唛头')" align="center" prop="marks" />
        <el-table-column :label="$t('品名')" align="center" prop="title">
          <template slot-scope="scope">
            <span v-if="scope.row.feeType != 5">{{
              scope.row.titleZh
                ? scope.row.titleZh + "(" + scope.row.titleEn + ")"
                : ""
            }}</span>
          </template>
        </el-table-column>
        <el-table-column :label="$t('箱数')" align="center" prop="num" />
        <el-table-column :label="$t('体积/重量')" align="center" prop="weight">
          <template slot-scope="scope">
            <span v-if="scope.row.feeType != 5">
              {{ scope.row.volume + "/" + scope.row.weight }}</span
            >
          </template>
        </el-table-column>
        <el-table-column :label="$t('收入类型')" align="center" prop="feeType">
          <template slot-scope="scope">
            <dict-tag
              :type="DICT_TYPE.FEE_TYPE"
              :value="scope.row.feeType"
            ></dict-tag>
          </template>
        </el-table-column>
        <el-table-column
          :label="$t('单价金额')"
          align="center"
          prop="unitPrice"
        >
          <template slot-scope="scope">
            <span>{{ scope.row.unitPrice }}</span>
            {{ getCurrencyLabel(scope.row.currencyId) }}
          </template>
        </el-table-column>
        <el-table-column
          :label="$t('总金额')"
          align="center"
          prop="totalAmount"
        >
          <template slot-scope="scope">
            <span>{{ scope.row.totalAmount }}</span>
            {{ getCurrencyLabel(scope.row.currencyId) }}
          </template>
        </el-table-column>
        <el-table-column :label="$t('优惠金额')" align="center">
          <template slot-scope="scope">
            {{
              scope.row.discountTotal
                ? `${scope.row.discountTotal}(${scope.row.discountRemark})`
                : 0
            }}
          </template>
        </el-table-column>
      </el-table>
      <el-descriptions :column="2" border class="card">
        <el-descriptions-item :label="$t('是否需要开票')">
          <span>{{ form.openInvoice == 1 ? $t("需要") : $t("不需要") }}</span>
        </el-descriptions-item>
        <el-descriptions-item>
          <template slot="label">
            {{ $t("核销基准币种") }}
            <span
              :title="
                $t(
                  '应收可能出现多个币种的情况,多个币种没法计算整个收款单的核销比例,所以增加一个中间币种,如果应收只有一个币种就使用应收币种,如果有多个币种就以美元为核销基准币种'
                )
              "
              ><i class="el-icon-question"></i
            ></span>
          </template>
          {{ getCurrencyLabel(showCurrencyId) }}
        </el-descriptions-item>
      </el-descriptions>
    </el-card>
    <el-card class="card">
      <div slot="header" class="card-title">{{ $t("开票资料") }}</div>
      <el-descriptions :column="3" border>
        <el-descriptions-item :label="$t('发票抬头')">
          {{ form.invoice }}
        </el-descriptions-item>
        <el-descriptions-item :label="$t('纳税人识别号')">
          {{ form.taxpayer }}
        </el-descriptions-item>
        <el-descriptions-item :label="$t('开户行')">
          {{ form.accountBank }}
        </el-descriptions-item>
        <el-descriptions-item :label="$t('账号')">
          {{ form.accountName }}
        </el-descriptions-item>
        <el-descriptions-item :label="$t('项目')">
          {{ form.projectName }}
        </el-descriptions-item>
        <el-descriptions-item :label="$t('税率') + '%'">
          {{ form.taxRate }}
        </el-descriptions-item>
        <el-descriptions-item :label="$t('开票地址/电话')">
          {{ form.addressPhone }}
        </el-descriptions-item>
      </el-descriptions>
    </el-card>

    <el-card class="card">
      <!--收款信息 改 账单信息  lanbm 2024-05-29 update -->
      <div slot="header" class="card-title">{{ $t("账单信息") }}</div>
      <el-table :data="form.receiptAccountList" border>
        <el-table-column :label="$t('应收币种')" align="center">
          <template slot-scope="scope">
            {{ getCurrencyLabel(scope.row.currencyId) }}
          </template>
        </el-table-column>
        <el-table-column
          :label="$t('应收金额')"
          align="center"
          prop="receivableAmount"
        >
          <template slot-scope="scope" v-if="scope.row.type !== 'total'">
            <span
              v-if="scope.row.discountTotal && scope.row.discountTotal > 0"
              >{{
                `${scope.row.receivableAmount - scope.row.discountTotal}(${
                  scope.row.receivableAmount
                } - ${scope.row.discountTotal})`
              }}</span
            >
            <span v-else>{{ `${scope.row.receivableAmount}` }}</span>
          </template>
        </el-table-column>
        <el-table-column align="center" width="220">
          <template #header>
            {{ $t("核销基准币种") }}({{ getCurrencyLabel(showCurrencyId) }}){{
              $t("汇率")
            }}
          </template>
          <template slot-scope="scope">
            <template v-if="scope.row.type !== 'total'">
              <span>{{ scope.row.writeOffRate }}</span>
            </template>
            <template v-else>
              {{ $t("应核销总金额") }}({{ getCurrencyLabel(showCurrencyId) }})
            </template>
          </template>
        </el-table-column>
        <el-table-column align="center" prop="writeOffAmount">
          <template #header>
            {{ $t("核销基准金额") }}({{ getCurrencyLabel(showCurrencyId) }})
          </template>
        </el-table-column>
        <el-table-column :label="$t('期望收款账户')" align="center">
          <template slot-scope="scope" v-if="scope.row.type !== 'total'">
            {{
              `${
                bankData.find((v) => v.id == scope.row.platformAccountId)
                  ? bankData.find((v) => v.id == scope.row.platformAccountId)
                      .baAccountName
                  : ""
              }(${
                bankData.find((v) => v.id == scope.row.platformAccountId)
                  ? bankData.find((v) => v.id == scope.row.platformAccountId)
                      .baAccountNum
                  : ""
              })`
            }}
          </template>
        </el-table-column>

        <el-table-column :label="$t('期望收款币种')" align="center">
          <template slot-scope="scope">
            {{ getCurrencyLabel(scope.row.collectionCurrencyId) }}
          </template>
        </el-table-column>
        <el-table-column :label="$t('期望收款汇率')" align="center">
          <template slot-scope="scope">
            <span v-if="scope.row.type !== 'total'">{{
              scope.row.collectionRate
            }}</span>
            <span v-else
              >{{ $t("期望收费金额") }}
              <span :title="$t('导出账单给客户时显示的收款金额与币种')"
                ><i class="el-icon-question"></i
              ></span>
            </span>
          </template>
        </el-table-column>
        <el-table-column
          :label="$t('期望收款金额')"
          align="center"
          prop="collectionAmount"
        >
          <template slot-scope="scope">
            <span v-if="scope.row.type !== 'total'">{{
              scope.row.collectionAmount || 0
            }}</span>
            <div v-else>
              <div v-for="itemAmount in scope.row.collectionAmount">
                {{
                  $i18n.locale == "zh_CN"
                    ? itemAmount.currencyNameZh
                    : itemAmount.currencyNameEn
                }}:
                {{ itemAmount && itemAmount.amount ? itemAmount.amount : 0 }}
              </div>
            </div>
          </template>
        </el-table-column>
      </el-table>
      <el-descriptions :column="2" border class="card">
        <el-descriptions-item :label="$t('账单汇率有效期')">
          {{ parseTime(form.rateValidateDate) }}
        </el-descriptions-item>
      </el-descriptions>
    </el-card>
    <el-card class="card">
      <div slot="header" class="card-title">{{ $t("银行收款明细") }}</div>
      <!--
      <div>
        <el-button
          type="primary"
          v-if="form.state != 7 && form.state != 0"
          plain
          size="mini"
          @click="handleAddReceiptItem"
          v-hasPermi="['ecw:payment:detail:addBank']"
          style="padding: 10px; margin-bottom: 10px"
          >{{ $t("添加收款明细") }}</el-button
        >
      </div>-->
      <el-table
        ref="multipleTable"
        :data="detailed"
        border
        row-key="id"
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="50" :reserve-selection="true">
        </el-table-column>
        <el-table-column
          :label="$t('序号')"
          type="index"
          align="center"
          width="50"
        ></el-table-column>
        <el-table-column
          :label="$t('收款账户')"
          align="center"
          prop="accountName"
        />
        <el-table-column :label="$t('实收金额')" align="center" prop="amount" />
        <el-table-column :label="$t('实收币种')" align="center" prop="marks">
          <template slot-scope="scope">
            {{ getCurrencyLabel(scope.row.currencyId) }}
          </template>
        </el-table-column>
        <el-table-column :label="$t('汇率')" align="center" prop="rate" />
        <el-table-column align="center" prop="writeOffAmount">
          <template #header>
            {{ $t("兑核销基准金额") }}({{ getCurrencyLabel(showCurrencyId) }})
          </template>
        </el-table-column>
        <el-table-column
          :label="$t('实收日期')"
          align="center"
          prop="amountDate"
        >
        </el-table-column>
        <el-table-column :label="$t('水单号')" align="center" prop="billNo" />
        <el-table-column :label="$t('水单附件')" align="center" prop="attr">
          <template slot-scope="scope" v-if="scope.row.attr">
            <div v-for="(v, i) in scope.row.attr" :key="i">
              <el-link :href="v.url" type="primary" target="_blank">{{
                v.name
              }}</el-link>
            </div>
          </template>
        </el-table-column>
        <el-table-column :label="$t('状态')" align="center" prop="status">
          <template slot-scope="scope">
            <dict-tag
              :type="DICT_TYPE.RECEIPT_ITEM_STATE"
              :value="scope.row.status"
            />
          </template>
        </el-table-column>
        <!--
        <el-table-column :label="$t('操作')" align="center" width="200">
          <template slot-scope="scope">
            <el-button
              v-if="scope.row.status == 0"
              v-hasPermi="['ecw:payment:detail:delete']"
              type="text"
              @click="deleteClick(scope.row)"
              >{{ $t("删除") }}</el-button
            >
            <el-button
              v-if="scope.row.status == 0"
              type="text"
              @click="detailClick(scope.row)"
              v-hasPermi="['ecw:payment:detail:detail']"
              >{{ $t("详情") }}</el-button
            >
            <el-button
              v-if="scope.row.status == 0"
              type="text"
              @click="
                $router.push(`bankDetail?id=` + id + `&bankId=` + scope.row.id)
              "
              v-hasPermi="['ecw:payment:detail:writeOff']"
              >{{ $t("核销") }}</el-button
            >
            <el-button
              v-if="scope.row.status == 1"
              type="text"
              @click="showCancel(scope.$index)"
              v-hasPermi="['ecw:payment:detail:cancelWriteOff']"
              >{{ $t("反核销") }}</el-button
            >
            <el-button
              v-if="scope.row.status == 0"
              type="text"
              @click="editClick(scope.row)"
              v-hasPermi="['ecw:payment:detail:bankEdit']"
              >{{ $t("编辑") }}</el-button
            >
            <el-button
              v-if="scope.row.status == 2"
              type="text"
              @click="cancelClick(scope.$index, 1)"
              v-hasPermi="['ecw:payment:detail:cancelDetailApproval']"
              >{{ $t("取消审核") }}</el-button
            >
            <el-button
              v-if="scope.row.status == 3"
              type="text"
              @click="cancelClick(scope.$index, 2)"
              v-hasPermi="['ecw:payment:detail:cancelWriteOffNo']"
              >{{ $t("取消反核销审核") }}</el-button
            >
            <el-button
              v-if="scope.row.status == 3 || scope.row.status == 2"
              type="text"
              @click="
                $router.push(
                  `/bpm/process-instance/detail?id=` + scope.row.bmpId
                )
              "
              v-hasPermi="['ecw:payment:detail:approval']"
              >{{ $t("审核详情") }}</el-button
            >
          </template>
        </el-table-column>-->
      </el-table>
    </el-card>
    <el-card class="card hexiaoCard">
      <el-descriptions :column="3" border>
        <el-descriptions-item>
          <template slot="label">
            {{ $t("实收已核销总金额")
            }}<span
              :title="
                $t(
                  '所有银行收款明细中状态为已核销的实收金额,币种根据实收币种分类统计'
                )
              "
              ><i class="el-icon-question"></i
            ></span>
          </template>
          <template v-if="!Object.keys(writeOffTotal).length"> 0 </template>
          <div v-else>
            <div v-for="(amount, currency) in writeOffTotal" :key="currency">
              {{ amount }}{{ getCurrencyLabel(currency) }}
            </div>
          </div>
        </el-descriptions-item>
        <el-descriptions-item>
          <template slot="label">
            {{ $t("核销基准币种已核销总金额") }}({{
              getCurrencyLabel(showCurrencyId)
            }})
            <span
              :title="
                $t(
                  '为了方便统计收款单核销比例,将所有银行收款明细中状态为已核销的实收金额,转换为核销基准币种的金额累加'
                )
              "
              ><i class="el-icon-question"></i
            ></span>
          </template>
          {{ writeOffAmount }}
        </el-descriptions-item>
        <el-descriptions-item>
          <template slot="label">
            {{ $t("总核销比例") }}({{ getCurrencyLabel(showCurrencyId) }})
            <span
              :title="
                $t('总核销比例=核销基准币种已核销总金额/核销基准币种应收总金额')
              "
              ><i class="el-icon-question"></i
            ></span>
          </template>
          {{ WriteOffProportion }}%
        </el-descriptions-item>
      </el-descriptions>
    </el-card>
    <div style="margin: 20px 0; font-size: 16px" v-if="form.financeRemark">
      {{ $t("备注") }}:{{ form.financeRemark }}
    </div>
    <!--
    <div slot="footer" style="margin: 20px 0">

      <el-button
        v-if="
          form.state != 7 &&
          form.state != 9 &&
          form.state != 10 &&
          form.state != 11 &&
          form.state != 4 &&
          form.state != 5 &&
          form.state != 6
        "
        type="primary"
        @click="toEdit"
        v-hasPermi="['ecw:payment:detail:edit']"
        >{{ $t("编辑") }}</el-button
      >
      <el-button
        v-if="
          form.state != 7 &&
          form.state != 9 &&
          form.state != 10 &&
          form.state != 11 &&
          form.state != 4 &&
          form.state != 5 &&
          form.state != 6
        "
        type="primary"
        @click="verificationAll"
        v-hasPermi="['ecw:payment:detail:allWriteOff']"
        >{{ $t("全部核销") }}</el-button
      >
      <el-button
        type="primary"
        v-if="form.state == 11"
        v-hasPermi="['ecw:voucher:cancelWriteOff']"
        @click="$router.push(`/bpm/process-instance/detail?id=` + form.bmpId)"
        >{{ $t("反核销审核详情") }}</el-button
      >
      <el-button
        type="primary"
        v-if="form.state == 10"
        v-hasPermi="['ecw:voucher:cancelWriteOff']"
        @click="$router.push(`/bpm/process-instance/detail?id=` + form.bmpId)"
        >{{ $t("全部核销审核详情") }}</el-button
      >
      <el-button
        v-if="form.state == 11"
        type="primary"
        v-hasPermi="['ecw:vocher:cancelWriteOfflNo']"
        @click="detailClickCancel(1)"
        >{{ $t("取消反核销审核") }}</el-button
      >
      <el-button
        v-if="form.state == 10"
        type="primary"
        v-hasPermi="['ecw:vocher:cancelWriteOffAll']"
        @click="detailClickCancel(2)"
        >{{ $t("取消全部核销审核") }}</el-button
      >
      <el-button
        v-if="form.state == 4 || form.state == 5 || form.state == 6"
        type="primary"
        v-hasPermi="['ecw:voucher:cancelWriteOff']"
        @click="writeOffShow()"
        >{{ $t("提交收款单反核销") }}</el-button
      >
      <el-button
        plain
        type="primary"
        @click="$store.dispatch('tagsView/delCurrentView')"
        >{{ $t("返回") }}</el-button
      >
    </div>-->
    <el-dialog :title="detailTitle" :visible.sync="detailShow" width="30%">
      <div class="cancel_content">
        <span>{{ $t("申请理由") }}</span>
        <el-input
          type="textarea"
          :rows="6"
          v-model="detailReason"
          :placeholder="$t('请输入取消理由')"
        ></el-input>
      </div>
      <span slot="footer" class="dialog-footers">
        <el-button type="primary" @click="detailWriteOffClick()">{{
          $t("提交")
        }}</el-button>
        <el-button @click="detailShow = false">{{ $t("取消") }}</el-button>
      </span>
    </el-dialog>
    <el-dialog :title="$t('收款单反核销')" :visible.sync="wiffShow" width="30%">
      <div class="cancel_content">
        <span>{{ $t("申请理由") }}</span>
        <el-input
          type="textarea"
          :rows="6"
          v-model="wiffRemark"
          :placeholder="$t('请输入理由')"
        ></el-input>
      </div>
      <span slot="footer" class="dialog-footers">
        <el-button type="primary" @click="writeOffClick()">{{
          $t("提交反核销")
        }}</el-button>
        <el-button @click="wiffShow = false">{{ $t("取消") }}</el-button>
      </span>
    </el-dialog>
    <el-dialog
      v-if="openAddDialog"
      :visible.sync="openAddDialog"
      :title="dialogTitle"
      width="50%"
      append-to-body
    >
      <div style="padding: 0 24px">
        <el-form ref="addForm" :model="addForm" label-width="250px">
          <el-form-item :label="$t('收款单号')">{{
            form.receiptNo
          }}</el-form-item>
          <el-form-item :label="$t('剩余应收金额')">
            <template v-if="surplusData.length == 0"> 0 </template>
            <div v-else>
              <div v-for="(amount, currency) in surplusData" :key="currency">
                <span v-if="amount">
                  {{ amount }}{{ getCurrencyLabel(currency) }}</span
                >
              </div>
            </div>
          </el-form-item>
          <el-form-item
            :label="$t('收款账户')"
            prop="accountNo"
            :rules="{
              required: true,
              trigger: ['blur', 'change'],
              message: $t('收款账户不能为空'),
            }"
          >
            <el-select
              v-if="!isView"
              filterable
              clear
              v-model="addForm.accountId"
              :placeholder="$t('请选择收款账户')"
              style="width: 220px"
              @change="accountChange"
              v-el-select-loadmore="loadmore"
            >
              <el-option
                v-for="item in bankData"
                :key="item.id"
                :label="item.baAccountName + '(' + item.baAccountNum + ')'"
                :value="item.id"
              />
            </el-select>
            <span v-else
              >{{ addForm.accountNo
              }}{{ "(" + addForm.accountName + ")" }}</span
            >
          </el-form-item>
          <el-form-item
            :label="$t('实收日期')"
            prop="amountDate"
            :rules="{
              required: true,
              trigger: ['blur', 'change'],
              message: $t('实收日期不能为空'),
            }"
          >
            <el-date-picker
              v-if="!isView"
              clearable
              v-model="addForm.amountDate"
              value-format="yyyy-MM-dd"
              format="yyyy-MM-dd"
              type="date"
              :placeholder="$t('选择实收日期')"
            />
            <span v-else>{{ addForm.amountDate }}</span>
          </el-form-item>
          <div style="display: flex">
            <el-form-item
              :label="$t('实收')"
              prop="amount"
              :rules="{
                required: true,
                trigger: ['blur', 'change'],
                message: $t('实收不能为空'),
              }"
            >
              <el-input
                v-if="!isView"
                v-model="addForm.amount"
                style="width: 220px; margin-right: 12px"
                @input="setWriteOffAmount"
              ></el-input>
              <span v-else>{{ addForm.amount }}</span>
            </el-form-item>
            <el-form-item
              label-width="0px"
              prop="currencyId"
              :rules="{
                required: true,
                trigger: ['blur', 'change'],
                message: $t('币种不能为空'),
              }"
            >
              <el-select
                v-model="addForm.currencyId"
                :placeholder="$t('请选择')"
                :disabled="isView"
                @change="(val) => currencyIdChange(val)"
              >
                <el-option
                  v-for="item in currencyList"
                  :key="item.id"
                  :label="$i18n.locale == 'zh_CN' ? item.titleZh : item.titleEn"
                  :value="item.id"
                />
              </el-select>
            </el-form-item>
          </div>
          <el-form-item
            v-if="showCurrencyId != addForm.currencyId"
            prop="rate"
            :rules="{
              required: true,
              trigger: ['blur', 'change'],
              message: $t('兑核销基准币种汇率不能为空'),
            }"
          >
            <template slot="label">
              <span
                :title="
                  $t(
                    '实收币种与核销基准币种一样时,无需填写汇率,不一样需要填写汇率'
                  )
                "
                >{{ $t("兑核销基准币种汇率") }}({{
                  getCurrencyLabel(showCurrencyId)
                }})</span
              >
            </template>
            <el-input
              v-if="!isView"
              v-model="addForm.rate"
              style="width: 220px"
            ></el-input>
            <span v-else>{{ addForm.rate }}</span>
          </el-form-item>
          <el-form-item v-if="showCurrencyId != addForm.currencyId">
            <template slot="label">
              {{ $t("兑核销基准币种金额") }}({{
                getCurrencyLabel(showCurrencyId)
              }})
            </template>
            <span>{{
              addForm.writeOffAmount
                ? parseFloat(addForm.writeOffAmount).toFixed(2)
                : ""
            }}</span>
          </el-form-item>
          <el-form-item :label="$t('水单附件')" prop="attr">
            <el-upload
              v-if="!isView"
              class="upload-demo"
              :action="uploadFileUrl"
              :headers="headers"
              :on-success="handleUploadSuccess"
              :before-upload="handleBeforeUpload"
              :on-error="handleUploadError"
              :before-remove="beforeRemove"
              :file-list="addForm.attr"
              multiple
            >
              <el-button size="small" type="primary">{{
                $t("上传附件")
              }}</el-button>
            </el-upload>
            <div v-else>
              <div v-for="(v, i) in addForm.attr" :key="i">
                <el-link :href="v.url" type="primary" target="_blank">{{
                  v.name
                }}</el-link>
              </div>
            </div>
          </el-form-item>
          <el-form-item :label="$t('水单号')" prop="billNo">
            <el-input
              v-if="!isView"
              v-model="addForm.billNo"
              style="width: 220px"
            ></el-input>
            <span v-else>{{ addForm.billNo }}</span>
          </el-form-item>
        </el-form>
        <div slot="footer" v-if="!isView">
          <el-button type="primary" @click="saveFrom">{{
            saveBtnText
          }}</el-button>
          <el-button @click="hiddenDialog">{{ $t("取消") }}</el-button>
        </div>
      </div>
    </el-dialog>
    <el-dialog
      :title="$t('收款单银行实收明细反核销-未提交')"
      :visible.sync="dialogVisible"
      width="30%"
    >
      <div class="cancel_content">
        <span>{{ $t("申请理由") }}</span>
        <el-input
          type="textarea"
          :rows="6"
          v-model="reason"
          :placeholder="$t('请输入理由')"
        ></el-input>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button type="primary" @click="verificationCancelClick()">{{
          $t("提交反核销")
        }}</el-button>
        <el-button @click="dialogVisible = false">{{ $t("取消") }}</el-button>
      </span>
    </el-dialog>
    <el-dialog :title="$t('取消审核')" :visible.sync="cancelShow" width="30%">
      <div class="cancel_content">
        <span>{{ $t("申请理由") }}</span>
        <el-input
          type="textarea"
          :rows="6"
          v-model="cancelReason"
          :placeholder="$t('请输入取消审核理由')"
        ></el-input>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button type="primary" @click="cancelWriteOffClick()">{{
          $t("提交")
        }}</el-button>
        <el-button @click="cancelShow = false">{{ $t("取消") }}</el-button>
      </span>
    </el-dialog>
  </div>
</template>
  
  <script>
import { getBankAccountPage } from "@/api/ecw/bankAccount";
import { getToken } from "@/utils/auth";
import { listSimpleDepts } from "@/api/system/dept";
import { getCustomer } from "@/api/ecw/customer";
import { getExchangeRatePage } from "@/api/ecw/exchangeRate";
//lanbm 2024-05-24 新添加的用户银行明细核销审核的链接页面
import {
  getReceiptInfoByIds,
  getInvoicingItem,
  receiptItemCreate,
  getReceivableItem,
  deleteReceiptItem,
  receiptItemVerification,
  updateReceiptItem,
  receiptItemBatchVerification,
  getReceiptAccountList,
  financeReceiptWriteOff,
  financeReceiptItemWriteOffNo,
  cancelFinanceReceiptItemWriteOff,
  cancelFinanceReceiptItemWriteOffNo,
  cancelFinanceReceiptWriteOffNo,
  cancelFinanceReceiptWriteOff,
  financeReceiptWriteOffNo,
} from "@/api/ecw/financial";
import { getCurrencyPage } from "@/api/ecw/currency";
import NP from "number-precision";

export default {
  props: {
    receiptId: Number,
  },
  data() {
    return {
      uploadFileUrl: process.env.VUE_APP_BASE_API + "/app-api/file/upload", // 上传的图片服务器地址
      headers: {
        Authorization: "Bearer " + getToken(),
      },
      id: 0,
      form: {},
      list: [],
      detailedList: [],
      openAddDialog: false,
      bankData: [],
      params: {
        page: 1,
        rows: 100,
      },
      addForm: {},
      detailed: [],
      deptData: [],
      deptArr: [],
      dialogTitle: this.$t("添加银行实收明细"),
      saveBtnText: this.$t("添加"),
      isView: false,
      multipleSelection: [],
      currencyList: [],
      verificationData: {
        usCount: 0,
        rmbCount: 0,
        nairaCount: 0,
        writtenOff: 0,
        WriteOffProportion: 0,
      },
      remainingAmount: {
        usAmount: 0,
        rmbAmount: 0,
        nairaAmount: 0,
      },
      surplusData: [],
      dialogVisible: false,
      reason: "",
      cancelShow: false,
      cancelTitle: "",
      cancelReason: "",
      cancelType: 1,
      detailReason: "",
      detailTitle: "",
      detailShow: false,
      detailIndex: 1,
      wiffShow: false,
      wiffRemark: "",
      rateList: [],
      codePage: {
        pageNo: 1,
        pageSize: 20,
      },
      pages: 1,
    };
  },
  computed: {
    showCurrencyId() {
      let fieldList = [];
      let groupList = [];
      this.list.map((element) => {
        if (fieldList.indexOf(element["currencyId"]) === -1) {
          fieldList.push(element["currencyId"]);
        }
      });
      for (let i = 0; i < fieldList.length; i++) {
        let arr = this.list.filter((element) => {
          return element["currencyId"] === fieldList[i];
        });
        groupList.push({
          currencyId: arr[0].currencyId,
          list: arr,
        });
      }
      if (groupList.length === 1) return groupList[0].currencyId;
      else return 1;
    },
    // 已核销总金额
    writeOffTotal() {
      let total = {};
      this.detailed.forEach((item) => {
        if (item.status) {
          if (!total[item.currencyId]) {
            total[item.currencyId] = item.amount;
          } else
            total[item.currencyId] = NP.plus(
              total[item.currencyId],
              item.amount
            );
        }
      });
      return total;
    },
    // 已核销总金额
    writeOffAmount() {
      let total = 0;
      this.detailed.forEach((item) => {
        if (item.status) {
          total = NP.plus(total, item.writeOffAmount);
        }
      });

      return total.toFixed(2);
    },
    //显示反审核反核销弹窗
    writeOffShow() {
      this.wiffRemark = "";
      this.wiffShow = true;
    },
    WriteOffProportion() {
      let total = 0;
      if (!this.form.receiptAccountList) return 0;
      let amountTotal = this.form.receiptAccountList.find(
        (item) => item.type == "total"
      ).writeOffAmount;

      this.detailed.forEach((item) => {
        if (item.status) {
          total = NP.plus(total, item.writeOffAmount);
        }
      });

      let portion = NP.divide(total, amountTotal);
      console.log(portion);
      if (!portion) return 0;
      return (portion * 100).toFixed(2);
    },
  },
  watch: {
    "addForm.rate"() {
      this.setWriteOffAmount();
    },
  },
  directives: {
    "el-select-loadmore": {
      bind(el, binding) {
        const SELECTWRAP_DOM = el.querySelector(
          ".el-select-dropdown .el-select-dropdown__wrap"
        );
        SELECTWRAP_DOM.addEventListener("scroll", function () {
          const condition =
            this.scrollHeight - this.scrollTop <= this.clientHeight;
          if (condition) {
            binding.value();
          }
        });
      },
    },
  },
  async created() {
    // 获取汇率
    await getCurrencyPage(this.params).then(
      (res) => (this.currencyList = res.data.list)
    );
    await getExchangeRatePage(this.params).then(
      (res) => (this.rateList = res.data.list)
    );
    await listSimpleDepts().then((res) => {
      this.deptData = res.data;
    });
    await getBankAccountPage(this.codePage).then((res) => {
      this.bankData = res.data.list;
      this.pages = res.data.total / this.codePage.pageSize + 1;
    });

    //if (this.$route.query.id) {
    if (this.receiptId) {
      //this.id = this.$route.query.id;
      this.id = this.receiptId;
      await getReceiptInfoByIds({ id: this.id }).then((res) => {
        this.form = res.data;
        let dept = this.deptData.filter(
          (itt) => itt.id == res.data.departmentId
        );
        if (dept.length > 0) {
          this.form.departmentName = dept[0].name;
        }
      });
      await getInvoicingItem({ id: this.id }).then((res) => {
        this.list = [...res.data];
      });
      getReceiptAccountList({ id: this.id }).then((res) => {
        if (res.data.length > 0) {
          res.data = [
            ...res.data,
            {
              type: "total",
              writeOffAmount: res.data
                .reduce(
                  (total, currentValue) =>
                    NP.plus(total, currentValue.writeOffAmount || 0),
                  0
                )
                .toFixed(2),
              collectionAmount: [],
            },
          ];
        }
        this.$set(this.form, "receiptAccountList", res.data);
        // 收款总计

        let num;
        let amountList = [];
        this.currencyList.forEach((item, index) => {
          let nairaListByList = this.list.filter(
            (v) => v.currencyId === item.id
          );
          if (nairaListByList.length > 0) {
            let discountNaira = nairaListByList.reduce(
              (total, currentValue) =>
                NP.plus(total, currentValue.discountTotal || 0),
              0
            );
            num = res.data.find((v) => v.currencyId == item.id);
            num && (num.discountTotal = discountNaira);
          }
          let dollarList = this.form.receiptAccountList.filter(
            (v) => v.collectionCurrencyId == item.id
          );
          if (dollarList.length > 0) {
            let dollar = dollarList
              .reduce(
                (total, currentValue) =>
                  NP.plus(total, currentValue.collectionAmount || 0),
                0
              )
              .toFixed(2);
            // if(n && n.discountTotal&&n.discountTotal>0){
            //   amountList.push({currencyName:item.titleZh, currencyId: item.id, amount:(dollar-n.discountTotal).toFixed(2)})
            // }else{
            amountList.push({
              currencyId: item.id,
              currencyNameEn: item.titleEn,
              currencyNameZh: item.titleZh,
              amount: dollar || 0,
            });
            // }
          }
        });
        this.form.receiptAccountList[
          this.form.receiptAccountList.length - 1
        ].collectionAmount = amountList;
        this.$set(this.form, "receiptAccountList", [
          ...this.form.receiptAccountList,
        ]);

        this.$nextTick(() => {
          if (this.form.receiptAccountList.length > 0) {
            this.editReceiptAccountList();
          }
        });
      });
    }

    this.getList();
  },
  methods: {
    // 懒加载
    loadmore() {
      this.codePage.pageNo++;
      // 大于页码不请求了
      console.log(111);
      if (this.codePage.pageNo > this.pages) {
        return;
      }
      this.getCodeList();
    },
    getCodeList() {
      setTimeout(() => {
        getBankAccountPage(this.codePage).then((res) => {
          this.bankData = this.bankData.concat(res.data.list);
          this.pages = res.data.total / this.codePage.pageSize + 1;
        });
      }, 200);
    },
    rateChange(row, index) {
      if (row.collectionRate) {
        row.receivableAmount &&
          (row.collectionAmount = Math.round(
            NP.times(
              row.collectionRate || 0,
              NP.minus(row.receivableAmount, row.discountTotal || 0)
            )
          ));
      } else {
        row.collectionAmount = "";
      }
      // row.receivableAmount && (row.collectionAmount = NP.times(row.collectionRate || 0, NP.minus(row.receivableAmount, row.discountTotal||0)).toFixed(2))
      this.form.receiptAccountList[index] = { ...row };
    },
    editReceiptAccountList() {
      let amountList = [];
      this.currencyList.forEach((item, index) => {
        let dollarList = this.form.receiptAccountList.filter(
          (v) => v.collectionCurrencyId == item.id
        );
        if (dollarList.length > 0) {
          let dollar = dollarList.reduce(
            (total, currentValue) =>
              NP.plus(total, currentValue.collectionAmount || 0),
            0
          );
          amountList.push({
            currencyId: item.id,
            currencyNameEn: item.titleEn,
            currencyNameZh: item.titleZh,
            amount: dollar.toFixed(2),
          });
        }
      });
      this.form.receiptAccountList[
        this.form.receiptAccountList.length - 1
      ].collectionAmount = amountList;
      this.$set(this.form, "receiptAccountList", [
        ...this.form.receiptAccountList,
      ]);
    },
    setWriteOffAmount() {
      let pointArr = [];
      let regs = /^[0-9]+\d*(\.\d*)?$|^0?\.\d*[0-9]\d*$/;
      if (this.addForm.amount && !regs.test(this.addForm.amount)) {
        this.addForm.amount = "";
        this.$modal.msgError(this.$t("输入金额不对"));
      } else {
        if (this.addForm && this.addForm.amount) {
          pointArr = this.addForm.amount.toString().split(".");
          if (pointArr.length > 1 && pointArr[1]) {
            this.addForm.amount = Math.round(this.addForm.amount * 100) / 100;
          }
        }
      }
      this.$set(
        this.addForm,
        "writeOffAmount",
        NP.times(this.addForm.rate || 0, this.addForm.amount || 0)
      );
    },
    getCurrencyLabel(id) {
      let label = this.currencyList.filter((item) => item.id == id);
      if (label.length > 0)
        return this.$i18n.locale == "zh_CN"
          ? label[0].titleZh
          : label[0].titleEn;
      return "";
    },
    getsurplusData() {
      // 已收
      this.surplusData = [];
      let recepted = [];
      this.detailed.forEach((item) => {
        if (!recepted[item.currencyId]) {
          recepted[item.currencyId] = item.amount;
        } else
          recepted[item.currencyId] = NP.plus(
            recepted[item.currencyId],
            item.amount
          );
      });
      // 应收
      let collom = [];
      // 从期望收费金额中提取应收币种和金额
      this.form.receiptAccountList
        .find((item) => item.type == "total")
        .collectionAmount.forEach((item) => {
          collom[item.currencyId] = item.amount;
        });
      recepted.forEach((amount, currency) => {
        if (amount) {
          if (collom[currency]) {
            if (collom[currency] - amount != 0)
              this.surplusData[currency] = +parseFloat(
                (collom[currency] - amount).toPrecision(12)
              );
          } else {
            this.surplusData[currency] = -amount;
          }
        }
      });
      collom.forEach((amount, currency) => {
        if (amount) {
          if (!this.surplusData[currency]) {
            if (recepted[currency]) {
              if (amount - recepted[currency] != 0)
                this.surplusData[currency] = +parseFloat(
                  (amount - recepted[currency]).toPrecision(12)
                );
            } else {
              this.surplusData[currency] = amount;
            }
          }
        }
      });
    },
    accountChange(val) {
      let data = this.bankData.find((item) => item.id == val);
      this.$set(this.addForm, "accountName", data.baAccountName || "");
      this.$set(this.addForm, "accountNo", data.baAccountNum || "");
      this.$set(this.addForm, "accountBankName", data.baBankName || "");
    },
    RMBtoUS() {
      return NP.divide(
        100,
        this.currencyList.find((v) => v.titleEn === "USD").huilv
      );
    },
    NANtoUS() {
      return NP.times(this.RMBtoUS(), this.NANtoRMB());
    },
    UStoRMB() {
      return NP.divide(
        this.currencyList.find((v) => v.titleEn === "USD").huilv,
        100
      );
    },
    UStoNAN() {
      return NP.times(this.RMBtoNAN(), this.UStoRMB());
    },
    RMBtoNAN() {
      return NP.divide(
        100,
        this.currencyList.find((v) => v.titleEn === "NGN").huilv
      );
    },
    NANtoRMB() {
      return NP.divide(
        this.currencyList.find((v) => v.titleEn === "NGN").huilv,
        100
      );
    },
    //显示反核销弹窗
    showCancel(index) {
      this.selectIndex = index;
      this.reason = "";
      this.dialogVisible = true;
    },
    writeOffClick() {
      if (!this.wiffRemark) {
        this.$modal.msgError(this.$t("请输入申请理由"));
        return;
      }
      this.$modal
        .confirm(this.$t("您确认要反核销吗") + "?")
        .then(() => {
          financeReceiptWriteOffNo({
            receiptId: this.id,
            receiptNo: this.form.receiptNo,
            remark: this.wiffRemark,
          }).then((res) => {
            this.getReceiptInfoData();
            this.$message.success(this.$t("提交成功"));
            this.wiffShow = false;
            // this.$store.dispatch('tagsView/delCurrentView')
          });
        })
        .catch(() => {
          this.wiffShow = false;
        });
    },
    //显示取消审核弹窗
    detailClickCancel(type) {
      this.detailIndex = type;
      this.detailReason = "";
      if (this.detailIndex == 1) {
        this.detailTitle = this.$t("取消反核销审核");
      } else {
        this.detailTitle = this.$t("取消全部核销审核");
      }
      this.detailShow = true;
    },
    //取消审核弹窗
    cancelClick(index, type) {
      this.selectIndex = index;
      this.cancelType = type;
      this.cancelReason = "";
      this.cancelShow = true;
    },
    //取消审核
    detailWriteOffClick() {
      if (!this.detailReason) {
        this.$modal.msgError(this.$t("请输入申请理由"));
        return;
      }
      if (this.detailIndex == 1) {
        cancelFinanceReceiptWriteOffNo({
          receiptId: this.id,
          remark: this.detailReason,
        }).then((res) => {
          this.detailShow = false;
          this.getReceiptInfoData();
          this.$message.success(this.$t("提交成功"));
        });
      } else {
        cancelFinanceReceiptWriteOff({
          receiptId: this.id,
          remark: this.detailReason,
        }).then((res) => {
          this.detailShow = false;
          this.getReceiptInfoData();
          this.$message.success(this.$t("提交成功"));
        });
      }
    },
    getReceiptInfoData() {
      getReceiptInfoByIds({ id: this.id }).then((res) => {
        this.form = res.data;
        getCustomer(this.form.customerId).then((res) => {
          this.form.customerName = res?.data?.name;
        });
        let dept = this.deptData.filter(
          (itt) => itt.id == res.data.departmentId
        );
        // console.log(dept)
        if (dept.length > 0) {
          this.form.departmentName = dept[0].name;
        }
      });
    },
    //取消审核
    cancelWriteOffClick() {
      if (!this.cancelReason) {
        this.$modal.msgError(this.$t("请输入申请理由"));
        return;
      }
      let receiptItemId = this.detailed[this.selectIndex].id;
      if (this.cancelType == 1) {
        cancelFinanceReceiptItemWriteOff({
          receiptItemId: receiptItemId,
          remark: this.cancelReason,
        }).then((res) => {
          this.cancelShow = false;
          this.getList();
          this.$message.success(this.$t("提交成功"));
        });
      } else {
        cancelFinanceReceiptItemWriteOffNo({
          receiptItemId: receiptItemId,
          remark: this.cancelReason,
        }).then((res) => {
          this.cancelShow = false;
          this.getList();
          this.$message.success(this.$t("提交成功"));
        });
      }
    },
    currencyIdChange(val) {
      val = Number(val);
      let rate;
      if (val === this.showCurrencyId) {
        rate = 1;
      } else {
        rate = this.getRate(val, this.showCurrencyId);
      }
      this.$set(this.addForm, "rate", rate);
    },
    //获取汇率
    getRate(sourceCurrencyId, targetCurrencyId) {
      let rate = this.rateList.find(
        (v) =>
          v.sourceCurrencyId === sourceCurrencyId &&
          v.targetCurrencyId === targetCurrencyId
      );
      if (rate) return rate.currencyRate;
      return "";
    },
    getList() {
      getReceivableItem({ id: this.id }).then((res) => {
        this.detailed = res.data.map((v) => ({
          ...v,
          amountDate: this.parseTime(v.amountDate, "{y}-{m}-{d}"),
          rate: parseFloat(v.rate),
          attr: v.attr
            ? v.attr
                .split(",")
                .map((t) => ({ name: t.slice(t.lastIndexOf("/") + 1), url: t }))
            : [],
        }));
      });
    },
    saveFrom() {
      this.$refs.addForm.validate((valid) => {
        if (valid) {
          if (this.addForm.id) {
            const params = { ...this.addForm };
            params.attr &&
              (params.attr = params.attr.map((v) => v.url).join(","));
            updateReceiptItem(params).then((res) => {
              this.$modal.msgSuccess(this.$t("修改成功"));
              this.openAddDialog = false;
              this.getList();
            });
            return;
          }
          const params = { ...this.addForm };
          params.attr &&
            (params.attr = params.attr.map((v) => v.url).join(","));
          params.receiptId = this.id;
          receiptItemCreate(params).then((res) => {
            this.$modal.msgSuccess(this.$t("新增成功"));
            this.openAddDialog = false;
            this.getList();
          });
        }
      });
    },
    toEdit() {
      return this.$router.push("creatCollection?id=" + this.id);
    },
    detailClick(row) {
      this.getsurplusData();
      this.openAddDialog = true;
      this.dialogTitle = this.$t("银行实收明细详情");
      this.isView = true;
      setTimeout(() => {
        this.addForm = { ...row };
        this.setWriteOffAmount();
      }, 0);
    },
    editClick(row) {
      this.getsurplusData();
      this.openAddDialog = true;
      this.dialogTitle = this.$t("编辑银行实收明细");
      this.saveBtnText = this.$t("提交");
      this.isView = false;
      setTimeout(() => {
        this.addForm = { ...row };
        let bank = this.bankData.find(
          (v) => v.baAccountNum == this.addForm.accountNo
        );
        if (bank) this.addForm.accountId = bank.id;
        this.setWriteOffAmount();
      }, 0);
    },
    deleteClick(row) {
      const id = row.id;
      this.$modal
        .confirm(this.$t("是否确认删除该收款单") + "?")
        .then(function () {
          return deleteReceiptItem(id);
        })
        .then(() => {
          this.getList();
          this.$modal.msgSuccess(this.$t("删除成功"));
        })
        .catch(() => {});
    },
    verificationClick(row) {
      const id = row.id;
      this.$modal
        .confirm(this.$t("您确认要核销吗") + "?")
        .then(function () {
          return receiptItemVerification(id);
        })
        .then(() => {
          this.getList();
          this.$modal.msgSuccess(this.$t("核销成功"));
        })
        .catch(() => {});
    },
    //银行明细反核销
    verificationCancelClick() {
      if (!this.reason) {
        this.$modal.msgError(this.$t("请输入申请理由"));
        return;
      }
      const id = this.detailed[this.selectIndex].id;
      this.$modal
        .confirm(this.$t("您确认要反核销吗") + "?")
        .then(() => {
          financeReceiptItemWriteOffNo({
            receiptId: this.id,
            receiptNo: this.form.receiptNo,
            receiptItemId: id,
            remark: this.reason,
          }).then((res) => {
            this.getList();
            this.$message.success(this.$t("提交成功"));
            this.dialogVisible = false;
          });
        })
        .catch(() => {
          this.dialogVisible = false;
        });
    },
    handleSelectionChange(val) {
      this.multipleSelection = val;
    },
    batchVerification() {
      if (this.multipleSelection.length === 0) {
        this.$modal.msgError(this.$t("请选择需要核销的收款明细"));
        return;
      }
      const params = { ids: this.multipleSelection.map((v) => v.id).join(",") };
      this.$modal
        .confirm(this.$t("您确认要核销吗" + "?"))
        .then(function () {
          return receiptItemBatchVerification(params);
        })
        .then(() => {
          this.multipleSelection.forEach((row) => {
            this.$refs.multipleTable.toggleRowSelection(row);
          });
          this.getList();
          this.$modal.msgSuccess(this.$t("核销成功"));
        })
        .catch(() => {});
    },
    verificationAll() {
      if (!this.detailed || this.detailed.length == 0) {
        this.$modal.msgError(
          this.$t(
            "当前收款单未添加银行收款明细,无法全部核销,请添加银行收款单明细,并核销所有实收明细后再进行全部核销"
          )
        );
        return;
      }
      this.$modal
        .confirm(this.$t("您确认要全部核销吗" + "?"))
        .then(() => {
          return financeReceiptWriteOff({
            receiptId: this.id,
            receiptNo: this.form.receiptNo,
          });
        })
        .then(() => {
          this.$modal.msgSuccess(this.$t("核销成功"));
          this.$store.dispatch("tagsView/delCurrentView");
        })
        .catch(() => {});
    },
    hiddenDialog() {
      this.openAddDialog = false;
    },
    handleAddReceiptItem() {
      this.getsurplusData();
      this.addForm = {};
      this.openAddDialog = true;
      this.isView = false;
      this.dialogTitle = this.$t("添加银行实收明细");
      this.saveBtnText = this.$t("添加");
    },
    handleUploadSuccess(res, file, fileList) {
      let arr = [];
      setTimeout(() => {
        fileList.forEach((item) => {
          arr.push({
            name: item.name,
            url: item.response ? item.response.data : item.url,
          });
        });
        this.addForm.attr = arr;
      }, 300);
      this.loading.close();
    },
    handleBeforeUpload() {
      this.loading = this.$loading({
        lock: true,
        text: this.$t("上传中"),
        background: "rgba(0, 0, 0, 0.7)",
      });
    },
    handleUploadError() {
      this.$message({
        type: "error",
        message: this.$t("上传失败"),
      });
      this.loading.close();
    },
    beforeRemove(file, fileList) {
      return this.$confirm(this.$t("确定移除") + "?").then((res) => {
        setTimeout(() => {
          this.addForm.attr = fileList.map((v) => ({
            name: v.name,
            url: v.response ? v.response.data : v.url,
          }));
        }, 300);
      });
    },
  },
};
</script>
  
  <style scoped lang="scss">
.app-container {
  ::v-deep .el-descriptions-item__label {
    width: 200px;
  }
  ::v-deep .el-tag + .el-tag {
    margin-left: 8px;
  }
}
.card {
  margin-top: 20px;
}
.dialog-footer {
  padding: 40px;
}
.card-title {
  font-size: 18px;
  font-weight: bold;
}
.hexiaoCard {
  ::v-deep .el-descriptions-item__label {
    width: 11%;
  }
  ::v-deep .el-descriptions-item__content {
    width: 22%;
  }
}
.cancel_content {
  display: flex;
  // align-items: center;
  flex-direction: column;
  // padding-top: 20px;
}
.cancel_content span {
  font-size: 16px;
  font-weight: 600;
  margin-bottom: 10px;
}
</style>