多表单验证

<script setup lang="ts">
import { ref } from 'vue';
import { Modal, message } from 'ant-design-vue';
import { AIRPLANE_MISSION_MODE } from '../enum';
import type { deviceAirPortLoad } from './columns';
import { defaultDeviceKindColumns, deviceAirportLoadColumns, deviceDefaultAbilityColumns } from './columns';
import orgSelectDropTree from './orgSelectDropTree.vue';
import LoadSelect from './loadSelect.vue';

// const emit = defineEmits(['confirm']);
defineOptions({
  name: 'DeviceAirportAdd',
});
const loadBind = {
  1: '机场 ',
  2: '无人机',
};
const loading = {
  1: '内置',
  2: '外挂',
};
// 获取默认飞控能力信息
const defaultDeviceUavModelList = ref<API.DeviceModelAbilityBo[]>();
// const deviceUavForm = ref<API.DeviceUavDto>({ deviceName: '', deviceSn: '', orgId: '', deviceType: '', deviceSubType: '' });
function getDefaultAbility(factoryCode: string | undefined, modelId: any) {
  const params = ref<API.DeviceUavModelListDto>({
    factoryCode,
    modelId,
  });
  postDeviceUavModelGetModelAbility({ ...params.value }).then((res) => {
    if (res.success) {
      defaultDeviceUavModelList.value = res.data ? res.data : [];
    }
  });
}
const airportLoadData = ref<deviceAirPortLoad[]>([]); // 机场设备种类
const deviceLoadData = ref<deviceAirPortLoad[]>([]); // 无人机默认设备种类
// 获取无人机默认设备种类信息
const defaultDeviceKindList = ref<API.DeviceUavModelKindBo[]>([]);
function getDefaultDeviceKindList(factoryCode: string | undefined, modelId: any) {
  const params = ref<API.DeviceUavModelListDto>({
    factoryCode,
    modelId,
  });
  postDeviceUavModelGetModelKind({ ...params.value }).then((res) => {
    if (res.success) {
      defaultDeviceKindList.value = res.data?.map((item: any) => {
        return {
          ...item,
          abilityName: getDeviceAblity(item),
          loadBingName: loadBind[item.loadBind],
          loadingName: loading[item.loading],
        };
      });
    }
  });
}
const airPlaneUavMode = ref<string[]>([]); // 无人机-航线配置
const deviceAirportAddDetail = ref();
// 表单数据
const airportForm = ref<API.DeviceAirportDto>({
  deviceName: '',
  orgId: '',
  airLine: '',
  deviceType: '',
  firmwareVersion: '',
  deviceSn: '',
  deviceSonType: '',
});
//  窗口
const modelValue = ref<boolean>(false);
const deviceUavFormList: any = ref([]);
const factorynametext = ref('');
function openModel(node: API.FlyDockEquipmentDTO, factory: any, factoryname: any) {
  // console.log('node', node)
  // console.log('factory', factory);
  // console.log('factoryname', factoryname);
  factorynametext.value = factoryname;
  modelValue.value = true;
  airportForm.value.deviceName = node.deviceName;
  airportForm.value.deviceType = node.deviceType;
  airportForm.value.firmwareVersion = node.firmwareVersion;
  airportForm.value.deviceSonType = node.deviceSubType;
  airportForm.value.deviceSn = node.deviceSn;
  airportForm.value.dockerId = node.id;
  airportForm.value.modelName = node.deviceName;
  airportForm.value.department = node.workspaceName; // 机场
  airportForm.value.factoryCode = node.manufacturer; // 厂家id
  // console.log('node.uavList列表多个', node.uavList)
  deviceUavFormList.value = [];
  if (node.uavList) {
    // deviceUavForm.value.airportId = node.id; //机场id
    // deviceUavForm.value.deviceName = node.uavList[0]?.deviceName;//设备名称
    // deviceUavForm.value.deviceSn = node.uavList[0]?.deviceSn;
    // deviceUavForm.value.deviceType = node.uavList[0]?.deviceType;
    // deviceUavForm.value.deviceSubType = node.uavList[0]?.deviceSubType;
    // deviceUavForm.value.uavId = node.uavList[0]?.id;
    // // deviceUavForm.value.factoryId = node.uavList[0]?.manufacturer; //厂家id
    // deviceUavForm.value.factoryId = node.manufacturer; //厂家id
    // deviceUavForm.value.relStatue = node.uavList[0]?.relStatue;
    // // getTypeList(deviceUavForm.value.factoryId);
    // 型号下拉
    node.uavList.forEach((item) => {
      deviceUavFormList.value.push({
        airportId: node.id,
        deviceName: item.deviceName,
        deviceSn: item.deviceSn,
        deviceType: item.deviceType,
        deviceSubType: item.deviceSubType,
        uavId: item.id,
        factoryId: node.manufacturer,
        relStatue: item.relStatue,
      });
    });
    // console.log('deviceUavFormList', deviceUavFormList.value)
    // getTypeList(deviceUavForm.value.factoryId);
    getTypeList(node.manufacturer);
  }
}
// 校验表单
const airportRef = ref(); // 机场信息
// const airplaneRef = ref();//无人机信息
const uavDialogRefs: Ref<any> = ref({});
// 确认新增
async function confirmCheck() {
  try {
    await airportRef.value.validateFields();
    // await airplaneRef.value.validateFields();
    for (let i = 0; i < deviceUavFormList.value.length; i++) {
      await uavDialogRefs.value[deviceUavFormList.value[i].uavId];
    }
    // deviceUavForm.value.orgId = airportForm.value.orgId;
    // deviceUavForm.value.deviceRelKindOtherList = deviceLoadData.value; // 无人机列表
    // deviceUavForm.value.uavLine = airPlaneUavMode.value.toString();
    // deviceUavForm.value.deviceRelKindList = defaultDeviceKindList.value;
    deviceUavFormList.value.forEach((item: any) => {
      item.orgId = airportForm.value.orgId;
      item.deviceRelKindOtherList = deviceLoadData.value;
      item.uavLine = airPlaneUavMode.value.toString();
      item.deviceRelKindList = defaultDeviceKindList.value;
    });
    // console.log('deviceUavFormList.value2222', deviceUavFormList.value)
    // airportForm.value.deviceUav = deviceUavForm.value;
    airportForm.value.deviceUav = deviceUavFormList.value;
    airportForm.value.deviceRelKindList = airportLoadData.value; // 无人机列表
    // console.log('保存传参', airportForm.value)
    postDeviceAirportSave(airportForm.value).then((res) => {
      if (res.success) {
        message.success('新增成功');
        modelValue.value = false;
      }
    });
  }
  catch (errorInfo) {

  }
}
// 根据无人机厂商获取型号列表
const typeModelList = ref<API.DeviceUavModel[] | undefined>([]);
async function getTypeList(factoryCode: string | undefined) {
  const params = { factoryCode };
  const res = await postDeviceUavModelGetAll(params);
  if (res.success) {
    typeModelList.value = res.data;
  }
}

