Kaynağa Gözat

批量修改地址

xzc 1 hafta önce
ebeveyn
işleme
746836fc9e

+ 5 - 0
yudao-ui-admin-vue3/src/api/pressure2/equipboilerscheduling/index.ts

@@ -172,4 +172,9 @@ export const EquipBoilerSchedulingApi = {
     return request.put({ url: '/pressure2/equip-boiler-scheduling/contact/batch-update', data })
   },
 
+  // 批量修改锅炉设备地址
+  batchUpdateDistrict: async (data: { ids: string[], equipDistrict: number, equipStreet: number, areaType: string }) => {
+    return request.put({ url: '/pressure2/equip-boiler/batch-update-district', data })
+  },
+
 }

+ 6 - 1
yudao-ui-admin-vue3/src/api/pressure2/pipescheduling/index.ts

@@ -170,11 +170,16 @@ export const EquipPipeSchedulingApi = {
     return request.post({ url: '/pressure2/equip-pipe-scheduling/equip/update', data })
   },
 
-  //批量更新计划排期锅炉设备联系人信息
+  //批量更新计划排期管道设备联系人信息
   contactBatchUpdate: async (data: { ids: string[], contact: string, contactPhone: string }) => {
     return request.put({ url: '/pressure2/equip-pipe-scheduling/contact/batch-update', data })
   },
 
