import { DictCode } from '@/constants';
import type { IconfontIcon } from '@/icons/fonts/iconfont';

import type { Component, ComponentPublicInstance } from 'vue';
import type { StepProps, UploadProps } from 'ant-design-vue';
import type { Rule, RuleObject } from 'ant-design-vue/es/form';
import type { FormLabelAlign } from 'ant-design-vue/es/form/interface';
import type { Dayjs } from 'dayjs';
import type {
  CoolingDataType,
  CtrlCabinetStartType,
  DeviceRunningStatus,
  ProtocolConfigMethod,
  TimeScaleType,
  VisualModuleType,
} from '@/constants';

export interface ApiResponse<T> {
  data: T;
  code: number;
  msg: string;
}

export interface PageData<T> {
  records: T[];
  total: number;
  pageIndex: number;
  pageSize: number;
  pageNum: number;
}

export interface PageParams {
  pageIndex: number;
  pageSize: number;
  pageSorts?: PageSorts[];
}

export interface PageSorts {
  column: string;
  asc: boolean;
}

export interface OptionItem<T> {
  value: T;
  label: string;
}

export type CheckedType = boolean | string | number;

export interface IconObject {
  name: IconfontIcon;
  size?: number;
  color?: string;
}

export interface IframeMsg {
  msgType: string;
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
  [key: string]: any;
}

export type FormRules<T> = {
  [K in keyof T]?: Rule[];
} & {
  [key: string]: Rule[];
};

export type RuleValidator<T> = (rule: RuleObject, value: T, callback: (error?: string) => void) => Promise<void>;

export type RangeValue = [Dayjs, Dayjs];

export interface DictTypeDataParams {
  id?: number;
  dictCode?: DictCode;
}

export interface DictTypeData {
  dictId: number;
  dictCode: string;
  dictName: string;
  dictEngName: string;
  dictOrderNum: number | null;
  dictTypeDataList: DictValue[];
}

export interface DictValue {
  dictValueId: number;
  dictValue: string;
  dictEngValue: string;
  dictValueOrderNum: number;
  isDefault: boolean | null;
}

export interface TabComponent {
  key: string;
  name: string;
  component: Component;
}

export interface DevGroupTabCompProps {
  deviceGroupId: number;
}

export interface UseGuideStepItem extends StepProps {
  title: string;
  stepTitle?: string;
  stepDescription?: string;
  hideHeader?: boolean;
  hideHeaderDivider?: boolean;
  headerMargin?: number;
  component: Component;
  contentOffset?: number;
  formLayout?: 'horizontal' | 'vertical' | 'inline';
  labelAlign?: FormLabelAlign;
  labelCol?: { span?: string | number };
  wrapperCol?: { span?: string | number };
  isLastStep?: boolean;
  exportButtonShow?: boolean;
  prevStepButtonHide?: boolean;
  nextStepButtonHide?: boolean;
  nextStepButtonText?: string;
  nextStepButtonDisabled?: boolean;
}

export interface UseGuideStepItemProps<T> {
  form: T;
  steps: UseGuideStepItem[];
  stepIndex: number;
  goToStep: (index: number) => void;
}

export type UseGuideStepItemExpose = {
  exportData?: () => void | Promise<void>;
  /**
   * 在当前步骤点击返回时预先执行某些操作
   * @returns 是否已经返回之前的步骤
   */
  goBack?: () => boolean | Promise<boolean>;
  finish?: () => void | Promise<void>;
};

export type UseGuideStepItemInstance = ComponentPublicInstance<unknown, UseGuideStepItemExpose>;

export interface SetupProtocolForm {
  protocolType?: string;
  protocolInfo: Partial<ProtocolBaseInfo>;
  protocolFile: UploadProps['fileList'];
  configMethod: ProtocolConfigMethod;
  deviceType?: string;
}

export interface CustomParamsForm {
  gatewayParamName: string;
  gatewayParamCode: string;
  unit: string;
  module: string;
  readWriteType: string;
  parsingType: string;
  writeFunctionCode: string;
  readFunctionCode: string;
  addressLength: number;
  registerAddress: number;
  coefficient: number;
  isHighFrequencyParameter: string;
  readCalculationFormula: string;
  writeCalculationFormula: string;
  decimalPlaces: number;
  contiguousAddressingRange: number;
}

export type ProtocolListData = PageData<ProtocolBaseInfo>;

export interface ProtocolBaseInfo {
  id: number;
  protocolName: string;
  protocolType: string;
  deviceType: string;
  deviceTypeId: number | null;
  dataBit: 5 | 6 | 7 | 8;
  parityBit: 'N' | 'O' | 'E';
  stopBit: '1' | '1.5' | '2';
  baudRate: number;
  dataSendInterval: number;
  highFreqSendInterval: number;
  readTimeout: number;
  nextDataReadDelay: number;
  nextRoundDataReadDelay: number;
  readContinuousAddr: string;
  readContinuousAddrCode: number;
  readContinuousAddrLength: number;
  byteOrder: string;
  byteOrderCode: string;
  addrOrder: string;
  addrOrderCode: string;
}

export interface ProtocolListQuery extends PageParams {
  searchContent: string;
  isDraft: 0 | 1;
}

export type ProtocolParamData = PageData<ProtocolParamInfo>;

export interface ProtocolParamInfo {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  baseInfoId: number;
  platformParamCode: string;
  platformParamName: string;
  gatewayParamCode: string;
  gatewayParamName: string;
  gatewayParamExt: string | null;
  paramCode: string;
  paramName: string;
  unit: string;
  module: string;
  groupType: string;
  readWriteType: string;
  readWriteTypeCode: string;
  readFuncCode: string;
  writeFuncCode: string;
  registerAddr: string;
  addrNumber: string;
  registerType: string;
  registerTypeCode: string;
  parsingType: string;
  parsingTypeCode: string;
  addrLength: number;
  wordLength: number;
  wordLengthCode: string;
  quantity: number;
  coefficient: number;
  isHighFreqParam: string;
  isHighFreqParamCode: string;
  readCalcFormula: string;
  writeCalcFormula: string;
  decimalPlace: number;
  recognizeResult: string | null;
  candidateResults: string | null;
  platformProtocolInfoId?: number;
  bitAddress1: string;
  bitAddress1Status: string;
  bitAddress1Detail: string;
  bitAddress2: string;
  bitAddress2Status: string;
  bitAddress2Detail: string;
  bitAddress3: string;
  bitAddress3Status: string;
  bitAddress3Detail: string;
  [key: string]: unknown;
}

export interface ProtocolCandidateResult {
  platformProtocolId: number;
  platformProtocolGatewayParamName: string;
}

export interface ProtocolParamSearchParams extends PageParams {
  baseInfoId: number;
  paramCode?: string;
  paramName?: string;
  recognizeResult?: string[];
}

export type ProtocolStandardParamData = PageData<ProtocolStandardParam>;

export interface ProtocolStandardParam {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  platformParamCode: string;
  platformParamName: string;
  gatewayParamCode: string;
  gatewayParamName: string;
  unit: string;
  module: string;
  deviceTypeId: number;
  deviceType: string;
  enabled: number;
  [key: string]: unknown;
}

export interface ProtocolStandardParamQuery extends PageParams {
  platformParamCode?: string;
  platformParamName?: string;
  templateType?: string;
}

export interface RegisterGatewayForm extends EquipmentInformation {
  snCode: string;
  password: string;
  modelId: number;
  linkType: string;
  id: number;
  interfaceId?: number;
  protocolId?: number;
  linkName: string;
  protocolName: string;
}

