DeviceProfileModal.vue 4.62 KB
<template>
  <div>
    <BasicModal
      :maskClosable="false"
      v-bind="$attrs"
      width="55rem"
      @register="register"
      @ok="handleSubmit"
      @cancel="handleCancel"
    >
      <div class="step-form-form">
        <a-steps :current="current">
          <a-step v-for="item in steps" :key="item.title" :title="item.title" />
        </a-steps>
      </div>
      <div class="mt-5">
        <DeviceConfigurationStep
          v-show="current === 0"
          ref="DevConStRef"
          @next="handleStepNext(true, null)"
        />
        <TransportConfigurationStep
          v-show="current === 1"
          ref="TransConStRef"
          @prev="handleStepPrev"
        />
      </div>
    </BasicModal>
  </div>
</template>
<script lang="ts" setup>
  import { ref, unref, reactive } from 'vue';
  import { BasicModal, useModalInner } from '/@/components/Modal';
  import DeviceConfigurationStep from './step/DeviceConfigurationStep.vue';
  import TransportConfigurationStep from './step/TransportConfigurationStep.vue';
  import { deviceConfigAddOrEdit, deviceConfigGetDetail } from '/@/api/device/deviceConfigApi';
  import { useMessage } from '/@/hooks/web/useMessage';
  import { steps } from './device.profile.data';
  import { isEmpty } from '/@/utils/is';

  const emits = defineEmits(['success', 'register']);
  const isEditId = ref('');
  const isEditCreatTime = ref('');
  const { createMessage } = useMessage();
  const isViewDetail = ref(false);
  const isUpdate = ref(false);
  const current = ref(0);
  const DevConStRef = ref<InstanceType<typeof DeviceConfigurationStep>>();
  const TransConStRef = ref<InstanceType<typeof TransportConfigurationStep>>();
  const postSubmitFormData: any = reactive({
    deviceConfData: {},
  });
  const transportConfData: any = reactive({
    profileData: {},
  });
  const transportTypeStr = ref('');
  const [register, { closeModal, setModalProps }] = useModalInner(async (data) => {
    setModalProps({ confirmLoading: false });
    current.value = 0;
    isUpdate.value = data.isUpdate;
    isViewDetail.value = data.isView;
    const res = data.record !== undefined ? await deviceConfigGetDetail(data.record.id) : {};
    isEditId.value = data.record !== undefined ? data.record.id : null;
    isEditCreatTime.value = data.record !== undefined ? data.record.createTime : null;
    if (!unref(isViewDetail)) {
      const title = !unref(isUpdate) ? '编辑设备配置' : '新增设备配置';
      setModalProps({ title, showOkBtn: true, showCancelBtn: true });
      if (!unref(isUpdate)) {
        await setDeviceConfEditFormData(res);
        await setTransConfEditFormData(res);
        handleStepNext(false, res);
      }
    } else {
      setModalProps({ showOkBtn: false, showCancelBtn: false, title: '查看设备配置' });
      await setDeviceConfEditFormData(res);
      await setTransConfEditFormData(res);
      handleStepNext(false, res);
    }
  });
  const handleStepNext = (e, data) => {
    if (e) {
      current.value++;
    } else {
      setTransConfEditFormData(data);
    }
  };
  const handleStepPrev = () => {
    current.value--;
  };

  const setDeviceConfEditFormData = async (res) => {
    await DevConStRef.value?.setFormData(res);
  };
  const setTransConfEditFormData = async (res) => {
    await TransConStRef.value?.setFormData(res);
  };

  const getDeviceConfFormData = async () => {
    postSubmitFormData.deviceConfData = await DevConStRef.value?.getFormData();
  };
  const getTransConfData = async () => {
    transportConfData.profileData = await TransConStRef.value?.getFormData();
    transportTypeStr.value = transportConfData.profileData.transportConfiguration.type;
    Reflect.deleteProperty(transportConfData.profileData?.transportConfiguration, 'transportType');
  };

  const handleSubmit = async () => {
    await getDeviceConfFormData();
    await getTransConfData();
    const isEmptyObj = isEmpty(transportConfData.profileData.transportConfiguration);
    await deviceConfigAddOrEdit({
      ...postSubmitFormData.deviceConfData,
      ...{ transportType: !isEmptyObj ? transportTypeStr.value : 'DEFAULT' },
      ...{ profileData: !isEmptyObj ? transportConfData.profileData : null },
      ...{ id: isUpdate.value ? null : isEditId.value },
      ...{ createTime: isUpdate.value ? null : isEditCreatTime.value },
    });
    createMessage.success(isUpdate.value ? `新增成功` : `编辑成功`);
    handleCancel();
    emits('success');
  };

  const handleCancel = () => {
    closeModal();
    DevConStRef.value?.resetFormData();
    TransConStRef.value?.resetFormData();
  };
</script>

<style lang="less" scope>
  :deep(.ant-modal-content) {
    height: 700px !important;
  }
</style>