+  // 批量修改管道设备地址
+  batchUpdateDistrict: async (data: { ids: string[], equipDistrict: number, equipStreet: number, areaType: string }) => {
+    return request.put({ url: '/pressure2/equip-pipe/batch-update-district', data })
+  },
+
   // 查询工程单
   getDetailByProject: async (params: any) => {
     return request.post({ url: '/pressure2/equip-pipe-scheduling/getDetailByProject', data:params })

+ 102 - 0
yudao-ui-admin-vue3/src/views/pressure/equipmentAppointment/index.vue

@@ -120,6 +120,9 @@
         <el-button type="primary" :disabled="selectedRows.length === 0" @click="handleBatchEditContact">
           修改约检联系人
         </el-button>
+        <el-button type="primary" :disabled="selectedRows.length === 0" @click="handleBatchEditLocation">
+          批量修改地址
+        </el-button>
         <el-button type="primary" :disabled="selectedRows.length === 0" @click="handleBatchRemark">
           批量添加备注
         </el-button>
@@ -339,6 +342,37 @@
       </el-button>
     </template>
   </el-dialog>
+
+  <!-- 批量修改地址弹窗 -->
+  <el-dialog v-model="batchEditLocationVisible" title="批量修改地址" width="500px" :close-on-click-modal="false">
+    <el-form
+      ref="batchEditLocationFormRef"
+      :model="batchEditLocationFormData"
+      :rules="batchEditLocationFormRules"
+      label-width="140px"
+    >
+      <el-form-item label="设备所在行政区" prop="equipDistrict">
+        <AreaSelect
+          v-model="batchEditLocationFormData.equipDistrict"
+          :areaType="batchEditLocationFormData.areaType"
+          @area-type-change="changeArea"
+          @change="changeAddress"
+          placeholder="请选择设备所在行政区"
+        />
+      </el-form-item>
+      <el-form-item label="设备所在街道" prop="equipStreet">
+        <StreetSelect
+          v-model="batchEditLocationFormData.equipStreet"
+          :district-ids="[batchEditLocationFormData.equipDistrict]"
+          placeholder="请选择设备所在街道"
+        />
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button :loading="batchEditLocationLoading" @click="batchEditLocationVisible = false">取消</el-button>
+      <el-button type="primary" :loading="batchEditLocationLoading" @click="batchEditLocationSubmitForm">批量修改</el-button>
+    </template>
+  </el-dialog>
 </template>
 
 <script lang="ts" setup name="EquipmentAppointment">
@@ -350,9 +384,13 @@ import EquipBoilerForm from '@/components/EquipBoilerForm/index.vue'
 import EquipPipeForm from '@/components/EquipPipeForm/index.vue'
 import BatchEditForm from './components/batchEditForm.vue'
 import AreaSelect from '@/views/system/equipcontainer/components/AreaSelect.vue'
+import StreetSelect from '@/views/system/equipcontainer/components/StreetSelect.vue'
 import DeptSelect from '@/views/pressure2/pipescheduling/components/DeptSelect.vue'
 import { getStrDictOptions, getDictLabel, DICT_TYPE } from '@/utils/dict'
 import FetchApis from './index.api'
+import { EquipContainerApi } from '@/api/pressure/equipcontainer'
+import { EquipBoilerSchedulingApi } from '@/api/pressure2/equipboilerscheduling'
+import { EquipPipeSchedulingApi } from '@/api/pressure2/pipescheduling'
 import { cloneDeep } from 'lodash-es'
 import { isEmpty } from '@/utils/is'
 import dayjs from 'dayjs'
@@ -798,6 +836,19 @@ const handleBatchAppointment = () => {
 
 // 批量修改约检联系人
 const batchEditFormRef = ref()
+// 批量修改地址
+const batchEditLocationVisible = ref(false)
+const batchEditLocationLoading = ref(false)
+const batchEditLocationFormRef = ref()
+const batchEditLocationFormData = ref({
+  areaType: '',
+  equipDistrict: '', // 设备所在行政区
+  equipStreet: '', // 设备所在街道
+})
+const batchEditLocationFormRules = {
+  equipDistrict: [{ required: true, message: '请选择设备所在行政区', trigger: 'change' }],
+  equipStreet: [{ required: true, message: '请选择设备所在街道', trigger: 'change' }],
+}
 const handleBatchEditContact = () => {
   if (selectedRows.value.length === 0) {
     ElMessage.warning('请先选择设备')
@@ -809,6 +860,57 @@ const handleBatchEditFormSuccess = () => {
   getListPageFn()
 }
 
+// 批量修改地址
+const handleBatchEditLocation = async () => {
+  if (selectedRows.value.length === 0) {
+    ElMessage.warning('请先选择设备')
+    return
+  }
+  // 使用第一个选中设备的地址信息预填表单
+  const firstEquip = selectedRows.value[0]
+  batchEditLocationFormData.value.areaType = firstEquip.areaType || ''
+  batchEditLocationFormData.value.equipDistrict = firstEquip.equipDistrict || ''
+  batchEditLocationFormData.value.equipStreet = firstEquip.equipStreet || ''
+  batchEditLocationVisible.value = true
+}
+const changeArea = (areaType: 'all' | 'gz') => {
+  batchEditLocationFormData.value.areaType = areaType
+}
+const changeAddress = () => {
+  batchEditLocationFormData.value.equipStreet = null as any
+  setTimeout(() => {
+    batchEditLocationFormRef.value?.clearValidate(['equipStreet'])
+  }, 0)
+}
+const batchEditLocationSubmitForm = async () => {
+  if (!batchEditLocationFormRef.value) return
+  const valid = await batchEditLocationFormRef.value.validate()
+  if (!valid) return
+  batchEditLocationLoading.value = true
+  try {
+    const selectRows = selectedRows.value || []
+    const data = {
+      ...batchEditLocationFormData.value,
+      ids: selectRows.map((item: any) => item.id)
+    }
+    // 根据设备类型调用不同的 API
+    if (selectedEquipMainType.value === 'boiler') {
+      await EquipBoilerSchedulingApi.batchUpdateDistrict(data)
+    } else if (selectedEquipMainType.value === 'pipe') {
+      await EquipPipeSchedulingApi.batchUpdateDistrict(data)
+    } else {
+      await EquipContainerApi.batchUpdateDistrictApi(data)
+    }
+    ElMessage.success('修改成功')
+    getListPageFn()
+    batchEditLocationVisible.value = false
+  } catch {
+    ElMessage.error('修改失败')
+  } finally {
+    batchEditLocationLoading.value = false
+  }
+}
+
 // 管道:是否有效弹窗
 const isValidDialogVisible = ref(false)
 const isValidDialogLoading = ref(false)

+ 107 - 0
yudao-ui-admin-vue3/src/views/pressure/orderConfirm/detail.vue

@@ -729,6 +729,13 @@
         >
           <Icon icon="ep:edit" class="mr-5px" /> 批量修改约检联系人
         </el-button>
+        <el-button
+          type="primary"
+          @click="handleBatchEditLocationFn"
+          :disabled="selectedEquips.length === 0"
+        >
+          <Icon icon="ep:edit" class="mr-5px" /> 批量修改地址
+        </el-button>
        <el-button type="default" @click="handleExportFn">
          <el-icon size="16" class="mr-5px">
           <Download />
@@ -1311,6 +1318,38 @@
     <batchEditForm ref="batchEditFormRef" @success="() => handleEquipQuery(true)" />
     <EquipContainerForm ref="EquipContainerFormRef" />
     <FileUploadModal ref="fileUploadModalRef" @success="handleFileUploadSuccess" />
+
+    <!-- 批量修改地址弹窗 -->
+    <Dialog v-model="batchEditLocationVisible" title="批量修改地址">
+      <el-form
+        ref="batchEditLocationFormRef"
+        v-loading="formLoading"
+        :model="batchEditLocationFormData"
+        :rules="batchEditLocationFormRules"
+        label-width="140px"
+      >
+        <el-form-item label="设备所在行政区" prop="equipDistrict">
+          <AreaSelect
+            v-model="batchEditLocationFormData.equipDistrict"
+            :areaType="batchEditLocationFormData.areaType"
+            @area-type-change="changeArea"
+            @change="changeAddress"
+            placeholder="请选择设备所在行政区"
+          />
+        </el-form-item>
+        <el-form-item label="设备所在街道" prop="equipStreet">
+          <StreetSelect
+            v-model="batchEditLocationFormData.equipStreet"
+            :district-ids="[batchEditLocationFormData.equipDistrict]"
+            placeholder="请选择设备所在街道"
+          />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button :disabled="formLoading" type="primary" @click="batchEditLocationSubmitForm">批量修改</el-button>
+        <el-button @click="batchEditLocationVisible = false">取 消</el-button>
+      </template>
+    </Dialog>
   </div>
 
   <Dialog title="历史联系人信息" v-model="historyDialogVisible" align-center width="1100px">
@@ -1499,6 +1538,9 @@ import {
 } from '@/utils/constants'
 import { useEmitt } from '@/hooks/web/useEmitt'
 import { getUnitNewList, getUnitContacts } from '@/api/laboratory/unit'
+import { EquipContainerApi } from '@/api/pressure/equipcontainer'
+import { EquipBoilerSchedulingApi } from '@/api/pressure2/equipboilerscheduling'
+import { EquipPipeSchedulingApi } from '@/api/pressure2/pipescheduling'
 import { numberToChinese } from '@/utils/formatter'
 import UploadFile from './components/UploadFile.vue'
 import FileUploadModal from './components/ImportFile.vue'
@@ -1540,6 +1582,17 @@ const route = useRoute()
 const router = useRouter()
 const tagsViewStore = useTagsViewStore()
 const batchEditFormRef = ref()
+const batchEditLocationVisible = ref(false)
+const batchEditLocationFormRef = ref()
+const batchEditLocationFormData = ref({
+  areaType: '',
+  equipDistrict: '', // 设备所在行政区
+  equipStreet: '', // 设备所在街道
+})
+const batchEditLocationFormRules = reactive({
+  equipDistrict: [{ required: true, message: '请选择设备所在行政区', trigger: 'change' }],
+  equipStreet: [{ required: true, message: '请选择设备所在街道', trigger: 'change' }],
+})
 const dictStore = useDictStore()
 const getUnitEnterpriseType = computed(
   () => dictStore.getDictMap['system_client_unit_enterprise_type']
@@ -2210,6 +2263,60 @@ const handleBatchEditFn = () => {
   }
   batchEditFormRef.value.open(selectedEquips.value, '1')
 }
+/** 批量修改地址 - 打开弹窗 */
+const handleBatchEditLocationFn = async () => {
+  const selectRows = selectedEquips.value || []
+  if (!selectRows.length) {
+    return ElMessage.error('请选择要修改的设备')
+  }
+  formLoading.value = true
+  try {
+    // 使用第一个选中设备的地址信息预填表单
+    const firstEquip = selectRows[0]
+    batchEditLocationFormData.value.areaType = firstEquip.areaType || ''
+    batchEditLocationFormData.value.equipDistrict = firstEquip.equipDistrict || ''
+    batchEditLocationFormData.value.equipStreet = firstEquip.equipStreet || ''
+    batchEditLocationVisible.value = true
+  } finally {
+    formLoading.value = false
+  }
+}
+const changeArea = (areaType: 'all' | 'gz') => {
+  batchEditLocationFormData.value.areaType = areaType
+}
+const changeAddress = () => {
+  batchEditLocationFormData.value.equipStreet = null as any
+  setTimeout(() => {
+    batchEditLocationFormRef.value?.clearValidate(['equipStreet'])
+  }, 0)
+}
+const batchEditLocationSubmitForm = async () => {
+  if (!batchEditLocationFormRef.value) return
+  const valid = await batchEditLocationFormRef.value.validate()
+  if (!valid) return
+  formLoading.value = true
+  try {
+    const selectRows = selectedEquips.value || []
+    const data = {
+      ...batchEditLocationFormData.value,
+      ids: selectRows.map((item) => item.id)
+    }
+    // 根据设备类型调用不同的 API
+    const equipMainType = orderDetail.value?.equipMainType
+    if (equipMainType === 200) {
+      await EquipBoilerSchedulingApi.batchUpdateDistrict(data)
+    } else if (equipMainType === 300) {
+      await EquipPipeSchedulingApi.batchUpdateDistrict(data)
+    } else {
+      await EquipContainerApi.batchUpdateDistrictApi(data)
+    }
+    ElMessage.success('修改成功')
+    handleEquipQuery(true)
+    batchEditLocationVisible.value = false
+  } finally {
+    formLoading.value = false
+  }
+}
 const handleExportFn = async () => {
   loading.value = true
   try {

+ 75 - 0
yudao-ui-admin-vue3/src/views/pressure2/orderConfirm/boilerDetail.vue

@@ -495,6 +495,9 @@
               <el-button type="primary" @click="handleBatchEditFn" :disabled="selectedEquips.length === 0">
                 <Icon icon="ep:edit" class="mr-5px" /> 批量修改约检联系人
               </el-button>
+              <el-button type="primary" @click="handleBatchEditLocationFn" :disabled="selectedEquips.length === 0">
+                <Icon icon="ep:edit" class="mr-5px" /> 批量修改地址
+              </el-button>
             </el-form-item>
           </div>
         </el-form>
@@ -619,6 +622,21 @@
        <EquipContainerForm ref="EquipContainerFormRef" />
     <FileUploadModal ref="fileUploadModalRef" @success="handleFileUploadSuccess" />
 
+    <!-- 批量修改地址弹窗 -->
+    <el-dialog v-model="batchEditLocationVisible" title="批量修改地址" width="500px" :close-on-click-modal="false">
+      <el-form ref="batchEditLocationFormRef" :model="batchEditLocationFormData" :rules="batchEditLocationFormRules" label-width="140px">
+        <el-form-item label="设备所在行政区" prop="equipDistrict">
+          <AreaSelect v-model="batchEditLocationFormData.equipDistrict" :areaType="batchEditLocationFormData.areaType" @area-type-change="changeArea" @change="changeAddress" placeholder="请选择设备所在行政区" />
+        </el-form-item>
+        <el-form-item label="设备所在街道" prop="equipStreet">
+          <StreetSelect v-model="batchEditLocationFormData.equipStreet" :district-ids="[batchEditLocationFormData.equipDistrict]" placeholder="请选择设备所在街道" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button :loading="batchEditLocationLoading" @click="batchEditLocationVisible = false">取消</el-button>
+        <el-button type="primary" :loading="batchEditLocationLoading" @click="batchEditLocationSubmitForm">批量修改</el-button>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
@@ -629,6 +647,7 @@ import { ElMessage, ElMessageBox } from 'element-plus'
 import batchEditForm from '../planNew/components/batchEditForm.vue'
 import { BoilerAppointmentConfirmOrderApi, BoilerAppointmentConfirmOrderVO } from '@/api/pressure2/appointmentconfirmorder'
 import { EquipBoilerSchedulingEquipVO } from '@/api/pressure2/equipboilerscheduling'
+import { EquipBoilerSchedulingApi } from '@/api/pressure2/equipboilerscheduling'
 import dayjs from 'dayjs'
 import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
 import DeptSelect from '../../pressure2/equipboilerscheduling/components/DeptSelect.vue'
@@ -663,6 +682,19 @@ const tagsViewStore = useTagsViewStore()
 const userStore = useUserStoreWithOut()
 const batchEditFormRef = ref()
 
+const batchEditLocationVisible = ref(false)
+const batchEditLocationLoading = ref(false)
+const batchEditLocationFormRef = ref()
+const batchEditLocationFormData = ref({
+  areaType: '',
+  equipDistrict: '',
+  equipStreet: '',
+})
+const batchEditLocationFormRules = {
+  equipDistrict: [{ required: true, message: '请选择设备所在行政区', trigger: 'change' }],
+  equipStreet: [{ required: true, message: '请选择设备所在街道', trigger: 'change' }],
+}
+
 const orderDetail = ref<BoilerAppointmentConfirmOrderVO>()
 
 const checkTypeMap = PressureCheckTypeMap
@@ -1206,6 +1238,49 @@ const handleBatchEditFn = () => {
   }
   batchEditFormRef.value.open(selectedEquips.value, '1')
 }
+
+/** 批量修改地址 */
+const handleBatchEditLocationFn = () => {
+  if (selectedEquips.value.length === 0) {
+    ElMessage.warning('请先选择设备')
+    return
+  }
+  const firstEquip = selectedEquips.value[0]
+  batchEditLocationFormData.value.areaType = firstEquip.areaType || ''
+  batchEditLocationFormData.value.equipDistrict = firstEquip.equipDistrict || ''
+  batchEditLocationFormData.value.equipStreet = firstEquip.equipStreet || ''
+  batchEditLocationVisible.value = true
+}
+const changeArea = (areaType: 'all' | 'gz') => {
+  batchEditLocationFormData.value.areaType = areaType
+}
+const changeAddress = () => {
+  batchEditLocationFormData.value.equipStreet = null as any
+  setTimeout(() => {
+    batchEditLocationFormRef.value?.clearValidate(['equipStreet'])
+  }, 0)
+}
+const batchEditLocationSubmitForm = async () => {
+  if (!batchEditLocationFormRef.value) return
+  const valid = await batchEditLocationFormRef.value.validate()
+  if (!valid) return
+  batchEditLocationLoading.value = true
+  try {
+    const data = {
+      ...batchEditLocationFormData.value,
+      ids: selectedEquips.value.map((item: any) => item.id)
+    }
+    await EquipBoilerSchedulingApi.batchUpdateDistrict(data)
+    ElMessage.success('修改成功')
+    handleEquipQuery()
+    batchEditLocationVisible.value = false
+  } catch {
+    ElMessage.error('修改失败')
+  } finally {
+    batchEditLocationLoading.value = false
+  }
+}
+
 /** 确认拒绝约检 */
 const handleRejectConfirm = async (type) => {
   if (!rejectForm.value.reasonDict) {

+ 75 - 0
yudao-ui-admin-vue3/src/views/pressure2/orderConfirm/pipeDetail.vue

@@ -144,6 +144,9 @@
               <el-button type="primary" @click="handleBatchEditFn" :disabled="selectedRows.length === 0">
                 <Icon icon="ep:edit" class="mr-5px" /> 批量修改约检联系人
               </el-button>
+              <el-button type="primary" @click="handleBatchEditLocationFn" :disabled="selectedRows.length === 0">
+                <Icon icon="ep:edit" class="mr-5px" /> 批量修改地址
+              </el-button>
             </el-form-item>
           </div>
         </el-form>
@@ -662,6 +665,21 @@
        <EquipContainerForm ref="EquipContainerFormRef" />
     <FileUploadModal ref="fileUploadModalRef" @success="handleFileUploadSuccess" />
 
+    <!-- 批量修改地址弹窗 -->
+    <el-dialog v-model="batchEditLocationVisible" title="批量修改地址" width="500px" :close-on-click-modal="false">
+      <el-form ref="batchEditLocationFormRef" :model="batchEditLocationFormData" :rules="batchEditLocationFormRules" label-width="140px">
+        <el-form-item label="设备所在行政区" prop="equipDistrict">
+          <AreaSelect v-model="batchEditLocationFormData.equipDistrict" :areaType="batchEditLocationFormData.areaType" @area-type-change="changeArea" @change="changeAddress" placeholder="请选择设备所在行政区" />
+        </el-form-item>
+        <el-form-item label="设备所在街道" prop="equipStreet">
+          <StreetSelect v-model="batchEditLocationFormData.equipStreet" :district-ids="[batchEditLocationFormData.equipDistrict]" placeholder="请选择设备所在街道" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button :loading="batchEditLocationLoading" @click="batchEditLocationVisible = false">取消</el-button>
+        <el-button type="primary" :loading="batchEditLocationLoading" @click="batchEditLocationSubmitForm">批量修改</el-button>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
@@ -705,6 +723,7 @@ import {
   PipeEquipmentVO
 } from "@/api/pressure2/pipeequipment";
 import {PipeAppointmentConfirmOrderApi} from "@/api/pressure2/pipeappointmentconfirmorder";
+import { EquipPipeSchedulingApi } from "@/api/pressure2/pipescheduling";
 import {UserQualificationsApi} from "@/api/pressure2/userQualifications";
 import CheckerSelect, { type CheckerItem } from '@/views/pressure2/components/CheckerSelect'
 import { useUserStoreWithOut } from '@/store/modules/user'
@@ -716,6 +735,19 @@ const router = useRouter()
 const tagsViewStore = useTagsViewStore()
 const batchEditFormRef = ref()
 
+const batchEditLocationVisible = ref(false)
+const batchEditLocationLoading = ref(false)
+const batchEditLocationFormRef = ref()
+const batchEditLocationFormData = ref({
+  areaType: '',
+  equipDistrict: '',
+  equipStreet: '',
+})
+const batchEditLocationFormRules = {
+  equipDistrict: [{ required: true, message: '请选择设备所在行政区', trigger: 'change' }],
+  equipStreet: [{ required: true, message: '请选择设备所在街道', trigger: 'change' }],
+}
+
 const orderDetail = ref<BoilerAppointmentConfirmOrderVO>()
 
 const checkTypeMap = PressureCheckTypeMap
@@ -1498,6 +1530,49 @@ const handleBatchEditFn = () => {
   }
   batchEditFormRef.value.open(selectedRows.value, '1')
 }
+
+/** 批量修改地址 */
+const handleBatchEditLocationFn = () => {
+  if (selectedRows.value.length === 0) {
+    ElMessage.warning('请先选择设备')
+    return
+  }
+  const firstEquip = selectedRows.value[0]
+  batchEditLocationFormData.value.areaType = firstEquip.areaType || ''
+  batchEditLocationFormData.value.equipDistrict = firstEquip.equipDistrict || ''
+  batchEditLocationFormData.value.equipStreet = firstEquip.equipStreet || ''
+  batchEditLocationVisible.value = true
+}
+const changeArea = (areaType: 'all' | 'gz') => {
+  batchEditLocationFormData.value.areaType = areaType
+}
+const changeAddress = () => {
+  batchEditLocationFormData.value.equipStreet = null as any
+  setTimeout(() => {
+    batchEditLocationFormRef.value?.clearValidate(['equipStreet'])
+  }, 0)
+}
+const batchEditLocationSubmitForm = async () => {
+  if (!batchEditLocationFormRef.value) return
+  const valid = await batchEditLocationFormRef.value.validate()
+  if (!valid) return
+  batchEditLocationLoading.value = true
+  try {
+    const data = {
+      ...batchEditLocationFormData.value,
+      ids: selectedRows.value.map((item: any) => item.id)
+    }
+    await EquipPipeSchedulingApi.batchUpdateDistrict(data)
+    ElMessage.success('修改成功')
+    handleEquipQuery()
+    batchEditLocationVisible.value = false
+  } catch {
+    ElMessage.error('修改失败')
+  } finally {
+    batchEditLocationLoading.value = false
+  }
+}
+
 /** 确认拒绝约检 */
 const handleRejectConfirm = async (type) => {
   if (!rejectForm.value.reasonDict) {

+ 99 - 0
yudao-ui-admin-vue3/src/views/pressure2/planNew/boilerDetail.vue

@@ -190,6 +190,9 @@
         <el-button type="primary" @click="handleBatchEditFn" :disabled="selectedRows.length === 0">
           <Icon icon="ep:edit" class="mr-5px" /> 批量修改约检联系人
         </el-button>
+        <el-button type="primary" @click="handleBatchEditLocationFn" :disabled="selectedRows.length === 0">
+          <Icon icon="ep:edit" class="mr-5px" /> 批量修改地址
+        </el-button>
         <el-button type="primary" @click="() => handleToRoute('AcceptOrder1')">约检单</el-button>
         <el-button type="primary" @click="() => handleToRoute('TaskOrder')">任务单</el-button>
       </el-row>
@@ -415,6 +418,38 @@
   />
   <!--  约检弹框  -->
   <batchEditForm ref="formRef" @success="handleScheduleSuccess" />
+
+  <!-- 批量修改地址弹窗 -->
+  <Dialog v-model="batchEditLocationVisible" title="批量修改地址">
+    <el-form
+      ref="batchEditLocationFormRef"
+      v-loading="formLoading"
+      :model="batchEditLocationFormData"
+      :rules="batchEditLocationFormRules"
+      label-width="140px"
+    >
+      <el-form-item label="设备所在行政区" prop="equipDistrict">
+        <AreaSelect
+          v-model="batchEditLocationFormData.equipDistrict"
+          :areaType="batchEditLocationFormData.areaType"
+          @area-type-change="changeArea"
+          @change="changeAddress"
+          placeholder="请选择设备所在行政区"
+        />
+      </el-form-item>
+      <el-form-item label="设备所在街道" prop="equipStreet">
+        <StreetSelect
+          v-model="batchEditLocationFormData.equipStreet"
+          :district-ids="[batchEditLocationFormData.equipDistrict]"
+          placeholder="请选择设备所在街道"
+        />
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button :disabled="formLoading" type="primary" @click="batchEditLocationSubmitForm">批量修改</el-button>
+      <el-button @click="batchEditLocationVisible = false">取 消</el-button>
+    </template>
+  </Dialog>
 </template>
 
 <script setup lang="ts" name="PlanNewDetail">
@@ -472,6 +507,18 @@ const selectedTypeList = ref<StringDictDataType[]>([]) // 选中的容器归类
 const equipCategoryOptions = getStrDictOptions(DICT_TYPE.SYSTEM_EQUIP_CONTAINER_EQUIP_CATEGORY) // 容器分类字典选项
 const formRef = ref()
 const tableRef = ref()
+const formLoading = ref(false) // 表单加载中
+const batchEditLocationVisible = ref(false)
+const batchEditLocationFormRef = ref()
+const batchEditLocationFormData = ref({
+  areaType: '',
+  equipDistrict: '', // 设备所在行政区
+  equipStreet: '', // 设备所在街道
+})
+const batchEditLocationFormRules = reactive({
+  equipDistrict: [{ required: true, message: '请选择设备所在行政区', trigger: 'change' }],
+  equipStreet: [{ required: true, message: '请选择设备所在街道', trigger: 'change' }],
+})
 // 单位基本信息
 const unitInfo = ref({
   unitId: '',
@@ -702,6 +749,58 @@ const handleBatchEditFn = () => {
   formRef.value.open(selectedRows.value, '1')
 }
 
+/** 批量修改地址 - 打开弹窗 */
+const handleBatchEditLocationFn = async () => {
+  const selectRows = selectedRows.value || []
+  if (!selectRows.length) {
+    return ElMessage.error('请选择要修改的设备')
+  }
+  formLoading.value = true
+  try {
+    const params = {
+      id: selectRows[0]?.id
+    }
+    const res = await EquipBoilerSchedulingApi.getPlanSchedulingBoilersList(params)
+    const equip = res.list?.[0]
+    if (equip) {
+      batchEditLocationFormData.value.areaType = equip.areaType || ''
+      batchEditLocationFormData.value.equipDistrict = equip.equipDistrict || ''
+      batchEditLocationFormData.value.equipStreet = equip.equipStreet || ''
+    }
+    batchEditLocationVisible.value = true
+  } finally {
+    formLoading.value = false
+  }
+}
+const changeArea = (areaType: 'all' | 'gz') => {
+  batchEditLocationFormData.value.areaType = areaType
+}
+const changeAddress = () => {
+  batchEditLocationFormData.value.equipStreet = null as any
+  setTimeout(() => {
+    batchEditLocationFormRef.value?.clearValidate(['equipStreet'])
+  }, 0)
+}
+const batchEditLocationSubmitForm = async () => {
+  if (!batchEditLocationFormRef.value) return
+  const valid = await batchEditLocationFormRef.value.validate()
+  if (!valid) return
+  formLoading.value = true
+  try {
+    const selectRows = selectedRows.value || []
+    const data = {
+      ...batchEditLocationFormData.value,
+      ids: selectRows.map((item) => item.id)
+    }
+    await EquipBoilerSchedulingApi.batchUpdateDistrict(data)
+    ElMessage.success('修改成功')
+    handleQuery()
+    batchEditLocationVisible.value = false
+  } finally {
+    formLoading.value = false
+  }
+}
+
 /** 约检单/任务单 跳转查询 */
 const handleToRoute = (routeName: 'AcceptOrder1' | 'TaskOrder') => {
   const { unitName } = unref(currentCheckData) || {}

+ 99 - 0
yudao-ui-admin-vue3/src/views/pressure2/planNew/pipeDetail.vue

@@ -238,6 +238,9 @@
         <el-button type="primary" @click="handleBatchEditFn" :disabled="selectedRows.length === 0">
           <Icon icon="ep:edit" class="mr-5px" /> 批量修改约检联系人
         </el-button>
+        <el-button type="primary" @click="handleBatchEditLocationFn" :disabled="selectedRows.length === 0">
+          <Icon icon="ep:edit" class="mr-5px" /> 批量修改地址
+        </el-button>
         <el-button type="primary" @click="() => handleToRoute('AcceptOrder1')">约检单</el-button>
         <el-button type="primary" @click="() => handleToRoute('TaskOrder')">任务单</el-button>
       </el-row>
@@ -485,6 +488,38 @@
     @success="handleScheduleSuccess"
   />
   <PipeBatchEditForm ref="formRef" @success="handleScheduleSuccess" />
+
+  <!-- 批量修改地址弹窗 -->
+  <Dialog v-model="batchEditLocationVisible" title="批量修改地址">
+    <el-form
+      ref="batchEditLocationFormRef"
+      v-loading="formLoading"
+      :model="batchEditLocationFormData"
+      :rules="batchEditLocationFormRules"
+      label-width="140px"
+    >
+      <el-form-item label="设备所在行政区" prop="equipDistrict">
+        <AreaSelect
+          v-model="batchEditLocationFormData.equipDistrict"
+          :areaType="batchEditLocationFormData.areaType"
+          @area-type-change="changeArea"
+          @change="changeAddress"
+          placeholder="请选择设备所在行政区"
+        />
+      </el-form-item>
+      <el-form-item label="设备所在街道" prop="equipStreet">
+        <StreetSelect
+          v-model="batchEditLocationFormData.equipStreet"
+          :district-ids="[batchEditLocationFormData.equipDistrict]"
+          placeholder="请选择设备所在街道"
+        />
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button :disabled="formLoading" type="primary" @click="batchEditLocationSubmitForm">批量修改</el-button>
+      <el-button @click="batchEditLocationVisible = false">取 消</el-button>
+    </template>
+  </Dialog>
 </template>
 
 <script setup lang="ts" name="PlanNewDetail">
@@ -548,6 +583,18 @@ const planScheduleEquipPipeDialogRef = ref<InstanceType<typeof PlanScheduleEquip
 const selectedTypeList = ref<StringDictDataType[]>([]) // 选中的容器归类
 
 const formRef = ref()
+const formLoading = ref(false) // 表单加载中
+const batchEditLocationVisible = ref(false)
+const batchEditLocationFormRef = ref()
+const batchEditLocationFormData = ref({
+  areaType: '',
+  equipDistrict: '', // 设备所在行政区
+  equipStreet: '', // 设备所在街道
+})
+const batchEditLocationFormRules = reactive({
+  equipDistrict: [{ required: true, message: '请选择设备所在行政区', trigger: 'change' }],
+  equipStreet: [{ required: true, message: '请选择设备所在街道', trigger: 'change' }],
+})
 // 单位基本信息
 const unitInfo = ref({
   unitId: '',
@@ -990,6 +1037,58 @@ const handleBatchEditFn = () => {
   formRef.value.open(selectedRows.value, '1')
 }
 
+/** 批量修改地址 - 打开弹窗 */
+const handleBatchEditLocationFn = async () => {
+  const selectRows = selectedRows.value || []
+  if (!selectRows.length) {
+    return ElMessage.error('请选择要修改的设备')
+  }
+  formLoading.value = true
+  try {
+    const params = {
+      id: selectRows[0]?.id
+    }
+    const res = await EquipPipeSchedulingApi.getPlanSchedulingPipesList(params)
+    const equip = res.list?.[0]
+    if (equip) {
+      batchEditLocationFormData.value.areaType = equip.areaType || ''
+      batchEditLocationFormData.value.equipDistrict = equip.equipDistrict || ''
+      batchEditLocationFormData.value.equipStreet = equip.equipStreet || ''
+    }
+    batchEditLocationVisible.value = true
+  } finally {
+    formLoading.value = false
+  }
+}
+const changeArea = (areaType: 'all' | 'gz') => {
+  batchEditLocationFormData.value.areaType = areaType
+}
+const changeAddress = () => {
+  batchEditLocationFormData.value.equipStreet = null as any
+  setTimeout(() => {
+    batchEditLocationFormRef.value?.clearValidate(['equipStreet'])
+  }, 0)
+}
+const batchEditLocationSubmitForm = async () => {
+  if (!batchEditLocationFormRef.value) return
+  const valid = await batchEditLocationFormRef.value.validate()
+  if (!valid) return
+  formLoading.value = true
+  try {
+    const selectRows = selectedRows.value || []
+    const data = {
+      ...batchEditLocationFormData.value,
+      ids: selectRows.map((item) => item.id)
+    }
+    await EquipPipeSchedulingApi.batchUpdateDistrict(data)
+    ElMessage.success('修改成功')
+    handleQuery()
+    batchEditLocationVisible.value = false
+  } finally {
+    formLoading.value = false
+  }
+}
+
 /** 约检单/任务单 跳转查询 */
 const handleToRoute = (routeName: 'AcceptOrder1' | 'TaskOrder') => {
   const { unitName } = unref(currentCheckData) || {}