455 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			455 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | ||
|   <section class="app-grid-block">
 | ||
|     <ai-list>
 | ||
|       <template slot="title">
 | ||
|         <ai-title title="网格区块" :isShowBottomBorder="true"></ai-title>
 | ||
|       </template>
 | ||
|       <template slot="left">
 | ||
|         <ai-tree-menu title="网格层级" @search="v=> $refs.tree.filter(v)">
 | ||
|           <el-tree
 | ||
|               :data="treeObj.treeList"
 | ||
|               :props="treeObj.defaultProps"
 | ||
|               @node-click="handleNodeClick"
 | ||
|               node-key="id"
 | ||
|               ref="tree"
 | ||
|               :filter-node-method="filterNode"
 | ||
|               default-expand-all
 | ||
|               highlight-current>
 | ||
|             <template slot-scope="{node,data}">
 | ||
|               <div v-text="node.label"/>
 | ||
|             </template>
 | ||
|           </el-tree>
 | ||
|         </ai-tree-menu>
 | ||
|       </template>
 | ||
|       <template slot="content">
 | ||
|         <ai-search-bar>
 | ||
|           <template slot="left">
 | ||
|             <el-date-picker
 | ||
|                 v-model="searchObj.createTimeStr"
 | ||
|                 type="date"
 | ||
|                 @change="(page.current = 1), getList()"
 | ||
|                 value-format="yyyy-MM-dd"
 | ||
|                 size="small"
 | ||
|                 placeholder="创建时间"
 | ||
|             >
 | ||
|             </el-date-picker>
 | ||
|           </template>
 | ||
|           <template slot="right">
 | ||
|             <el-input
 | ||
|                 v-model="searchObj.girdName"
 | ||
|                 size="small"
 | ||
|                 placeholder="输入网格名称"
 | ||
|                 @keyup.enter.native="(page.current = 1), getList()"
 | ||
|                 clearable
 | ||
|                 @clear="(searchObj.girdName = '', page.current = 1), getList()"
 | ||
|                 suffix-icon="iconfont iconSearch"
 | ||
|             />
 | ||
|           </template>
 | ||
|         </ai-search-bar>
 | ||
|         <ai-search-bar bottomBorder>
 | ||
|           <template slot="left">
 | ||
|             <el-button
 | ||
|                 type="primary"
 | ||
|                 icon="iconfont iconAdd"
 | ||
|                 @click="(isEdit = false), toAdd()"
 | ||
|             >新增
 | ||
|             </el-button>
 | ||
|             <el-button
 | ||
|                 icon="iconfont iconDelete"
 | ||
|                 @click="deleteById(ids.join(','))"
 | ||
|                 :disabled="!Boolean(ids.length)"
 | ||
|             >
 | ||
|               删除
 | ||
|             </el-button>
 | ||
|             <ai-download
 | ||
|                 :instance="instance"
 | ||
|                 url="/app/appgirdinfo/exportGirdInfo"
 | ||
|                 :params="{ ...searchObj, ids: ids.join(',') }"
 | ||
|                 fileName="网格区块"
 | ||
|             >
 | ||
|               <el-button icon="iconfont iconExported" size="small"
 | ||
|               >导出全部
 | ||
|               </el-button
 | ||
|               >
 | ||
|             </ai-download>
 | ||
|             <ai-import
 | ||
|                 ref="import"
 | ||
|                 title="导入"
 | ||
|                 name="网格区块"
 | ||
|                 url="/app/appgirdinfo/downloadGirdInfo"
 | ||
|                 importUrl="/app/appgirdinfo/importGirdInfo"
 | ||
|                 suffixName="xlsx"
 | ||
|                 :customCliker="true"
 | ||
|                 :instance="instance"
 | ||
|             >
 | ||
|               <template slot="tips">
 | ||
|                 <p>
 | ||
|                   如果表格中已经存在数据,则会被本次导入的数据覆盖;不存在数据,系统将生成新的标准记录;
 | ||
|                 </p>
 | ||
|               </template>
 | ||
|               <el-button size="small" icon="iconfont iconImport"
 | ||
|               >导入
 | ||
|               </el-button
 | ||
|               >
 | ||
|             </ai-import>
 | ||
|           </template>
 | ||
|         </ai-search-bar>
 | ||
|         <ai-table
 | ||
|             class="mt10"
 | ||
|             :tableData="tableData"
 | ||
|             :col-configs="colConfigs"
 | ||
|             :total="page.total"
 | ||
|             ref="aitableex"
 | ||
|             :current.sync="page.current"
 | ||