export interface VerificationEquipment {
  snCode: string;
  password: string;
}

export interface GatewayInformation {
  createTime: string;
  createUserId: string;
  deleted: number;
  id: number;
  isRegister: number;
  modelId: number;
  password: string;
  snCode: string;
  state: number;
  updateTime: string;
  updateUserId: number;
}

export interface GatewayModelInfo {
  createTime: string;
  createUserId: string;
  deleted: number;
  docUrl: string;
  iconUrl: string;
  id: number;
  interfaceId: string;
  interfaceNum: string;
  modelName: string;
  surfMode: string;
  surfModeEn: string;
  updateTime: string;
  updateUserId: string;
}

export interface InterfaceNum {
  COM: number;
  DI: number;
  DO: number;
  LAN: number;
  WAN: number;
}

export interface EquipmentInformation {
  state: number;
  docUrl: string;
  iconUrl: string;
  interfaceNum: string;
  modelName: string;
  surfMode: string | string[];
  surfModeEn: string | string[];
  show: boolean;
  judgmentRegistration: boolean;
}

export interface GatewayInterface {
  comment: string;
  createTime: string;
  createUserId: string;
  deleted: number;
  dictCode: string;
  dictEngValue: string;
  dictValue: string;
  enabled: number;
  id: number;
  isDefault: string;
  orderNum: number;
  tag: string;
  updateTime: string;
  updateUserId: string;
}

export interface AddInterface {
  interfaceId?: number;
  linkName: string;
  gatewayId: number;
  protocolType: string;
}

export interface InterfaceList {
  value: string;
  label: string;
}

export interface InterfaceData {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  linkName: string;
  gatewayId: number;
  interfaceId: number;
  protocolType: string;
  bindState: number;
  dataBit: number;
  parityBit: string;
  stopBit: string;
  baudRate: number;
  readTimeout: number;
  nextDataReadDelay: number;
  nextRoundDataReadDelay: number;
  interfaceType: string;
}

export interface AgreementUpdate {
  id: number;
  linkName: string;
  gatewayId: number;
  interfaceId: number;
  bindState: number;
  dataBit: string;
  parityBit: string;
  stopBit: string;
  baudRate?: string;
  readTimeout: number;
  nextDataReadDelay: number;
  nextRoundDataReadDelay: number;
  protocolType?: string;
}

export interface AgreementData {
  protocolType: string;
  station: string;
  name: string;
  protocolName: string;
  dataSendInterval: number;
  highFreqSendInterval: number;
  protocolId?: number;
  isStandard: string;
  deviceName: string;
}

export interface AgreementForm {
  baudRate?: string;
  dataBit: string;
  parityBit: string;
  stopBit: string;
  readTimeout: number;
  nextDataReadDelay: number;
  nextRoundDataReadDelay: number;
}

export interface EquipmentGroup {
  pageIndex: number;
  pageSize: number;
  content: string;
}

export interface DeviceGroupItem {
  id: number;
  createTime: Date | null;
  updateTime: Date | null;
  createUserId: number | null;
  updateUserId: number | null;
  groupName: string;
  comment: string | null;
  parentId: number;
  userId: number;
  deleted: boolean | null;
  deviceGroupChilds: DeviceGroupChild[];
}

export interface DeviceGroupChild {
  id: number;
  groupName: string;
  comment: string | null;
  parentId: number;
  userId: number;
}

export interface DeviceGroupTree extends DeviceGroupItem {
  label: string;
  children: DeviceGroupTreeChild[];
}

export interface DeviceGroupTreeChild extends DeviceGroupChild {
  label: string;
  children: (AllDevicesList & { label: string })[];
}

export interface ListInfo {
  dataType: number;
}

export interface ProtocolList {
  pageIndex: number;
  pageSize: number;
  searchContent: string;
  protocolType: string;
}

export interface EquipmentDetailsForm {
  id?: number;
  deviceName: string;
  groupId?: number;
  deviceType?: number;
  brand?: string;
  model?: string;
  productionDate: string;
  deviceDetail: string;
}

export interface EquipmentInformationForm {
  groupId: number;
  deviceData: number[];
  deviceType?: number;
  deviceName: string;
  brand?: string;
  model?: string;
  chillerType?: string;
  productionDate?: Dayjs;
  powerRating: string;
  refrigerantType?: string;
  refrigerantDosage?: string;
  nominalCoolingcapacity?: string;
  nominalcalorificvalue?: string;
  nominalCopRefrigeration?: string;
  nominalCopHeating?: string;
  chilledWaterRatedFlow?: string;
  coolingWaterRatedFlow?: string;
  motorCoolingMethod?: string;
  copCorrectionFactor?: string;
  numberUnitCircuits?: string;
  singleLoopCompressor?: string;
  frequencyConversion?: string;
  ratedVoltage?: string;
  inflowTemperature?: string;
  waterOutletTemperature?: string;
  relativeHumidityTemperature?: string;
  fanNumber?: string;
  waterFlowRate?: string;
  coolingCapacity?: string;
  inletPipeDiameter?: string;
  outletPipeDiameter?: string;
  ratedFlow?: string;
  ratedHead?: string;
  ratedCurrent?: string;
  revolutions?: string;
  status: string;
  remarks: string;
  devId: number;
  imgUrl: string;
  id?: number;
}

export interface EquipmentTypeItem {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  dataType: number;
  dataName: string;
}

export type ProtocolItemData = PageData<ProtocolItem>;
export interface ProtocolItem {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  protocolName: string;
  protocolType: string;
  deviceTypeId: number | null;
  deviceType: string;
  dataBit: number;
  parityBit: string;
  stopBit: string;
  baudRate: number;
  dataSendInterval: number;
  highFreqSendInterval: number;
  readTimeout: number | null;
  nextDataReadDelay: number;
  nextRoundDataReadDelay: number;
  addrOrder: string;
  addrOrderCode: string;
  byteOrder: string;
  byteOrderCode: string;
  attachment: string;
  readContinuousAddr: string;
  readContinuousAddrCode: number;
  readContinuousAddrLength: number;
}

export interface ProtocolsItem {
  /*协议ID */
  protocolId?: number;

  /*从站号 */
  station: string;

  /*是否平台标准协议 */
  isStandard: string;

  /*普通数据上报频率 */
  dataSendInterval: number;

  /*高频发送间隔 */
  highFreqSendInterval: number;
}
export interface ProtocolReset {
  linkId: number;
  protocols: ProtocolsItem[];
}

export interface VerificationAgreement {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  linkId: number;
  protocolId: number;
  station: number;
  isStandard: number;
  dataSendInterval: number;
  highFreqSendInterval: number;
  protocolName: string;
  protocolType: string;
  deviceName: string;
}

export interface ProtocolListItem {
  pageIndex: number;
  pageSize: number;
  id?: number;
  linkId?: number;
  readWriteTypeCode?: string;
  monitorType?: string;
  searchContent?: string;
}

export type ProtocolListPageItemData = PageData<ProtocolListPageItem>;
export interface ProtocolListPageItem {
  id: number;
  createTime: string | null;
  updateTime: string | null;
  createUserId: number | null;
  updateUserId: number | null;
  baseInfoId: number | null;
  platformParamCode: string | null;
  platformParamName: string | null;
  gatewayParamCode: string;
  gatewayParamName: string;
  paramCode: string;
  paramName: string;
  unit: string | null;
  module: number;
  readWriteType: string | null;
  readWriteTypeCode: string | null;
  readFuncCode: string | null;
  writeFuncCode: string | null;
  registerAddr: string | null;
  addrNumber: number | null;
  registerType: string | null;
  registerTypeCode: string | null;
  parsingType: string | null;
  parsingTypeCode: string | null;
  addrLength: number | null;
  wordLength: number | null;
  wordLengthCode: string | null;
  quantity: number | null;
  coefficient: number;
  isHighFreqParam: boolean | null;
  isHighFreqParamCode: string | null;
  readCalcFormula: string | null;
  writeCalcFormula: string | null;
  decimalPlace: number | null;
}