// 选取组织
function onSelectOrg(value: string | number) {
  airportForm.value.orgId = value;
}
// 打开新增负载窗口
const loadSelectRef = ref();
const loadDataType = ref<number>(1); // 负载挂在哪个设备上 1机场,2无人机
function openLoadDrawer(type: number) {
  loadDataType.value = type;
  loadSelectRef.value.open();
}
// 设置新增设备种类数据
function setLoadData(data: deviceAirPortLoad[]) {
  data.forEach((item) => {
    item.open = '1';
    item.kindId = item.id; // 将装置id 转换为kindId
  });
  if (loadDataType.value === 1) { // 新增机场设备种类
    airportLoadData.value = [...airportLoadData.value, ...data];
  }
  else { // 新增无人机其他设备种类
    deviceLoadData.value = [...deviceLoadData.value, ...data];
  }
}
// 复制设备种类
function copyLoad(record: any, index: number, type: number) {
  if (type === 1) {
    airportLoadData.value.splice(index, 0, JSON.parse(JSON.stringify(record)));
  }
  else {
    deviceLoadData.value.splice(index, 0, JSON.parse(JSON.stringify(record)));
  }
}
// 删除设备种类
function deleteLoad(index: number, type: number) {
  if (type === 1) {
    airportLoadData.value.splice(index, 1);
  }
  else {
    deviceLoadData.value.splice(index, 1);
  }
}
// 无人机型号更改时获取默认信息
function getModelAbilityAndKind(v: any) {
  getDefaultAbility(airportForm.value.factoryCode, v); // 获取无人机默认飞控能力
  getDefaultDeviceKindList(airportForm.value.factoryCode, v); // 获取无人机默认种类
}
defineExpose({
  openModel,
});