|             :size.sync="page.size"
 | ||
|             @selection-change="v=>ids=v.map((e) => e.id)"
 | ||
|             @getList="getList()"
 | ||
|             :dict="dict">
 | ||
|           <el-table-column label="网格成员" slot="user" align="center" width="160">
 | ||
|             <template slot-scope="{ row }">
 | ||
|               <el-button type="text" @click="showGridMembers(row)">{{ row.girdMemberNumber || 0 }}</el-button>
 | ||
|             </template>
 | ||
|           </el-table-column>
 | ||
|           <el-table-column
 | ||
|               label="操作"
 | ||
|               slot="options"
 | ||
|               align="center"
 | ||
|               fixed="right"
 | ||
|               width="160">
 | ||
|             <template slot-scope="{ row }">
 | ||
|               <el-button type="text" @click="showEdit(row.id)">编辑</el-button>
 | ||
|               <map-plotting :value="row.points" @change="v=>confirm(row,v)"/>
 | ||
|               <el-button type="text" @click="deleteById(row.id)">删除</el-button>
 | ||
|             </template>
 | ||
|           </el-table-column>
 | ||
|         </ai-table>
 | ||
|       </template>
 | ||
|     </ai-list>
 | ||
|     <ai-dialog :title="`${gridInfo.girdName}网格成员`" :visible.sync="dialog" customFooter @closed="gridInfo={}"
 | ||
|                width="700px">
 | ||
|       <ai-table :tableData="gridInfo.tableData" :colConfigs="gridMemberColConfigs" :dict="dict"
 | ||
|                 :isShowPagination="false" :show-header="false"/>
 | ||
|       <template #footer>
 | ||
|         <el-button @click="dialog=false">关闭</el-button>
 | ||
|       </template>
 | ||
|     </ai-dialog>
 | ||
|   </section>
 | ||
| </template>
 | ||
| 
 | ||
| <script>
 | ||
| import MapPlotting from "./mapPlotting";
 | ||
| 
 | ||
