ServiceProfit.vue 15.9 KB
<!-- <template>
  <BasicModal
    v-bind="$attrs"
    @register="register"
    title="生产对账单"
    width="60%"
    :bodyStyle="{ height: '500px' }"
    @ok="handleOk"
  >
  </BasicModal>
</template> -->
<template>
  <BasicModal
    v-bind="$attrs"
    @register="register"
    title="净利润分析表"
    width="60%"
    :bodyStyle="{ height: '455px' }"
    @visible-change="handleShow"
    @ok="handleOk"
    okText="导出"
  >
    <template #appendFooter>
      <a-button style="background-color: #1890ff; color: white" @click="handleCalculate"
        >计算</a-button
      >
    </template>
    <table
      style="
        width: 100%;
        border-collapse: collapse;
        text-align: center;
        border: 1px solid black;
        font-size: 16px;
      "
    >
      <thead>
        <!-- <tr>
          <th colspan="4" style="border: 1px solid black">净利润分析表</th>
        </tr> -->
      </thead>
      <tbody>
        <tr>
          <td style="border: 1px solid black; width: 25%">项目号</td>
          <td style="border: 1px solid black; width: 25%">{{ projectNo }}</td>
          <td style="border: 1px solid black; width: 25%">开始时间</td>
          <td style="border: 1px solid black; width: 25%">结束时间</td>
        </tr>
        <tr>
          <td style="border: 1px solid black"></td>
          <td style="border: 1px solid black">项目开始时间</td>
          <td style="border: 1px solid black">
            <input type="date" v-model="projectStartTime" style="width: 100%" />
          </td>
          <input type="date" v-model="projectEndTime" style="width: 100%" />
        </tr>
        <tr>
          <td style="border: 1px solid black"></td>
          <td style="border: 1px solid black">生产进行时间</td>
          <td style="border: 1px solid black">
            <input type="date" v-model="produceStartTime" style="width: 100%" />
          </td>
          <td style="border: 1px solid black">
            <input type="date" v-model="produceEndTime" style="width: 100%"
          /></td>
        </tr>
        <tr>
          <td style="border: 1px solid black">客户编码</td>
          <td style="border: 1px solid black">{{ customerCode }}</td>
          <td style="border: 1px solid black"></td>
          <td style="border: 1px solid black">备注</td>
        </tr>
        <tr>
          <td style="border: 1px solid black" colspan="2">客户总金额合计</td>
          <td style="border: 1px solid black">{{ customerTotalPrice }}</td>
          <td style="border: 1px solid black"></td>
        </tr>
        <tr>
          <td style="border: 1px solid black" colspan="2">生产科总价合计</td>
          <td style="border: 1px solid black">{{ productionDepartmentTotalPrice }}</td>
          <td style="border: 1px solid black"></td>
        </tr>
        <tr>
          <td style="border: 1px solid black" colspan="2">包装费用合计</td>
          <td style="border: 1px solid black">{{ packetTotalPrice }}</td>
          <td style="border: 1px solid black"></td>
        </tr>
        <tr>
          <td style="border: 1px solid black" colspan="2">研发开发费合计</td>
          <td style="border: 1px solid black"
            ><a-input v-model:value="developTotalPrice" placeholder="请输入"
          /></td>
          <td style="border: 1px solid black"></td>
        </tr>
        <tr>
          <td style="border: 1px solid black" colspan="2">复制费用合计</td>
          <td style="border: 1px solid black"
            ><a-input v-model:value="copyTotalPrice" placeholder="请输入"
          /></td>
          <td style="border: 1px solid black"></td>
        </tr>
        <tr>
          <td style="border: 1px solid black" colspan="2">固定成本</td>
          <td style="border: 1px solid black">{{ fixCost }}</td>
          <td style="border: 1px solid black"></td>
        </tr>
        <tr>
          <td style="border: 1px solid black" colspan="2">西班牙提成</td>
          <td style="border: 1px solid black">{{ spainRatioProfitPrice }}</td>
          <td style="border: 1px solid black"></td>
        </tr>
        <tr>
          <td style="border: 1px solid black" colspan="2">中国团队提成</td>
          <td style="border: 1px solid black">{{ chinaRatioProfitPrice }}</td>
          <td style="border: 1px solid black"></td>
        </tr>
        <tr>
          <td style="border: 1px solid black" colspan="2">支出合计</td>
          <td style="border: 1px solid black">{{ outTotalPrice }}</td>
          <td style="border: 1px solid black"></td>
        </tr>
        <tr>
          <td style="border: 1px solid black" colspan="2">毛利润</td>
          <td style="border: 1px solid black">{{ grossProfit }}</td>
          <td style="border: 1px solid black"></td>
        </tr>
        <tr>
          <td style="border: 1px solid black" colspan="2">研发贸易净利润</td>
          <td style="border: 1px solid black">{{ developProfit }}</td>
          <td style="border: 1px solid black"></td>
        </tr>
        <tr>
          <td style="border: 1px solid black" colspan="2">包装费用合计金额</td>
          <td style="border: 1px solid black">{{ packetTotalPrice }}</td>
          <td style="border: 1px solid black"></td>
        </tr>
        <tr>
          <td style="border: 1px solid black" colspan="2">包装费用实际金额</td>
          <td style="border: 1px solid black"
            ><a-input v-model:value="packetActualTotalPrice" placeholder="请输入"
          /></td>
          <td style="border: 1px solid black"></td>
        </tr>
        <tr>
          <td style="border: 1px solid black" colspan="2">订单总数量</td>
          <td style="border: 1px solid black">{{ orderCount }}</td>
          <td style="border: 1px solid black"></td>
        </tr>
        <tr>
          <td style="border: 1px solid black" colspan="2">实际跟单单价=实际跟单费用/件数</td>
          <td style="border: 1px solid black">{{ actualRmbPrice }}</td>
          <td style="border: 1px solid black"></td>
        </tr>
        <tr>
          <td style="border: 1px solid black" colspan="2">实际跟单单价折算美金</td>
          <td style="border: 1px solid black">{{ actualPrice }}</td>
          <td style="border: 1px solid black"></td>
        </tr>
        <tr>
          <td style="border: 1px solid black" colspan="2">包装费用收益</td>
          <td style="border: 1px solid black">{{ packetProfitPrice }}</td>
          <td style="border: 1px solid black"></td>
        </tr>
        <tr>
          <td style="border: 1px solid black" colspan="2">汇率收益</td>
          <td style="border: 1px solid black">{{ actualRatioProfitPrice }}</td>
          <td style="border: 1px solid black"></td>
        </tr>
        <tr>
          <td style="border: 1px solid black" colspan="2">综合收益</td>
          <td style="border: 1px solid black">{{ totalProfitPrice }}</td>
          <td style="border: 1px solid black"></td>
        </tr>
      </tbody>
    </table>
  </BasicModal>
