You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							297 lines
						
					
					
						
							9.8 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							297 lines
						
					
					
						
							9.8 KiB
						
					
					
				| <template> | |
|   <a-spin :spinning="confirmLoading"> | |
|     <a-form ref="formRef" class="antd-modal-form" :labelCol="labelCol" :wrapperCol="wrapperCol"> | |
|       <a-row> | |
|         <a-col :span="24"> | |
|           <a-form-item label="防区" v-bind="validateInfos.lineId"> | |
|             <!-- <j-dict-select-tag v-model:value="formData.lineId" dictCode="" placeholder="" :disabled="disabled"/> --> | |
|             <a-select | |
|               v-model:value="formData.lineId" | |
|               style="width: 300px" | |
|               @change="changeLineValue" | |
|               :disabled="disabled" | |
|               placeholder="请选择所属防区" | |
|             > | |
|               <a-select-option v-for="(item, index) in lineSelect" :value="item.id" :key="item.id"> | |
|                 {{ item.name }} | |
|               </a-select-option> | |
|             </a-select> | |
|           </a-form-item> | |
|         </a-col> | |
|         <a-col :span="24"> | |
|           <a-form-item label="站点序号" v-bind="validateInfos.sitecode"> | |
|             <a-input v-model:value="formData.sitecode" placeholder="请输入站点序号" :disabled="disabled"></a-input> | |
|           </a-form-item> | |
|         </a-col> | |
|         <a-col :span="24"> | |
|           <a-form-item label="站点名称" v-bind="validateInfos.sitename"> | |
|             <a-input v-model:value="formData.sitename" placeholder="请输入站点名称" :disabled="disabled"></a-input> | |
|           </a-form-item> | |
|         </a-col> | |
|         <template v-if="disabled == false"> | |
|           <a-col :span="24"> | |
|             <a-form-item label="位置"> | |
|               <a><img :src="locationPng" class="dwImg" @click="mapShow" /></a> | |
|             </a-form-item> | |
|           </a-col> | |
|  | |
|           <EarthMapModal | |
|             ref="earthMapModal" | |
|             :enableTile="false" | |
|             :visible="mapVisible" | |
|             @closeWin=" | |
|               () => { | |
|                 mapVisible = false; | |
|               } | |
|             " | |
|             @checkPosition="checkPosition" | |
|             :hasMoveMethod="true" | |
|             @moveChinaPosition="moveChinaPosition" | |
|             :editTileModel="mapModel" | |
|             initModeType="3D" | |
|             :enable-pointer="false" | |
|           > | |
|           </EarthMapModal> | |
|         </template> | |
|         <a-col :span="24"> | |
|           <a-form-item label="经度" v-bind="validateInfos.longitude"> | |
|             <a-input-number v-model:value="formData.longitude" placeholder="请输入经度" style="width: 100%" :disabled="disabled" /> | |
|           </a-form-item> | |
|         </a-col> | |
|         <a-col :span="24"> | |
|           <a-form-item label="纬度" v-bind="validateInfos.latitude"> | |
|             <a-input-number v-model:value="formData.latitude" placeholder="请输入纬度" style="width: 100%" :disabled="disabled" /> | |
|           </a-form-item> | |
|         </a-col> | |
|         <a-col :span="24"> | |
|           <a-form-item label="高度" v-bind="validateInfos.height"> | |
|             <a-input-number v-model:value="formData.height" placeholder="请输入高度" style="width: 100%" :disabled="disabled" /> | |
|           </a-form-item> | |
|         </a-col> | |
|         <a-col :span="24"> | |
|           <a-form-item label="偏航角" v-bind="validateInfos.yaw"> | |
|             <a-input-number v-model:value="formData.yaw" placeholder="请输入偏航角" style="width: 100%" :disabled="disabled" /> | |
|           </a-form-item> | |
|         </a-col> | |
|         <a-col :span="24"> | |
|           <a-form-item label="俯仰角" v-bind="validateInfos.pitch"> | |
|             <a-input-number v-model:value="formData.pitch" placeholder="请输入俯仰角" style="width: 100%" :disabled="disabled" /> | |
|           </a-form-item> | |
|         </a-col> | |
|         <a-col :span="24"> | |
|           <a-form-item label="翻转角" v-bind="validateInfos.roll"> | |
|             <a-input-number v-model:value="formData.roll" placeholder="请输入翻转角" style="width: 100%" :disabled="disabled" /> | |
|           </a-form-item> | |
|         </a-col> | |
|       </a-row> | |
|     </a-form> | |
|   </a-spin> | |
| </template> | |
| 
 | |
