<template>
  <div class="tenant">
    <div class="content">
      <byTable
        :source="sourceList.data"
        :pagination="sourceList.pagination"
        :config="config"
        :loading="loading"
        :selectConfig="selectConfig"
        highlight-current-row
        :action-list="[
          // {
          //   text: '导出Excel',
          //   action: () => deriveExcel(),
          // },
          {
            text: '退税登记',
            action: () => openModalOne('add'),
          },
          {
            text: '添加流水',
            action: () => openModal('add'),
          },
        ]"
        @get-list="getList"
      >
        <!-- <template #amount="{ item }">
          <div :style="'color: ' + (item.status === '10' ? '#04cb04;' : 'red;')">
            <span style="padding-right: 4px">{{ item.currency }}</span>
            <span v-if="item.status === '20'">-</span>
            <span>{{ moneyFormat(item.amount, 2) }}</span>
          </div>
        </template> -->
        <template #status10="{ item }">
          <div>
            <span v-if="item.status == 10">{{ item.amount }}</span>
          </div>
        </template>
        <template #status20="{ item }">
          <div>
            <span v-if="item.status == 20">{{ item.amount }}</span>
          </div>
        </template>
        <template #contractCodes="{ item }">
          <div style="width: 100%">
            <div v-if="item.contractCodes">
              <div
                v-for="(contract, index) in item.contractCodes.split(',')"
                :key="index"
              >
                <a
                  style="color: #409eff; cursor: pointer; word-break: break-all"
                  @click="openDetails(contract)"
                  >{{ contract }}</a
                >
              </div>
            </div>
          </div>
        </template>
      </byTable>
    </div>

    <el-dialog
      :title="modalType == 'add' ? '添加流水' : '编辑流水'"
      v-if="dialogVisible"
      v-model="dialogVisible"
      width="600"
    >
      <byForm
        :formConfig="formConfig"
        :formOption="formOption"
        v-model="formData.data"
        :rules="rules"
        ref="submit"
        v-loading="loadingDialog"
      >
        <template #transactionTime>
          <div>
            <el-date-picker
              v-model="formData.data.transactionTime"
              type="datetime"
              placeholder="请选择交易时间"
              value-format="YYYY-MM-DD HH:mm:ss"
            />
          </div>
        </template>
        <template #money>
          <div style="width: 100%">
            <el-row :gutter="10">
              <el-col :span="6">
                <el-form-item prop="status">
                  <el-select
                    v-model="formData.data.status"
                    placeholder="请选择"
                    style="width: 100%"
                    @change="changeStatus()"
                  >
                    <el-option
                      v-for="item in status"
                      :key="item.value"
                      :label="item.label"
                      :value="item.value"
                    />
                  </el-select>
                </el-form-item>
              </el-col>
              <el-col :span="6">
                <el-form-item prop="currency">
                  <el-select
                    v-model="formData.data.currency"
                    placeholder="请选择"
                    style="width: 100%"
                  >
                    <el-option
                      v-for="item in accountCurrency"
                      :key="item.value"
                      :label="item.label"
                      :value="item.value"
                    />
                  </el-select>
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item prop="amount">
                  <el-input-number
                    onmousewheel="return false;"
                    v-model="formData.data.amount"
                    placeholder="请输入金额"
                    style="width: 100%"
                    :precision="2"
                    :controls="false"
                    :min="0"
                  />
                </el-form-item>
              </el-col>
            </el-row>
          </div>
        </template>
        <template #received>
          <div>
            <el-form-item prop="received">
              <el-radio-group v-model="formData.data.received">
                <el-radio
                  v-for="item in received"
                  :key="item.value"
                  :label="item.value"
                  border
                  >{{ item.label }}</el-radio
                >
              </el-radio-group>
            </el-form-item>
          </div>
        </template>
      </byForm>
      <template #footer>
        <el-button @click="dialogVisible = false" size="large">取 消</el-button>
        <el-button type="primary" @click="submitForm()" size="large"
          >确 定</el-button
        >
      </template>
    </el-dialog>

    <el-dialog
      :title="'退税登记'"
      v-if="dialogVisibleOne"
      v-model="dialogVisibleOne"
      width="600"
    >
      <byForm
        :formConfig="formConfigOne"
        :formOption="formOption"
        v-model="formData.dataOne"
        :rules="rulesOne"
        ref="submitOne"
        v-loading="loadingDialog"
      >
        <template #details>
          <div style="width: 100%">
            <el-button
              type="primary"
              @click="handleAddRow"
              style="margin: 10px 0"
            >
              添加
            </el-button>
            <el-table :data="formData.dataOne.taxRefundDetailsList">
              <el-table-column prop="count" label="合同编号" min-width="150">
                <template #default="{ row, $index }">
                  <el-form-item
                    :prop="'taxRefundDetailsList.' + $index + '.contractId'"
                    :rules="rulesOne.contractId"
                    :inline-message="true"
                  >
                    <el-select
                      v-model="row.contractId"
                      placeholder="请选择"
                      filterable
                      style="width: 100%"
                    >
                      <el-option
                        v-for="item in contractList"
                        :label="item.code"
                        :value="item.id"
                      >
                      </el-option>
                    </el-select>
                  </el-form-item>
                </template>
              </el-table-column>
              <el-table-column prop="amount" label="关联金额" min-width="150">
                <template #default="{ row, $index }">
                  <el-form-item
                    :prop="'taxRefundDetailsList.' + $index + '.amount'"
                    :rules="rulesOne.amount"
                    :inline-message="true"
                  >
                    <el-input-number
                      onmousewheel="return false;"
                      v-model="row.amount"
                      :precision="2"
                      :controls="false"
                      :min="0"
                      style="width: 100%"
                    />
                  </el-form-item>
                </template>
              </el-table-column>
              <el-table-column prop="zip" label="操作" width="80">
                <template #default="{ $index }">
                  <el-button type="primary" link @click="handleRemove($index)"
                    >删除</el-button
                  >
                </template>
              </el-table-column>
            </el-table>
          </div>
        </template>
      </byForm>
      <template #footer>
        <el-button @click="dialogVisibleOne = false" size="large"
          >取 消</el-button
        >
        <el-button type="primary" @click="submitFormOne()" size="large"
          >确 定</el-button
        >
      </template>
    </el-dialog>

    <el-dialog title="打印" v-if="openPrint" v-model="openPrint" width="860">
      <ContractPDF :rowData="rowData"></ContractPDF>
      <template #footer>
        <el-button @click="openPrint = false" size="large">取消</el-button>
        <el-button v-print="printObj" size="large">打印</el-button>
        <el-button type="primary" @click="clickDownload()" size="large"
          >下载PDF</el-button
        >
      </template>
    </el-dialog>
  </div>