</template>
<script lang="ts" setup>
  import { BasicModal, useModalInner } from '@/components/Modal';
  import { computed, ref, toRaw } from 'vue';
  // import { payDate, checkCreate } from '@/api/project/invoice';
  import { calculateBusinessProfit, exportBusinessProfit } from '@/api/project/order';
  import { getList } from '/@/api/sys/config';
  import type { Dayjs } from 'dayjs';
  import axios from 'axios';

  const projectStartTime = ref();
  const projectEndTime = ref();
  const produceStartTime = ref();
  const produceEndTime = ref();

  const testinput = ref();
  const Input1 = ref('');
  const Input2 = ref();
  const res = ref();
  const orderList = ref();
  const customerCode = ref();
  const projectNo = ref();
  const developTotalPrice = ref();
  const copyTotalPrice = ref();
  const packetActualTotalPrice = ref();
  const spainRatio = ref(0);
  const chinaRatio = ref(0);
  const actualRmbPrice = ref(0); //实际跟单单价
  const actualPrice = ref(0); //实际跟单单价折算美金
  const actualRatio = ref(6.2); //实际汇率
  const customerTotalPrice = ref(); //客户总价合计
  const actualRatioProfitPrice = ref(); //汇率收益
  const grossProfit = ref(); //毛利润合计
  const actualRatiactualRatioProfitPriceo = ref(); //汇率收益计算
  const chinaRatioProfitPrice = ref(); //中国团队提成比例
  const developProfit = ref(); //研发贸易利润
  const fixCost = ref(); // 固定成本
  const orderCount = ref(); //订单总数量
  const outTotalPrice = ref(); //支出合计计
  const packetProfitPrice = ref(); //包装费用收益计算
  const packetTotalPrice = ref(); //包装费用合计¥
  const productionDepartmentTotalPrice = ref(); //生成科总价¥
  const totalProfitPrice = ref(); //综合收益计算
  const spainRatioProfitPrice = ref(); //西班牙提成金额

  // const orderRes = await getOrderList({});
  // console.log(orderRes, '5656orderRes');
  const [register, { closeModal }] = useModalInner(async (data) => {
    res.value = data.data;
    orderList.value = data.res;
    customerCode.value = data.customerCode[0][0];
    projectNo.value = data.projectNo[0][0];
    console.log(orderList.value, 565656);
  });
  async function handleOk() {
    axios
      .post(
        '/basic-api/order/erp/calculate_profit/business_profit_ratio_export',
        {
          customerCode: customerCode.value,
          projectNo: projectNo.value,
          projectStartTime: projectStartTime.value,
          projectEndTime: projectEndTime.value,
          produceStartTime: produceStartTime.value,
          produceEndTime: produceEndTime.value,
          developTotalPrice: developTotalPrice.value,
          copyTotalPrice: copyTotalPrice.value,
          spainRatio: spainRatio.value,
          chinaRatio: chinaRatio.value,
          packetActualTotalPrice: packetActualTotalPrice.value,
          actualRmbPrice: actualRmbPrice.value,
          actualPrice: actualPrice.value,
          actualRatio: actualRatio.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 = `业务/研发净利润分析${date}.pdf`; // 你可以为文件命名
        document.body.appendChild(link);
        link.click(); // 自动点击链接,触发下载
        console.log(link, 5656);
        document.body.removeChild(link); // 下载完成后移除链接
      })
      .catch((error) => {
        console.error(error);
      });
    closeModal();
  }
  function handleShow(visible: boolean) {
    if (visible) {
      projectStartTime.value = null;
      projectEndTime.value = null;
      produceStartTime.value = null;
      produceEndTime.value = null;
      customerCode.value = null;
      projectNo.value = null;
      developTotalPrice.value = null;
      copyTotalPrice.value = null;
      packetActualTotalPrice.value = null;
    }
  }
  //提成接口
  interface RatioListItem {
    createBy: string;
    createTime: string;
    enableFlag: number;
    id: number;
    modifyBy: string;
    modifyTime: string;
    relationCode: string;
    relationName: string;
    relationValue: string; // 这里 relationValue 是一个字符串,但内部是一个 JSON 数组,需要进一步解析
    settingCode: string;
    settingName: string;
    settingType: number;
    settingValue: string;
  }
  interface RatioList {
    items: RatioListItem[];
  }
  async function handleCalculate() {
    const packetCalculatePrice = ref(0);
    const orderCalculateCount = ref(0);
    const allList = toRaw(orderList.value);
    console.log(allList, '5656allList');
    allList.forEach((item) => {
      console.log(item, '5656orderList');
      console.log(item.profitAnalysisInfo.packetPrice, '5656orderList');
      packetCalculatePrice.value += item.profitAnalysisInfo.packetPrice;
      orderCalculateCount.value += item.orderCount;
      actualRmbPrice.value += packetCalculatePrice.value / orderCalculateCount.value;
    });
    actualPrice.value = actualRmbPrice.value / actualRatio.value;
    // const ratioList = (await getList({ settingType: 3 })) as Array<RatioListItem>;
    const ratioList = (await getList({ settingType: 3 })) as RatioList;
    const ratios = ratioList.items.filter((item) => item.settingValue === customerCode.value);
    console.log(ratios, '5656ratios');
    const ratioAll = JSON.parse(ratios[0].relationValue);
    console.log(ratioAll, '5656ratios', ratioAll[1].relationValue, ratioAll[2].relationValue);
    chinaRatio.value = ratioAll[1].relationValue;
    spainRatio.value = ratioAll[2].relationValue;
    //提成比例为0,提成设为0
    const params = {
      customerCode: customerCode.value,
      projectNo: projectNo.value,
      projectStartTime: projectStartTime.value,
      projectEndTime: projectEndTime.value,
      produceStartTime: produceStartTime.value,
      produceEndTime: produceEndTime.value,
      developTotalPrice: developTotalPrice.value,
      copyTotalPrice: copyTotalPrice.value,
      spainRatio: spainRatio.value,
      chinaRatio: chinaRatio.value,
      packetActualTotalPrice: packetActualTotalPrice.value,
      actualRmbPrice: actualRmbPrice.value,
      actualPrice: actualPrice.value,
      actualRatio: actualRatio.value,
    };
    console.log(params, '5656params');
    const res = await calculateBusinessProfit({
      customerCode: customerCode.value,
      projectNo: projectNo.value,
      projectStartTime: projectStartTime.value,
      projectEndTime: projectEndTime.value,
      produceStartTime: produceStartTime.value,
      produceEndTime: produceEndTime.value,
      developTotalPrice: developTotalPrice.value,
      copyTotalPrice: copyTotalPrice.value,
      spainRatio: spainRatio.value,
      chinaRatio: chinaRatio.value,
      packetActualTotalPrice: packetActualTotalPrice.value,
      actualRmbPrice: actualRmbPrice.value,
      actualPrice: actualPrice.value,
      actualRatio: actualRatio.value,
    });
    console.log(res, '5656resservice');

    customerTotalPrice.value = res.customerTotalPrice;
    grossProfit.value = res.grossProfit;
    actualRatioProfitPrice.value = res.actualRatioProfitPrice;
    actualRmbPrice.value = res.actualRmbPrice;
    actualPrice.value = res.actualPrice;
    actualRatio.value = res.actualRatio;
    actualRatiactualRatioProfitPriceo.value = res.actualRatioProfitPrice; //汇率收益计算
    chinaRatioProfitPrice.value = res.chinaRatioProfitPrice; //中国团队提成比例
    developProfit.value = res.developProfit; //研发贸易利润
    fixCost.value = res.fixCost; // 固定成本
    orderCount.value = res.orderCount; //订单总数量
    outTotalPrice.value = res.outTotalPrice; //支出合计
    packetProfitPrice.value = res.packetProfitPrice; //包装费用收益计算
    packetTotalPrice.value = res.packetTotalPrice; //包装费用合计
    productionDepartmentTotalPrice.value = res.productionDepartmentTotalPrice; //生成科总价
    totalProfitPrice.value = res.totalProfitPrice; //综合收益计算
    spainRatioProfitPrice.value = res.spainRatioProfitPrice; //西班牙提成金额
  }
</script>
<style scoped>
  .divAll {
    display: flex;
    justify-content: center;
    align-items: center;
  }
</style>