一大波修改
This commit is contained in:
		
							parent
							
								
									ab7d436744
								
							
						
					
					
						commit
						3d64c5fcb7
					
				| @ -173,11 +173,11 @@ const crudOptions = reactive({ | ||||
|       icon: 'view', | ||||
|       event: ({ row }) => handleView(row), | ||||
|     }, | ||||
|     { | ||||
|       name: '编辑', | ||||
|       icon: 'edit', | ||||
|       event: ({ row }) => handleEdit(row), | ||||
|     }, | ||||
|     // { | ||||
|     //   name: '编辑', | ||||
|     //   icon: 'edit', | ||||
|     //   event: ({ row }) => handleEdit(row), | ||||
|     // }, | ||||
|     { | ||||
|       type: 'danger', | ||||
|       name: '删除', | ||||
| @ -232,23 +232,23 @@ const handleDelete = async (row) => { | ||||
| 
 | ||||
| const handleSubmit = async () => { | ||||
|   console.log('提交表单:', formData.value); | ||||
|   try { | ||||
|     if (dialogTitle.value === '新增网格') { | ||||
|       await createGrid(formData.value); | ||||
|       ElMessage.success('新增成功'); | ||||
|       resetForm(); | ||||
|       visible.value = false; | ||||
|       getData(); | ||||
|     } else { | ||||
|       await updateGrid(formData.value); | ||||
|       ElMessage.success('更新成功'); | ||||
|       resetForm(); | ||||
|       visible.value = false; | ||||
|       getData(); | ||||
|     } | ||||
|   } catch (error) { | ||||
|     ElMessage.error(error.message || '新增失败,请重试'); | ||||
|   } | ||||
|   // try { | ||||
|   //   if (dialogTitle.value === '新增网格') { | ||||
|   //     await createGrid(formData.value); | ||||
|   //     ElMessage.success('新增成功'); | ||||
|   //     resetForm(); | ||||
|   //     visible.value = false; | ||||
|   //     getData(); | ||||
|   //   } else { | ||||
|   //     await updateGrid(formData.value); | ||||
|   //     ElMessage.success('更新成功'); | ||||
|   //     resetForm(); | ||||
|   //     visible.value = false; | ||||
|   //     getData(); | ||||
|   //   } | ||||
|   // } catch (error) { | ||||
|   //   ElMessage.error(error.message || '新增失败,请重试'); | ||||
|   // } | ||||
| }; | ||||
| 
 | ||||
| // --------------------------------------------------------------------- | ||||
|  | ||||
| @ -127,11 +127,8 @@ const filterObject = (obj) => { | ||||
| const crudData = ref([]); | ||||
| const crudOptions = reactive({ | ||||
|   ...CRUD_OPTIONS, | ||||
|   addBtn: false, | ||||
|   header: false, | ||||
|   searchBtn: false, | ||||
|   emptyBtn: false, | ||||
|   refreshBtn: false, | ||||
|   menu: false, | ||||
|   height: 'calc(100vh - 360px)', | ||||
|   column: [ | ||||
|     { label: '地块编号', prop: 'id', width: 160 }, | ||||
| @ -227,23 +224,23 @@ const handleDelete = async (row) => { | ||||
| 
 | ||||
| const handleSubmit = async () => { | ||||
|   console.log('提交表单:', formData.value); | ||||
|   try { | ||||
|     if (dialogTitle.value === '新增网格') { | ||||
|       await createGrid(formData.value); | ||||
|       ElMessage.success('新增成功'); | ||||
|       resetForm(); | ||||
|       visible.value = false; | ||||
|       getData(); | ||||
|     } else { | ||||
|       await updateGrid(formData.value); | ||||
|       ElMessage.success('更新成功'); | ||||
|       resetForm(); | ||||
|       visible.value = false; | ||||
|       getData(); | ||||
|     } | ||||
|   } catch (error) { | ||||
|     ElMessage.error(error.message || '新增失败,请重试'); | ||||
|   } | ||||
|   // try { | ||||
|   //   if (dialogTitle.value === '新增网格') { | ||||
|   //     await createGrid(formData.value); | ||||
|   //     ElMessage.success('新增成功'); | ||||
|   //     resetForm(); | ||||
|   //     visible.value = false; | ||||
|   //     getData(); | ||||
|   //   } else { | ||||
|   //     await updateGrid(formData.value); | ||||
|   //     ElMessage.success('更新成功'); | ||||
|   //     resetForm(); | ||||
|   //     visible.value = false; | ||||
|   //     getData(); | ||||
|   //   } | ||||
|   // } catch (error) { | ||||
|   //   ElMessage.error(error.message || '新增失败,请重试'); | ||||
|   // } | ||||
| }; | ||||
| 
 | ||||
| // --------------------------------------------------------------------- | ||||
|  | ||||
| @ -1,178 +1,136 @@ | ||||
| <template> | ||||
|   <div class="custom-page"> | ||||
|     <h1>林地</h1> | ||||
|     <LandSearch :search="searchForm" @on-search="handleSearch" @on-reset="handleReset" /> | ||||
|     <!-- 搜索 --> | ||||
|     <el-form :inline="true" :model="searchForm" class="search-bar"> | ||||
|       <el-form-item label="关键词"> | ||||
|         <el-input v-model="searchForm.name" placeholder="请输入关键词" clearable /> | ||||
|       </el-form-item> | ||||
|       <el-form-item lable=""> | ||||
|         <AreaCascader v-model:region-code="searchForm.regionCode" v-model:grid-id="searchForm.id" :width="600" /> | ||||
|       </el-form-item> | ||||
|       <el-form-item> | ||||
|         <el-button type="primary" @click="handleSearch"> 搜索 </el-button> | ||||
|         <el-button @click="resetSearch"> 重置 </el-button> | ||||
|       </el-form-item> | ||||
|     </el-form> | ||||
|     <!-- 四个固定 Tabs --> | ||||
|     <el-tabs v-model="activeTab" @tab-click="handleTabChange"> | ||||
|       <!-- <el-tab-pane label="待提交" name="0" /> --> | ||||
|       <el-tab-pane label="待审核" name="1" /> | ||||
|       <el-tab-pane label="已通过" name="2" /> | ||||
|       <el-tab-pane label="已驳回" name="0" /> | ||||
|     </el-tabs> | ||||
|     <TableComponent | ||||
|       :loading="loading" | ||||
|       :columns="columns" | ||||
|       :table-data="tableData" | ||||
|       :current-page="pageData.currentPage" | ||||
|       :page-size="pageData.pageSize" | ||||
|       :total="pageData.total" | ||||
|       :show-pagination="true" | ||||
|       :show-border="true" | ||||
|       :show-sort="true" | ||||
|       style="height: calc(100vh - 320px)" | ||||
|       @page-change="handlePageChange" | ||||
|     <avue-crud | ||||
|       ref="crudRef" | ||||
|       v-model:page="pageData" | ||||
|       :data="crudData" | ||||
|       :option="crudOptions" | ||||
|       :table-loading="loading" | ||||
|       @current-change="handleCurrentChange" | ||||
|       @size-change="handleSizeChange" | ||||
|     > | ||||
|       <template #action="scope"> | ||||
|         <!-- <el-button size="small" @click="handleEdit(scope.row)">编辑</el-button> | ||||
|         <el-button size="small" type="danger" @click="handleDelete(scope.row)">删除</el-button> --> | ||||
|         <custom-table-operate :actions="getActions(scope.row)" :data="scope" /> | ||||
|       <!-- <template #menu-left> | ||||
|         <el-button type="primary" icon="Plus" @click="handleAdd">新增网格</el-button> | ||||
|       </template> --> | ||||
|       <template #menu="scope"> | ||||
|         <custom-table-operate :actions="crudOptions.actions" :data="scope" /> | ||||
|       </template> | ||||
|     </TableComponent> | ||||
|     </avue-crud> | ||||
|     <el-dialog :key="dialogTitle" v-model="visible" :title="dialogTitle" width="60%" align-center :draggable="true"> | ||||
|       <el-tabs v-model="activeFormTab" class="tabs-wrapper"> | ||||
|         <el-tab-pane label="土地基本信息" name="basic"> | ||||
|           <p class="form-title">基本信息</p> | ||||
|           <el-form ref="basicFormRef" :model="formData" :disabled="isReadonly" label-width="120px"> | ||||
|             <el-row :gutter="20"> | ||||
|               <el-col :span="12"> | ||||
|                 <el-form-item label="地块名称" prop="landName"> | ||||
|                   <el-input v-model="formData.landName" placeholder="请输入地块名称" /> | ||||
|       <el-form ref="form" :model="formData" :rules="rules" :disabled="isReadonly" label-width="100px" class="form-item"> | ||||
|         <p class="form-title">填写网格信息</p> | ||||
|         <el-form-item label="网格名称" prop="gridName"> | ||||
|           <el-input v-model="formData.gridName" placeholder="请输入网格名称" /> | ||||
|         </el-form-item> | ||||
|                 <el-form-item label="土地类型" prop="landType"> | ||||
|                   <el-tree-select | ||||
|                     v-model="formData.landType" | ||||
|                     :data="landTypeOptions" | ||||
|                     :props="treeProps" | ||||
|                     placeholder="选择土地类型" | ||||
|                     clearable | ||||
|                     check-strictly | ||||
|                     :render-after-expand="false" | ||||
|                   /> | ||||
|         <el-form-item label="所属行政区域" prop="gridAreaCode"> | ||||
|           <AreaSelect v-model="formData.gridAreaCode" :label="null" :emit-path="false" /> | ||||
|         </el-form-item> | ||||
|                 <el-form-item label="具体位置" prop="address"> | ||||
|                   <el-input v-model="formData.address" placeholder="请输入具体位置" /> | ||||
|         <el-form-item label="网格化地图" prop="scopeImg"> | ||||
|           <FileUploader v-model="formData.scopeImg" :limit="1" /> | ||||
|         </el-form-item> | ||||
|                 <el-form-item label="土壤类型" prop="soilTypeId"> | ||||
|                   <url-select | ||||
|                     v-model="formData.soilTypeId" | ||||
|                     placeholder="选择土壤类型" | ||||
|                     url="/land-resource/baseInfo/soilTypePage" | ||||
|                     :params="{ current: 1, size: 100 }" | ||||
|                     label-key="soilType" | ||||
|                     value-key="id" | ||||
|                     :clearable="true" | ||||
|                   /> | ||||
|         <el-form-item label="备注" prop="note"> | ||||
|           <el-input v-model="formData.note" placeholder="请输入备注" /> | ||||
|         </el-form-item> | ||||
|                 <el-form-item label="土地照片" prop="landUrl"> | ||||
|                   <FileUploader v-model="formData.landUrl" :limit="1" /> | ||||
|                 </el-form-item> | ||||
|               </el-col> | ||||
|               <el-col :span="12"> | ||||
|                 <el-form-item label="面积(亩)" prop="area"> | ||||
|                   <el-input-number v-model="formData.area" :min="0" :precision="2" :step="0.1" controls-position="right" style="width: 100%" /> | ||||
|                 </el-form-item> | ||||
| 
 | ||||
|                 <el-form-item label="" label-width="0" prop="gridId"> | ||||
|                   <AreaCascader v-model:region-code="formData.gridAreaCode" v-model:grid-id="formData.gridId" label="" :split-rows="true" /> | ||||
|                 </el-form-item> | ||||
| 
 | ||||
|                 <el-form-item label="土地范围" prop="scope"> | ||||
|                   <el-input v-model="formData.scope" placeholder="请输入土地范围" /> | ||||
|                   <!-- <Attrs v-model:attrs="formData.scope" type="add" accept="image/*" /> --> | ||||
|                 </el-form-item> | ||||
|               </el-col> | ||||
|             </el-row> | ||||
|       </el-form> | ||||
|         </el-tab-pane> | ||||
|         <el-tab-pane label="土地承包信息" name="property"> | ||||
|           <p class="form-title">承包信息</p> | ||||
|           <el-form ref="propertyFormRef" :model="formData" :disabled="isReadonly" label-width="150px"> | ||||
|             <el-row :gutter="20"> | ||||
|               <el-col :span="12"> | ||||
|                 <el-form-item label="土地承包经营权人" prop="propertyName"> | ||||
|                   <el-input v-model="formData.propertyName" placeholder="请输入产权人姓名" /> | ||||
|                 </el-form-item> | ||||
|                 <el-form-item label="联系方式" prop="propertyPhone"> | ||||
|                   <el-input v-model="formData.propertyPhone" placeholder="请输入产权人联系方式" /> | ||||
|                 </el-form-item> | ||||
|                 <el-form-item label="土地经营权证书编号" prop="landCode"> | ||||
|                   <el-input v-model="formData.landCode" placeholder="请输入产权编号" /> | ||||
|                 </el-form-item> | ||||
|                 <el-form-item label="土地经营权证书" prop="propertyCertificateUrl"> | ||||
|                   <FileUploader v-model="formData.propertyCertificateUrl" :limit="1" /> | ||||
|                 </el-form-item> | ||||
|               </el-col> | ||||
|               <!-- <el-col :span="12"></el-col> --> | ||||
|             </el-row> | ||||
|           </el-form> | ||||
|         </el-tab-pane> | ||||
|         <el-tab-pane label="土地流转信息" name="use"> | ||||
|           <p class="form-title">流转信息</p> | ||||
|           <el-form ref="useForm" :model="formData" label-width="120px"> | ||||
|             <el-row> | ||||
|               <el-col :span="12"> | ||||
|                 <el-form-item label="是否土地流转" prop="landTransfer"> | ||||
|                   <el-radio-group v-model="formData.landTransfer" :disabled="isReadonly"> | ||||
|                     <el-radio label="1">是</el-radio> | ||||
|                     <el-radio label="0">否</el-radio> | ||||
|                   </el-radio-group> | ||||
|                 </el-form-item> | ||||
|                 <el-form-item v-if="formData.landTransfer === '1'" label="土地受让方" prop="landUseName"> | ||||
|                   <el-input v-model="formData.landUseName" placeholder="请输入土地受让方" /> | ||||
|                 </el-form-item> | ||||
|                 <el-form-item v-if="formData.landTransfer === '1'" label="联系电话" prop="landUsePhone"> | ||||
|                   <el-input v-model="formData.landUsePhone" placeholder="请输入土地受让方联系方式" /> | ||||
|                 </el-form-item> | ||||
|                 <el-form-item v-if="formData.landTransfer === '1'" label="流转合同" prop="landCertificateUrl"> | ||||
|                   <FileUploader v-model="formData.landCertificateUrl" :limit="1" /> | ||||
|                 </el-form-item> | ||||
|               </el-col> | ||||
|             </el-row> | ||||
|           </el-form> | ||||
|         </el-tab-pane> | ||||
|       </el-tabs> | ||||
| 
 | ||||
|       <template #footer> | ||||
|         <span class="dialog-footer"> | ||||
|           <el-button @click="visible = false">取消</el-button> | ||||
|           <template v-if="!isReadonly"> | ||||
|             <el-button type="primary" @click="submitAll">修改</el-button> | ||||
|           </template> | ||||
|         </span> | ||||
|         <div class="dialog-footer"> | ||||
|           <el-button @click="handleCancel">取消</el-button> | ||||
|           <el-button v-if="!isReadonly" type="primary" @click="handleSubmit()"> 保存 </el-button> | ||||
|         </div> | ||||
|       </template> | ||||
|     </el-dialog> | ||||
|   </div> | ||||
| </template> | ||||
| 
 | ||||
| <script setup> | ||||
| import { ref, onMounted } from 'vue'; | ||||
| import LandSearch from './components/LandSearch.vue'; | ||||
| import TableComponent from '@/components/tableComponent.vue'; | ||||
| // --------------------------------------------------------------------- | ||||
| // avue-crud 通用代码 | ||||
| // --------------------------------------------------------------------- | ||||
| import { ref, reactive, watch, onMounted, computed, nextTick } from 'vue'; | ||||
| import { CRUD_OPTIONS } from '@/config'; | ||||
| import { ElMessage, ElMessageBox } from 'element-plus'; | ||||
| import { useUserStore } from '@/store/modules/user'; | ||||
| import { mockData } from './landData'; | ||||
| 
 | ||||
| const searchForm = ref({}); | ||||
| const handleSearch = (searchData) => { | ||||
|   // 使用搜索条件 | ||||
|   console.log(searchData); | ||||
| }; | ||||
| 
 | ||||
| const handleReset = () => { | ||||
|   // 重置后的逻辑 | ||||
| }; | ||||
| 
 | ||||
| const activeTab = ref('1'); | ||||
| const handleTabChange = ({ name }) => { | ||||
|   //   activeTab.value = name; | ||||
|   console.log('切换tab', activeTab.value); | ||||
|   getData(); | ||||
| }; | ||||
| const UserStore = useUserStore(); | ||||
| const user = UserStore.getUserInfo(); | ||||
| console.log('admin 属性:', user.admin); | ||||
| 
 | ||||
| const loading = ref(false); | ||||
| const tableData = ref([]); | ||||
| 
 | ||||
| const visible = ref(false); | ||||
| const isReadonly = ref(false); | ||||
| const dialogTitle = ref(); | ||||
| const activeTab = ref('1'); | ||||
| const formData = ref({ | ||||
|   gridName: '', | ||||
|   gridAreaCode: '', | ||||
|   scope: '', | ||||
|   scopeImg: '', | ||||
|   note: '', | ||||
| }); | ||||
| const initialFormData = { ...formData.value }; | ||||
| const resetForm = () => { | ||||
|   formData.value = { ...initialFormData }; | ||||
| }; | ||||
| 
 | ||||
| const pageData = ref({ | ||||
|   currentPage: 1, | ||||
|   pageSize: 10, | ||||
|   total: 0, | ||||
| }); | ||||
| const columns = ref([ | ||||
| const searchForm = ref({ | ||||
|   gridName: '', | ||||
|   keyword: '', | ||||
|   regionCode: '', | ||||
|   id: '', | ||||
|   status: -1, | ||||
| }); | ||||
| const initialSearchForm = { ...searchForm.value }; | ||||
| const resetSearch = () => { | ||||
|   searchForm.value = { ...initialSearchForm }; | ||||
| }; | ||||
| // 过滤对象,只保留有值的属性 | ||||
| const filterObject = (obj) => { | ||||
|   const newObj = {}; | ||||
|   Object.keys(obj).forEach((key) => { | ||||
|     const value = obj[key]; | ||||
|     // 检查值是否有效,排除空字符串、null 和 undefined | ||||
|     if (value !== '' && value !== null && value !== undefined) { | ||||
|       newObj[key] = value; | ||||
|     } | ||||
|   }); | ||||
|   return newObj; | ||||
| }; | ||||
| 
 | ||||
| const crudData = ref([]); | ||||
| const crudOptions = reactive({ | ||||
|   ...CRUD_OPTIONS, | ||||
|   header: false, | ||||
|   menu: false, | ||||
|   height: 'calc(100vh - 360px)', | ||||
|   column: [ | ||||
|     { label: '地块编号', prop: 'id', width: 160 }, | ||||
|     { label: '地块名称', prop: 'landName', width: 170 }, | ||||
|     { label: '面积', prop: 'area', formatter: (row, column, cellValue) => `${Number(cellValue).toFixed(2)} 亩` }, | ||||
| @ -184,7 +142,7 @@ const columns = ref([ | ||||
|     { label: '土地承包经营人', prop: 'propertyName' }, | ||||
|     { label: '联系电话', prop: 'propertyPhone' }, | ||||
|     { label: '土地经营权证书编号', prop: 'landCode', width: 160 }, | ||||
|   { label: '是否土地流转', prop: 'isTransfer', formatter: (row, column, cellValue) => (cellValue === 1 ? '是' : '否') }, | ||||
|     { label: '是否土地流转', prop: 'isTransfer' }, | ||||
|     { label: '土地受让方', prop: 'transferName' }, | ||||
|     { label: '受让方联系电话', prop: 'transferPhone', width: 100 }, | ||||
|     { label: '流转合同', prop: 'transferContract' }, | ||||
| @ -194,10 +152,8 @@ const columns = ref([ | ||||
|     // { label: '信息更新人', prop: 'updateName' }, | ||||
|     // { label: '信息更新单位', prop: 'updateGroup' }, | ||||
|     { label: '信息更新时间', prop: 'updateTime' }, | ||||
|   { label: '操作', prop: 'action', slotName: 'action', fixed: 'right' }, | ||||
| ]); | ||||
| 
 | ||||
| const actions = [ | ||||
|   ], | ||||
|   actions: [ | ||||
|     { | ||||
|       name: '查看', | ||||
|       icon: 'view', | ||||
| @ -212,20 +168,36 @@ const actions = [ | ||||
|       type: 'danger', | ||||
|       name: '删除', | ||||
|       icon: 'delete', | ||||
|     event: ({ row }) => handleDelete(row.id), | ||||
|       event: ({ row }) => handleDelete(row), | ||||
|     }, | ||||
| ]; | ||||
| const handleView = async (row) => { | ||||
|   ], | ||||
| }); | ||||
| const handleTabChange = ({ name }) => { | ||||
|   //   activeTab.value = name; | ||||
|   console.log('切换tab', activeTab.value); | ||||
|   getData(); | ||||
| }; | ||||
| const handleRefresh = async () => { | ||||
|   searchForm.value = { ...initialSearchForm }; | ||||
|   getData(); | ||||
| }; | ||||
| const handleCurrentChange = (val) => { | ||||
|   pageData.value.currentPage = val; | ||||
| }; | ||||
| const handleSizeChange = (val) => { | ||||
|   pageData.value.pageSize = val; | ||||
| }; | ||||
| const handleView = (row) => { | ||||
|   isReadonly.value = true; | ||||
|   formData.value = await getLandDetail(row.id); | ||||
|   formData.value = { ...row }; | ||||
|   dialogTitle.value = '查看网格'; | ||||
|   visible.value = true; | ||||
|   //   visible.value = true; | ||||
| }; | ||||
| const handleEdit = (row) => { | ||||
|   isReadonly.value = false; | ||||
|   formData.value = { ...row }; | ||||
|   dialogTitle.value = '编辑网格'; | ||||
|   visible.value = true; | ||||
|   //   visible.value = true; | ||||
| }; | ||||
| const handleDelete = async (row) => { | ||||
|   console.log('删除', row); | ||||
| @ -250,127 +222,105 @@ const handleDelete = async (row) => { | ||||
|   //   } | ||||
| }; | ||||
| 
 | ||||
| const handlePageChange = ({ page, pageSize }) => { | ||||
|   pageData.value.currentPage = page; | ||||
|   pageData.value.pageSize = pageSize; | ||||
|   getData(); | ||||
| }; | ||||
| 
 | ||||
| const visible = ref(false); | ||||
| const isReadonly = ref(false); | ||||
| const dialogTitle = ref(); | ||||
| const activeFormTab = ref('basic'); | ||||
| const formData = ref({ | ||||
|   gridName: '', | ||||
|   gridAreaCode: '', | ||||
|   scope: '', | ||||
|   scopeImg: '', | ||||
|   note: '', | ||||
| }); | ||||
| const initialFormData = { ...formData.value }; | ||||
| const resetForm = () => { | ||||
|   formData.value = { ...initialFormData }; | ||||
| }; | ||||
| 
 | ||||
| import { mockData } from './landData'; | ||||
| import { createLand, deleteLand, editLand, fetchLandList, getLandById, approveLand } from '@/apis/landResourceManagement/landManagement'; | ||||
| import request from '@/utils/axios'; | ||||
| const getData = async () => { | ||||
|   loading.value = true; | ||||
|   const requestData = { | ||||
|     ...searchForm.value, | ||||
|     page: pageData.value.currentPage, | ||||
|     size: pageData.value.pageSize, | ||||
|     landStatus: activeTab.value, | ||||
|     landTypeName: '草地', | ||||
|   }; | ||||
|   const response = await fetchLandList(requestData); | ||||
|   tableData.value = Array.isArray(response.data.records) ? response.data.records : []; | ||||
|   pageData.value.total = tableData.value.length; | ||||
|   loading.value = false; | ||||
| }; | ||||
| const getLandDetail = async (id) => { | ||||
|   const response = await getLandById(id); | ||||
|   return response.data; | ||||
| }; | ||||
| const landTypeOptions = ref([]); | ||||
| const treeProps = ref({ | ||||
|   value: 'id', | ||||
|   label: 'landType', | ||||
|   children: 'children', | ||||
|   // disabled: (data) => { | ||||
|   //   return data.children && data.children.length > 0; | ||||
|   // }, | ||||
| }); | ||||
| const fetchLandTypeData = async () => { | ||||
| const handleSubmit = async () => { | ||||
|   console.log('提交表单:', formData.value); | ||||
|   try { | ||||
|     const response = await request.get('/land-resource/baseInfo/landTree', { params: { status: '1' } }); | ||||
|     if (response.code === 200) { | ||||
|       landTypeOptions.value = response.data; | ||||
|     if (dialogTitle.value === '新增网格') { | ||||
|       await createGrid(formData.value); | ||||
|       ElMessage.success('新增成功'); | ||||
|       resetForm(); | ||||
|       visible.value = false; | ||||
|       getData(); | ||||
|     } else { | ||||
|       await updateGrid(formData.value); | ||||
|       ElMessage.success('更新成功'); | ||||
|       resetForm(); | ||||
|       visible.value = false; | ||||
|       getData(); | ||||
|     } | ||||
|   } catch (error) { | ||||
|     console.error('获取土地类型数据失败', error); | ||||
|     ElMessage.error(error.message || '新增失败,请重试'); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| // --------------------------------------------------------------------- | ||||
| // 业务代码 | ||||
| // --------------------------------------------------------------------- | ||||
| import { createGrid, updateGrid, deleteGrid, fetchGridList, getGridDetail, exportGrid } from '@/apis/landResourceManagement/gridManagement'; | ||||
| 
 | ||||
| onMounted(() => { | ||||
|   getData(); | ||||
|   fetchLandTypeData(); | ||||
| }); | ||||
| const getData = async () => { | ||||
|   //   const filteredParams = filterObject(searchForm.value); | ||||
|   //   const response = await fetchGridList(filteredParams); | ||||
|   //   crudData.value = Array.isArray(response.data.records) ? response.data.records : []; | ||||
|   loading.value = true; | ||||
|   // 模拟接口延迟 | ||||
|   await new Promise((resolve) => setTimeout(resolve, 300)); | ||||
|   crudData.value = mockData | ||||
|     .filter((item) => item.status === activeTab.value) | ||||
|     .map((item) => ({ | ||||
|       ...item, | ||||
|       landTypeName: '林地', | ||||
|     })); | ||||
|   pageData.value.total = crudData.value.length; | ||||
|   loading.value = false; | ||||
| }; | ||||
| 
 | ||||
| const handleAdd = () => { | ||||
|   console.log('handleAdd'); | ||||
|   resetForm(); | ||||
|   isReadonly.value = false; | ||||
|   dialogTitle.value = '新增网格'; | ||||
|   visible.value = true; | ||||
| }; | ||||
| 
 | ||||
| const handleSearch = () => { | ||||
|   getData(); | ||||
| }; | ||||
| const handleCancel = () => { | ||||
|   visible.value = false; | ||||
| }; | ||||
| </script> | ||||
| 
 | ||||
| <style scoped lang="scss"> | ||||
| .custom-page { | ||||
|   display: flex; | ||||
|   flex-direction: column; | ||||
|   padding-bottom: 0px; | ||||
| } | ||||
| h1 { | ||||
|   font-size: 20px; | ||||
|   font-weight: bold; | ||||
|   margin-bottom: 20px; | ||||
| } | ||||
| .tabs-wrapper { | ||||
|   width: 100%; | ||||
|   display: flex; | ||||
|   align-items: center; | ||||
|   // background-color: #7daaaa; | ||||
| 
 | ||||
|   .el-tabs__header { | ||||
|     width: 100%; | ||||
| 
 | ||||
|     .el-tabs__nav-scroll { | ||||
|       display: flex; | ||||
|       justify-content: center; | ||||
| .search-bar { | ||||
|   padding-left: 20px; | ||||
| } | ||||
| 
 | ||||
|     .el-tabs__item { | ||||
|       font-size: 16px; | ||||
|       color: #555555; | ||||
|       font-weight: 500; | ||||
|     } | ||||
|   } | ||||
|   :deep(.el-tabs__content) { | ||||
| :deep(.el-dialog__body) { | ||||
|   padding: 20px; | ||||
|     // background-color: #af8686; | ||||
|     border-radius: 4px; | ||||
|     width: 80%; | ||||
|     height: calc(100vh - 400px); | ||||
|   height: calc(100vh - 300px); | ||||
|   overflow-y: auto; | ||||
| 
 | ||||
|     .el-tab-pane { | ||||
|       margin: 0 auto; | ||||
|       width: 100%; | ||||
|       // background-color: #555555; | ||||
| } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| .form-title { | ||||
|   font-size: 16px; | ||||
|   font-weight: 500; | ||||
|   margin: 30px 0; | ||||
|   color: #333333; | ||||
| } | ||||
| 
 | ||||
| .form-item { | ||||
|   width: 500px; | ||||
|   margin: 0 auto; | ||||
| } | ||||
| .dialog-footer { | ||||
|   display: block; | ||||
|   text-align: center; | ||||
| } | ||||
| .custom-search { | ||||
|   display: flex; | ||||
|   align-items: center; | ||||
|   padding-left: 20px; | ||||
| 
 | ||||
|   .el-button { | ||||
|     margin-left: 12px; | ||||
|   } | ||||
| } | ||||
| </style> | ||||
|  | ||||
| @ -1,329 +0,0 @@ | ||||
| <template> | ||||
|   <div class="custom-page"> | ||||
|     <h1>林地</h1> | ||||
|     <!-- 搜索 --> | ||||
|     <el-form :inline="true" :model="searchForm" class="search-bar"> | ||||
|       <el-form-item label="关键词"> | ||||
|         <el-input v-model="searchForm.name" placeholder="请输入关键词" clearable /> | ||||
|       </el-form-item> | ||||
|       <el-form-item lable=""> | ||||
|         <AreaCascader v-model:region-code="searchForm.regionCode" v-model:grid-id="searchForm.id" :width="600" /> | ||||
|       </el-form-item> | ||||
|       <el-form-item> | ||||
|         <el-button type="primary" @click="handleSearch"> 搜索 </el-button> | ||||
|         <el-button @click="resetSearch"> 重置 </el-button> | ||||
|       </el-form-item> | ||||
|     </el-form> | ||||
|     <!-- 四个固定 Tabs --> | ||||
|     <el-tabs v-model="activeTab" @tab-click="handleTabChange"> | ||||
|       <!-- <el-tab-pane label="待提交" name="0" /> --> | ||||
|       <el-tab-pane label="待审核" name="1" /> | ||||
|       <el-tab-pane label="已通过" name="2" /> | ||||
|       <el-tab-pane label="已驳回" name="0" /> | ||||
|     </el-tabs> | ||||
|     <avue-crud | ||||
|       ref="crudRef" | ||||
|       v-model:page="pageData" | ||||
|       :data="crudData" | ||||
|       :option="crudOptions" | ||||
|       :table-loading="loading" | ||||
|       @current-change="handleCurrentChange" | ||||
|       @size-change="handleSizeChange" | ||||
|     > | ||||
|       <!-- <template #menu-left> | ||||
|         <el-button type="primary" icon="Plus" @click="handleAdd">新增网格</el-button> | ||||
|       </template> --> | ||||
|       <template #menu="scope"> | ||||
|         <custom-table-operate :actions="crudOptions.actions" :data="scope" /> | ||||
|       </template> | ||||
|     </avue-crud> | ||||
|     <el-dialog :key="dialogTitle" v-model="visible" :title="dialogTitle" width="60%" align-center :draggable="true"> | ||||
|       <el-form ref="form" :model="formData" :rules="rules" :disabled="isReadonly" label-width="100px" class="form-item"> | ||||
|         <p class="form-title">填写网格信息</p> | ||||
|         <el-form-item label="网格名称" prop="gridName"> | ||||
|           <el-input v-model="formData.gridName" placeholder="请输入网格名称" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="所属行政区域" prop="gridAreaCode"> | ||||
|           <AreaSelect v-model="formData.gridAreaCode" :label="null" :emit-path="false" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="网格化地图" prop="scopeImg"> | ||||
|           <FileUploader v-model="formData.scopeImg" :limit="1" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="备注" prop="note"> | ||||
|           <el-input v-model="formData.note" placeholder="请输入备注" /> | ||||
|         </el-form-item> | ||||
|       </el-form> | ||||
|       <template #footer> | ||||
|         <div class="dialog-footer"> | ||||
|           <el-button @click="handleCancel">取消</el-button> | ||||
|           <el-button v-if="!isReadonly" type="primary" @click="handleSubmit()"> 保存 </el-button> | ||||
|         </div> | ||||
|       </template> | ||||
|     </el-dialog> | ||||
|   </div> | ||||
| </template> | ||||
| 
 | ||||
| <script setup> | ||||
| // --------------------------------------------------------------------- | ||||
| // avue-crud 通用代码 | ||||
| // --------------------------------------------------------------------- | ||||
| import { ref, reactive, watch, onMounted, computed, nextTick } from 'vue'; | ||||
| import { CRUD_OPTIONS } from '@/config'; | ||||
| import { ElMessage, ElMessageBox } from 'element-plus'; | ||||
| import { useUserStore } from '@/store/modules/user'; | ||||
| import { mockData } from './landData'; | ||||
| 
 | ||||
| const UserStore = useUserStore(); | ||||
| const user = UserStore.getUserInfo(); | ||||
| console.log('admin 属性:', user.admin); | ||||
| 
 | ||||
| const loading = ref(false); | ||||
| 
 | ||||
| const visible = ref(false); | ||||
| const isReadonly = ref(false); | ||||
| const dialogTitle = ref(); | ||||
| const activeTab = ref('1'); | ||||
| const formData = ref({ | ||||
|   gridName: '', | ||||
|   gridAreaCode: '', | ||||
|   scope: '', | ||||
|   scopeImg: '', | ||||
|   note: '', | ||||
| }); | ||||
| const initialFormData = { ...formData.value }; | ||||
| const resetForm = () => { | ||||
|   formData.value = { ...initialFormData }; | ||||
| }; | ||||
| 
 | ||||
| const pageData = ref({ | ||||
|   currentPage: 1, | ||||
|   pageSize: 10, | ||||
|   total: 0, | ||||
| }); | ||||
| const searchForm = ref({ | ||||
|   gridName: '', | ||||
|   keyword: '', | ||||
|   regionCode: '', | ||||
|   id: '', | ||||
|   status: -1, | ||||
| }); | ||||
| const initialSearchForm = { ...searchForm.value }; | ||||
| const resetSearch = () => { | ||||
|   searchForm.value = { ...initialSearchForm }; | ||||
| }; | ||||
| // 过滤对象,只保留有值的属性 | ||||
| const filterObject = (obj) => { | ||||
|   const newObj = {}; | ||||
|   Object.keys(obj).forEach((key) => { | ||||
|     const value = obj[key]; | ||||
|     // 检查值是否有效,排除空字符串、null 和 undefined | ||||
|     if (value !== '' && value !== null && value !== undefined) { | ||||
|       newObj[key] = value; | ||||
|     } | ||||
|   }); | ||||
|   return newObj; | ||||
| }; | ||||
| 
 | ||||
| const crudData = ref([]); | ||||
| const crudOptions = reactive({ | ||||
|   ...CRUD_OPTIONS, | ||||
|   addBtn: false, | ||||
|   header: false, | ||||
|   searchBtn: false, | ||||
|   emptyBtn: false, | ||||
|   refreshBtn: false, | ||||
|   height: 'calc(100vh - 360px)', | ||||
|   column: [ | ||||
|     { label: '地块编号', prop: 'id', width: 160 }, | ||||
|     { label: '地块名称', prop: 'landName', width: 170 }, | ||||
|     { label: '面积', prop: 'area', formatter: (row, column, cellValue) => `${Number(cellValue).toFixed(2)} 亩` }, | ||||
|     { label: '土地分类', prop: 'landTypeName' }, | ||||
|     { label: '土壤类型', prop: 'soilTypeName' }, | ||||
|     { label: '所属行政区域', prop: 'fullRegionName', width: 160 }, | ||||
|     { label: '所属网格', prop: 'gridName', width: 90 }, | ||||
|     { label: '具体位置', prop: 'address', width: 160 }, | ||||
|     { label: '土地承包经营人', prop: 'propertyName' }, | ||||
|     { label: '联系电话', prop: 'propertyPhone' }, | ||||
|     { label: '土地经营权证书编号', prop: 'landCode', width: 160 }, | ||||
|     { label: '是否土地流转', prop: 'isTransfer' }, | ||||
|     { label: '土地受让方', prop: 'transferName' }, | ||||
|     { label: '受让方联系电话', prop: 'transferPhone', width: 100 }, | ||||
|     { label: '流转合同', prop: 'transferContract' }, | ||||
|     { label: '信息填报人', prop: 'fillName' }, | ||||
|     { label: '信息填报单位', prop: 'fillGroup' }, | ||||
|     { label: '信息填报时间', prop: 'fillTime' }, | ||||
|     // { label: '信息更新人', prop: 'updateName' }, | ||||
|     // { label: '信息更新单位', prop: 'updateGroup' }, | ||||
|     { label: '信息更新时间', prop: 'updateTime' }, | ||||
|   ], | ||||
|   actions: [ | ||||
|     { | ||||
|       name: '查看', | ||||
|       icon: 'view', | ||||
|       event: ({ row }) => handleView(row), | ||||
|     }, | ||||
|     { | ||||
|       name: '编辑', | ||||
|       icon: 'edit', | ||||
|       event: ({ row }) => handleEdit(row), | ||||
|     }, | ||||
|     { | ||||
|       type: 'danger', | ||||
|       name: '删除', | ||||
|       icon: 'delete', | ||||
|       event: ({ row }) => handleDelete(row), | ||||
|     }, | ||||
|   ], | ||||
| }); | ||||
| const handleTabChange = ({ name }) => { | ||||
|   //   activeTab.value = name; | ||||
|   console.log('切换tab', activeTab.value); | ||||
|   getData(); | ||||
| }; | ||||
| const handleRefresh = async () => { | ||||
|   searchForm.value = { ...initialSearchForm }; | ||||
|   getData(); | ||||
| }; | ||||
| const handleCurrentChange = (val) => { | ||||
|   pageData.value.currentPage = val; | ||||
| }; | ||||
| const handleSizeChange = (val) => { | ||||
|   pageData.value.pageSize = val; | ||||
| }; | ||||
| const handleView = (row) => { | ||||
|   isReadonly.value = true; | ||||
|   formData.value = { ...row }; | ||||
|   dialogTitle.value = '查看网格'; | ||||
|   //   visible.value = true; | ||||
| }; | ||||
| const handleEdit = (row) => { | ||||
|   isReadonly.value = false; | ||||
|   formData.value = { ...row }; | ||||
|   dialogTitle.value = '编辑网格'; | ||||
|   //   visible.value = true; | ||||
| }; | ||||
| const handleDelete = async (row) => { | ||||
|   console.log('删除', row); | ||||
|   //   try { | ||||
|   //     await ElMessageBox.confirm('确认删除该网格吗?', '提示', { | ||||
|   //       confirmButtonText: '确定', | ||||
|   //       cancelButtonText: '取消', | ||||
|   //       type: 'warning', | ||||
|   //     }); | ||||
| 
 | ||||
|   //     const response = await deleteGrid(row.id); | ||||
| 
 | ||||
|   //     ElMessage.success('删除成功'); | ||||
|   //     getData(); | ||||
|   //   } catch (error) { | ||||
|   //     if (error === 'cancel') { | ||||
|   //       ElMessage.info('已取消删除'); | ||||
|   //     } else { | ||||
|   //       ElMessage.error('删除失败'); | ||||
|   //       console.error('删除异常:', error); | ||||
|   //     } | ||||
|   //   } | ||||
| }; | ||||
| 
 | ||||
| const handleSubmit = async () => { | ||||
|   console.log('提交表单:', formData.value); | ||||
|   try { | ||||
|     if (dialogTitle.value === '新增网格') { | ||||
|       await createGrid(formData.value); | ||||
|       ElMessage.success('新增成功'); | ||||
|       resetForm(); | ||||
|       visible.value = false; | ||||
|       getData(); | ||||
|     } else { | ||||
|       await updateGrid(formData.value); | ||||
|       ElMessage.success('更新成功'); | ||||
|       resetForm(); | ||||
|       visible.value = false; | ||||
|       getData(); | ||||
|     } | ||||
|   } catch (error) { | ||||
|     ElMessage.error(error.message || '新增失败,请重试'); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| // --------------------------------------------------------------------- | ||||
| // 业务代码 | ||||
| // --------------------------------------------------------------------- | ||||
| import { createGrid, updateGrid, deleteGrid, fetchGridList, getGridDetail, exportGrid } from '@/apis/landResourceManagement/gridManagement'; | ||||
| 
 | ||||
| onMounted(() => { | ||||
|   getData(); | ||||
| }); | ||||
| const getData = async () => { | ||||
|   //   const filteredParams = filterObject(searchForm.value); | ||||
|   //   const response = await fetchGridList(filteredParams); | ||||
|   //   crudData.value = Array.isArray(response.data.records) ? response.data.records : []; | ||||
|   loading.value = true; | ||||
|   // 模拟接口延迟 | ||||
|   await new Promise((resolve) => setTimeout(resolve, 300)); | ||||
|   crudData.value = mockData | ||||
|     .filter((item) => item.status === activeTab.value) | ||||
|     .map((item) => ({ | ||||
|       ...item, | ||||
|       landTypeName: '林地', | ||||
|     })); | ||||
|   pageData.value.total = crudData.value.length; | ||||
|   loading.value = false; | ||||
| }; | ||||
| 
 | ||||
| const handleAdd = () => { | ||||
|   console.log('handleAdd'); | ||||
|   resetForm(); | ||||
|   isReadonly.value = false; | ||||
|   dialogTitle.value = '新增网格'; | ||||
|   visible.value = true; | ||||
| }; | ||||
| 
 | ||||
| const handleSearch = () => { | ||||
|   getData(); | ||||
| }; | ||||
| const handleCancel = () => { | ||||
|   visible.value = false; | ||||
| }; | ||||
| </script> | ||||
| 
 | ||||
| <style scoped lang="scss"> | ||||
| .custom-page { | ||||
|   padding-bottom: 0px; | ||||
| } | ||||
| h1 { | ||||
|   font-size: 20px; | ||||
|   font-weight: bold; | ||||
|   margin-bottom: 20px; | ||||
| } | ||||
| .search-bar { | ||||
|   padding-left: 20px; | ||||
| } | ||||
| :deep(.el-dialog__body) { | ||||
|   padding: 20px; | ||||
|   height: calc(100vh - 300px); | ||||
|   overflow-y: auto; | ||||
| } | ||||
| .form-title { | ||||
|   font-size: 16px; | ||||
|   font-weight: 500; | ||||
|   margin: 30px 0; | ||||
|   color: #333333; | ||||
| } | ||||
| .form-item { | ||||
|   width: 500px; | ||||
|   margin: 0 auto; | ||||
| } | ||||
| .dialog-footer { | ||||
|   text-align: center; | ||||
| } | ||||
| .custom-search { | ||||
|   display: flex; | ||||
|   align-items: center; | ||||
|   padding-left: 20px; | ||||
| 
 | ||||
|   .el-button { | ||||
|     margin-left: 12px; | ||||
|   } | ||||
| } | ||||
| </style> | ||||
| @ -0,0 +1,385 @@ | ||||
| <template> | ||||
|   <div class="custom-page"> | ||||
|     <h1>林地</h1> | ||||
|     <LandSearch :search="searchForm" @on-search="handleSearch" @on-reset="handleReset" /> | ||||
|     <el-tabs v-model="activeTab" @tab-click="handleTabChange"> | ||||
|       <!-- <el-tab-pane label="待提交" name="0" /> --> | ||||
|       <el-tab-pane label="待审核" name="1" /> | ||||
|       <el-tab-pane label="已通过" name="2" /> | ||||
|       <el-tab-pane label="已驳回" name="0" /> | ||||
|     </el-tabs> | ||||
|     <TableComponent | ||||
|       :loading="loading" | ||||
|       :columns="columns" | ||||
|       :table-data="tableData" | ||||
|       :current-page="pageData.currentPage" | ||||
|       :page-size="pageData.pageSize" | ||||
|       :total="pageData.total" | ||||
|       :show-pagination="true" | ||||
|       :show-border="true" | ||||
|       :show-sort="true" | ||||
|       style="height: calc(100vh - 320px)" | ||||
|       @page-change="handlePageChange" | ||||
|     > | ||||
|       <template #action="scope"> | ||||
|         <!-- <el-button size="small" @click="handleEdit(scope.row)">编辑</el-button> | ||||
|         <el-button size="small" type="danger" @click="handleDelete(scope.row)">删除</el-button> --> | ||||
|         <custom-table-operate :actions="getActions(scope.row)" :data="scope" /> | ||||
|       </template> | ||||
|     </TableComponent> | ||||
|     <el-dialog :key="dialogTitle" v-model="visible" :title="dialogTitle" width="60%" align-center :draggable="true"> | ||||
|       <el-tabs v-model="activeFormTab" class="tabs-wrapper"> | ||||
|         <el-tab-pane label="土地基本信息" name="basic"> | ||||
|           <p class="form-title">基本信息</p> | ||||
|           <el-form ref="basicFormRef" :model="formData" :disabled="isReadonly" label-width="120px"> | ||||
|             <el-row :gutter="20"> | ||||
|               <el-col :span="12"> | ||||
|                 <el-form-item label="地块名称" prop="landName"> | ||||
|                   <el-input v-model="formData.landName" placeholder="请输入地块名称" /> | ||||
|                 </el-form-item> | ||||
|                 <el-form-item label="土地类型" prop="landType"> | ||||
|                   <el-tree-select | ||||
|                     v-model="formData.landType" | ||||
|                     :data="landTypeOptions" | ||||
|                     :props="treeProps" | ||||
|                     placeholder="选择土地类型" | ||||
|                     clearable | ||||
|                     check-strictly | ||||
|                     :render-after-expand="false" | ||||
|                   /> | ||||
|                 </el-form-item> | ||||
|                 <el-form-item label="具体位置" prop="address"> | ||||
|                   <el-input v-model="formData.address" placeholder="请输入具体位置" /> | ||||
|                 </el-form-item> | ||||
|                 <el-form-item label="土壤类型" prop="soilTypeId"> | ||||
|                   <url-select | ||||
|                     v-model="formData.soilTypeId" | ||||
|                     placeholder="选择土壤类型" | ||||
|                     url="/land-resource/baseInfo/soilTypePage" | ||||
|                     :params="{ current: 1, size: 100 }" | ||||
|                     label-key="soilType" | ||||
|                     value-key="id" | ||||
|                     :clearable="true" | ||||
|                   /> | ||||
|                 </el-form-item> | ||||
|                 <el-form-item label="土地照片" prop="landUrl"> | ||||
|                   <FileUploader v-model="formData.landUrl" :limit="1" /> | ||||
|                 </el-form-item> | ||||
|               </el-col> | ||||
|               <el-col :span="12"> | ||||
|                 <el-form-item label="面积(亩)" prop="area"> | ||||
|                   <el-input-number v-model="formData.area" :min="0" :precision="2" :step="0.1" controls-position="right" style="width: 100%" /> | ||||
|                 </el-form-item> | ||||
| 
 | ||||
|                 <el-form-item label="" label-width="0" prop="gridId"> | ||||
|                   <AreaCascader v-model:region-code="formData.gridAreaCode" v-model:grid-id="formData.gridId" label="" :split-rows="true" /> | ||||
|                 </el-form-item> | ||||
| 
 | ||||
|                 <el-form-item label="土地范围" prop="scope"> | ||||
|                   <el-input v-model="formData.scope" placeholder="请输入土地范围" /> | ||||
|                   <!-- <Attrs v-model:attrs="formData.scope" type="add" accept="image/*" /> --> | ||||
|                 </el-form-item> | ||||
|               </el-col> | ||||
|             </el-row> | ||||
|           </el-form> | ||||
|         </el-tab-pane> | ||||
|         <el-tab-pane label="土地承包信息" name="property"> | ||||
|           <p class="form-title">承包信息</p> | ||||
|           <el-form ref="propertyFormRef" :model="formData" :disabled="isReadonly" label-width="150px"> | ||||
|             <el-row :gutter="20"> | ||||
|               <el-col :span="12"> | ||||
|                 <el-form-item label="土地承包经营权人" prop="propertyName"> | ||||
|                   <el-input v-model="formData.propertyName" placeholder="请输入产权人姓名" /> | ||||
|                 </el-form-item> | ||||
|                 <el-form-item label="联系方式" prop="propertyPhone"> | ||||
|                   <el-input v-model="formData.propertyPhone" placeholder="请输入产权人联系方式" /> | ||||
|                 </el-form-item> | ||||
|                 <el-form-item label="土地经营权证书编号" prop="landCode"> | ||||
|                   <el-input v-model="formData.landCode" placeholder="请输入产权编号" /> | ||||
|                 </el-form-item> | ||||
|                 <el-form-item label="土地经营权证书" prop="propertyCertificateUrl"> | ||||
|                   <FileUploader v-model="formData.propertyCertificateUrl" :limit="1" /> | ||||
|                 </el-form-item> | ||||
|               </el-col> | ||||
|               <!-- <el-col :span="12"></el-col> --> | ||||
|             </el-row> | ||||
|           </el-form> | ||||
|         </el-tab-pane> | ||||
|         <el-tab-pane label="土地流转信息" name="use"> | ||||
|           <p class="form-title">流转信息</p> | ||||
|           <el-form ref="useForm" :model="formData" label-width="120px"> | ||||
|             <el-row> | ||||
|               <el-col :span="12"> | ||||
|                 <el-form-item label="是否土地流转" prop="landTransfer"> | ||||
|                   <el-radio-group v-model="formData.landTransfer" :disabled="isReadonly"> | ||||
|                     <el-radio label="1">是</el-radio> | ||||
|                     <el-radio label="0">否</el-radio> | ||||
|                   </el-radio-group> | ||||
|                 </el-form-item> | ||||
|                 <el-form-item v-if="formData.landTransfer === '1'" label="土地受让方" prop="landUseName"> | ||||
|                   <el-input v-model="formData.landUseName" placeholder="请输入土地受让方" /> | ||||
|                 </el-form-item> | ||||
|                 <el-form-item v-if="formData.landTransfer === '1'" label="联系电话" prop="landUsePhone"> | ||||
|                   <el-input v-model="formData.landUsePhone" placeholder="请输入土地受让方联系方式" /> | ||||
|                 </el-form-item> | ||||
|                 <el-form-item v-if="formData.landTransfer === '1'" label="流转合同" prop="landCertificateUrl"> | ||||
|                   <FileUploader v-model="formData.landCertificateUrl" :limit="1" /> | ||||
|                 </el-form-item> | ||||
|               </el-col> | ||||
|             </el-row> | ||||
|           </el-form> | ||||
|         </el-tab-pane> | ||||
|       </el-tabs> | ||||
| 
 | ||||
|       <template #footer> | ||||
|         <span class="dialog-footer"> | ||||
|           <el-button @click="visible = false">取消</el-button> | ||||
|           <template v-if="!isReadonly"> | ||||
|             <el-button type="primary" @click="submitAll">修改</el-button> | ||||
|           </template> | ||||
|         </span> | ||||
|       </template> | ||||
|     </el-dialog> | ||||
|   </div> | ||||
| </template> | ||||
| 
 | ||||
| <script setup> | ||||
| import { ref, onMounted } from 'vue'; | ||||
| import LandSearch from './components/LandSearch.vue'; | ||||
| import TableComponent from '@/components/tableComponent.vue'; | ||||
| 
 | ||||
| const searchForm = ref({}); | ||||
| const handleSearch = (searchData) => { | ||||
|   // 使用搜索条件 | ||||
|   console.log(searchData); | ||||
| }; | ||||
| 
 | ||||
| const handleReset = () => { | ||||
|   // 重置后的逻辑 | ||||
| }; | ||||
| 
 | ||||
| const activeTab = ref('1'); | ||||
| const handleTabChange = ({ name }) => { | ||||
|   //   activeTab.value = name; | ||||
|   console.log('切换tab', activeTab.value); | ||||
|   getData(); | ||||
| }; | ||||
| 
 | ||||
| const loading = ref(false); | ||||
| const tableData = ref([]); | ||||
| const pageData = ref({ | ||||
|   currentPage: 1, | ||||
|   pageSize: 10, | ||||
|   total: 0, | ||||
| }); | ||||
| const columns = ref([ | ||||
|   { label: '地块编号', prop: 'id', width: 160 }, | ||||
|   { label: '地块名称', prop: 'landName', width: 170 }, | ||||
|   { label: '面积', prop: 'area', formatter: (row, column, cellValue) => `${Number(cellValue).toFixed(2)} 亩` }, | ||||
|   { label: '土地分类', prop: 'landTypeName' }, | ||||
|   { label: '土壤类型', prop: 'soilTypeName' }, | ||||
|   { label: '所属行政区域', prop: 'fullRegionName', width: 160 }, | ||||
|   { label: '所属网格', prop: 'gridName', width: 90 }, | ||||
|   { label: '具体位置', prop: 'address', width: 160 }, | ||||
|   { label: '土地承包经营人', prop: 'propertyName' }, | ||||
|   { label: '联系电话', prop: 'propertyPhone' }, | ||||
|   { label: '土地经营权证书编号', prop: 'landCode', width: 160 }, | ||||
|   { label: '是否土地流转', prop: 'isTransfer', formatter: (row, column, cellValue) => (cellValue === 1 ? '是' : '否') }, | ||||
|   { label: '土地受让方', prop: 'transferName' }, | ||||
|   { label: '受让方联系电话', prop: 'transferPhone', width: 100 }, | ||||
|   { label: '流转合同', prop: 'transferContract' }, | ||||
|   { label: '信息填报人', prop: 'fillName' }, | ||||
|   { label: '信息填报单位', prop: 'fillGroup' }, | ||||
|   { label: '信息填报时间', prop: 'fillTime' }, | ||||
|   // { label: '信息更新人', prop: 'updateName' }, | ||||
|   // { label: '信息更新单位', prop: 'updateGroup' }, | ||||
|   { label: '信息更新时间', prop: 'updateTime' }, | ||||
|   { label: '操作', prop: 'action', slotName: 'action', fixed: 'right' }, | ||||
| ]); | ||||
| 
 | ||||
| const actions = [ | ||||
|   { | ||||
|     name: '查看', | ||||
|     icon: 'view', | ||||
|     event: ({ row }) => handleView(row), | ||||
|   }, | ||||
|   { | ||||
|     name: '编辑', | ||||
|     icon: 'edit', | ||||
|     event: ({ row }) => handleEdit(row), | ||||
|   }, | ||||
|   { | ||||
|     type: 'danger', | ||||
|     name: '删除', | ||||
|     icon: 'delete', | ||||
|     event: ({ row }) => handleDelete(row.id), | ||||
|   }, | ||||
| ]; | ||||
| const handleView = async (row) => { | ||||
|   isReadonly.value = true; | ||||
|   formData.value = await getLandDetail(row.id); | ||||
|   dialogTitle.value = '查看网格'; | ||||
|   visible.value = true; | ||||
| }; | ||||
| const handleEdit = (row) => { | ||||
|   isReadonly.value = false; | ||||
|   formData.value = { ...row }; | ||||
|   dialogTitle.value = '编辑网格'; | ||||
|   visible.value = true; | ||||
| }; | ||||
| const handleDelete = async (row) => { | ||||
|   console.log('删除', row); | ||||
|   //   try { | ||||
|   //     await ElMessageBox.confirm('确认删除该网格吗?', '提示', { | ||||
|   //       confirmButtonText: '确定', | ||||
|   //       cancelButtonText: '取消', | ||||
|   //       type: 'warning', | ||||
|   //     }); | ||||
| 
 | ||||
|   //     const response = await deleteGrid(row.id); | ||||
| 
 | ||||
|   //     ElMessage.success('删除成功'); | ||||
|   //     getData(); | ||||
|   //   } catch (error) { | ||||
|   //     if (error === 'cancel') { | ||||
|   //       ElMessage.info('已取消删除'); | ||||
|   //     } else { | ||||
|   //       ElMessage.error('删除失败'); | ||||
|   //       console.error('删除异常:', error); | ||||
|   //     } | ||||
|   //   } | ||||
| }; | ||||
| 
 | ||||
| const handlePageChange = ({ page, pageSize }) => { | ||||
|   pageData.value.currentPage = page; | ||||
|   pageData.value.pageSize = pageSize; | ||||
|   getData(); | ||||
| }; | ||||
| 
 | ||||
| const visible = ref(false); | ||||
| const isReadonly = ref(false); | ||||
| const dialogTitle = ref(); | ||||
| const activeFormTab = ref('basic'); | ||||
| const formData = ref({ | ||||
|   gridName: '', | ||||
|   gridAreaCode: '', | ||||
|   scope: '', | ||||
|   scopeImg: '', | ||||
|   note: '', | ||||
| }); | ||||
| const initialFormData = { ...formData.value }; | ||||
| const resetForm = () => { | ||||
|   formData.value = { ...initialFormData }; | ||||
| }; | ||||
| 
 | ||||
| import { mockData } from './landData'; | ||||
| import { createLand, deleteLand, editLand, fetchLandList, getLandById, approveLand } from '@/apis/landResourceManagement/landManagement'; | ||||
| import request from '@/utils/axios'; | ||||
| const getData = async () => { | ||||
|   loading.value = true; | ||||
|   // const requestData = { | ||||
|   //   ...searchForm.value, | ||||
|   //   page: pageData.value.currentPage, | ||||
|   //   size: pageData.value.pageSize, | ||||
|   //   landStatus: activeTab.value, | ||||
|   //   landTypeName: '草地', | ||||
|   // }; | ||||
|   // const response = await fetchLandList(requestData); | ||||
|   // tableData.value = Array.isArray(response.data.records) ? response.data.records : []; | ||||
|   // pageData.value.total = tableData.value.length; | ||||
|   // loading.value = false; | ||||
|   await new Promise((resolve) => setTimeout(resolve, 300)); | ||||
|   tableData.value = mockData | ||||
|     .filter((item) => item.status === activeTab.value) | ||||
|     .map((item) => ({ | ||||
|       ...item, | ||||
|       landTypeName: '林地', | ||||
|     })); | ||||
|   pageData.value.total = tableData.value.length; | ||||
|   loading.value = false; | ||||
| }; | ||||
| const getLandDetail = async (id) => { | ||||
|   const response = await getLandById(id); | ||||
|   return response.data; | ||||
| }; | ||||
| const landTypeOptions = ref([]); | ||||
| const treeProps = ref({ | ||||
|   value: 'id', | ||||
|   label: 'landType', | ||||
|   children: 'children', | ||||
|   // disabled: (data) => { | ||||
|   //   return data.children && data.children.length > 0; | ||||
|   // }, | ||||
| }); | ||||
| const fetchLandTypeData = async () => { | ||||
|   try { | ||||
|     const response = await request.get('/land-resource/baseInfo/landTree', { params: { status: '1' } }); | ||||
|     if (response.code === 200) { | ||||
|       landTypeOptions.value = response.data; | ||||
|     } | ||||
|   } catch (error) { | ||||
|     console.error('获取土地类型数据失败', error); | ||||
|   } | ||||
| }; | ||||
| onMounted(() => { | ||||
|   getData(); | ||||
|   fetchLandTypeData(); | ||||
| }); | ||||
| </script> | ||||
| <style scoped lang="scss"> | ||||
| .custom-page { | ||||
|   display: flex; | ||||
|   flex-direction: column; | ||||
| } | ||||
| h1 { | ||||
|   font-size: 20px; | ||||
|   font-weight: bold; | ||||
| } | ||||
| .tabs-wrapper { | ||||
|   width: 100%; | ||||
|   display: flex; | ||||
|   align-items: center; | ||||
|   // background-color: #7daaaa; | ||||
| 
 | ||||
|   .el-tabs__header { | ||||
|     width: 100%; | ||||
| 
 | ||||
|     .el-tabs__nav-scroll { | ||||
|       display: flex; | ||||
|       justify-content: center; | ||||
|     } | ||||
| 
 | ||||
|     .el-tabs__item { | ||||
|       font-size: 16px; | ||||
|       color: #555555; | ||||
|       font-weight: 500; | ||||
|     } | ||||
|   } | ||||
|   :deep(.el-tabs__content) { | ||||
|     padding: 20px; | ||||
|     // background-color: #af8686; | ||||
|     border-radius: 4px; | ||||
|     width: 80%; | ||||
|     height: calc(100vh - 400px); | ||||
|     overflow-y: auto; | ||||
| 
 | ||||
|     .el-tab-pane { | ||||
|       margin: 0 auto; | ||||
|       width: 100%; | ||||
|       // background-color: #555555; | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| .form-title { | ||||
|   font-size: 16px; | ||||
|   font-weight: 500; | ||||
|   margin: 30px 0; | ||||
|   color: #333333; | ||||
| } | ||||
| 
 | ||||
| .dialog-footer { | ||||
|   display: block; | ||||
|   text-align: center; | ||||
| } | ||||
| </style> | ||||
| @ -218,17 +218,14 @@ const filterObject = (obj) => { | ||||
| const crudData = ref([]); | ||||
| const crudOptions = reactive({ | ||||
|   ...CRUD_OPTIONS, | ||||
|   addBtn: false, | ||||
|   header: false, | ||||
|   searchBtn: false, | ||||
|   emptyBtn: false, | ||||
|   refreshBtn: false, | ||||
|   menu: false, | ||||
|   height: 'calc(100vh - 360px)', | ||||
|   column: [ | ||||
|     { label: '地块编号', prop: 'id', width: 160 }, | ||||
|     { label: '地块名称', prop: 'landName', width: 170 }, | ||||
|     { label: '面积', prop: 'area', formatter: (row, column, cellValue) => `${Number(cellValue).toFixed(2)} 亩` }, | ||||
|     { label: '土地分类', prop: 'fullLandType' }, | ||||
|     { label: '土地分类', prop: 'landTypeName' }, | ||||
|     { label: '土壤类型', prop: 'soilTypeName' }, | ||||
|     { label: '所属行政区域', prop: 'fullRegionName', width: 160 }, | ||||
|     { label: '所属网格', prop: 'gridName', width: 90 }, | ||||
| @ -262,22 +259,22 @@ const crudOptions = reactive({ | ||||
|       icon: 'delete', | ||||
|       event: ({ row }) => handleDelete(row), | ||||
|     }, | ||||
|     { | ||||
|       name: '审核', | ||||
|       icon: 'approve', | ||||
|       event: ({ row }) => onApprove(row), | ||||
|     }, | ||||
|     // TODO: 驳回应该有填写驳回原因的弹窗 | ||||
|     { | ||||
|       name: '驳回', | ||||
|       icon: 'reject', | ||||
|       event: ({ row }) => onReject(row), | ||||
|     }, | ||||
|     { | ||||
|       name: '驳回原因', | ||||
|       icon: 'reject', | ||||
|       event: ({ row }) => onRejectReason(row), | ||||
|     }, | ||||
|     // { | ||||
|     //   name: '审核', | ||||
|     //   icon: 'approve', | ||||
|     //   event: ({ row }) => onApprove(row), | ||||
|     // }, | ||||
|     // // TODO: 驳回应该有填写驳回原因的弹窗 | ||||
|     // { | ||||
|     //   name: '驳回', | ||||
|     //   icon: 'reject', | ||||
|     //   event: ({ row }) => onReject(row), | ||||
|     // }, | ||||
|     // { | ||||
|     //   name: '驳回原因', | ||||
|     //   icon: 'reject', | ||||
|     //   event: ({ row }) => onRejectReason(row), | ||||
|     // }, | ||||
|   ], | ||||
| }); | ||||
| const handleTabChange = ({ name }) => { | ||||
| @ -331,23 +328,6 @@ const handleDelete = async (row) => { | ||||
| 
 | ||||
| const handleSubmit = async () => { | ||||
|   console.log('提交表单:', formData.value); | ||||
|   try { | ||||
|     if (dialogTitle.value === '新增网格') { | ||||
|       await createLand(formData.value); | ||||
|       ElMessage.success('新增成功'); | ||||
|       resetForm(); | ||||
|       visible.value = false; | ||||
|       getData(); | ||||
|     } else { | ||||
|       await editLand(formData.value); | ||||
|       ElMessage.success('更新成功'); | ||||
|       resetForm(); | ||||
|       visible.value = false; | ||||
|       getData(); | ||||
|     } | ||||
|   } catch (error) { | ||||
|     ElMessage.error(error.message || '新增失败,请重试'); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| // --------------------------------------------------------------------- | ||||
| @ -361,9 +341,18 @@ onMounted(() => { | ||||
| }); | ||||
| const getData = async () => { | ||||
|   loading.value = true; | ||||
|   const filteredParams = filterObject(searchForm.value); | ||||
|   const response = await fetchLandList(filteredParams); | ||||
|   crudData.value = Array.isArray(response.data.records) ? response.data.records : []; | ||||
|   // const filteredParams = filterObject(searchForm.value); | ||||
|   // const response = await fetchLandList(filteredParams); | ||||
|   // crudData.value = Array.isArray(response.data.records) ? response.data.records : []; | ||||
|   // pageData.value.total = crudData.value.length; | ||||
|   // loading.value = false; | ||||
|   await new Promise((resolve) => setTimeout(resolve, 300)); | ||||
|   crudData.value = mockData | ||||
|     .filter((item) => item.status === activeTab.value) | ||||
|     .map((item) => ({ | ||||
|       ...item, | ||||
|       landTypeName: '草地', | ||||
|     })); | ||||
|   pageData.value.total = crudData.value.length; | ||||
|   loading.value = false; | ||||
| }; | ||||
|  | ||||
| @ -127,11 +127,8 @@ const filterObject = (obj) => { | ||||
| const crudData = ref([]); | ||||
| const crudOptions = reactive({ | ||||
|   ...CRUD_OPTIONS, | ||||
|   addBtn: false, | ||||
|   header: false, | ||||
|   searchBtn: false, | ||||
|   emptyBtn: false, | ||||
|   refreshBtn: false, | ||||
|   menu: false, | ||||
|   height: 'calc(100vh - 360px)', | ||||
|   column: [ | ||||
|     { label: '地块编号', prop: 'id', width: 160 }, | ||||
| @ -227,23 +224,6 @@ const handleDelete = async (row) => { | ||||
| 
 | ||||
| const handleSubmit = async () => { | ||||
|   console.log('提交表单:', formData.value); | ||||
|   try { | ||||
|     if (dialogTitle.value === '新增网格') { | ||||
|       await createGrid(formData.value); | ||||
|       ElMessage.success('新增成功'); | ||||
|       resetForm(); | ||||
|       visible.value = false; | ||||
|       getData(); | ||||
|     } else { | ||||
|       await updateGrid(formData.value); | ||||
|       ElMessage.success('更新成功'); | ||||
|       resetForm(); | ||||
|       visible.value = false; | ||||
|       getData(); | ||||
|     } | ||||
|   } catch (error) { | ||||
|     ElMessage.error(error.message || '新增失败,请重试'); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| // --------------------------------------------------------------------- | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user