useSendCommand.ts 2.34 KB
import { ControlComponentValue } from './control.config';
import { getDeviceProfile } from '/@/api/alarm/position';
import { getDeviceRelation, sendCommandOneway } from '/@/api/dataBoard';
import { DeviceTypeEnum } from '/@/api/device/model/deviceModel';
import { getModelServices } from '/@/api/device/modelOfMatter';
import { useMessage } from '/@/hooks/web/useMessage';
import { isString } from '/@/utils/is';
import { TransportTypeEnum } from '/@/views/device/profiles/components/TransportDescript/const';

const { createMessage } = useMessage();
export function useSendCommand() {
  const error = () => {
    createMessage.error('下发指令失败');
    return false;
  };
  const sendCommand = async (record: ControlComponentValue, value: any) => {
    if (!record) return error();
    const { deviceProfileId, attribute, deviceType } = record;
    let { deviceId } = record;
    if (!deviceId) return error();
    try {
      const list = await getDeviceProfile();
      const deviceProfile = list.find((item) => item.id === deviceProfileId);
      if (!deviceProfile) return error();

      let params: string | Recordable = {
        [attribute!]: Number(value),
      };

      // 如果是TCP设备从物模型中获取下发命令(TCP网关子设备无物模型服务与事件)
      if (deviceProfile!.transportType === TransportTypeEnum.TCP) {
        const serviceList = (await getModelServices({ deviceProfileId: deviceProfileId! })) || [];
        const record = serviceList.find((item) => item.identifier === attribute);
        const sendCommand = record?.functionJson.inputData?.at(0)?.serviceCommand || '';
        params = isString(sendCommand) ? sendCommand : JSON.stringify(sendCommand);
      }

      if (deviceType === DeviceTypeEnum.SENSOR) {
        deviceId = await getDeviceRelation({
          deviceId,
          isSlave: deviceType === DeviceTypeEnum.SENSOR,
        });
      }

      // 控制按钮下发命令为0 或 1
      await sendCommandOneway({
        deviceId,
        value: {
          params: params,
          persistent: true,
          additionalInfo: {
            cmdType: 'API',
          },
          method: 'methodThingskit',
        },
      });
      createMessage.success('命令下发成功');
      return true;
    } catch (msg) {
      console.log('enter');
      return error();
    }
  };
  return {
    sendCommand,
  };
}