| export default {
 | ||
|   name: "List",
 | ||
|   components: {MapPlotting},
 | ||
|   label: "网格区块",
 | ||
|   props: {
 | ||
|     instance: Function,
 | ||
|     dict: Object,
 | ||
|     permissions: Function,
 | ||
|   },
 | ||
|   data() {
 | ||
|     return {
 | ||
|       treeObj: {
 | ||
|         treeList: [],
 | ||
|         defaultProps: {
 | ||
|           children: "girdList",
 | ||
|           label: "girdName",
 | ||
|         },
 | ||
|         defaultExpandedKeys: [],
 | ||
|       },
 | ||
|       filterText: "",
 | ||
|       page: {
 | ||
|         current: 1,
 | ||
|         size: 10,
 | ||
|         total: 0,
 | ||
|       },
 | ||
|       searchObj: {
 | ||
|         createTimeStr: "",
 | ||
|         girdName: "",
 | ||
|       },
 | ||
|       tableData: [],
 | ||
|       info: {},
 | ||
|       ids: [],
 | ||
|       showMap: false,
 | ||
|       map: "",
 | ||
|       polyEditor: "",
 | ||
|       editRow: {},
 | ||
|       searchAddress: "",
 | ||
|       mouseTool: "",
 | ||
|       placeSearch: "",
 | ||
|       path: [],
 | ||
|       overlays: [],
 | ||
|       isEdit: false,
 | ||
|       fileList: [],
 | ||
|       dialog: false,
 | ||
|       gridInfo: {},
 | ||
|       gridMemberColConfigs: [
 | ||
|         {prop: "name"},
 | ||
|         {prop: "checkType", formart: v => v === '1' ? '网格员' : '网格长'}
 | ||
|       ]
 | ||
|     };
 | ||
|   },
 | ||
|   created() {
 | ||
|     this.getTreeList();
 | ||
|     this.getList();
 | ||
|     this.dict.load("girdType", "isLastLevel", "plottingStatus", "girdMemberType");
 | ||
|   },
 | ||
|   computed: {
 | ||
|     colConfigs() {
 | ||
|       return [
 | ||
|         {type: 'selection'},
 | ||
|         {prop: "girdName", align: "left", label: "网格名称",},
 | ||
|         {slot: 'user'},
 | ||
|         {prop: "plottingStatus", align: "center", label: "标绘状态", dict: "plottingStatus"},
 | ||
|         {prop: "createTime", align: "center", label: "创建时间"},
 | ||
|         {slot: "options"}
 | ||
|       ];
 | ||
|     },
 | ||
|     isTopGrid() {
 | ||
|       return this.info.id == this.treeObj.treeList?.[0]?.id
 | ||
|     }
 | ||
|   },
 | ||
|   methods: {
 | ||
|     handleNodeClick(val) {
 | ||
|       this.info = this.$copy(val);
 | ||
|       this.getList();
 | ||
|     },
 | ||
|     getTreeList() {
 | ||
|       this.instance.post("/app/appgirdinfo/listAllByTop").then(res => {
 | ||
|         if (res?.data) {
 | ||
|           this.treeObj.treeList = [res.data];
 | ||
|           this.info = res.data
 | ||
|           this.$nextTick(() => {
 | ||
|             this.$refs.tree.setCurrentKey(this.info.id)
 | ||
|           })
 | ||
|         }
 | ||
|       });
 | ||
|     },
 | ||
|     filterNode(value, data) {
 | ||
|       if (!value) return true;
 | ||
|       return data.girdName.indexOf(value) !== -1;
 | ||
|     },
 | ||
|     deleteById(ids) {
 | ||
|       ids && this.$confirm("删除网格后,会清除网格内网格员的责任家庭信息,如有下级网格,会同步删除下级网格所有数据!", {
 | ||
|         type: "error",
 | ||
|       }).then(() => {
 | ||
|         this.instance.post("/app/appgirdinfo/delete", null, {params: {ids}}).then((res) => {
 | ||
|           if (res?.code == 0) {
 | ||
|             this.$message.success("删除成功!");
 | ||
|             this.getList();
 | ||
|             this.getTreeList();
 | ||
|           }
 | ||
|         });
 | ||
|       }).catch(() => 0);
 | ||
|     },
 | ||
|     deleteTree(ids) {
 | ||
|       ids && this.$confirm("是否要删除该网格区块?", {
 | ||
|         type: "error",
 | ||
|       }).then(() => {
 | ||
|         this.instance.post("/app/appgirdinfo/delete", null, {
 | ||
|           params: {ids}
 | ||
|         }).then((res) => {
 | ||
|           if (res?.code == 0) {
 | ||
|             this.$message.success("删除成功!");
 | ||
|             this.getTreeList();
 | ||
|           }
 | ||
|         });
 | ||
|       }).catch(() => 0);
 | ||
|     },
 | ||
|     getList() {
 | ||
|       this.instance.post("/app/appgirdinfo/list", null, {
 | ||
|         params: {
 | ||
|           ...this.searchObj,
 | ||
|           ...this.page,
 | ||
|           parentGirdId: this.isTopGrid ? '' : this.info.id,
 | ||
|         },
 | ||
|       }).then((res) => {
 | ||
|         if (res?.data) {
 | ||
|           this.tableData = res.data.records;
 | ||
|           this.page.total = res.data.total;
 | ||
|         }
 | ||
|       });
 | ||
|     },
 | ||
|     handleSelectionChange(val) {
 | ||
|       this.ids = [];
 | ||
|       val.map((e) => {
 | ||
|         this.ids.push(e.id);
 | ||
|       });
 | ||
|     },
 | ||
|     //添加二级网格
 | ||
|     addTwoLevel() {
 | ||
|       this.info = {...this.treeObj.treeList[0]};
 | ||
|       this.toAdd()
 | ||
|     },
 | ||
|     toAdd() {
 | ||
|       let {id: parentGirdId, girdName: parentGirdName} = this.info
 | ||
|       this.$router.push({
 | ||
|         hash: "#add", query: {parentGirdId, parentGirdName}
 | ||
|       })
 | ||
|     },
 | ||
|     goBack() {
 | ||
|       this.isAdd = false;
 | ||
|       this.$nextTick(() => {
 | ||
|         this.getList();
 | ||
|         this.getTreeList();
 | ||
|       });
 | ||
|     },
 | ||
|     showEdit(id) {
 | ||
|       this.$router.push({hash: "#add", query: {id}})
 | ||
|     },
 | ||
|     //map搜索
 | ||
|     confirm(row, points) {
 | ||
|       this.instance.post(`/app/appgirdinfo/updateCoordinate`, {...row, points}).then((res) => {
 | ||
|         if (res.code == 0) {
 | ||
|           this.$message.success("提交成功!")
 | ||
|           this.getList();
 | ||
|         }
 | ||
|       });
 | ||
|     },
 | ||
|     resetSearch() {
 | ||
|       Object.keys(this.searchObj).map((e) => {
 | ||
|         this.searchObj[e] = "";
 | ||
|       });
 | ||
|       this.getList();
 | ||
|     },
 | ||
|     showGridMembers(row) {
 | ||
|       if (row.girdMemberNumber > 0) {
 | ||
|         this.gridInfo = this.$copy(row)
 | ||
|         this.instance.post("/app/appgirdmemberinfo/listByGirdIdByThree", null, {
 | ||
|           params: {girdId: row.id}
 | ||
|         }).then(res => {
 | ||
|           if (res?.data) {
 | ||
|             this.gridInfo.tableData = res.data
 | ||
|             this.dialog = true
 | ||
|           }
 | ||
|         })
 | ||
|       } else this.$message.warning("当前网格无成员")
 | ||
|     }
 | ||
|   },
 | ||
| };
 | ||