export type SerialNumberItemData = PageData<SerialNumberItem>;
export interface SerialNumberItem {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  snCode: string;
  password: string;
  modelId: number;
  isRegister: number;
  state: number;
  deleted: number;
  modelName: string;
  links: PhysicalInterfaceList[];
}

export interface PhysicalInterfaceList {
  linkId: number;
  linkName: string;
  groups: GroupItem[];
}

export interface GroupItem {
  id: number;
  linkName: string;
  station: number;
  protocolId: number;
  protocolName: string;
  group: string;
}

export type ListEquipmentParametersItemData = PageData<ListEquipmentParametersItem>;

export interface ListEquipmentParametersItem {
  gatewayParamCode: string;
  gatewayParamName: string;
  id: number;
  parsingType?: number;
  readWriteType?: string;
  readWriteTypeCode?: string;
  unit: string;
  groupId?: number;
  groupSerialNum?: number;
  groupParamSerialNum?: number;
  isProcessData: boolean;
  gatewayId: number;
  deviceParamCode: string;
  deviceParamName: string;
  groupName: string;
  groupIdShow: boolean;
  linkId: number;
  gatewayLinkProtocolId: number;
}

export interface GatewayDataItem extends ListEquipmentParametersItem {
  id: number;
  platformParamCode: string;
  platformParamName: string;
  gatewayParamCode: string;
  gatewayParamName: string;
  unit: string;
  readWriteType: string;
  readWriteTypeCode: string;
  parsingType?: number;
  paramGroupName: string;
}

export interface EquipmentUpdateForm {
  deviceId: number;
  gatewayId: number;
  gatewayProtocolId: number;
  linkId?: number;
}

export interface GetListItem {
  deviceId: number;
  monitorType: string;
  pageIndex: number;
  pageSize: number;
  gatewayId?: number;
  createUserId?: number;
}

export interface PostProtocolPage {
  pageIndex: number;
  pageSize: number;
  deviceIds: number[];
  gatewayIds: number[];
}

export type PostProtocolPageItemData = PageData<PostProtocolPageItem>;
export interface PostProtocolPageItem {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  baseInfoId: number;
  platformParamCode?: string;
  platformParamName?: string;
  gatewayParamCode?: string;
  gatewayParamName?: string;
  paramCode: string;
  paramName: string;
  unit?: string;
  module: string;
  readWriteType: string;
  readWriteTypeCode: string;
  readFuncCode: string;
  writeFuncCode?: string;
  registerAddr: string;
  addrNumber?: string;
  registerType: string;
  registerTypeCode?: string;
  parsingType: string;
  parsingTypeCode: string;
  addrLength: number;
  wordLength?: string;
  wordLengthCode?: string;
  quantity?: string;
  coefficient: number;
  isHighFreqParam: string;
  isHighFreqParamCode: string;
  readCalcFormula?: string;
  writeCalcFormula?: string;
  decimalPlace?: number;
  deviceName: string;
  deviceNum: string;
  groupSerialNum: number;
  groupParamSerialNum: number;
  deviceId: number;
  isProcessData: boolean;
  gatewayId: number;
  deviceParamCode: string;
  deviceParamName: string;
  groupId?: number;
  deviceParamCodeShow: boolean;
  deviceParamNameShow: boolean;
  groupIdShow: boolean;
  groupParamSerialNumShow: boolean;
}

export interface ProtocolGatewayListListItem {
  pageIndex: number;
  pageSize: number;
  snCode?: number;
  gatewayId?: number;
  searchContent: string;
  monitorType: string;
}

export interface ParameterVerification {
  id: number;
  deviceParamGroupName: string;
  valueVos: ParameterVerificationList[];
}

export interface ParameterVerificationList {
  baseInfoId: number;
  platformParamCode: string;
  platformParamName: string;
  gatewayParamCode: string;
  gatewayParamName: string;
  paramCode: string;
  paramName: string;
  unit: string;
  module: string;
  readWriteType: string;
  readWriteTypeCode: string;
  readFuncCode: string;
  writeFuncCode: string;
  registerAddr: string;
  addrNumber: string;
  registerType: string;
  registerTypeCode: string;
  parsingType: string;
  parsingTypeCode: string;
  addrLength: number;
  wordLength: string;
  wordLengthCode: string;
  quantity: number;
  coefficient: number;
  isHighFreqParam: string;
  isHighFreqParamCode: string;
  readCalcFormula: string;
  writeCalcFormula: string;
  decimalPlace: number;
  valueId: number;
  value: number | string;
}

export interface GroupingList {
  groupName: string;
  serialNum?: number;
  id: number;
}

export interface GroupingListData {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  groupName: string;
  deviceId: number;
  serialNum: number;
}

export interface DevicesList {
  pageIndex: number;
  pageSize: number;
  groupId?: number;
  deviceType?: number;
  searchContent?: string;
  brandName?: string;
  modelName?: string;
  gatewaySnCode?: string;
  deviceName?: string;
  runningStatus?: number;
  runningStatusList?: DeviceRunningStatus[] | null;
  status?: number | null;
  errorStatus?: number;
}

export interface ListInterfaces {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  modelId: number;
  interfaceType: string;
  name: string;
}

export interface ListPhysicalInterfaces {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  interfaceId: number;
  protocolName: string;
  orderNum: number;
}

export interface CustomizationData {
  deviceParamCode: string;
  paramNumShow: boolean;
  deviceParamName: string;
  paramNameShow: boolean;
  customFormula: string;
  customFormulaShow: boolean;
  unit: string;
  unitShow: boolean;
  decimalDigits?: number;
  decimalDigitsShow: boolean;
  paramGroupId?: number;
  paramGroupName: string;
  paramGroupIdShow: boolean;
  groupSerialNum?: number;
  groupSerialNumShow: boolean;
  groupParamSerialNum?: number;
  isProcessData: boolean;
}

export interface CustomParameters {
  customFormula: string;
  unit: string;
  decimalDigits?: number;
  deviceId: number;
  isProcessData: boolean;
  paramGroupId?: number;
  groupParamSerialNum?: number;
  paramType?: number;
  deviceParamCode: string;
  deviceParamName: string;
  paramGroupName: string;
}

export interface SubmitSorting {
  protocolParamId?: number;
  paramGroupId?: number;
  serialNum?: number;
  paramType?: number;
  isProcessData?: boolean;
  deviceParamName?: string;
  deviceParamCode?: string;
  groupId?: number;
}

export type DevicesListItemData = PageData<DevicesListItem>;
export interface DevicesListItem {
  id: number;
  deviceName: string;
  deviceDetail: string;
  groupId: number;
  deviceType: number;
  userId: number;
  brand: number;
  model: number;
  modelType: number;
  controlType: number;
  compressionLevel: number;
  voltageLevel: number;
  powerRating: number;
  powerUnload: number;
  maximumFlow: number;
  pressure: number;
  pressureMax: number;
  productionDate: string;
  productionNum: string;
  mainTechData: string;
  mountedPosition: string;
  department: string;
  respPerson: string;
  phone: string;
  serviceLife: number;
  status: number;
  runningStatus: number;
  remarks: string;
  deviceNum: string;
  deleted: boolean;
  deviceGroup: DeviceGroup;
  gatewayInfos: GatewayInfos[];
  protocolParamInfos: ProtocolParamInfos[];
  groupName: string;
  deviceTypeName: string;
  brandName: string;
  modelName: string;
  modelTypeName: string;
  controlTypeName: string;
  compressionLevelName: string;
  voltageLevelName: string;
  enableCopSet: boolean;
}

