00cc69904bd95fd91d5b3c109a7df351e85a3cc3.svn-base 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <template>
  2. <div>
  3. <el-cascader v-if="showCascader" :props="placeProps" v-model="adCode" @change="divisionChange"></el-cascader>
  4. <span style="margin-left: 10px; cursor: pointer; color: #5cb6ff" @click="addCustomDivision"><i class="el-icon-circle-plus"></i> 新增</span>
  5. <add-new-division v-if="showAddDivisionDialog" :rootCode="rootCode" @addSuccess="addSuccess" @handleClose="handleClose"></add-new-division>
  6. </div>
  7. </template>
  8. <script>
  9. /*****组件注释说明
  10. * name:行政区划选择组件(县/乡镇/村)
  11. * func: 查询县级及以下的行政区划,并可新增数据库里没有的行政区划
  12. * props:{
  13. * rootCode: 根节点行政区划代码,从父组件传进来
  14. * currentObjectName:当前督查对象(县)的名称,用于行政区划名称拼接
  15. * }
  16. * author: wby
  17. * date: 2020/5/11
  18. ****/
  19. import {getAdXBaseData} from '@api/duChaAPI.js'
  20. import addNewDivision from './addNewDivision.vue'
  21. export default {
  22. props: ['rootCode','currentObjectName'],
  23. data(){
  24. let _this = this
  25. return{
  26. adCode: null,
  27. placeProps: {
  28. lazy: true,
  29. lazyLoad (node, resolve) {
  30. const { level } = node;
  31. if(level == 0){
  32. setTimeout(() => {
  33. const nodes = Array.from({ length: level + 1 })
  34. .map(item => ({
  35. value: _this.rootCode,
  36. label: _this.currentObjectName,
  37. leaf: level > 2
  38. }));
  39. // 通过调用resolve将子节点数据返回,通知组件数据加载完成
  40. resolve(nodes);
  41. }, 500);
  42. }else if(level == 1){
  43. _this.cascaderTown(node, resolve)
  44. }else if(level == 2){
  45. _this.cascaderVillage(node, resolve)
  46. }
  47. }
  48. },
  49. townsList: [],
  50. villagesList: [],
  51. showAddDivisionDialog: false,
  52. showCascader: true
  53. }
  54. },
  55. components:{
  56. addNewDivision
  57. },
  58. methods:{
  59. // 获取乡镇数据列表
  60. cascaderTown(node, resolve){
  61. let adCode = this.rootCode
  62. let townsList = []
  63. getAdXBaseData(adCode).then(
  64. (res) => {
  65. if (res.success && res.data) {
  66. this.townsList = res.data
  67. this.townsList.forEach(item=>{
  68. townsList.push({value: item.adCode,label: item.adName, leaf: false})
  69. })
  70. } else {
  71. townsList = [];
  72. }
  73. console.log(townsList)
  74. resolve(townsList)
  75. },
  76. (err) => {
  77. }
  78. );
  79. },
  80. // 获取村数据列表
  81. cascaderVillage(node, resolve){
  82. let villagesList = []
  83. getAdXBaseData(node.value).then(
  84. (res) => {
  85. if (res.success && res.data) {
  86. this.villagesList = res.data
  87. this.villagesList.forEach(item=>{
  88. villagesList.push({value: item.adCode,label: item.adName, leaf: true})
  89. })
  90. } else {
  91. villagesList = [];
  92. }
  93. resolve(villagesList)
  94. },
  95. (err) => {
  96. }
  97. );
  98. },
  99. // 所选行政区划节点改变时触发,并将行政区划信息(adCode、adName)输出给父组件
  100. divisionChange(val){
  101. if(val.length){
  102. let division
  103. if(val.length == 1){
  104. division = {
  105. adCode: this.rootCode,
  106. adName: this.currentObjectName
  107. }
  108. }else if(val.length == 2){
  109. let townName
  110. this.townsList.forEach(ele=>{
  111. if(ele.adCode == val[1]){
  112. townName = ele.adName
  113. }
  114. })
  115. division = {
  116. adCode: val[1],
  117. adName: `${this.currentObjectName}${townName}`
  118. }
  119. }else if(val.length == 3){
  120. let townName,villageName
  121. this.townsList.forEach(ele=>{
  122. if(ele.adCode == val[1]){
  123. townName = ele.adName
  124. }
  125. })
  126. this.villagesList.forEach(ele=>{
  127. if(ele.adCode == val[2]){
  128. villageName = ele.adName
  129. }
  130. })
  131. division = {
  132. adCode: val[1],
  133. adName: `${this.currentObjectName}${townName}${villageName}`
  134. }
  135. }
  136. this.$emit('currentDivision',division)
  137. }
  138. },
  139. // 添加自定义(数据库中没有的)行政区划信息
  140. addCustomDivision(){
  141. this.showAddDivisionDialog = true
  142. },
  143. // 添加成功后触发addSuccess方法 由于级联面板采用了懒加载的方法,所以在添加成功后利用v-if来强制行政区划列表的更新
  144. addSuccess(){
  145. this.showAddDivisionDialog = false
  146. this.showCascader = false
  147. setTimeout(()=>{
  148. this.showCascader = true
  149. },500)
  150. },
  151. handleClose(){
  152. this.showAddDivisionDialog = false
  153. }
  154. }
  155. }
  156. </script>
  157. <style lang="scss">
  158. </style>