| </script>
 | ||
| 
 | ||
| <style lang="scss" scoped>
 | ||
| .app-grid-block {
 | ||
|   width: 100%;
 | ||
|   height: 100%;
 | ||
| 
 | ||
|   ::v-deep .el-tree {
 | ||
|     background: transparent;
 | ||
| 
 | ||
|     .el-tree-node__expand-icon.is-leaf {
 | ||
|       color: transparent !important;
 | ||
|     }
 | ||
| 
 | ||
|     .el-tree-node__content > .el-tree-node__expand-icon {
 | ||
|       padding: 4px;
 | ||
|     }
 | ||
| 
 | ||
|     .el-tree-node__content {
 | ||
|       height: 32px;
 | ||
|     }
 | ||
| 
 | ||
|     .el-tree__empty-text {
 | ||
|       color: #222;
 | ||
|       font-size: 14px;
 | ||
|     }
 | ||
| 
 | ||
|     .el-tree-node__children .el-tree-node__content {
 | ||
|       height: 32px;
 | ||
|     }
 | ||
| 
 | ||
|     .el-tree-node__content:hover {
 | ||
|       background: #E8EFFF;
 | ||
|       color: #222222;
 | ||
|       border-radius: 2px;
 | ||
|     }
 | ||
| 
 | ||
|     .is-current > .el-tree-node__content {
 | ||
|       color: #fff !important;
 | ||
| 
 | ||
|       &:hover {
 | ||
|         background: #2266FF;
 | ||
|         color: #fff;
 | ||
|       }
 | ||
| 
 | ||
|       background: #2266FF;
 | ||
| 
 | ||
|       .el-tooltip {
 | ||
|         color: #fff;
 | ||
|       }
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   .flex-box {
 | ||
|     display: flex;
 | ||
|     align-items: center;
 | ||
|     justify-content: center;
 | ||
|     width: 100%;
 | ||
|     white-space: nowrap;
 | ||
|     text-overflow: ellipsis;
 | ||
|     overflow: hidden;
 | ||
|     word-break: break-all;
 | ||
| 
 | ||
|     & > div {
 | ||
|       display: flex;
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   .mt10 {
 | ||
|     padding: 8px 0;
 | ||
|   }
 | ||
| 
 | ||
|   ::v-deep.fullscreenMap {
 | ||
|     .el-dialog {
 | ||
|       display: flex;
 | ||
|       flex-direction: column;
 | ||
| 
 | ||
|       .el-dialog__body {
 | ||
|         padding: 0;
 | ||
|         flex: 1;
 | ||
|         min-height: 0;
 | ||
| 
 | ||
|         .ai-dialog__content {
 | ||
|           max-height: unset !important;
 | ||
|           padding-bottom: 0;
 | ||
|           height: 100%;
 | ||
| 
 | ||
|           .ai-dialog__content--wrapper {
 | ||
|             padding-right: 0 !important;
 | ||
|           }
 | ||
|         }
 | ||
|       }
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   ::v-deep .treePanel {
 | ||
|     display: flex;
 | ||
|     flex-direction: column;
 | ||
| 
 | ||
|     .el-tree {
 | ||
|       min-height: 0;
 | ||
|       flex: 1;
 | ||
|     }
 | ||
| 
 | ||
|     footer {
 | ||
|       width: 100%;
 | ||
|       height: 32px;
 | ||
|       background-color: #fff;
 | ||
|       display: flex;
 | ||
|       align-items: center;
 | ||
| 
 | ||
|       span {
 | ||
|         width: 33.33%;
 | ||
|         text-align: center;
 | ||
|         cursor: pointer;
 | ||
|       }
 | ||
| 
 | ||
|       .el-button {
 | ||
|         width: 33.33%;
 | ||
|       }
 | ||
|     }
 | ||
|   }
 | ||
| }
 | ||
| </style>
 |