</template>

<script setup>
import { computed, ref } from "vue";
import byTable from "@/components/byTable/index";
import byForm from "@/components/byForm/index";
import useUserStore from "@/store/modules/user";
import { ElMessage, ElMessageBox } from "element-plus";
import moment from "moment";
import ContractPDF from "@/components/PDF/contractPDF.vue";

const { proxy } = getCurrentInstance();
const accountCurrency = ref([]);
const accountList = ref([]);
const contractList = ref([]);
const status = ref([
  {
    label: "收入",
    value: "10",
  },
  {
    label: "支出",
    value: "20",
  },
]);
const received = ref([
  {
    label: "是",
    value: "10",
  },
  {
    label: "否",
    value: "20",
  },
]);
const sourceList = ref({
  data: [],
  pagination: {
    total: 0,
    pageNum: 1,
    pageSize: 10,
    keyword: "",
    accountManagementId: "",
    currency: "",
  },
});
const loading = ref(false);
const selectConfig = computed(() => {
  return [
    {
      label: "资金账户",
      prop: "accountManagementId",
      data: accountList.value,
      isShowAll: false,
    },
    {
      label: "币种",
      prop: "currency",
      data: accountCurrency.value,
      isShowAll: false,
    },
  ];
});
const config = computed(() => {
  return [
    {
      attrs: {
        label: "归属公司",
        prop: "corporationName",
        width: 160,
      },
    },
    {
      attrs: {
        label: "关联销售合同",
        slot: "contractCodes",
        width: 160,
      },
    },
    {
      attrs: {
        label: "资金账户",
        prop: "accountManagementName",
        width: 200,
      },
    },
    {
      attrs: {
        label: "交易时间",
        prop: "transactionTime",
        width: 160,
      },
    },
    {
      attrs: {
        label: "币种",
        prop: "currency",
        width: 100,
      },
    },
    {
      attrs: {
        label: "收入",
        slot: "status10",
        width: 120,
      },
    },
    {
      attrs: {
        label: "支出",
        slot: "status20",
        width: 120,
      },
    },
    {
      attrs: {
        label: "余额",
        prop: "remainder",
        width: 120,
      },
    },
    {
      attrs: {
        label: "摘要",
        prop: "remarks",
        "min-width": 300,
      },
    },
    {
      attrs: {
        label: "对方账户",
        prop: "name",
        width: 200,
      },
    },
    {
      attrs: {
        label: "对方银行",
        prop: "openingBank",
        width: 200,
      },
    },
    {
      attrs: {
        label: "对方账号",
        prop: "accountOpening",
        width: 240,
      },
    },
    {
      attrs: {
        label: "操作",
        width: "120",
        align: "center",
        fixed: "right",
      },
      renderHTML(row) {
        return [
          {
            attrs: {
              label: "修改",
              type: "primary",
              text: true,
            },
            el: "button",
            click() {
              update(row);
            },
          },
          {
            attrs: {
              label: "删除",
              type: "primary",
              text: true,
            },
            el: "button",
            click() {
              ElMessageBox.confirm(
                "此操作将永久删除该数据, 是否继续?",
                "提示",
                {
                  confirmButtonText: "确定",
                  cancelButtonText: "取消",
                  type: "warning",
                }
              ).then(() => {
                proxy
                  .post("/accountRunningWater/delete", {
                    id: row.id,
                  })
                  .then(() => {
                    ElMessage({
                      message: "删除成功",
                      type: "success",
                    });
                    getList();
                  });
              });
            },
          },
        ];
      },
    },
  ];
});
const getCurrency = () => {
  return proxy
    .post("/dictTenantData/page", {
      pageNum: 1,
      pageSize: 999,
      dictCode: "account_currency",
      tenantId: useUserStore().user.tenantId,
    })
    .then((res) => {
      if (res.rows && res.rows.length > 0) {
        accountCurrency.value = res.rows.map((item) => {
          return {
            label: item.dictValue,
            value: item.dictKey,
          };
        });
        sourceList.value.pagination.currency = accountCurrency.value[0].value;
      }
    });
};
const getAccountList = () => {
  return proxy
    .post("/accountManagement/page", { pageNum: 1, pageSize: 999 })
    .then((res) => {
      if (res.rows && res.rows.length > 0) {
        accountList.value = res.rows.map((item) => {
          return {
            label: item.alias,
            value: item.id,
          };
        });
        sourceList.value.pagination.accountManagementId =
          accountList.value[0].value;
      }
    });
};
const getDict = () => {
  // 关联合同
  proxy
    .post("/contract/page", { pageNum: 1, pageSize: 9999, status: 30 })
    .then((res) => {
      contractList.value = res.rows;
    });

  Promise.all([getCurrency(), getAccountList()]).then(() => {
    getList();
  });
};
const getList = async (req) => {
  sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
  loading.value = true;
  proxy
    .post("/accountRunningWater/page1", sourceList.value.pagination)
    .then((res) => {
      sourceList.value.data = res.rows;
      sourceList.value.pagination.total = res.total;
      setTimeout(() => {
        loading.value = false;
      }, 200);
    });
};
getDict();
const modalType = ref("add");
const dialogVisible = ref(false);
const dialogVisibleOne = ref(false);
const loadingDialog = ref(false);
const submit = ref(null);
const submitOne = ref(null);
const formOption = reactive({
  inline: true,
  labelWidth: 100,
  itemWidth: 100,
  rules: [],
});
const formData = reactive({
  data: {},
  dataOne: {
    taxRefundDetailsList: [],
  },
});
const formConfig = computed(() => {
  return [
    {
      type: "title",
      title: "账户信息",
    },
    {
      type: "select",
      prop: "accountManagementId",
      label: "选择账户",
      data: accountList.value,
    },
    {
      type: "title",
      title: "交易信息",
    },
    {
      type: "slot",
      prop: "transactionTime",
      slotName: "transactionTime",
      label: "交易时间",
    },
    {
      type: "slot",
      prop: "money",
      slotName: "money",
      label: "交易金额",
    },
    formData.data.status == "10"
      ? {
          type: "slot",
          prop: "received",
          slotName: "received",
          label: "合同到账",
        }
      : {},
    {
      type: "title",
      title: "对方信息",
    },
    {
      type: "input",
      prop: "name",
      label: "账户名称",
      itemType: "text",
    },
    {
      type: "input",
      prop: "openingBank",
      label: "开户银行",
      itemType: "text",
    },
    {
      type: "input",
      prop: "accountOpening",
      label: "银行账号",
      itemType: "text",
    },
    {
      type: "title",
      title: "其他信息",
    },
    {
      type: "input",
      prop: "remarks",
      label: "摘要",
      itemType: "textarea",
    },
  ];
});
const formConfigOne = computed(() => {
  return [
    {
      type: "title",
      title: "账户信息",
    },
    {
      type: "select",
      prop: "accountManagementId",
      label: "选择账户",
      data: accountList.value,
    },
    {
      type: "title",
      title: "退税信息",
    },
    {
      type: "date",
      itemType: "datetime",
      prop: "transactionTime",
      label: "退税时间",
    },
    {
      type: "select",
      prop: "currency",
      label: "货币类型",
      data: accountCurrency.value,
      itemWidth: 30,
    },
    {
      type: "number",
      prop: "amount",
      label: "退税金额",
      itemWidth: 70,
      precision: 2,
      min: 0,
      controls: false,
      style: {
        width: "100%",
      },
    },
    {
      type: "title",
      title: "对方信息",
    },
    {
      type: "input",
      prop: "name",
      label: "账户名称",
      itemType: "text",
    },
    {
      type: "input",
      prop: "openingBank",
      label: "开户银行",
      itemType: "text",
    },
    {
      type: "input",
      prop: "accountOpening",
      label: "银行账号",
      itemType: "text",
    },
    {
      type: "slot",
      slotName: "details",
      label: "关联合同",
    },
    {
      type: "title",
      title: "其他信息",
    },
    {
      type: "input",
      prop: "remarks",
      label: "摘要",
      itemType: "textarea",
    },
  ];
});