export interface DeviceGroup {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  groupName: string;
  comment: string;
  parentId: number;
  userId: number;
  deleted: string;
  orgId: number;
}

export interface SubmitDeviceGroup {
  id?: number;
  groupName: string;
  parentId?: number;
}

export interface DeviceParamGroup {
  id: number;
  deviceParamGroupName: string;
  valueVos: DeviceParamItem[];
}

export interface DeviceParamItem {
  value: string;
  valueId: number;
  serialNum: number | null;
  paramName: string;
  unit: string | null;
  time: string;
  deviceParamName: string;
  deviceParamCode: string;
}

export interface DeviceTypeCount {
  deviceType: number;
  deviceTypeName: string;
  count: number;
}

export interface DevWorkCardProps<T extends string> {
  realTimeData?: Partial<Record<T, number | string>>;
  deviceDetail: Partial<Record<string, number>>;
  enableCopSet: boolean;
}

export interface DevWorkRTDQuery {
  deviceType: number;
  deviceIds: number[];
  deviceParamCode: string[];
  endTime: string;
}

export interface DevWorkRealTimeData {
  deviceId: number;
  deviceParamMapList: {
    time: string;
    [key: string]: string | number;
  }[];
  flushTime: string | null;
}

export interface DevWorkHisDataQuery {
  deviceIds: number[];
  deviceParamCode: string[];
  startTime?: string;
  endTime?: string;
}

export interface DevWorkHistoryData {
  deviceId: number;
  hisVOS: DevWorkHistoryDataItem[];
}

export interface DevWorkHistoryDataItem {
  deviceParamCode: string;
  deviceParamName: string;
  unit: string;
  value: {
    time: string;
    value: string | number;
  }[];
}

export interface GatewayInfos {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  snCode: string;
  password: string;
  modelId: number;
  isRegister: string;
  state: string;
  deleted: string;
}

export interface ProtocolParamInfos {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  baseInfoId: number;
  orgId: number;
  recognizeResult: string;
  candidateResults: string;
  platformParamCode: string;
  platformParamName: string;
  gatewayParamCode: string;
  gatewayParamName: string;
  paramCode: string;
  paramName: string;
  unit: string;
  module: string;
  readWriteType: string;
  readWriteTypeCode: string;
  readFuncCode: string;
  writeFuncCode: string;
  registerAddr: string;
  addrNumber: string;
  registerType: string;
  registerTypeCode: string;
  parsingType: string;
  parsingTypeCode: string;
  addrLength: number;
  wordLength: string;
  wordLengthCode: string;
  quantity: number;
  coefficient: number;
  isHighFreqParam: string;
  isHighFreqParamCode: string;
  readCalcFormula: string;
  writeCalcFormula: string;
  decimalPlace: number;
  isDraft: string;
}

export interface GatewayBody {
  pageIndex: number;
  pageSize: number;
  searchContent: string;
  state: number;
}

export type GatewayListItemData = PageData<GatewayListItem>;
export interface GatewayListItem {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  snCode: string;
  password: string;
  modelId: number;
  isRegister: string;
  state: string;
  deleted: string;
  modelName: string;
  protocolParamInfoQueryVos: protocolParamInfo[];
}

export interface protocolParamInfo {
  baseInfoId: number;
  orgId: number;
  recognizeResult: string;
  candidateResults: string;
  platformParamCode: string;
  platformParamName: string;
  gatewayParamCode: string;
  gatewayParamName: string;
  paramCode: string;
  paramName: string;
  unit: string;
  module: string;
  readWriteType: string;
  readWriteTypeCode: string;
  readFuncCode: string;
  writeFuncCode: string;
  registerAddr: string;
  addrNumber: string;
  registerType: string;
  registerTypeCode: string;
  parsingType: string;
  parsingTypeCode: string;
  addrLength: number;
  wordLength: string;
  wordLengthCode: string;
  quantity: number;
  coefficient: number;
  isHighFreqParam: string;
  isHighFreqParamCode: string;
  readCalcFormula: string;
  writeCalcFormula: string;
  decimalPlace: number;
  isDraft: string;
}

export interface GatewayParameterBody {
  pageIndex: number;
  pageSize: number;
  gatewayId: number;
  gatewayLinkProtocolId: number;
}

export type GatewayParameterItemData = PageData<GatewayParameterItem>;
export interface GatewayParameterItem {
  id: number;
  paramName: string;
  paramCode: string;
  gatewayParamName: string;
  gatewayParamCode: string;
  unit: string;
  readWriteType: string;
  readWriteTypeCode: string;
  value: string | number;
  time: string;
  monitorStatus: string;
}

export interface EquipmentDetailsItem {
  deviceQueryVo: BasicInformation;
  gatewayInfoVos: AssociatedGatewayParameters[];
  protocolParamDeviceInfoVos: ConfigureDeviceParameters[];
  protocolParamCustomDevVos: CustomParametersItem[];
}

export interface AssociatedGatewayParameters {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  snCode: string;
  password: string;
  modelId: number;
  isRegister: string;
  state: string;
  deleted: string;
  modelName: string;
  linkName: string;
  linkId: number;
  gatewayLinkProtocolId: number;
  protocolParamInfoQueryVos: protocolParamInfo[];
}

export interface BasicInformation {
  id: number;
  deviceName: string;
  groupId: number;
  deviceType: number;
  userId: number;
  brand: number;
  model: number;
  modelType: number;
  controlType: number;
  compressionLevel: number;
  voltageLevel: number;
  powerRating: number;
  powerUnload: number;
  maximumFlow: number;
  pressure: number;
  pressureMax: number;
  productionDate: string;
  productionNum: string;
  mainTechData: string;
  mountedPosition: string;
  department: string;
  respPerson: string;
  phone: string;
  serviceLife: number;
  status: number;
  remarks: string;
  deviceNum: string;
  runningStatus: number;
  deleted: boolean;
  deviceGroup: DeviceGroup;
  gatewayInfos: GatewayInfos[];
  protocolParamInfos: ProtocolParamInfos[];
  groupName: string;
  deviceTypeName: string;
  brandName: string;
  modelName: string;
  modelTypeName: string;
  controlTypeName: string;
  compressionLevelName: string;
  voltageLevelName: string;
  errorStatus: number;
  deviceDetail: string;
  imgUrl: string;
  mainGroupId: number;
  mainGroupName: string;
}

export interface ConfigureDeviceParameters {
  baseInfoId: number;
  orgId: number;
  recognizeResult: string;
  candidateResults: string;
  platformParamCode: string;
  platformParamName: string;
  gatewayParamCode: string;
  gatewayParamName: string;
  paramCode: string;
  paramName: string;
  unit: string;
  module: string;
  readWriteType: string;
  readWriteTypeCode: string;
  readFuncCode: string;
  writeFuncCode: string;
  registerAddr: string;
  addrNumber: string;
  registerType: string;
  registerTypeCode: string;
  parsingType: string;
  parsingTypeCode: string;
  addrLength: number;
  wordLength: string;
  wordLengthCode: string;
  quantity: number;
  coefficient: number;
  isHighFreqParam: string;
  isHighFreqParamCode: string;
  readCalcFormula: string;
  writeCalcFormula: string;
  decimalPlace: number;
  isDraft: string;
  id: number;
  deviceParamCode: string;
  deviceParamName: string;
  isProcessData: number;
  gatewayId: string;
  groupSerialNum: number;
  groupParamSerialNum: number;
  groupId: number;
  snCode: string;
  serialNum: number;
  groupName: string;
  linkId: string;
  gatewayLinkProtocolId: number;
}