//  获取飞机能力信息
function getDeviceAblity(record: any) {
  const str = record.deviceKindAbilityBoList.map((item: any, index: number) => {
    return (index + 1) + item.abilityName;
  });
  return str.join(',');
}
const activeKey = ref(['0']);
// const tableData = ref<API.[]>()
</script>

<template>
  <Modal
    ref="deviceAirportAddDetail" v-model:open="modelValue" width="1000px" :destroy-on-close="true"
    :body-style="{ height: '500px', overflow: 'auto' }" title="新增设备(2/2)" @ok="confirmCheck"
  >
    <div>
      <p class="font-bold mb-2">
        机场信息
      </p>
      <a-form
        ref="airportRef" :model="airportForm" name="basic" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }"
        autocomplete="off"
      >
        <a-row>
          <a-col :span="8">
            <a-form-item label="厂家">
              <a-input v-model:value="factorynametext" :disabled="true" />
            </a-form-item>
          </a-col>
        </a-row>

        <a-row>
          <a-col :span="8">
            <a-form-item label="设备信息" name="deviceName" :rules="[{ required: true, message: '请输入设备信息!' }]">
              <a-input v-model:value="airportForm.deviceName" />
            </a-form-item>
          </a-col>
          <a-col :span="8">
            <a-form-item label="所属组织" name="orgId" :rules="[{ required: true, message: '请选中组织!' }]">
              <orgSelectDropTree :bordered="true" auth="organization" @change="onSelectOrg" />
            </a-form-item>
          </a-col>
          <a-col :span="8">
            <a-form-item label="作业半径" name="airLine" :rules="[{ required: true, message: '请输入作业半径!' }]">
              <a-input v-model:value="airportForm.airLine" />
            </a-form-item>
          </a-col>
        </a-row>
        <a-row>
          <a-col :span="8">
            <a-form-item label="机身序列号">
              <a-input v-model:value="airportForm.deviceSn" :disabled="true" />
            </a-form-item>
          </a-col>
          <a-col :span="8">
            <a-form-item label="固件版本">
              <a-input v-model:value="airportForm.firmwareVersion" :disabled="true" />
            </a-form-item>
          </a-col>
          <a-col :span="8">
            <a-form-item label="型号" name="modelName">
              <a-input v-model:value="airportForm.modelName" :disabled="true" />
            </a-form-item>
          </a-col>
        </a-row>
        <div class="flex justify-between">
          <p class="font-bold mb-2">
            机场设备种类
          </p>
          <a-space>
            <a-button class="mb-1" type="primary" @click="openLoadDrawer(1)">
              添加机场设备种类
            </a-button>
          </a-space>
        </div>
        <a-table :columns="deviceAirportLoadColumns" :data-source="airportLoadData" :pagination="false">
          <template #bodyCell="{ column, record, index }">
            <template v-if="column.dataIndex === 'action'">
              <a-space>
                <a-button type="primary" @click="copyLoad(record, index, 1)">
                  <template #icon>
                    <CopyOutlined />
                  </template>
                </a-button>
                <a-button type="primary" danger @click="deleteLoad(index, 1)">
                  <template #icon>
                    <DeleteOutlined />
                  </template>
                </a-button>
              </a-space>
            </template>
            <template v-if="column.dataIndex === 'loadIndex'">
              <a-input v-model:value="record.loadIndex" />
            </template>
            <template v-if="column.dataIndex === 'showName'">
              <a-input v-model:value="record.showName" />
            </template>
            <template v-if="column.dataIndex === 'open'">
              <a-switch v-model:checked="record.open" checked-value="0" un-checked-value="1" />
            </template>
          </template>
        </a-table>
      </a-form>
      <!-- 多个设备多个无人机信息 -->
      <a-collapse v-model:activeKey="activeKey">
        <a-collapse-panel v-for="(item, index) in deviceUavFormList" :key="index" header="无人机配置">
          <div>
            <p class="font-bold mb-2">
              无人机信息
            </p>
          </div>
          <a-form
            :ref="(el: any) => {
              uavDialogRefs[item.uavId] = el
            }" :model="item" name="basic" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }" autocomplete="off"
          >
            <a-row>
              <a-col :span="8">
                <a-form-item label="设备名称" name="deviceName" :rules="[{ required: true, message: '请输入设备信息!' }]">
                  <a-input v-model:value="item.deviceName" />
                </a-form-item>
              </a-col>
              <a-col :span="8">
                <a-form-item label="厂家" name="factory">
                  <a-input v-model:value="item.factoryId" :disabled="true" />
                </a-form-item>
              </a-col>
            </a-row>
            <a-row>
              <a-col :span="8">
                <a-form-item label="型号" name="deviceType">
                  <a-select
                    v-model:value="item.modelId" :field-names="{ label: 'modelName', value: 'id' }"
                    :options="typeModelList" @change="getModelAbilityAndKind"
                  />
                </a-form-item>
              </a-col>
              <a-col :span="8">
                <a-form-item label="机身序列号">
                  <a-input v-model:value="item.deviceSn" :disabled="true" />
                </a-form-item>
              </a-col>
            </a-row>
          </a-form>
          <div>
            <p class="font-bold mb-2">
              无人机-默认设备种类
            </p>
          </div>
          <a-table :columns="defaultDeviceKindColumns" :data-source="defaultDeviceKindList" :pagination="false">
            <template #bodyCell="{ column, record }">
              <template v-if="column.dataIndex === 'action'" />
              <template v-if="column.dataIndex === 'loadIndex'">
                <a-input v-model:value="record.loadIndex" />
              </template>
              <template v-if="column.dataIndex === 'showName'">
                <a-input v-model:value="record.showName" />
              </template>
              <template v-if="column.dataIndex === 'open'">
                <a-switch v-model:checked="record.open" checked-value="0" un-checked-value="1" />
              </template>
            </template>
          </a-table>
          <div>
            <div class="flex justify-between mr-1">
              <p class="font-bold mb-2">
                无人机-其他设备种类
              </p>
              <a-space>
                <a-button class="mb-1" type="primary" @click="openLoadDrawer(2)">
                  添加无人机其他设备种类
                </a-button>
              </a-space>
            </div>
            <a-table :columns="deviceAirportLoadColumns" :data-source="deviceLoadData" :pagination="false">
              <template #bodyCell="{ column, record, index }">
                <template v-if="column.dataIndex === 'action'">
                  <a-space>
                    <a-button type="primary" @click="copyLoad(record, index, 1)">
                      <template #icon>
                        <CopyOutlined />
                      </template>
                    </a-button>
                    <a-button type="primary" danger @click="deleteLoad(index, 2)">
                      <template #icon>
                        <DeleteOutlined />
                      </template>
                    </a-button>
                  </a-space>
                </template>
                <template v-if="column.dataIndex === 'loadIndex'">
                  <a-input v-model:value="record.loadIndex" />
                </template>
                <template v-if="column.dataIndex === 'showName'">
                  <a-input v-model:value="record.showName" />
                </template>
                <template v-if="column.dataIndex === 'open'">
                  <a-switch v-model:checked="record.open" checked-value="0" un-checked-value="1" />
                </template>
              </template>
            </a-table>
          </div>
          <div>
            <div class="flex justify-between">
              <p class="font-bold mb-2">
                无人机-默认飞控能力
              </p>
            </div>
            <a-table
              :columns="deviceDefaultAbilityColumns" :data-source="defaultDeviceUavModelList"
              :pagination="false"
            >
              <template #bodyCell="{ column, record }">
                <template v-if="column.dataIndex === 'action'" />
                <template v-if="column.dataIndex === 'loadIndex'">
                  <a-input v-model:value="record.loadIndex" />
                </template>
                <template v-if="column.dataIndex === 'showName'">
                  <a-input v-model:value="record.showName" />
                </template>
                <template v-if="column.dataIndex === 'open'">
                  <a-switch v-model:checked="record.open" checked-value="0" un-checked-value="1" />
                </template>
              </template>
            </a-table>
          </div>
          <div>
            <p class="font-bold mb-2">
              无人机-航线模式配置
            </p>
            <a-checkbox-group v-model:value="airPlaneUavMode" name="checkboxgroup" :options="AIRPLANE_MISSION_MODE" />
          </div>
        </a-collapse-panel>
      </a-collapse>
    </div>
    <LoadSelect ref="loadSelectRef" @select-load-data="setLoadData" />
  </Modal>
</template>

  

posted @ 2024-09-12 17:20  abcByme  阅读(6)  评论(1编辑  收藏  举报