<!-- <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">${{ customerTotalPriceUsd }}</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">${{ productionDepartmentTotalPriceUsd }}</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">${{ packetTotalPriceUsd }}</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" ><a-input v-model:value="actualdocumentaryPrice" 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">¥{{ 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" ><a-input v-model:value="actualRatio" 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">¥{{ 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(); //实际汇率 const customerTotalPrice = ref(0); //客户总价合计 const actualdocumentaryPrice = ref(0); //实际跟单费用 const actualRatioProfitPrice = ref(0); //汇率收益 const grossProfit = ref(0); //毛利润合计 const customerTotalPriceUsd = ref(0); //客户总价$ const productionDepartmentTotalPriceUsd = ref(0); //生产科总价$ const actualRatiactualRatioProfitPriceo = ref(0); //汇率收益计算 const packetTotalPriceUsd = ref(0); //汇率收益计算 const chinaRatioProfitPrice = ref(0); //中国团队提成比例 const developProfit = ref(0); //研发贸易利润 const fixCost = ref(0); // 固定成本 const orderCount = ref(0); //订单总数量 const outTotalPrice = ref(0); //支出合计计 const packetProfitPrice = ref(0); //包装费用收益计算 const packetTotalPrice = ref(0); //包装费用合计¥ const productionDepartmentTotalPrice = ref(0); //生成科总价¥ const totalProfitPrice = ref(0); //综合收益计算 const spainRatioProfitPrice = ref(0); //西班牙提成金额 const ids = ref(); // const orderRes = await getOrderList({}); const [register, { closeModal }] = useModalInner(async (data) => { res.value = data.data; orderList.value = data.res; orderList.value.forEach((item) => { orderCount.value += item.orderCount; }); customerCode.value = data.customerCode[0][0]; ids.value = data.data; const extractedValues = ref<string[]>(data.projectNo.map((item) => item[0])); projectNo.value = extractedValues.value.join(','); }); async function handleOk() { axios .post( '/basic-api/order/erp/calculate_profit/business_profit_ratio_export', { customerCode: customerCode.value, projectNo: projectNo.value, ids: ids.value, projectStartTime: projectStartTime.value, projectEndTime: projectEndTime.value, produceStartTime: produceStartTime.value, produceEndTime: produceEndTime.value, developTotalPrice: developTotalPrice.value, // actualdocumentaryPrice: actualdocumentaryPrice.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}.xlsx`; // 你可以为文件命名 document.body.appendChild(link); link.click(); // 自动点击链接,触发下载 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; // ids.value = null; // developTotalPrice.value = null; // actualdocumentaryPrice.value = null; // copyTotalPrice.value = null; // packetActualTotalPrice.value = null; // orderCount.value = 0; // } // } function handleShow(visible: boolean) { if (!visible) { projectStartTime.value = null; // 项目开发开始时间 projectEndTime.value = null; // 项目开发结束时间 produceStartTime.value = null; // 生产开始时间 produceEndTime.value = null; // 生产结束时间 customerCode.value = null; // 客户编码 projectNo.value = null; // 项目号 ids.value = null; // 假设存在的 ID 列表 developTotalPrice.value = null; // 开发总价格 actualdocumentaryPrice.value = null; // 实际跟单费用 copyTotalPrice.value = null; // 复制总价格 packetActualTotalPrice.value = null; // 包装实际总价格 orderCount.value = 0; // 订单总数量 // 新增的数据 - 修改的位置 testinput.value = null; // 新增输入框 Input1.value = ''; // 输入框 1 Input2.value = null; // 输入框 2 res.value = null; // 结果 orderList.value = null; // 订单列表 spainRatio.value = 0; // 西班牙比例 chinaRatio.value = 0; // 中国比例 actualRmbPrice.value = 0; // 实际跟单单价 actualPrice.value = 0; // 实际跟单单价折算美金 actualRatio.value = 0; // 实际汇率 customerTotalPrice.value = 0; // 客户总价合计 actualRatioProfitPrice.value = 0; // 汇率收益 grossProfit.value = 0; // 毛利润合计 chinaRatioProfitPrice.value = 0; // 中国团队提成比例 developProfit.value = 0; // 研发贸易利润 fixCost.value = 0; // 固定成本 outTotalPrice.value = 0; // 支出合计 packetProfitPrice.value = 0; // 包装费用收益计算 packetTotalPrice.value = 0; // 包装费用合计 productionDepartmentTotalPrice.value = 0; // 生成科总价 totalProfitPrice.value = 0; // 综合收益计算 spainRatioProfitPrice.value = 0; // 西班牙提成金额 customerTotalPriceUsd.value = 0; productionDepartmentTotalPriceUsd.value = 0; packetTotalPriceUsd.value = 0; } } //提成接口 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); allList.forEach((item) => { 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); const ratioAll = JSON.parse(ratios[0].relationValue); chinaRatio.value = ratioAll[1].relationValue; spainRatio.value = ratioAll[2].relationValue; //提成比例为0,提成设为0 const params = { customerCode: customerCode.value, projectNo: projectNo.value, ids: ids.value, projectStartTime: projectStartTime.value, projectEndTime: projectEndTime.value, produceStartTime: produceStartTime.value, produceEndTime: produceEndTime.value, developTotalPrice: developTotalPrice.value, // actualdocumentaryPrice: actualdocumentaryPrice.value, copyTotalPrice: copyTotalPrice.value, spainRatio: spainRatio.value, chinaRatio: chinaRatio.value, packetActualTotalPrice: packetActualTotalPrice.value, actualRmbPrice: actualRmbPrice.value, actualPrice: actualPrice.value, actualRatio: actualRatio.value, }; const res = await calculateBusinessProfit({ customerCode: customerCode.value, projectNo: projectNo.value, ids: ids.value, projectStartTime: projectStartTime.value, projectEndTime: projectEndTime.value, produceStartTime: produceStartTime.value, produceEndTime: produceEndTime.value, developTotalPrice: developTotalPrice.value, // actualdocumentaryPrice: actualdocumentaryPrice.value, copyTotalPrice: copyTotalPrice.value, spainRatio: spainRatio.value, chinaRatio: chinaRatio.value, packetActualTotalPrice: packetActualTotalPrice.value, actualRmbPrice: actualRmbPrice.value, actualPrice: actualPrice.value, actualRatio: actualRatio.value, }); customerTotalPrice.value = res.customerTotalPrice.toFixed(2); grossProfit.value = res.grossProfit.toFixed(2); actualRatioProfitPrice.value = res.actualRatioProfitPrice.toFixed(2); actualRmbPrice.value = res.actualRmbPrice.toFixed(2); actualPrice.value = res.actualPrice.toFixed(2); actualRatio.value = res.actualRatio; actualRatiactualRatioProfitPriceo.value = res.actualRatioProfitPrice.toFixed(2); //汇率收益计算 chinaRatioProfitPrice.value = res.chinaRatioProfitPrice.toFixed(2); //中国团队提成比例 developProfit.value = res.developProfit.toFixed(2); //研发贸易利润 developTotalPrice.value = res.developTotalPrice.toFixed(2); copyTotalPrice.value = res.copyTotalPrice.toFixed(2); packetActualTotalPrice.value = res.packetActualTotalPrice.toFixed(2); actualRatio.value = res.actualRatio.toFixed(2); fixCost.value = res.fixCost.toFixed(2); // 固定成本 orderCount.value = res.orderCount; //订单总数量 outTotalPrice.value = res.outTotalPrice.toFixed(2); //支出合计 packetProfitPrice.value = res.packetProfitPrice.toFixed(2); //包装费用收益计算 packetTotalPrice.value = res.packetTotalPrice.toFixed(2); //包装费用合计 productionDepartmentTotalPrice.value = res.productionDepartmentTotalPrice.toFixed(2); //生成科总价 totalProfitPrice.value = res.totalProfitPrice.toFixed(2); //综合收益计算 spainRatioProfitPrice.value = res.spainRatioProfitPrice.toFixed(2); //西班牙提成金额 customerTotalPriceUsd.value = res.customerTotalPriceUsd.toFixed(2); productionDepartmentTotalPriceUsd.value = res.productionDepartmentTotalPriceUsd.toFixed(2); packetTotalPriceUsd.value = res.packetTotalPriceUsd.toFixed(2); } </script> <style scoped> .divAll { display: flex; justify-content: center; align-items: center; } </style>