const rules = ref({
  accountManagementId: [
    { required: true, message: "请选择账户", trigger: "change" },
  ],
  transactionTime: [
    { required: true, message: "请选择交易时间", trigger: "change" },
  ],
  status: [{ required: true, message: "请选择收支类型", trigger: "change" }],
  currency: [{ required: true, message: "请选择币种", trigger: "change" }],
  received: [
    { required: true, message: "请选择合同是否到账", trigger: "change" },
  ],
  amount: [{ required: true, message: "请输入金额", trigger: "blur" }],
  // name: [{ required: true, message: "请输入账户名称", trigger: "blur" }],
  // openingBank: [{ required: true, message: "请输入开户银行", trigger: "blur" }],
  // accountOpening: [{ required: true, message: "请输入银行账号", trigger: "blur" }],
});
const rulesOne = ref({
  accountManagementId: [
    { required: true, message: "请选择账户", trigger: "change" },
  ],
  transactionTime: [
    { required: true, message: "请选择退税时间", trigger: "change" },
  ],
  currency: [{ required: true, message: "请选择币种", trigger: "change" }],
  // amount: [{ required: true, message: "请输入退税金额", trigger: "blur" }],
  contractId: [{ required: true, message: "请选择合同", trigger: "change" }],
  amount: [{ required: true, message: "请输入金额", trigger: "blur" }],
});