export interface CustomParametersItem {
  id: number;
  customFormula: string;
  unit: string;
  decimalDigits: number;
  deviceId: number;
  serialNum: number;
  isProcessData: boolean;
  groupSerialNum: number;
  groupParamSerialNum: number;
  deviceParamCode: string;
  deviceParamName: string;
  groupName: string;
}

export interface AllDevicesList {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  deviceName: string;
  groupId: number;
  deviceType: number;
  userId: number;
  brand: number;
  model: number;
  modelType: number;
  controlType: number;
  compressionLevel: number;
  voltageLevel: number;
  powerRating: number;
  powerUnload: number;
  maximumFlow: number;
  pressure: number;
  pressureMax: number;
  productionDate: string;
  productionNum: string;
  mainTechData: string;
  mountedPosition: string;
  department: string;
  respPerson: string;
  phone: string;
  serviceLife: number;
  status: number;
  remarks: string;
  deleted: number;
  deviceNum: string;
  runningStatus: string;
}

export interface GatewayQuery extends PageParams {
  searchContent: string;
  state: number;
  total: number;
}

export interface GatewayLinkProtocolQuery {
  linkId: number;
  monitorType: string;
  searchContent: string;
  linkProtocolId: number;
}

export interface DeviceBindQuery {
  deviceParamGroups: DeviceParamGroups[];
  deviceGateways: DeviceGateways[];
  deviceParamGroupRels: DeviceParamGroupRels[];
  protocolParamCustomDevDTOS: CustomParameters[];
}

export interface DeviceParamGroups {
  groupName: string;
  deviceId: number;
  serialNum?: number;
}

export interface DeviceGateways {
  deviceId: number;
  gatewayId: number;
  gatewayProtocolId: number;
  linkId: number;
  gatewayLinkProtocolId: number;
}

export interface DeviceParamGroupRels {
  deviceId: number;
  protocolParamId: number;
  paramGroupName: string;
  paramType: number;
  deviceParamCode: string;
  deviceParamName: string;
  isProcessData: boolean;
  unit: string;
  gatewayId: number;
  gatewayLinkProtocolId: number;
}

export interface ParamValueListAutomaticQuery {
  linkId: number;
  deviceTypeId: number;
  deviceId: number;
  linkProtocolId: number;
}

export interface ParamValueListAutomaticData {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  baseInfoId: number;
  orgId: number;
  recognizeResult: string;
  candidateResults: string;
  platformParamCode: string;
  platformParamName: string;
  gatewayParamCode: string;
  gatewayParamName: string;
  paramCode: string;
  paramName: string;
  unit: string;
  module: string;
  readWriteType: string;
  readWriteTypeCode: string;
  readFuncCode: string;
  writeFuncCode: string;
  registerAddr: string;
  addrNumber: string;
  registerType: string;
  registerTypeCode: string;
  parsingType: string;
  parsingTypeCode: string;
  addrLength: number;
  wordLength: string;
  wordLengthCode: string;
  quantity: number;
  coefficient: number;
  isHighFreqParam: string;
  isHighFreqParamCode: string;
  readCalcFormula: string;
  writeCalcFormula: string;
  decimalPlace: number;
  isDraft: string;
}

export interface BatchUpdate {
  link: LinkType;
  protocols: VerificationAgreement[];
}

export interface LinkType {
  id: number;
  createTime?: string;
  updateTime?: string;
  createUserId?: number;
  updateUserId?: number;
  linkName: string;
  gatewayId: number;
  interfaceId: number;
  protocolType: string;
  bindState: number;
  dataBit: number;
  parityBit: string;
  stopBit: string;
  baudRate: number;
  readTimeout: number;
  nextDataReadDelay: number;
  nextRoundDataReadDelay: number;
}

export interface LinkProtocolType {
  id: number;
  createTime?: string;
  updateTime?: string;
  createUserId?: number;
  updateUserId?: number;
  linkId: number;
  protocolId: number;
  station: number;
  isStandard: string;
  dataSendInterval: number;
  highFreqSendInterval: number;
  deviceId?: number;
}

export interface DeviceGroupListQuery {
  userId?: number;
  orgId?: number;
  parentId: number;
  haveChild?: boolean;
}

export interface MonitoringForm {
  id?: number;
  name: string;
  tempHumidityControlMode: string;
  regionId?: number;
  returnDevGroupId?: number;
  returnDevId?: number;
  returnTempParamCode?: string;
  returnHumidityParamCode?: string;
  supplyDevGroupId?: number;
  supplyDevId?: number;
  supplyTempParamCode?: string;
  supplyHumidityParamCode?: string;
  outdoorDevGroupId?: number;
  outdoorDevId?: number;
  outdoorTempParamCode?: string;
  outdoorHumidityParamCode?: string;
  tempUpper?: number;
  tempLower?: number;
  tempPreset?: number;
  humidityUpper?: number;
  humidityLower?: number;
  humidityPreset?: number;
  runStatusFlag: number;
  supplyReturnTempDiff?: number;
  supplyUpperTempDiff?: number;
  runStatusDevGroupId?: number;
  runStatusDevId?: number;
  runStatusParamCode?: string;
  runStatusConditionCode?: string;
  runStatusConditionValue?: string;
}

export interface RegionQuery {
  id?: number;
  devGroupId: number;
  regionName?: string;
  canvas?: string;
}

export interface GroupRegions {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  orgId: number;
  devGroupId: number;
  regionName: string;
  canvas: string;
  outsideDevGroupId: number;
  outsideDevId: number;
  outsideDevName: string;
  outsideTempParamCode: string;
  outsideTempParamName: string;
  outsideTempParamUnit: string;
  outsideHumidityParamCode: string;
  outsideHumidityParamName: string;
  outsideHumidityParamUnit: string;
}

export interface DeviceParams {
  id: number;
  deviceParamCode: string;
  deviceParamName: string;
  unit: string;
}

export interface RegionsPointsItem {
  id: number;
  orgId: number;
  devGroupId: number;
  regionName: string;
  canvas: string;
  outsideDevGroupId: number;
  outsideDevId: number;
  outsideTempParamCode: string;
  outsideHumidityParamCode: string;
  outsideEnthalpyParamCode: string;
  outSideTemperature: string;
  outSideHumidity: string;
  outsideEnthalpy: string;
  avgTemperature: string;
  avgHumidity: string;
  points: MonitoringPointData[];
  name?: string;
}

export interface MonitoringPointData {
  id: number;
  name: string;
  status: number;
  temperature: string;
  humidity: string;
  tempUpper: number;
  tempLower: number;
  humidityUpper: number;
  humidityLower: number;
  tempData: CurvedData[];
  humidityData: CurvedData[];
  regionId: number;
  humidityExStatus: number;
  tempExStatus: number;
}

export interface CurvedData {
  time: string;
  value: number;
}

export interface MonitorPointInfo extends MonitoringForm {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  status: number;
  returnDevGroupId: number;
  supplyDevGroupId: number;
  returnDevId: number;
  supplyDevId: number;
  outdoorDevGroupId: number;
  outdoorDevId: number;
}

