reportInfoButton.js 6.28 KB
import React, { useEffect, useRef } from "react";
import { Modal, Button, Space, Row, Col } from "antd";
import * as commonFunc from "@/components/Common/commonFunc";
import * as commonUtils from "@/utils/utils";
import * as commonBusiness from "@/components/Common/commonBusiness";
import StaticEditTable from "@/components/Common/CommonTable";
import instructSet from "@/components/Common/CommonInstructSet";

const AutoTableHeight = '50vh';

// 业务层
const useTeamInfoEvent = props => {
  const nameCrewOrigin = useRef();
  const { formData, hasShowInfo } = props;

  let queryId = [];
  try {
    queryId = JSON.parse(props.reportRef?.sActiveKey || '[]')
  } catch (error) {
    queryId = []
  }

  const queryFormData = queryId.map(j => {
    const result = formData.find(i => i && i.sId === j)
    if (result) return result;
  }).filter(Boolean);

  useEffect (
    async () => {
      if (commonUtils.isNotEmptyArr(queryFormData) && queryFormData.length === 2) {
        const nameCrew = queryFormData[1].sGrd;
        const colunmData = handleGetColumnData(queryFormData, true);
        const result = await handleGetData(queryFormData, true);
        const addState = {
          ...colunmData,
          ...result,
            //   兼容异常转移部门的责任人
          [`${nameCrew}SelectedRowKeys`]: hasShowInfo?.sMainAssistantTransId?.split(',') || hasShowInfo?.sMainAssistantId?.split(',') || [],
        };
        props.onSaveState(addState);
        nameCrewOrigin.current = addState[`${nameCrew}Data`];
      }
    },
    [formData, props.reportRef?.sActiveKey]
  );

  // 获取表头数据
  const handleGetColumnData = (queryFormData = [], isWait) => {
    let addState = {};
    for (let i = 0; i < queryFormData.length; i++) {
      const config = queryFormData[i];
      const name = config.sGrd || '';
      const column = commonFunc.getHeaderConfig(config);
      addState = {
        ...addState,
        [`${name}Column`]: column,
        [`${name}Config`]: config,
      };
    }
    if (isWait) {
      return addState;
    } else {
      props.onSaveState(addState);
    }
  };

  // 获取数据集
  const handleGetData = async (queryFormData = [], isWait, extraConditions = {}) => {
    let addState = {};
    for (let i = 0; i < queryFormData.length; i++) {
      const config = queryFormData[i];
      if (!config) continue;
      const name = config.sGrd || '';
      const conditonValues = props.onGetSqlConditionValues(config);
      const result =
        (await props.onGetDataSet({
          name: `${name}`,
          configData: config,
          condition: {
            sSqlCondition: {
              ...conditonValues,
              ...extraConditions
            }
          },
          isWait: true
        })) || {};
      addState = { ...addState, ...result };
    }
    if (isWait) {
      return addState;
    } else {
      props.onSaveState(addState);
    }
  };

  return {
    ...props,
    queryFormData,
    nameCrewOrigin,
  };
};

export default (_props) => {

  if (!_props.reportInfoVisible) return "";

  const props = useTeamInfoEvent(_props);

  const { queryFormData, nameCrewOrigin } = props;

  if (!Array.isArray(queryFormData) || queryFormData.length !== 2) return "";

  const namePost = queryFormData[0].sGrd;
  const nameCrew = queryFormData[1].sGrd;

  const handleShowData = (name, selectedRowKeys) => {
    const dataShow = nameCrewOrigin.current;
    if (!Array.isArray(dataShow) || !Array.isArray(selectedRowKeys)) return;
    const sResponsibleDepartId = props[`${name}Data`]?.find(i => i && selectedRowKeys.includes(i.sId))?.sResponsibleDepartId;
    const showData = dataShow.filter(i => i && sResponsibleDepartId === i.sDepartId);
    props.onSaveState({ [`${nameCrew}Data`]: showData });
  }

  const selectData = () => {
    return commonFunc.getTableSelectedData({ props: { ...props, [`${nameCrew}Data`]: nameCrewOrigin.current || [] }, tableName: nameCrew });
  }

  const tablePropsPost = {
    ...commonBusiness.getTableTypes(namePost, props),
    tableProps: {
      AutoTableHeight,
    },
    onSelectRowChange: (name, selectedRowKeys) => {
      props.onSaveState({[`${namePost}SelectedRowKeys`]: selectedRowKeys });
      handleShowData(name, selectedRowKeys)
    }
  };

  const tableBaseProps = commonBusiness.getTableTypes(nameCrew, props);
  const tablePropsCrew = {
    ...tableBaseProps || {},
    tableProps: {
      AutoTableHeight,
    }
  };

  const { [`${nameCrew}Data`]: crewData = [], [`${nameCrew}SelectedRowKeys`]: crewSelectedRowKeys = [] } = props;
  const tablePropsCollect = {
    ...tableBaseProps,
    data: crewData.filter(item => crewSelectedRowKeys.includes(item.sId)),
    tableProps: {
      AutoTableHeight,
    }
  };

  // 执行指令集
  const handleExecInstructSet = async params => {
    const { btnConfig } = params;
    const { sInstruct } = btnConfig;
    if (!sInstruct) throw "";
    window.instructSetLock = false;
    await instructSet({ ...params });
  };

  const handleOk = () => {
    handleExecInstructSet({
      ...props,
      btnConfig: props.reportRef || {},
      [`${nameCrew}Data`]: selectData(),
      [`${nameCrew}DelData`]: [],
      [`${nameCrew}Config`]: queryFormData[1],
    }).then(() => {
      cancelCache();
    })
  }

  const cancelCache = () => {
    props.onSaveState({
      [`${namePost}Data`]: [],
      [`${namePost}DelData`]: [],
      [`${namePost}SelectedRowKeys`]: [],
      [`${nameCrew}Data`]: [],
      [`${nameCrew}DelData`]: [],
      [`${nameCrew}SelectedRowKeys`]: []
    })
    props.handleReportInfo();
  }

  return (
    <Modal
      title={props.reportRef?.sDefault || ""}
      open={props.reportInfoVisible}
      width="65%"
      onCancel={cancelCache}
      maskClosable={false}
      className="mesCommonModal"
      footer={
        <Space>
          <Button size="large" onClick={cancelCache}>
            取消
          </Button>
          <Button size="large" type="primary" onClick={handleOk}>
            确定
          </Button>
        </Space>
      }
    >
      <Row gutter={[16, 0]}>
        <Col span={8} flex={1} >
          <StaticEditTable {...tablePropsPost} />
        </Col>
        <Col span={8} flex={1} >
          <StaticEditTable {...tablePropsCrew} />
        </Col>
        <Col span={8} flex={1} >
          <StaticEditTable {...tablePropsCollect} />
        </Col>
      </Row>
    </Modal>
  );
};