const openModal = (val) => {
  modalType.value = val;
  formData.data = {
    transactionTime: moment().format("yyyy-MM-DD HH:mm:ss"),
  };
  loadingDialog.value = false;
  dialogVisible.value = true;
};
const openModalOne = () => {
  modalType.value = "add";
  formData.dataOne = {
    transactionTime: moment().format("yyyy-MM-DD HH:mm:ss"),
    currency: accountCurrency.value[0].value,
    taxRefundDetailsList: [],
  };
  dialogVisibleOne.value = true;
};

const changeStatus = () => {
  formData.data.received = "";
};
const submitForm = () => {
  submit.value.handleSubmit(() => {
    if (!formData.data.amount || Number(formData.data.amount) == 0) {
      return ElMessage("交易金额不能为0");
    }
    loadingDialog.value = true;
    proxy.post("/accountRunningWater/" + modalType.value, formData.data).then(
      () => {
        ElMessage({
          message: modalType.value == "add" ? "添加成功" : "编辑成功",
          type: "success",
        });
        dialogVisible.value = false;
        getList();
      },
      (err) => {
        console.log(err);
        loadingDialog.value = false;
      }
    );
  });
};

const handleAddRow = () => {
  formData.dataOne.taxRefundDetailsList.push({
    contractId: "",
    amount: null,
  });
};
const handleRemove = (index) => {
  formData.dataOne.taxRefundDetailsList.splice(index, 1);
};

