region.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424
  1. <template>
  2. <el-row>
  3. <el-col :span="9">
  4. <div class="box">
  5. <el-scrollbar>
  6. <basic-container>
  7. <avue-tree :option="treeOption" :data="treeData" @node-click="nodeClick" />
  8. </basic-container>
  9. </el-scrollbar>
  10. </div>
  11. </el-col>
  12. <el-col :span="15">
  13. <basic-container>
  14. <el-button-group>
  15. <el-button v-if="permission.region_add" type="primary" size="small" icon="el-icon-circle-plus-outline" @click="addChildren">新增下级</el-button>
  16. <el-button v-if="permission.region_delete" type="primary" size="small" icon="el-icon-delete" @click="handleDelete">删除</el-button>
  17. <el-button v-if="permission.region_import" type="primary" size="small" icon="el-icon-upload2" @click="handleImport">导入</el-button>
  18. <el-button v-if="permission.region_export" type="primary" size="small" icon="el-icon-download" @click="handleExport">导出</el-button>
  19. <el-button v-if="permission.region_debug" type="primary" size="small" icon="el-icon-video-play" @click="handleDebug">调试</el-button>
  20. </el-button-group>
  21. </basic-container>
  22. <basic-container>
  23. <avue-form ref="form" :option="regionOption" v-model="regionForm" @submit="handleSubmit">
  24. <template slot="code" slot-scope="{}">
  25. <el-input placeholder="请输入 区划子编号" v-model="regionForm.subCode">
  26. <template slot="prepend">{{ regionForm.parentCode }}</template>
  27. </el-input>
  28. </template>
  29. </avue-form>
  30. <el-dialog title="行政区划数据导入" append-to-body :visible.sync="excelBox" width="555px">
  31. <avue-form :option="excelOption" v-model="excelForm" :upload-after="uploadAfter">
  32. <template slot="excelTemplate">
  33. <el-button type="primary" @click="handleTemplate"> 点击下载<i class="el-icon-download el-icon--right"></i> </el-button>
  34. </template>
  35. </avue-form>
  36. </el-dialog>
  37. <el-dialog title="行政区划数据调试" append-to-body :visible.sync="debugBox" width="350px">
  38. <avue-form :option="debugOption" v-model="debugForm" />
  39. </el-dialog>
  40. </basic-container>
  41. </el-col>
  42. </el-row>
  43. </template>
  44. <script>
  45. import { getLazyTree, getDetail, submit, remove } from '@/api/base/region'
  46. import { mapGetters } from 'vuex'
  47. import { validatenull } from '@/util/validate'
  48. import { getToken } from '@/util/auth'
  49. export default {
  50. data() {
  51. return {
  52. topCode: '00',
  53. treeCode: '',
  54. treeParentCode: '',
  55. treeData: [],
  56. treeOption: {
  57. nodeKey: 'id',
  58. lazy: true,
  59. treeLoad: function (node, resolve) {
  60. const parentCode = node.level === 0 ? '00' : node.data.id
  61. getLazyTree(parentCode).then((res) => {
  62. resolve(
  63. res.data.data.map((item) => {
  64. return {
  65. ...item,
  66. leaf: !item.hasChildren,
  67. }
  68. })
  69. )
  70. })
  71. },
  72. addBtn: false,
  73. menu: false,
  74. size: 'small',
  75. props: {
  76. labelText: '标题',
  77. label: 'title',
  78. value: 'value',
  79. children: 'children',
  80. },
  81. },
  82. regionForm: {},
  83. regionOption: {
  84. labelWidth: 100,
  85. column: [
  86. {
  87. label: '父区划编号',
  88. prop: 'parentCode',
  89. span: 24,
  90. disabled: true,
  91. rules: [
  92. {
  93. required: true,
  94. message: '请输入父区划编号',
  95. trigger: 'blur',
  96. },
  97. ],
  98. },
  99. {
  100. label: '父区划名称',
  101. prop: 'parentName',
  102. span: 24,
  103. disabled: true,
  104. },
  105. {
  106. label: '区划编号',
  107. prop: 'code',
  108. formslot: true,
  109. span: 24,
  110. rules: [
  111. {
  112. required: true,
  113. message: '请输入区划编号',
  114. trigger: 'blur',
  115. },
  116. ],
  117. },
  118. {
  119. label: '区划子编号',
  120. prop: 'subCode',
  121. display: false,
  122. },
  123. {
  124. label: '区划名称',
  125. prop: 'name',
  126. span: 24,
  127. rules: [
  128. {
  129. required: true,
  130. message: '请输入区划名称',
  131. trigger: 'blur',
  132. },
  133. ],
  134. },
  135. {
  136. label: '区划售价体系',
  137. prop: 'regionLevel',
  138. type: 'radio',
  139. dicUrl: '/blade-system/dict/dictionary?code=region',
  140. props: {
  141. label: 'dictValue',
  142. value: 'dictKey',
  143. },
  144. dataType: 'number',
  145. span: 24,
  146. rules: [
  147. {
  148. required: true,
  149. message: '请选择区划售价体系',
  150. trigger: 'blur',
  151. },
  152. ],
  153. },
  154. {
  155. label: '区划排序',
  156. prop: 'sort',
  157. type: 'number',
  158. span: 24,
  159. rules: [
  160. {
  161. required: true,
  162. message: '请输入区划排序',
  163. trigger: 'blur',
  164. },
  165. ],
  166. },
  167. {
  168. label: '区划备注',
  169. prop: 'remark',
  170. type: 'textarea',
  171. minRows: 6,
  172. span: 24,
  173. },
  174. ],
  175. },
  176. excelBox: false,
  177. excelForm: {},
  178. excelOption: {
  179. submitBtn: false,
  180. emptyBtn: false,
  181. column: [
  182. {
  183. label: '模板上传',
  184. prop: 'excelFile',
  185. type: 'upload',
  186. drag: true,
  187. loadText: '模板上传中,请稍等',
  188. span: 24,
  189. propsHttp: {
  190. res: 'data',
  191. },
  192. tip: '请上传 .xls,.xlsx 标准格式文件',
  193. action: '/blade-system/region/import-region',
  194. },
  195. {
  196. label: '数据覆盖',
  197. prop: 'isCovered',
  198. type: 'switch',
  199. align: 'center',
  200. width: 80,
  201. dicData: [
  202. {
  203. label: '否',
  204. value: 0,
  205. },
  206. {
  207. label: '是',
  208. value: 1,
  209. },
  210. ],
  211. value: 0,
  212. slot: true,
  213. rules: [
  214. {
  215. required: true,
  216. message: '请选择是否覆盖',
  217. trigger: 'blur',
  218. },
  219. ],
  220. },
  221. {
  222. label: '模板下载',
  223. prop: 'excelTemplate',
  224. formslot: true,
  225. span: 24,
  226. },
  227. ],
  228. },
  229. debugBox: false,
  230. debugForm: {},
  231. debugOption: {
  232. labelWidth: 50,
  233. submitBtn: false,
  234. emptyBtn: false,
  235. column: [
  236. {
  237. label: '省份',
  238. prop: 'province',
  239. type: 'select',
  240. props: {
  241. label: 'name',
  242. value: 'code',
  243. },
  244. cascaderItem: ['city', 'district'],
  245. dicUrl: '/blade-system/region/select',
  246. span: 24,
  247. },
  248. {
  249. label: '地市',
  250. prop: 'city',
  251. type: 'select',
  252. props: {
  253. label: 'name',
  254. value: 'code',
  255. },
  256. dicFlag: false,
  257. dicUrl: '/blade-system/region/select?code={{key}}',
  258. span: 24,
  259. },
  260. {
  261. label: '区县',
  262. prop: 'district',
  263. type: 'select',
  264. props: {
  265. label: 'name',
  266. value: 'code',
  267. },
  268. dicFlag: false,
  269. dicUrl: '/blade-system/region/select?code={{key}}',
  270. span: 24,
  271. },
  272. ],
  273. },
  274. }
  275. },
  276. watch: {
  277. 'regionForm.subCode'() {
  278. this.regionForm.code = this.regionForm.parentCode + this.regionForm.subCode
  279. },
  280. 'excelForm.isCovered'() {
  281. if (this.excelForm.isCovered !== '') {
  282. const column = this.findObject(this.excelOption.column, 'excelFile')
  283. column.action = `/blade-system/region/import-region?isCovered=${this.excelForm.isCovered}`
  284. }
  285. },
  286. },
  287. computed: {
  288. ...mapGetters(['permission']),
  289. permissionList() {
  290. return {
  291. addBtn: this.vaildData(this.permission.region_add, false),
  292. viewBtn: this.vaildData(this.permission.region_view, false),
  293. delBtn: this.vaildData(this.permission.region_delete, false),
  294. editBtn: this.vaildData(this.permission.region_edit, false),
  295. }
  296. },
  297. ids() {
  298. let ids = []
  299. this.selectionList.forEach((ele) => {
  300. ids.push(ele.id)
  301. })
  302. return ids.join(',')
  303. },
  304. },
  305. methods: {
  306. initTree() {
  307. this.treeData = []
  308. getLazyTree(this.topCode).then((res) => {
  309. this.treeData = res.data.data.map((item) => {
  310. return {
  311. ...item,
  312. leaf: !item.hasChildren,
  313. }
  314. })
  315. })
  316. },
  317. nodeClick(data) {
  318. const column = this.findObject(this.regionOption.column, 'parentCode')
  319. column.disabled = true
  320. this.treeCode = data.id
  321. this.treeParentCode = data.parentId
  322. getDetail(this.treeCode).then((res) => {
  323. this.regionForm = res.data.data
  324. this.regionForm.subCode = this.regionForm.code.replace(this.regionForm.parentCode, '')
  325. })
  326. },
  327. addChildren() {
  328. if (validatenull(this.regionForm.code) || validatenull(this.regionForm.name)) {
  329. this.$message.warning('请先选择一项区划')
  330. return
  331. }
  332. this.regionForm.parentCode = this.regionForm.code
  333. this.regionForm.parentName = this.regionForm.name
  334. this.regionForm.code = ''
  335. this.regionForm.subCode = ''
  336. this.regionForm.name = ''
  337. this.regionForm.regionLevel = this.regionForm.regionLevel === 5 ? 5 : this.regionForm.regionLevel + 1
  338. },
  339. handleSubmit(form, done, loading) {
  340. const parentCode = form.parentCode === this.topCode ? '' : form.parentCode
  341. form.code = parentCode + form.subCode
  342. submit(form).then(
  343. () => {
  344. this.$message({
  345. type: 'success',
  346. message: '操作成功!',
  347. })
  348. this.initTree()
  349. this.regionForm.subCode = ''
  350. this.$refs.form.resetForm()
  351. done()
  352. },
  353. (error) => {
  354. loading()
  355. window.console.log(error)
  356. }
  357. )
  358. },
  359. handleDelete() {
  360. if (validatenull(this.regionForm.code)) {
  361. this.$message.warning('请先选择一项区划')
  362. return
  363. }
  364. this.$confirm(`确定将 [${this.regionForm.name}] 数据删除?`, {
  365. confirmButtonText: '确定',
  366. cancelButtonText: '取消',
  367. type: 'warning',
  368. })
  369. .then(() => {
  370. return remove(this.treeCode)
  371. })
  372. .then(() => {
  373. this.$message({
  374. type: 'success',
  375. message: '操作成功!',
  376. })
  377. this.initTree()
  378. this.regionForm.subCode = ''
  379. this.$refs.form.resetForm()
  380. })
  381. },
  382. uploadAfter(res, done, loading, column) {
  383. window.console.log(column)
  384. this.excelBox = false
  385. this.initTree()
  386. done()
  387. },
  388. handleDebug() {
  389. this.debugBox = true
  390. },
  391. handleImport() {
  392. this.excelBox = true
  393. },
  394. handleExport() {
  395. this.$confirm('是否导出行政区划数据?', '提示', {
  396. confirmButtonText: '确定',
  397. cancelButtonText: '取消',
  398. type: 'warning',
  399. }).then(() => {
  400. window.open(`/blade-system/region/export-region?${this.website.tokenHeader}=${getToken()}`)
  401. })
  402. },
  403. handleTemplate() {
  404. window.open(`/blade-system/region/export-template?${this.website.tokenHeader}=${getToken()}`)
  405. },
  406. },
  407. }
  408. </script>
  409. <style>
  410. .box {
  411. height: 800px;
  412. }
  413. .el-scrollbar {
  414. height: 100%;
  415. }
  416. .box .el-scrollbar__wrap {
  417. overflow: scroll;
  418. }
  419. </style>