export interface RegionNameList {
  name: string;
  id: number;
}

export interface OutdooForm {
  regionId?: number;
  outsideDevGroupId?: number;
  outsideDevId?: number;
  outsideTempParamCode?: string;
  outsideHumidityParamCode?: string;
  outsideEnthalpyParamCode?: string;
}

export interface LimitForm {
  id?: number;
  regionId?: number;
  tempUpper?: number;
  tempLower?: number;
  tempPreset?: number;
  humidityUpper?: number;
  humidityLower?: number;
  humidityPreset?: number;
  batch: boolean;
  batchPointIds: string;
  batchIds?: number[];
}

export interface WarningItem {
  id?: number;
  pointId?: number;
  enabled: boolean;
  type: number;
  val?: number;
  duration?: number;
}

export interface MonitorPointItem extends WarningItem {
  createTime: string;
  updateTime: string;
  createUserId: string;
  updateUserId: string;
  orgId: number;
}

export interface PointTimeSeriesQuery {
  startTime: string;
  endTime: string;
}

export interface TempHumidityControlSettings {
  id: number;
  name: string;
  tempHumidityControlMode: number;
  tempPreset: number;
  humidityPreset: number;
  tempUpper: number;
  tempLower: number;
  humidityUpper: number;
  humidityLower: number;
  supplyTempData: HistoricalDataSequence[];
  supplyHumidityData: HistoricalDataSequence[];
  tempData: HistoricalDataSequence[];
  humidityData: HistoricalDataSequence[];
}

export interface HistoricalDataSequence {
  time: string;
  value: number;
}

export interface FormatterData {
  componentType: string;
  seriesType: string;
  seriesIndex: number;
  seriesName: string;
  name: string;
  dataIndex: number;
  data: number;
  value: number;
  color: string; // 系列颜色
  dimensionNames: string[];
  encode: object;
  marker: string;
}

export interface InterfaceLsit extends InterfaceData {
  protocols: VerificationAgreement[];
}

export interface AlarmForm {
  eventName: string;
  time: [Dayjs, Dayjs];
  conditionLogic: number;
  enabled: boolean;
}

export interface AlarmHistoryItem {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  pointId: number;
  regionId: number;
  status: number;
  tempExStatus: number;
  humidityExStatus: number;
  triggerTime: string;
  recoverTime: string;
}

export interface DataType {
  code: string;
  value: string;
}

export interface DataSelection {
  groupId?: number;
  childGroupId?: number;
  deviceId?: number;
  paramCode: string;
  paramName: string;
  deviceName?: string;
}

export interface AlarmItem extends DataSelection {
  id?: number;
  type: number;
  subType?: string;
}

export interface TriggerConditionItem extends AlarmItem {
  alarmAlgOperator?: string;
  alarmThreshold?: string;
  alarmDeviceState?: string;
  alarmScheduledTime?: Dayjs;
  alarmRepeatTime?: string;
}

export interface ExecutionAction extends AlarmItem {
  alarmAdjustmentValue?: string;
  alarmContact?: number;
  alarmAlertContent?: string;
  alarmWaitTime?: Dayjs;
  alarmNotifyMethod?: string;
}

export interface DataSelectionItem {
  groupId: number;
  childGroupId: number;
  deviceId: number;
  paramCode: string;
  parametersName: string;
  selectType: number;
  deviceName: string;
}

export interface AlarmEvent {
  id?: number;
  eventName: string;
  startTime: string;
  endTime: string;
  enabled: boolean;
  conditionLogic: boolean;
  triggerConditionList: AlarmEventItem[];
  judgmentConditionList: AlarmEventItem[];
  executionActionList: AlarmEventItem[];
}

export interface DataItem {
  code: string;
  value: string;
}
export interface AlarmEventItem extends AlarmItem {
  dataList: DataItem[];
}

export interface AlarmPageParams extends PageParams {
  searchContent: string;
}

export type EventTriggerData = PageData<EventTrigger>;
export interface EventTrigger {
  id: number;
  eventName: string;
  deviceName: string;
  triggerTimes: number;
  lastTriggerTime: string;
  updateTime: string;
  enabled: boolean;
}

export interface ChangeState {
  id: number;
  enabled: boolean;
}

export interface AlarmHistory extends PageParams {
  eventId: number;
}

export type AlarmEventHistoryItemData = PageData<AlarmEventHistoryItem>;
export interface AlarmEventHistoryItem {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  alarmEventId: number;
  type: number;
  errorMsg: string;
}

export interface EnergyCardItem {
  value: string | number;
  unit: string;
  description: string;
  icon: string;
  bgColor: string;
}

export interface CoolingEnergyCardItem extends EnergyCardItem {
  type: CoolingDataType;
}

export interface ElectricityStatisticsQuery {
  deviceId?: number | string;
  deviceGroupId: number;
  deviceTypes?: number[];
  startTime: string;
  endTime: string;
}

export interface ElectricityDeviceValue {
  deviceName: string;
  deviceId: number;
  time: string;
  bill: number;
  energy: number;
  dailyUse: number;
  ratio: number;
}

export interface ElectricityHisQueryVo {
  deviceType: string;
  deviceTypeName: string;
  groupName?: string | null;
  valueList: ElectricityDeviceValue[];
}

export interface ElectricityGroupQueryVo {
  deviceType: string;
  deviceTypeName: string;
  groupName?: string | null;
  valueList: ElectricityDeviceValue[];
  totalRatio: number;
  totalEnergy: number;
  totalEnergyW: number;
  totalBill: number;
  totalBillW: number;
  totalDailyUse: number;
}

export interface ElectricityStatisticsResult {
  cumulativeEnergy: number;
  cumulativeBill: number;
  ringGrowth: number;
  cumulativeDailyUse: number;
  hisQueryVos: ElectricityHisQueryVo[];
  groupQueryVos: ElectricityGroupQueryVo[];
  timeScaleType: TimeScaleType;
}

export interface CoolingRealTimeDataQuery {
  deviceGroupId: number;
  startTime: string;
  endTime: string;
}

export interface CoolingRealTimeDataResult {
  coolingStationEnergyEfficiency: number;
  coolingStationCoolingData: number;
  coolingStationOutputActivePower: number;
  coolingStationWaterFlow: number;
}

export interface CoolingHistoryDataQuery {
  deviceTypes: number[];
  deviceGroupId: number;
  startTime: string;
  endTime: string;
  type: CoolingDataType;
}

export interface CoolingHistoryDataResult {
  data: {
    deviceTypeName: string;
    data: {
      time: string;
      [key: string]: string | number;
    }[];
  }[];
  timeScale: TimeScaleType;
}

export interface CoolingStatisticsQuery {
  deviceGroupId: number;
  deviceTypes: number[];
  startTime: string;
  endTime: string;
}

export interface CoolingDeviceValue {
  bill: number;
  coolingData: number;
  coolingEfficiency: number;
  time: string;
}

export interface CoolingHisQueryVo {
  deviceType: number;
  deviceTypeName: string;
  groupName?: string | null;
  billRatio: number;
  billTotal: number;
  coolingEfficiencyTotal: number;
  valueList: CoolingDeviceValue[];
}

