Statement.vue 8.46 KB
<template>
  
    <BasicModal
      v-bind="$attrs"
      destroyOnClose
      @register="register"
      title="LOACL对账单"
      width="1100px"
      @visible-change="handleShow"
      :footer="null"
      :bodyStyle="{ height: '650px', overflow: 'hidden' }"
    >
      <div class="container">
        <div v-if="isShow1 == true" style="margin-top: 30px">
          <RadioGroup v-model:value="selectedCompany" :options="companyOptions"  style="display: flex; gap: 200px;"/>
        </div>
         <!-- 代垫费用区域 -->
      <div class="table-container" style="display: flex; flex-wrap: wrap; justify-content: space-between; margin-top: 30px" >
        <div class="table-box" style="flex: 0.5; margin-right: -20px;">
          <h3>代垫费用</h3>
          <div class="input-row" style="display: flex; align-items: center;">
            <a-button type="primary" style="margin-left: 10px;" @click="addAdvanceCost">添加费用</a-button>
          </div>
          <div v-for="(item, index) in advanceCosts" :key="'advance-' + index" class="input-row" style="margin-top: 10px; display: flex;">
            <a-input v-model:value="item.name" placeholder="请输入费用名称" style="width: 200px;" />
            <a-input-number v-model:value="item.value" placeholder="请输入费用金额" style="width: 150px !important; margin-left: 10px;" />
            <a-button type="danger" style="margin-left: 10px;" @click="removeAdvanceCost(index)">删除</a-button>
          </div>
        </div>
        <div class="table-box" style="flex: 1;">
          <h3>费用支出</h3>
          <div class="input-row" style="display: flex; align-items: center;">
            <a-button type="primary" style="margin-left: 10px;" @click="addExpenseCost">添加费用</a-button>
          </div>
          <div v-for="(item, index) in expenseCosts" :key="'expense-' + index" class="input-row" style="margin-top: 10px; display: flex;">
            <a-input v-model:value="item.name" placeholder="请输入费用名称" style="width: 200px;" />
            <a-input-number v-model:value="item.value" placeholder="请输入费用金额" style="width: 150px !important; margin-left: 10px;" />
            <a-button type="danger" style="margin-left: 10px;" @click="removeExpenseCost(index)">删除</a-button>
          </div>
        </div>
        </div>

        <div class="bottom">
          <a-button type="primary" @click="handleAccountStatement" className="ml-4" v-if="isShow1 == true"
            >生成</a-button
          >
          <a-button type="primary" @click="handleCancel" className="ml-4" style="margin-left: 6px"
            >取消</a-button
          >
        </div>
      </div>
    </BasicModal>
  </template>
  <script lang="ts">
    import { defineComponent, ref, computed } from 'vue';
    import { BasicModal, useModalInner } from '/@/components/Modal';
    import { RadioGroup } from 'ant-design-vue';
    import { useMessage } from '@/hooks/web/useMessage';
    import axios from 'axios';
  
    export default defineComponent({
      props: {
        role: {
          type: String,
        },
        customerCodes: {
          type: Array<string | number>,
        },
      },
      components: { BasicModal, RadioGroup },
      setup(props) {
        const loading = ref(true);
        const choose = ref();
        const checkedKeys=ref();
        const isShow1 = ref(true);
        const advanceCostValue = ref(0);
        const expenseCostValue = ref(0);
        const advanceCosts = ref<{ name: string; value: number }[]>([]);
        const expenseCosts = ref<{ name: string; value: number }[]>([]);
        const [register, { setModalProps, closeModal }] = useModalInner(async (data)=>{
          checkedKeys.value=data.checkedKeys;
        });
        const { createMessage } = useMessage();
        const { error } = createMessage;
        const selectedCompany = ref();
        const companyOptions = ref([
          { label: '翱特逸格饰品有限公司', value: '翱特逸格饰品有限公司' },
          { label: '吉庆天成饰品有限公司', value: '吉庆天成饰品有限公司' }
        ]);
  
        function addAdvanceCost() {
          advanceCosts.value.push({ name: '', value: advanceCostValue.value });
        }
  
        function addExpenseCost() {
          expenseCosts.value.push({ name: '', value: expenseCostValue.value });
        }
  
        function removeAdvanceCost(index: number) {
          advanceCosts.value.splice(index, 1);
        }
  
        function removeExpenseCost(index: number) {
          expenseCosts.value.splice(index, 1);
        }
  
        function handleCancel() {
          loading.value = true;
          choose.value = '';
          setModalProps({ loading: false, confirmLoading: false });
          isShow1.value = true;
          advanceCosts.value = [];
          expenseCosts.value = [];
          closeModal();
        }
  
        function handleShow(visible: boolean) {
          if (visible) {
            loading.value = true;
            choose.value = '';
            setModalProps({ loading: false, confirmLoading: false });
            isShow1.value = true;
          } else {
            advanceCosts.value = [];
            expenseCosts.value = [];
          }
        }
        async function handleAccountStatement() {
          if (!selectedCompany.value) {
            error('请选择公司'); // 提示用户选择公司
            return; // 结束函数执行
          }

          axios
            .post(
              '/basic-api/order/erp/order/accountStatement',
              {
                ids: checkedKeys.value,
                disbursement: advanceCosts.value.map(item => ({ [item.name]: item.value })),
                deduction: expenseCosts.value.map(item => ({ [item.name]: item.value })),
                titleCompany: selectedCompany.value
              },
              {
                responseType: 'blob', // 设置响应类型为 'blob'
              },
            )
            .then((response) => {
              // 创建一个 Blob 对象来保存二进制数据
              const blob = new Blob([response.data], { type: 'application/octet-stream' });
              const getFormattedDate = (): string => {
                const date = new Date();

                const year = date.getFullYear();
                const month = String(date.getMonth() + 1).padStart(2, '0');
                const day = String(date.getDate()).padStart(2, '0');

                const hours = String(date.getHours()).padStart(2, '0');
                const minutes = String(date.getMinutes()).padStart(2, '0');
                const seconds = String(date.getSeconds()).padStart(2, '0');

                return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
              };
              const date = getFormattedDate();
              // 创建一个链接元素用于下载
              const link = document.createElement('a');
              link.href = window.URL.createObjectURL(blob);
              link.download = `${selectedCompany.value}对账单${date}.xlsx`; // 你可以为文件命名
              document.body.appendChild(link);
              link.click(); // 自动点击链接,触发下载
              document.body.removeChild(link); // 下载完成后移除链接
            })
            .catch((error) => {
              console.error(error);
            });
          closeModal();
        }
        return {
          register,
          loading,
          choose,
          handleShow,
          handleCancel,
          advanceCostValue,
          expenseCostValue,
          advanceCosts,
          expenseCosts,
          addAdvanceCost,
          addExpenseCost,
          isShow1,
          selectedCompany,
          companyOptions,
          removeAdvanceCost,
          removeExpenseCost,
          handleAccountStatement,
        };
      },
    });
  </script>
  <style scoped>
    /* .container {
      position: relative;
    }
    .bottom {
      position: absolute;
      bottom: 0;
    } */
    .container {
      display: flex;
      flex-direction: column;
      /* min-height: 20vh; */
    }
  
    .bottom {
      margin-top: 40px;
      /* margin-right: auto; */
      margin-left: 150px;
    }
  
    .showPdf {
      display: flex;
      position: relative;
      height: 30px;
      width: 470px;
      border: 2px solid;
      border-radius: 5px;
      border-color: #d8d8d8;
    }
  
    .FilePptOutlined {
      margin-top: 3px;
      margin-left: 30px;
    }
  
    .EyeOutlined {
      margin-top: 3px;
      margin-left: 290px;
    }
  </style>