| <script lang="ts" setup> | |
|   import { ref, reactive, nextTick, computed, onMounted } from 'vue'; | |
|   import { defHttp } from '/@/utils/http/axios'; | |
|   import { useMessage } from '/@/hooks/web/useMessage'; | |
|   // import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue'; | |
|   import { getValueType } from '/@/utils'; | |
|   import { saveOrUpdate } from '../MsCameraSite.api'; | |
|   import { Form } from 'ant-design-vue'; | |
|   import EarthMapModal from '@/views/military/modules/earthMap/scene/model/mapModel/EarthMapModal.vue'; | |
|   import locationPng from '@/assets/images/getLocation.png'; | |
| 
 | |
|   const lineSelect: any = ref([]); | |
|   const props = defineProps({ | |
|     formDisabled: { type: Boolean, default: false }, | |
|     formData: { type: Object, default: () => {} }, | |
|     formBpm: { type: Boolean, default: true }, | |
|   }); | |
|   const formRef = ref(); | |
|   const useForm = Form.useForm; | |
|   const emit = defineEmits(['register', 'ok']); | |
|   const formData = reactive<Record<string, any>>({ | |
|     id: undefined, | |
|     lineId: undefined, | |
|     sitecode: '', | |
|     sitename: '', | |
|     longitude: undefined, | |
|     latitude: undefined, | |
|     height: undefined, | |
|     yaw: undefined, | |
|     pitch: undefined, | |
|     roll: undefined, | |
|   }); | |
|   const { createMessage } = useMessage(); | |
|   const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } }); | |
|   const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } }); | |
|   const confirmLoading = ref<boolean>(false); | |
|   //表单验证 | |
|   const validatorRules = { | |
|     sitecode: [{ required: true, message: '请输入站点序号!' }], | |
|     sitename: [{ required: true, message: '请输入站点名称!' }], | |
|     longitude: [{ required: true, message: '请输入经度!' }], | |
|     latitude: [{ required: true, message: '请输入纬度!' }], | |
|     lineId: [{ required: true, message: '请选择所属防区!' }], | |
|   }; | |
|   const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: true }); | |
| 
 | |
|   // 表单禁用 | |
|   const disabled = computed(() => { | |
|     if (props.formBpm === true) { | |
|       if (props.formData.disabled === false) { | |
|         return false; | |
|       } else { | |
|         return true; | |
|       } | |
|     } | |
|     return props.formDisabled; | |
|   }); | |
| 
 | |
|   onMounted(() => { | |
|     setSelectList(); | |
|   }); | |
|   //线路选择框 | |
|   function setSelectList() { | |
|     defHttp | |
|       .get( | |
|         { | |
|           url: '/military/msMapLine/mapLineSelect', | |
|         }, | |
|         { isTransformResponse: false } | |
|       ) | |
|       // getAction(this.url.querySelectList, {}) | |
|       .then((res) => { | |
|         if (res.success) { | |
|           lineSelect.value = res.result; | |
|         } | |
|       }); | |
|   } | |
| 
 | |
|   /** | |
|    * 新增 | |
|    */ | |
|   function add() { | |
|     edit({}); | |
|   } | |
| 
 | |
|   /** | |
|    * 编辑 | |
|    */ | |
|   function edit(record) { | |
|     nextTick(() => { | |
|       resetFields(); | |
|       //赋值 | |
|       Object.assign(formData, record); | |
|     }); | |
|   } | |
| 
 | |