export interface CoolingStatisticsResult {
  timeScaleType: TimeScaleType;
  totalCoolingData: number;
  groupCoolingEfficiency: number;
  tempDataList: {
    temperature: number;
    time: string;
  }[];
  hisQueryVos: CoolingHisQueryVo[];
  hisCoolingDataVos: {
    time: string;
    valueList: Omit<CoolingDeviceValue, 'time'>[];
  }[];
  coolingStationDataVos: {
    time: string;
    coolingEfficiencyTotal: number;
    valueList: Omit<CoolingDeviceValue, 'time'>[];
  }[];
  deviceTypeCoolingEfficiencyVos: {
    deviceType: number;
    deviceTypeName: string;
    coolingEfficiencyTotal: number;
  }[];
}
export interface AutomaticMatching {
  autoVos: AutomaticMatchingItem[];
  paramGroupNames: string[];
}

export interface AutomaticMatchingItem {
  id: number;
  baseInfoId: number;
  orgId: number;
  platformParamCode: string;
  platformParamName: string;
  gatewayParamCode: string;
  gatewayParamName: string;
  gatewayParamExt: string;
  paramCode: string;
  paramName: string;
  unit: string;
  paramGroupName: string;
  readWriteTypeCode: string;
}

export interface TemperatureRange {
  time?: [Dayjs, Dayjs];
  lower: number;
  upper: number;
}

export interface TemperatureRangeItem {
  startTime: string;
  endTime: string;
  lower: number;
  upper: number;
}

export interface ChillersItem {
  id?: number;
  createTime?: string;
  updateTime?: string;
  createUserId?: number;
  updateUserId?: number;
  algId?: number;
  devId?: number;
  waterTempControlMode: number | string;
  continuous: number | string;
  stopCompensate: number;
  restartCompensate: number;
  safeDiffPressureLower: number;
  safeLoadLower: number;
  waterTempStep: number | string;
  deviceName?: string;
}

export interface AlgorithmForm {
  id?: number;
  devGroupId?: number;
  enabled: boolean;
  sendCtrlCmd: boolean;
  msgBox: boolean;
  tempRiseCtrlPeriod: number;
  tempReductionCtrlPeriod: number;
  minCtrlStep: string | number;
  intelligentMode: number;
  controlBasis: number;
  period: number;
  tempSafetyMargin: number;
  humiditySafetyMargin: number;
  tempHumidityCollectPeriod: string | number;
  waterSupplyTempSource: number;
  analysis: boolean;
  analysisType: number;
  enableRefrigerationPipeDynamicSet: boolean;
  enableCoolingPipeDynamicSet: boolean;
  coolingPipeDynamicOffset: number;
  coolingPipeDynamicSet: number;
  coolingPipeDynamicDeadZone: number;
  coolingPipeDynamicLower: number;
  coolingPipeDynamicUpper: number;
}

export interface AlgorithmConfigInfo extends AlgorithmForm {
  chillers: ChillersItem[];
  chilledWaterOutletTempRangeList: TemperatureRangeItem[];
  chilledWaterOutletTempRange?: string;
  chilledWaterOutletTempSet: string;
  deviceCOPList: DeviceCopItem[];
  deviceCopUpdateDTOS: { deviceId: number; enableCopSet: boolean }[];
}

export interface DeviceCopItem {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  deviceName: string;
  groupId: number;
  deviceType: number;
  userId: number;
  brand: string;
  model: string;
  productionDate: string;
  status: number;
  deleted: number;
  runningStatus: number;
  errorStatus: number;
  orgId: number;
  deviceDetail: string;
  addingToAlg: boolean;
  enableCopSet: boolean;
}

export interface OrgDeviceLimit {
  deviceGlobalId?: number;
  upperLimit?: number;
}

export interface OrganizationItem {
  id?: number;
  orgName: string;
  orderNum?: number;
  logo?: string;
  themeColor?: string;
  startTenancy?: string;
  endTenancy?: string;
  dataValidityPeriod?: string;
  remark?: string;
  enabled?: string;
  orgDeviceLimits?: OrgDeviceLimit[];
}
export interface CreateCustomer {
  orgName: string;
  logo: string;
  themeColor: string;
  id?: number;
  imageUrl: string;
  selectedColor: string;
  leaseTerm: [Dayjs, Dayjs];
  stationsNumber: number;
  dataValidityPeriod: string;
}

export interface CharacterItem {
  name: string;
  id?: number;
}

export interface AccountItem {
  name: string;
}

export interface DeviceParamType {
  id: number;
  deviceParamCode: string;
  deviceParamName: string;
  unit: string;
  codeType: number;
  type: number;
  candidates: string[];
}

export interface GroupModuleQuery {
  groupId: number;
  moduleType: VisualModuleType;
}

export interface GroupModuleInfo {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  leId: number;
  moduleType: number;
  groupId: number;
  groupName: string;
  orgId: number;
  deviceIds: string;
  moduleInfoAi: {
    id: number;
    aiStartType: CtrlCabinetStartType;
    aiSeekHostWaterTempValue: number;
    aiSeekHostWaterTempButton: boolean;
    aiSeekTowerWaterTempValue: number;
    aiSeekTowerWaterTempButton: boolean;
    aiSeekChildPumpValue: number;
    aiSeekChildPumpButton: boolean;
    aiSeekCoolingPumpValue: number;
    aiSeekCoolingPumpButton: boolean;
  };
}

export interface GroupModuleDevData {
  deviceId: number;
  deviceName: string;
  dataList: {
    dataCode: string;
    value?: number | string;
  }[];
  dataListRO: GroupModuleDevParam[];
  dataListRW: GroupModuleDevParam[];
}

export interface GroupModuleDevParam {
  dataName: string;
  dataCode: string;
  value: string;
  unit: string | null;
  bitAddress0Status: string | null;
  bitAddress0Detail: string | null;
  bitAddress1Status: string | null;
  bitAddress1Detail: string | null;
}

export interface DevStartStopStatus {
  status: boolean;
  message: string[];
}

export interface GroupModuleBatchItem {
  deviceType: number;
  deviceDataList: GroupBatchDeviceItem[];
}

export interface GroupBatchDeviceItem {
  deviceId: number;
  deviceName: string;
  deviceType: number;
  runningStatus: 0 | 1;
  disableEnableStatus: 0 | 1;
  manualAutoStatus: 0 | 1;
  startStopOrder: 0 | 1;
  localRemoteStatus?: '本地' | '远程' | null;
}

export interface AIStartStopDeviceItem {
  deviceId: number;
  deviceName: string;
  runningStatus: 0 | 1;
  startStatus: 0 | 1;
}

export interface AIStartStopDeviceParams {
  deviceId: number;
  status: 0 | 1;
  startType: CtrlCabinetStartType;
}

export interface AIStartStopOptimizeInfo {
  id: number;
  groupId: number;
  aiSeekHostWaterTempValue?: number;
  aiSeekHostWaterTempButton?: boolean;
  aiSeekTowerWaterTempValue?: number;
  aiSeekTowerWaterTempButton?: boolean;
  aiStartType?: CtrlCabinetStartType;
}

export interface AIOptimizeDevData {
  deviceGroupId: number;
  controllerDeviceId: number;
  deviceName: string;
  deviceIds: string;
  runningStatus: number;
  moduleId: number;
  enableHostWaterSet: boolean;
  enableTowerWaterSet: boolean;
  moduleInfoAi: {
    id: number;
    createTime: string;
    updateTime: string;
    createUserId: number;
    updateUserId: number;
    moduleId: number;
    aiStartType: number;
    aiSeekHostWaterTempValue: number;
    aiSeekHostWaterTempButton: boolean;
    aiSeekTowerWaterTempValue: number;
    aiSeekTowerWaterTempButton: boolean;
    aiSeekChildPumpValue: number;
    aiSeekChildPumpButton: boolean;
    aiSeekCoolingPumpValue: number;
    aiSeekCoolingPumpButton: boolean;
  };
  systemStatus: string;
}

