From 39133b3adcd034d30a74b42171dfd8c1a4a08327 Mon Sep 17 00:00:00 2001 From: yunkexin <760754045@qq.com> Date: Tue, 27 Jan 2026 14:19:46 +0800 Subject: [PATCH] =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E8=BF=90=E8=A1=8C=E6=83=85?= =?UTF-8?q?=E5=86=B5=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CustomPages/BI/BI064FormRunAnalysis.js | 372 ++++++++++++++++++ src/utils/customConfig.js | 28 +- 2 files changed, 388 insertions(+), 12 deletions(-) create mode 100644 src/components/CustomPages/BI/BI064FormRunAnalysis.js diff --git a/src/components/CustomPages/BI/BI064FormRunAnalysis.js b/src/components/CustomPages/BI/BI064FormRunAnalysis.js new file mode 100644 index 0000000..3a41aa1 --- /dev/null +++ b/src/components/CustomPages/BI/BI064FormRunAnalysis.js @@ -0,0 +1,372 @@ +import React from 'react'; +import { connect } from 'dva'; +import { initFilter } from '../../../utils/common'; +import { Table, Row, Spin, Card } from 'antd'; + +class BI064FormRunAnalysis extends React.Component { + constructor(props) { + super(props); + this.state = { + retData: [], // 表单运行数据 + companyData: [], // 公司数据 + loading: true, + tableData: [], // 处理后的表格数据 + columns: [], // 动态生成的列 + }; + } + + componentDidMount() { + this.loadData(); + } + + // 加载数据 + loadData = () => { + this.getBaseData(); + this.getrealData(); + }; + + // 获取公司数据 + getBaseData = () => { + const json = initFilter(this.props.login.OrgId); + this.props.dispatch({ + type: 'app/getDataByPost', + url: 'FM/Organization/OrderPaged', + payload: json, + onlyData: false, + onComplete: (ret) => { + if (ret && ret.Data) { + this.setState({ companyData: ret.Data }, () => { + this.processData(); + }); + } + }, + }); + }; + + // 获取表单运行数据 + getrealData = () => { + const json = initFilter(this.props.login.OrgId); + this.props.dispatch({ + type: 'app/getDataByPost', + url: 'BI/BIStatiscialAnalysisController/GetTaskViewInfo', + payload: json, + onlyData: false, + onComplete: (ret) => { + if (ret && ret.Data) { + this.setState({ retData: ret.Data, loading: false }, () => { + this.processData(); + }); + } else { + this.setState({ loading: false }); + } + }, + }); + }; + + // 处理数据,生成表格所需格式 + processData = () => { + const { retData, companyData } = this.state; + + if (!retData.length || !companyData.length) return; + + // 获取所有模块和表单的列表 + const modules = [...new Set(retData.map((item) => item.MOULD_NAME))]; + const forms = []; + + // 按模块组织表单 + modules.forEach((module) => { + const moduleForms = [ + ...new Set(retData.filter((item) => item.MOULD_NAME === module).map((item) => item.FORM_NAME)), + ]; + + moduleForms.forEach((form) => { + forms.push({ + module, + form, + key: `${module}_${form}`, + }); + }); + }); + + // 处理每个公司的数据 + const tableData = forms.map((formItem) => { + const { module, form, key } = formItem; + const rowData = { + key, + module, + form, + }; + + // 为每个公司添加数据 + companyData.forEach((company) => { + const companyName = company.NAME; + const companyDataKey = companyName.replace(/\s+/g, ''); + + // 查找该公司该表单的数据 + const formData = retData.find( + (item) => item.MOULD_NAME === module && item.FORM_NAME === form && item.COMPANY_NAME === companyName + ); + + if (formData) { + // 计算完成率和及时率 + // const finishRate = + // formData.TOTAL_QTY > 0 + // ? (((formData.NORMAL_FINISH + formData.OVER_FINISH + formData.DOING) / formData.TOTAL_QTY) * 100).toFixed( + // 0 + // ) + // : '0'; + + // const normalRate = + // formData.NORMAL_FINISH + formData.OVER_FINISH + formData.DOING > 0 + // ? ( + // (formData.NORMAL_FINISH / (formData.NORMAL_FINISH + formData.OVER_FINISH + formData.DOING)) * + // 100 + // ).toFixed(0) + // : '0'; + + rowData[`${companyDataKey}_total`] = formData.TOTAL_QTY; + rowData[`${companyDataKey}_normal`] = formData.NORMAL_FINISH; + rowData[`${companyDataKey}_overtime`] = formData.OVER_FINISH; + rowData[`${companyDataKey}_doing`] = formData.DOING; + rowData[`${companyDataKey}_unfinish`] = formData.UNFINISH; + rowData[`${companyDataKey}_overUnfinish`] = formData.OVER_UNFINISH; + rowData[`${companyDataKey}_finishRate`] = formData.FINISH_RATE; + rowData[`${companyDataKey}_normalRate`] = formData.NORMAL_RATE; + } else { + // 如果没有数据,设置默认值 + rowData[`${companyDataKey}_total`] = 0; + rowData[`${companyDataKey}_normal`] = 0; + rowData[`${companyDataKey}_overtime`] = 0; + rowData[`${companyDataKey}_doing`] = 0; + rowData[`${companyDataKey}_unfinish`] = 0; + rowData[`${companyDataKey}_overUnfinish`] = 0; + rowData[`${companyDataKey}_finishRate`] = '0'; + rowData[`${companyDataKey}_normalRate`] = '0'; + } + }); + + return rowData; + }); + + // 计算每个模块的行数,用于合并单元格 + const moduleRowCounts = {}; + let currentModule = null; + let count = 0; + + tableData.forEach((row, index) => { + if (row.module !== currentModule) { + if (currentModule !== null) { + moduleRowCounts[currentModule] = count; + } + currentModule = row.module; + count = 1; + } else { + count++; + } + + // 最后一个模块 + if (index === tableData.length - 1) { + moduleRowCounts[currentModule] = count; + } + }); + + // 将行数信息添加到tableData中,供render使用 + const tableDataWithRowSpan = tableData.map((row, index) => { + // 找到该模块的起始索引 + const moduleStartIndex = tableData.findIndex((item) => item.module === row.module); + + // 如果是该模块的第一行,设置rowSpan为该模块的行数 + if (index === moduleStartIndex) { + return { + ...row, + moduleRowSpan: moduleRowCounts[row.module] || 1, + }; + } else { + // 不是第一行,设置rowSpan为0,表示不显示 + return { + ...row, + moduleRowSpan: 0, + }; + } + }); + + // 生成表格列 + const columns = this.generateColumns(companyData, tableDataWithRowSpan); + + this.setState({ tableData: tableDataWithRowSpan, columns }); + }; + + // 动态生成表格列 + generateColumns = (companyData) => { + const baseColumns = [ + { + width: '150px', + title: '模块', + dataIndex: 'module', + key: 'module', + fixed: 'left', + align: 'center', + render: (value, row, index) => { + const obj = { + children: value, + props: {}, + }; + + // 设置rowSpan属性 + if (row.moduleRowSpan !== undefined) { + obj.props.rowSpan = row.moduleRowSpan; + } + + return obj; + }, + }, + { + width: '200px', + title: '表单', + dataIndex: 'form', + key: 'form', + fixed: 'left', + align: 'center', + }, + ]; + + // 为每个公司生成列组 + companyData.forEach((company) => { + const companyName = company.NAME; + const companyDataKey = companyName.replace(/\s+/g, ''); + + const companyColumns = { + title: `${companyName}运行数据`, + children: [ + { + title: '总任务数', + dataIndex: `${companyDataKey}_total`, + key: `${companyDataKey}_total`, + width: '80px', + align: 'center', + }, + { + title: '正常完成', + dataIndex: `${companyDataKey}_normal`, + key: `${companyDataKey}_normal`, + width: '80px', + align: 'center', + }, + { + title: '超时完成', + dataIndex: `${companyDataKey}_overtime`, + key: `${companyDataKey}_overtime`, + width: '80px', + align: 'center', + }, + { + title: '进行中', + dataIndex: `${companyDataKey}_doing`, + key: `${companyDataKey}_doing`, + width: '80px', + align: 'center', + }, + { + title: '超期未完成', + dataIndex: `${companyDataKey}_overUnfinish`, + key: `${companyDataKey}_overUnfinish`, + width: '80px', + align: 'center', + }, + { + title: '完成率', + dataIndex: `${companyDataKey}_finishRate`, + key: `${companyDataKey}_finishRate`, + width: '80px', + align: 'center', + render: (text) => {text}%, + }, + { + title: '及时率', + dataIndex: `${companyDataKey}_normalRate`, + key: `${companyDataKey}_normalRate`, + width: '80px', + align: 'center', + render: (text) => {text}%, + }, + ], + }; + + baseColumns.push(companyColumns); + }); + + return baseColumns; + }; + + render() { + const { tableData, columns, loading } = this.state; + + return ( +