|  | @@ -16,7 +16,7 @@
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  <script lang="ts" setup>
 | 
	
		
			
				|  |  |    import { onMounted, ref, shallowRef } from 'vue';
 | 
	
		
			
				|  |  | -  import { BasicColumn, BasicTableProps, PaginationProps, FormProps, FormSchema, BasicTable } from '/@/components/Table';
 | 
	
		
			
				|  |  | +  import { BasicColumn, PaginationProps, BasicTable } from '/@/components/Table';
 | 
	
		
			
				|  |  |    import { getTableHeaderColumns } from '/@/hooks/web/useWebColumns';
 | 
	
		
			
				|  |  |    import { defaultFormProps, defaultPaginationProps, getDefaultSchemas, defaultTableProps } from './history.data';
 | 
	
		
			
				|  |  |    import { getDeviceList, list } from './history.api';
 | 
	
	
		
			
				|  | @@ -25,11 +25,11 @@
 | 
	
		
			
				|  |  |    const props = withDefaults(
 | 
	
		
			
				|  |  |      defineProps<{
 | 
	
		
			
				|  |  |        /** 表格项配置,默认由deviceCode获取且联动dictCode,可以覆写,覆写后将不支持联动,参考BaiscTable */
 | 
	
		
			
				|  |  | -      columns?: BasicColumn[];
 | 
	
		
			
				|  |  | +      // columns?: BasicColumn[];
 | 
	
		
			
				|  |  |        /** 表格操作项配置,默认为空,可以覆写 */
 | 
	
		
			
				|  |  | -      actionColumns?: BasicColumn;
 | 
	
		
			
				|  |  | +      // actionColumns?: BasicColumn;
 | 
	
		
			
				|  |  |        /** 查询表单项配置,默认联动dictCode,可以覆写,覆写后将不支持联动,提供formProps时此项无效,参考BaiscTable */
 | 
	
		
			
				|  |  | -      schemas?: FormSchema[];
 | 
	
		
			
				|  |  | +      // schemas?: FormSchema[];
 | 
	
		
			
				|  |  |        /** 表格分页配置,可以覆写,参考BaiscTable */
 | 
	
		
			
				|  |  |        pagination?: PaginationProps;
 | 
	
		
			
				|  |  |        /** 设备编码,该编码用于从字段/点表配置中读出表头,示例:forcFan */
 | 
	
	
		
			
				|  | @@ -37,9 +37,9 @@
 | 
	
		
			
				|  |  |        /** 字典编码,该编码用于从字典配置中读出设备项,示例:forcFan_dict */
 | 
	
		
			
				|  |  |        dictCode: string;
 | 
	
		
			
				|  |  |        /** 表格配置,参考BaiscTable,该值会与默认的配置进行浅合并,这里提供的任何配置都是优先的 */
 | 
	
		
			
				|  |  | -      tableProps?: BasicTableProps;
 | 
	
		
			
				|  |  | +      // tableProps?: BasicTableProps;
 | 
	
		
			
				|  |  |        /** 查询表单配置,参考BaiscTable */
 | 
	
		
			
				|  |  | -      formProps?: FormProps;
 | 
	
		
			
				|  |  | +      // formProps?: FormProps;
 | 
	
		
			
				|  |  |      }>(),
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |        deviceCode: '',
 | 
	
	
		
			
				|  | @@ -47,73 +47,71 @@
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    );
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  // 初始化表格,将默认配置与props提供的配置合并
 | 
	
		
			
				|  |  | -  const defaultSchemas = getDefaultSchemas(props.dictCode);
 | 
	
		
			
				|  |  | -  const defaultColumns = getTableHeaderColumns(props.deviceCode.concat('_history'));
 | 
	
		
			
				|  |  | +  // 创建表格,此表格目前不具备常用功能,需要初始化后使用(props指定表格配置时除外)
 | 
	
		
			
				|  |  | +  const { tableContext } = useListPage({ tableProps: defaultTableProps });
 | 
	
		
			
				|  |  | +  const [register, { getForm, setLoading, getPaginationRef, setPagination, setProps, getColumns, setColumns }] = tableContext;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  const { tableContext } = useListPage({
 | 
	
		
			
				|  |  | -    tableProps: {
 | 
	
		
			
				|  |  | -      ...defaultTableProps,
 | 
	
		
			
				|  |  | -      columns: props.columns || defaultColumns,
 | 
	
		
			
				|  |  | -      actionColumn: props.actionColumns,
 | 
	
		
			
				|  |  | -      showActionColumn: Boolean(props.actionColumns),
 | 
	
		
			
				|  |  | -      formConfig: props.formProps || {
 | 
	
		
			
				|  |  | +  /**
 | 
	
		
			
				|  |  | +   * 初始化表格,该方法将根据参数设定新的表头、表单,如果提供了自定义的表头、表单配置则不作操作。
 | 
	
		
			
				|  |  | +   *
 | 
	
		
			
				|  |  | +   * 之所以将设备相关的信息作参数传入,是因为这样可以确认依赖关系,即需要有设备信息之后再初始化表格。
 | 
	
		
			
				|  |  | +   *
 | 
	
		
			
				|  |  | +   * @param deviceCodes 获取表头所用的编码,从左到右依次尝试,直到找到第一个有表头信息的为止
 | 
	
		
			
				|  |  | +   * @param deviceOptions 设备下拉框对应的选项
 | 
	
		
			
				|  |  | +   */
 | 
	
		
			
				|  |  | +  function initTable(deviceCodes: string[], deviceOptions: any[]) {
 | 
	
		
			
				|  |  | +    const defaultSchemas = getDefaultSchemas(props.dictCode, deviceOptions);
 | 
	
		
			
				|  |  | +    let defaultColumns: BasicColumn[] = [];
 | 
	
		
			
				|  |  | +    for (const code of deviceCodes) {
 | 
	
		
			
				|  |  | +      const cols = getTableHeaderColumns(code);
 | 
	
		
			
				|  |  | +      if (cols.length) {
 | 
	
		
			
				|  |  | +        defaultColumns = cols;
 | 
	
		
			
				|  |  | +        break;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    setProps({
 | 
	
		
			
				|  |  | +      columns: defaultColumns,
 | 
	
		
			
				|  |  | +      formConfig: {
 | 
	
		
			
				|  |  |          ...defaultFormProps,
 | 
	
		
			
				|  |  | -        schemas: props.schemas || defaultSchemas,
 | 
	
		
			
				|  |  | +        schemas: defaultSchemas,
 | 
	
		
			
				|  |  |        },
 | 
	
		
			
				|  |  |        pagination: props.pagination || defaultPaginationProps,
 | 
	
		
			
				|  |  | -      ...props.tableProps,
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -  });
 | 
	
		
			
				|  |  | -  const [register, { getForm, setLoading, setColumns, getPaginationRef, setPagination }] = tableContext;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  // 表格数据相关
 | 
	
		
			
				|  |  | -  const data = shallowRef([]);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  // 搜索
 | 
	
		
			
				|  |  | -  async function search() {
 | 
	
		
			
				|  |  | -    const form = getForm();
 | 
	
		
			
				|  |  | -    await form.validate();
 | 
	
		
			
				|  |  | -    await fetchData(form.getFieldsValue());
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  // 分站类型,不同的分站类型对应不同的方式获取历史数据
 | 
	
		
			
				|  |  | -  const deviceInfo = ref({});
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  // 获取设备列表信息,初始化一些信息
 | 
	
		
			
				|  |  | -  async function fetchDevice() {
 | 
	
		
			
				|  |  | -    const results = await getDeviceList({ devicetype: props.deviceCode, pageSize: 10000 });
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    const id = results[0].id || results[0].deviceID;
 | 
	
		
			
				|  |  | -    deviceInfo.value = results[0];
 | 
	
		
			
				|  |  | -    await getForm().setFieldsValue({ gdeviceid: id });
 | 
	
		
			
				|  |  | +  /**
 | 
	
		
			
				|  |  | +   * 更新表头,表头默认情况下需要和子设备联动
 | 
	
		
			
				|  |  | +   * @param prefix 子设备的值,即为表头取数据时字段的前缀
 | 
	
		
			
				|  |  | +   */
 | 
	
		
			
				|  |  | +  function updateColumns(prefix: string) {
 | 
	
		
			
				|  |  | +    const cols = getColumns();
 | 
	
		
			
				|  |  | +    setColumns(
 | 
	
		
			
				|  |  | +      cols.map((col) => {
 | 
	
		
			
				|  |  | +        return {
 | 
	
		
			
				|  |  | +          ...col,
 | 
	
		
			
				|  |  | +          dataIndex: col.dataIndex ? `${prefix || ''}${col.dataIndex}` : undefined,
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +      })
 | 
	
		
			
				|  |  | +    );
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  // 核心,获取表格的数据
 | 
	
		
			
				|  |  | -  function fetchData(formData: Record<string, unknown>) {
 | 
	
		
			
				|  |  | -    setLoading(true);
 | 
	
		
			
				|  |  | +  // 表格数据相关的字段
 | 
	
		
			
				|  |  | +  const data = shallowRef([]);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  /**
 | 
	
		
			
				|  |  | +   * 获取列表的数据
 | 
	
		
			
				|  |  | +   *
 | 
	
		
			
				|  |  | +   * 这些参数确认了依赖关系,即需要有表单数据、设备信息之后再尝试获取表格数据。
 | 
	
		
			
				|  |  | +   *
 | 
	
		
			
				|  |  | +   * @param formData 表格上方的表单数据
 | 
	
		
			
				|  |  | +   * @param deviceCode 设备编码
 | 
	
		
			
				|  |  | +   * @param deviceInfo 设备信息
 | 
	
		
			
				|  |  | +   */
 | 
	
		
			
				|  |  | +  function fetchData(formData: Record<string, unknown>, deviceCode: string, deviceInfo: any) {
 | 
	
		
			
				|  |  | +    setLoading(true);
 | 
	
		
			
				|  |  |      const pagination = getPaginationRef() as PaginationProps;
 | 
	
		
			
				|  |  | -    list(
 | 
	
		
			
				|  |  | -      props.deviceCode,
 | 
	
		
			
				|  |  | -      deviceInfo,
 | 
	
		
			
				|  |  | -      {
 | 
	
		
			
				|  |  | -        ...formData,
 | 
	
		
			
				|  |  | -        pageNo: pagination.current,
 | 
	
		
			
				|  |  | -        pageSize: pagination.pageSize,
 | 
	
		
			
				|  |  | -        column: 'createTime',
 | 
	
		
			
				|  |  | -        strtype: props.deviceCode + '*',
 | 
	
		
			
				|  |  | -        isEmployee: props.deviceCode.startsWith('vehicle') ? false : true,
 | 
	
		
			
				|  |  | -      },
 | 
	
		
			
				|  |  | -      pagination
 | 
	
		
			
				|  |  | -    )
 | 
	
		
			
				|  |  | +    return list(deviceCode, deviceInfo, formData, pagination)
 | 
	
		
			
				|  |  |        .then(({ records, total, current }) => {
 | 
	
		
			
				|  |  | -        // 表格的列需要默认情况下需要和设备列表联动
 | 
	
		
			
				|  |  | -        defaultColumns.filter((col) => {
 | 
	
		
			
				|  |  | -          col.dataIndex = `${formData.deviceid}${col.dataIndex}`;
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | -        setColumns(defaultColumns);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          setPagination({
 | 
	
		
			
				|  |  |            current,
 | 
	
		
			
				|  |  |            total,
 | 
	
	
		
			
				|  | @@ -125,8 +123,49 @@
 | 
	
		
			
				|  |  |        });
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  onMounted(() => {
 | 
	
		
			
				|  |  | -    fetchDevice();
 | 
	
		
			
				|  |  | +  // 设备信息相关的字段
 | 
	
		
			
				|  |  | +  const deviceInfo = ref<Record<string, unknown>>({});
 | 
	
		
			
				|  |  | +  const deviceOptions = ref<Record<string, unknown>[]>([]);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  /**
 | 
	
		
			
				|  |  | +   * 获取设备信息列表,初始化设备信息及设备可选项
 | 
	
		
			
				|  |  | +   */
 | 
	
		
			
				|  |  | +  async function fetchDevice() {
 | 
	
		
			
				|  |  | +    const results = await getDeviceList({ devicetype: props.deviceCode, pageSize: 10000 });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const options = results.map((item) => {
 | 
	
		
			
				|  |  | +      return {
 | 
	
		
			
				|  |  | +        label: item.strinstallpos,
 | 
	
		
			
				|  |  | +        value: item.id || item.deviceID,
 | 
	
		
			
				|  |  | +        deviceType: item.strtype || item.deviceType,
 | 
	
		
			
				|  |  | +        devicekind: item.devicekind,
 | 
	
		
			
				|  |  | +        stationtype: item.stationtype,
 | 
	
		
			
				|  |  | +      };
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    deviceOptions.value = options;
 | 
	
		
			
				|  |  | +    deviceInfo.value = results[0];
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  /**
 | 
	
		
			
				|  |  | +   * 搜索,核心方法
 | 
	
		
			
				|  |  | +   *
 | 
	
		
			
				|  |  | +   * 该方法获取表单、处理表单数据后尝试获取数据并设置表头
 | 
	
		
			
				|  |  | +   */
 | 
	
		
			
				|  |  | +  async function search() {
 | 
	
		
			
				|  |  | +    const form = getForm();
 | 
	
		
			
				|  |  | +    await form.validate();
 | 
	
		
			
				|  |  | +    const formData = form.getFieldsValue();
 | 
	
		
			
				|  |  | +    deviceInfo.value = deviceOptions.value.find((opt) => {
 | 
	
		
			
				|  |  | +      return opt.value === formData.gdeviceid;
 | 
	
		
			
				|  |  | +    }) as Record<string, unknown>;
 | 
	
		
			
				|  |  | +    const code = (deviceInfo.value.deviceType || props.deviceCode.concat('*')) as string;
 | 
	
		
			
				|  |  | +    await fetchData(formData, code, deviceInfo.value);
 | 
	
		
			
				|  |  | +    updateColumns(formData.deviceNum);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  onMounted(async () => {
 | 
	
		
			
				|  |  | +    await fetchDevice();
 | 
	
		
			
				|  |  | +    initTable([deviceInfo.value.deviceType as string, props.deviceCode.concat('_history')], deviceOptions.value);
 | 
	
		
			
				|  |  |      search();
 | 
	
		
			
				|  |  |    });
 | 
	
		
			
				|  |  |  </script>
 |