const submitFormOne = () => {
  submitOne.value.handleSubmit(() => {
    if (!formData.dataOne.taxRefundDetailsList.length > 0) {
      return ElMessage({
        message: "请关联合同",
        type: "info",
      });
    }
    const submitData = { ...formData.dataOne };
    for (let i = 0; i < submitData.taxRefundDetailsList.length; i++) {
      const e = submitData.taxRefundDetailsList[i];
      if (e.amount === 0) {
        return ElMessage({
          message: "关联金额不能为0",
          type: "info",
        });
      }
    }
    const total = submitData.taxRefundDetailsList.reduce(
      (sum, crr) => (sum += crr.amount),
      0
    );
    if (total !== Number(submitData.amount)) {
      return ElMessage({
        message: "关联合同明细的关联金额总合必须等于退税金额",
        type: "info",
      });
    }
    loadingDialog.value = true;
    proxy.post("/accountRunningWater/taxRefund", submitData).then(
      () => {
        ElMessage({
          message: modalType.value == "add" ? "添加成功" : "编辑成功",
          type: "success",
        });
        dialogVisibleOne.value = false;
        getList();
      },
      (err) => {
        console.log(err);
        loadingDialog.value = false;
      }
    );
  });
};
const update = (row) => {
  modalType.value = "edit";
  loadingDialog.value = true;
  proxy.post("/accountRunningWater/detail", { id: row.id }).then((res) => {
    formData.data = res;
    loadingDialog.value = false;
  });
  dialogVisible.value = true;
};
const deriveExcel = () => {
  let queryParams = proxy.deepClone(sourceList.value.pagination);
  queryParams.pageNum = 1;
  queryParams.pageSize = 9999;
  proxy.postTwo("/accountRunningWater/exportExcel", queryParams).then((res) => {
    exportData(res, "资金流水.xlsx");
  });
};
const exportData = (res, name) => {
  const content = res;
  const blob = new Blob([content], { type: "application/ms-excel" });
  const fileName = name;
  if ("download" in document.createElement("a")) {
    // 非IE下载
    const elink = document.createElement("a");
    elink.download = fileName;
    elink.style.display = "none";
    elink.href = URL.createObjectURL(blob);
    document.body.appendChild(elink);
    elink.click();
    URL.revokeObjectURL(elink.href); // 释放URL 对象
    document.body.removeChild(elink);
  } else {
    navigator.msSaveBlob(blob, fileName);
  }
};
const openPrint = ref(false);
const rowData = ref({});
const openDetails = (val) => {
  rowData.value = {
    code: val,
  };
  openPrint.value = true;
};
const printObj = ref({
  id: "printMe",
  popTitle: "",
  extraCss:
    "https://cdn.bootcdn.net/ajax/libs/animate.css/4.1.1/animate.compat.css, https://cdn.bootcdn.net/ajax/libs/hover.css/2.3.1/css/hover-min.css",
  extraHead: '<meta http-equiv="Content-Language"content="zh-cn"/>',
});
const clickDownload = () => {
  proxy.getPdf("外销合同PDF文件");
};
</script>

<style lang="scss" scoped>
.tenant {
  padding: 20px;
}
::v-deep(.el-input-number .el-input__inner) {
  text-align: left;
}
</style>