export interface AIOptimizeDetail {
  deviceList: AIOptimizeDeviceItem[];
  algorithmConfig: Partial<AlgorithmConfigInfo>;
}

export type AIOptimizeSetItemExpose = {
  submit?: () => void | Promise<void>;
};

export type AIOptimizeSetItemInstance = ComponentPublicInstance<unknown, AIOptimizeSetItemExpose>;

export interface AIOptimizeDeviceItem {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  deviceName: string;
  groupId: number;
  deviceType: number;
  userId: number;
  brand: string;
  model: string;
  productionDate: string;
  status: number;
  deleted: number;
  runningStatus: 0 | 1;
  errorStatus: number;
  orgId: number;
  deviceDetail: string;
  addingToAlg: boolean;
  enableCopSet: boolean;
}

export interface AIAdvancedParamItem {
  paramId: number;
  deviceId: number;
  deviceParamCode: string;
  deviceParamName: string;
  value: string;
  pullWindow: boolean;
  zeroValue: string | null;
  oneValue: string | null;
}

export type SmartCtrlLogData = PageData<SmartCtrlLogItem>;

export interface SmartCtrlLogItem {
  content: string;
  createTime: string;
  createUserId: number | null;
  devGroupId: number;
  devGroupName: string;
  devParentGroupId: number;
  deviceId: number;
  deviceName: string;
  id: number;
  orderType: number;
  orgId: number;
  result: number;
  updateTime: string;
  updateUserId: number | null;
}

export interface SmartCtrlLogQuery extends PageParams {
  deviceIds: string;
  searchContent: string;
  startTime?: string;
  endTime?: string;
}

export type OperateLogData = PageData<OperateLogItem>;

export interface OperateLogItem {
  deviceName: string;
  content: string;
  result: number;
  userName: string;
  createUserId: number;
  createTime: string;
}

export interface OperateLogQuery extends PageParams {
  groupIds: number[];
  content: string;
  result: number | null;
  userId: number | null;
  startTime?: string;
  endTime?: string;
}

export interface UploadLogo {
  etag: string;
  versionId: string;
  bucket: string;
  region: string;
  object: string;
  headers: Record<string, string>;
  fileName: string;
}

export interface TreeStructure {
  id: number;
  menuName: string;
  parentId: number;
  orderNum: number;
  path: string;
  component: string;
  isLink: string;
  menuType: string;
  perms: string;
  icon: string;
  enabled: number;
  checked: number;
  subPermissions: TreeStructure[];
}

export interface EquipmentLimitationsItem {
  deviceGlobalId?: number;
  upperLimit: number;
}

export interface InfoListByOrg {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  orgId: number;
  deviceGlobalId: number;
  upperLimit: number;
}

export interface Organization {
  id: number;
  parentId: number;
  orgName: string;
  orderNum: number;
  phone: string;
  email: string;
  managerId: string;
  enabled: string;
  subOrgs: Organization[];
}

export type CharacterPageItemData = PageData<CharacterPageItem>;

export interface CharacterPageItem {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  roleName: string;
  roleCode: string;
  orderNum: number;
  dataScope: string;
  enabled: string;
  defaultRole: string;
  remark: string;
}

export type NoticePageItemData = PageData<NoticePageItem>;
export interface NoticePageItem {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  orgId: number;
  userId: number;
  type: number;
  targetId: number;
  devGroupId: number;
  content: string;
  readStatus: boolean;
  groupName: string;
  monitorId: number;
  monitorName: string;
  deviceIds: number;
  deviceName: string;
  parentDevGroupId: number;
}

export interface UserPageParams {
  pageIndex: number;
  pageSize: number;
  userName: string;
  mobile: string;
  startTenancy: string;
  endTenancy: string;
  enabled?: string;
  orgId?: number;
  roleId?: number;
}

export interface AccountParams {
  id?: number;
  userName: string;
  mobile: string;
  password: string;
  startTenancy: string;
  endTenancy: string;
  enabled: string;
  orgId: number;
  roleId: number;
}

export interface AccountForm {
  id?: number;
  userName: string;
  mobile: string;
  password: string;
  enabled: boolean;
  roleId?: number;
  accountTerm?: [Dayjs, Dayjs];
}

export type UserPageItemData = PageData<UserPageItem>;
export interface UserPageItem {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  userName: string;
  email: string;
  mobile: string;
  avatar: string;
  password: string;
  startTenancy: string;
  endTenancy: string;
  enabled: number;
  deleted: string;
  roleId: number;
}

export interface CharacterParams {
  id?: number;
  roleName: string;
  orgId?: number;
}

export interface DeviceCop {
  id: number;
  enableCopSet: boolean;
  deviceName?: string;
}

export interface PermissionList {
  userId?: number;
  orgId?: number;
  parentId?: number;
  roleId?: number;
  haveDevice?: boolean;
  haveChild?: boolean;
}

export interface RoleIds {
  roleIds: number[];
}
export interface PermissionGroupItem {
  id: number;
  userId: number;
  groupName: string;
  comment: string;
  parentId: number;
  deleted?: number;
  orgId: number;
  roleIds: RoleIds;
  key?: number;
  deviceGroupChilds: TwoPermissionGroupItem[];
}

export interface TwoPermissionGroupItem {
  id: number;
  groupName: string;
  comment: string;
  parentId: number;
  userId: number;
  orgId: number;
  roleIds: RoleIds;
  key?: number;
}

export interface DevicePermissionsParams {
  roleId: number;
  groupIds: number[];
}
export interface RolePermissions {
  id?: number;
  orgId: number;
  roleName: string;
  remark: string;
  enabled: string;
  permissionIds: number[];
}

export interface CharacterForm {
  roleName: string;
  remark: string;
}

export interface OrganizationListParams extends PageParams {
  orgName: string;
}

export interface OperationPermissions {
  value: number;
  label: string;
  list: number[];
  subPermissions: { value: number; label: string }[];
}

export type OrganizationListItemData = PageData<OrganizationListItem>;

export interface OrganizationListItem {
  parentId: number;
  parentOrgName: string;
  orgName: string;
  orderNum: number;
  logo: string;
  themeColor: string;
  startTenancy: string;
  endTenancy: string;
  dataValidityPeriod: string;
  degree: string;
  remark: string;
  enabled: string;
  id: number;
}

export interface OrganizationInfo {
  id: number;
  createTime: string;
  updateTime: string;
  createUserId: number;
  updateUserId: number;
  parentId: number;
  orgName: string;
  orderNum: number;
  logo: string;
  themeColor: string;
  startTenancy: string;
  endTenancy: string;
  dataValidityPeriod: string;
  degree: string;
  remark: string;
  enabled: string;
}

export interface RolePermissionsParams {
  roleId: number;
  permissionIds: number[];
}

export interface RolePermissionsItem {
  id: number;
  remark: string;
  roleName: string;
  permissionCheckTreeVos: TreeStructure[];
}

export interface LoginUser {
  grant_type?: string;
  mobile: string;
  password: string;
}

export interface loginForm {
  access_token: string;
  expires_in: number;
  refresh_token: string;
  token_type: string;
}

export interface ChangePasswordForm {
  rawPassword: string;
  oldRawPassword: string;
  confirmPassword: string;
}

export interface PasswordParams {
  rawPassword: string;
  oldRawPassword: string;
}
export interface LoginData {
  userName: string;
  orgLogoPath: string;
  orgThemeColor: string;
  needFirstWizard: boolean;
}