|   /** | |
|    * 提交数据 | |
|    */ | |
|   async function submitForm() { | |
|     // 触发表单验证 | |
|     await validate(); | |
|     confirmLoading.value = true; | |
|     const isUpdate = ref<boolean>(false); | |
|     //时间格式化 | |
|     let model = formData; | |
|     if (model.id) { | |
|       isUpdate.value = true; | |
|     } | |
|     //循环数据 | |
|     for (let data in model) { | |
|       //如果该数据是数组并且是字符串类型 | |
|       if (model[data] instanceof Array) { | |
|         let valueType = getValueType(formRef.value.getProps, data); | |
|         //如果是字符串类型的需要变成以逗号分割的字符串 | |
|         if (valueType === 'string') { | |
|           model[data] = model[data].join(','); | |
|         } | |
|       } | |
|     } | |
|     await saveOrUpdate(model, isUpdate.value) | |
|       .then((res) => { | |
|         if (res.success) { | |
|           createMessage.success(res.message); | |
|           emit('ok'); | |
|         } else { | |
|           createMessage.warning(res.message); | |
|         } | |
|       }) | |
|       .finally(() => { | |
|         confirmLoading.value = false; | |
|       }); | |
|   } | |
|   function changeLineValue(item, option) { | |
|     formData.lineId = option.key; | |
|   } | |
| 
 | |
|   // 弹窗地图框属性 | |
|   const mapVisible = ref(false); | |
|   const mapModel = ref(); | |
|   const mapShow = function () { | |
|     mapModel.value = { | |
|       custom: { | |
|         id: formData.id, | |
|       }, | |
|       czmObject: { | |
|         name: formData.sitename, | |
|         xbsjType: 'Model', | |
|         url: '/dt/sys/common/static/' + formData.modelUrl, | |
|         // "color": [0.52, 0.6, 0.58, 1], | |
|         minimumPixelSize: formData.minimumPixelSize, | |
|         // maximumScale: 0.02, | |
|         scale: formData.scale, | |
|         xbsjScale: formData.xyzScale ? formData.xyzScale.split(',') : [1, 1, 1], | |
|         xbsjPosition: [window.Cesium.Math.toRadians(formData.longitude), window.Cesium.Math.toRadians(formData.latitude), formData.height], | |
|         xbsjRotation: [ | |
|           window.Cesium.Math.toRadians(formData.yaw), | |
|           window.Cesium.Math.toRadians(formData.pitch), | |
|           window.Cesium.Math.toRadians(formData.roll), | |
|         ], | |
|         viewDistance: 150, | |
|         distanceDisplayCondition: [1.0, 30000.0], | |
|       }, | |
|     }; | |
| 
 | |
|     mapVisible.value = true; | |
|   }; | |
| 
 | |
|   const checkPosition = function (position, rotation, fov) { | |
|     const CMath = window.Cesium.Math; | |
|     formData.longitude = CMath.toDegrees(position[0]); | |
|     formData.latitude = CMath.toDegrees(position[1]); | |
|     formData.height = CMath.toDegrees(position[2]); | |
| 
 | |
|     formData.yaw = CMath.toDegrees(rotation[0]); | |
|     formData.pitch = CMath.toDegrees(rotation[1]); | |
|     formData.roll = CMath.toDegrees(rotation[2]); | |
| 
 | |
|     // subObject.value.viewDistance = fov; | |
|   }; | |
|   const earthMapModal: any = ref(null); | |
|   // 打开地图时飞入到指定位置 | |
|   const moveChinaPosition = function () { | |
|     earthMapModal.value.CModel.czmObject.flyTo(); | |
|     // const CMath = window.Cesium.Math; | |
|     // window.earth.camera.position = [CMath.toRadians(formData.longitude) - 0.000001, CMath.toRadians(formData.latitude) - 0.000001, CMath.toRadians(formData.height) - 0.000001]; | |
|     // window.earth.camera.rotation = [CMath.toRadians(formData.yaw), CMath.toRadians(formData.pitch), CMath.toRadians(formData.roll)] | |
|   }; | |
|   defineExpose({ | |
|     add, | |
|     edit, | |
|     submitForm, | |
|   }); | |
| </script> | |
| 
 | |
| <style lang="less" scoped> | |
|   .antd-modal-form { | |
|     min-height: 500px !important; | |
|     overflow-y: auto; | |
|     padding: 24px 24px 24px 24px; | |
|   } | |
| 
 | |
|   .dwImg { | |
|     width: 32px; | |
|     height: 32px; | |
|   } | |
| </style>
 | |
| 
 |