address.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. <template>
  2. <div>
  3. <el-tooltip
  4. effect="dark"
  5. :content="addressName"
  6. placement="top"
  7. :enterable="false"
  8. :disabled="disabled"
  9. >
  10. <el-cascader
  11. :disabled="casDisabled"
  12. :clearable="clearable"
  13. ref="areaSelect"
  14. v-model="areaCodeList"
  15. :props="belongRegoinProps"
  16. :options="belongRegoinOptions"
  17. placeholder="请选择"
  18. @change="belongRegionChange"
  19. @visible-change="visibleChange"
  20. style="width: 100%"
  21. >
  22. </el-cascader>
  23. </el-tooltip>
  24. </div>
  25. </template>
  26. <script>
  27. // https://gitee.com/xiong_chencheng_1127/areaSelect/tree/master
  28. // import AreaCascader from "../../components/areaCascader.vue";
  29. // components: {
  30. // AreaCascader,
  31. // },
  32. // <Area-cascader
  33. // @selectedAreaList="selectedAreaList"
  34. // :isCurrentOrgDefaultArea="false"
  35. // :clearable="true"
  36. // ></Area-cascader>
  37. // 这里是我项目中自己封装的get请求 各位可自己封装
  38. // import { get } from "@/apis/apicommon";
  39. var Mock = require("mockjs");
  40. let dataList = Mock.mock({
  41. // 属性 list 的值是一个数组,其中含有 1 到 10 个元素
  42. "data|1-10": [
  43. {
  44. // 属性 id 是一个自增数,起始值为 1,每次增 1
  45. "id|1-10000": 1,
  46. "name|+1": "@city(true)",
  47. },
  48. ],
  49. });
  50. export default {
  51. name: "areaCascader",
  52. components: {},
  53. // 注意:isCurrentOrgDefaultArea与isPortDefaultArea不能同时为true
  54. props: {
  55. setLevel: {
  56. type: Number,
  57. default: 5,
  58. },
  59. // true开启默认回显当前账号所属区划地址,为false时关闭回显并且可选择任意区划
  60. isCurrentOrgDefaultArea: {
  61. type: Boolean,
  62. default: true,
  63. },
  64. // 回显指定区划地址的对象数据,必须为以下指定格式字段,切且注意该对象传入时间必须在该组件初始化之前
  65. defaultAddressInfos: {
  66. type: Object,
  67. // default:{
  68. // addressName:"",
  69. // provinceCode:"",
  70. // cityCode:"",
  71. // countyCode:"",
  72. // streetCode:"",
  73. // communityCode:"",
  74. // level:""
  75. // }
  76. },
  77. // true开启默认回显指定区划地址,需必传对象defaultAddressInfos,且与isCurrentOrgDefaultArea不能同时为true
  78. isPortDefaultArea: {
  79. type: Boolean,
  80. default: false,
  81. },
  82. // 是否可清空已选,默认不可清空
  83. clearable: {
  84. type: Boolean,
  85. default: false,
  86. },
  87. casDisabled: {
  88. type: Boolean,
  89. default: false,
  90. },
  91. },
  92. watch: {},
  93. data() {
  94. const self = this;
  95. return {
  96. disabled: true,
  97. addressName: "",
  98. defaultHosuse: {
  99. province: "",
  100. city: "",
  101. area: "",
  102. town: "",
  103. vill: "",
  104. },
  105. CurrentOrg: {},
  106. currentLastLevelCode: "",
  107. CurrentLevel: Number,
  108. areaCodeList: [],
  109. currentOrgLevel: "",
  110. belongRegoinOptions: [],
  111. belongRegoinProps: {
  112. checkStrictly: true,
  113. lazy: true,
  114. lazyLoad(node, resolve) {
  115. setTimeout(() => {
  116. self.getAreaForLazyLoad(node, resolve);
  117. }, 100);
  118. },
  119. },
  120. };
  121. },
  122. created() {
  123. // console.log(data);
  124. if (this.isCurrentOrgDefaultArea) {
  125. // 通过当前账号所在区划回显
  126. this.getCurrentOrg();
  127. }
  128. if (this.isPortDefaultArea) {
  129. // 通过指定区划回显
  130. this.getDefaultArea();
  131. }
  132. },
  133. methods: {
  134. visibleChange(val) {
  135. console.log(val);
  136. if (val) {
  137. this.disabled = true;
  138. } else if (!val && this.addressName) {
  139. this.disabled = false;
  140. }
  141. },
  142. belongRegionChange(val) {
  143. let res = this.$refs.areaSelect.getCheckedNodes();
  144. console.log(res);
  145. if (res && res.length > 0) {
  146. this.addressName =
  147. res[0].pathLabels[0] +
  148. (res[0].pathLabels[1] || "") +
  149. (res[0].pathLabels[2] || "") +
  150. (res[0].pathLabels[3] || "") +
  151. (res[0].pathLabels[4] || "");
  152. let areaNameObject = {
  153. provinceName: res[0].pathLabels[0],
  154. cityName: res[0].pathLabels[1],
  155. countyName: res[0].pathLabels[2],
  156. streetName: res[0].pathLabels[3],
  157. communityName: res[0].pathLabels[4],
  158. };
  159. let areaCodeObject = {
  160. provinceCode: res[0].path[0],
  161. cityCode: res[0].path[1],
  162. countyCode: res[0].path[2],
  163. streetCode: res[0].path[3],
  164. communityCode: res[0].path[4],
  165. };
  166. let data = {
  167. areaNameObject,
  168. areaCodeObject,
  169. };
  170. this.$emit("selectedAreaList", data);
  171. } else {
  172. this.addressName = "";
  173. let areaNameObject = {
  174. provinceName: "",
  175. cityName: "",
  176. countyName: "",
  177. streetName: "",
  178. communityName: "",
  179. };
  180. let areaCodeObject = {
  181. provinceCode: "",
  182. cityCode: "",
  183. countyCode: "",
  184. streetCode: "",
  185. communityCode: "",
  186. };
  187. let data = {
  188. areaNameObject,
  189. areaCodeObject,
  190. };
  191. this.$emit("selectedAreaList", data);
  192. this.disabled = true;
  193. }
  194. },
  195. getAreaForLazyLoad(node, resolve) {
  196. const { level } = node;
  197. let data = {};
  198. if (level == 0) {
  199. data = {
  200. areaCode: "000000",
  201. };
  202. } else if (
  203. level == 1 ||
  204. level == 2 ||
  205. level == 3 ||
  206. level == 4 ||
  207. level == 5
  208. ) {
  209. data = {
  210. areaCode: node.value,
  211. };
  212. } else {
  213. return false;
  214. } // 这里是接口
  215. // get("/area/getNextAreaInfoByCode", data)
  216. // .then((res) => {
  217. // mock.js模拟接口
  218. let res = Mock.mock({
  219. // 属性 list 的值是一个数组,其中含有 1 到 10 个元素
  220. "data|1-10": [
  221. {
  222. // 属性 id 是一个自增数,起始值为 1,每次增 1
  223. "id|1-10000": "1",
  224. "name|+1": "@city(true)",
  225. },
  226. ],
  227. });
  228. console.log(data);
  229. if (res.data) {
  230. let isContain = data.areaCode.search(this.currentLastLevelCode);
  231. let oData = [];
  232. // let oData = this.formatAreaData(res.data, level);
  233. if (this.isCurrentOrgDefaultArea || this.isPortDefaultArea) {
  234. let arrList = this.formatAreaData(res.data, level);
  235. arrList.map((item, index) => {
  236. if (
  237. (item.level <= this.CurrentLevel &&
  238. this.isCurrentOrgDefaultArea) ||
  239. (data.areaCode !== this.currentLastLevelCode &&
  240. this.CurrentLevel >= level) ||
  241. isContain != 0
  242. ) {
  243. oData.push(Object.assign({}, item, { disabled: true }));
  244. } else {
  245. oData.push(Object.assign({}, item, { disabled: false }));
  246. }
  247. });
  248. } else {
  249. oData = this.formatAreaData(res.data, level);
  250. }
  251. // this.belongRegoinOptions = oData
  252. if (oData.length == 0) {
  253. // // console.log('子节点数据为空', node)
  254. // node.syncCheckState(node.value);
  255. // const checkedNode = this.$refs.areaSelect.getCheckedNodes();
  256. // // console.log('获得刚才选中的节点', checkedNode)
  257. // node.syncCheckState(node.value)
  258. // node.doCheck(true)
  259. // this.$set(node, 'leaf', true)
  260. // oData = undefined;
  261. // resolve(oData);
  262. // return;
  263. }
  264. resolve(oData);
  265. }
  266. // })
  267. // .catch((err) => {
  268. // console.log(err);
  269. // this.$message.error(err);
  270. // });
  271. },
  272. formatAreaData(data, level) {
  273. return data.map((item) => {
  274. item.names = item.name;
  275. item.value = item.id;
  276. item.label = item.name;
  277. item.leaf = level >= this.setLevel - 1;
  278. return item;
  279. });
  280. },
  281. handleAreaCode() {
  282. let areaCodeList = [];
  283. if (this.defaultHosuse.province) {
  284. areaCodeList.push(this.defaultHosuse.province);
  285. this.currentLastLevelCode = this.defaultHosuse.province;
  286. }
  287. if (this.defaultHosuse.city) {
  288. areaCodeList.push(this.defaultHosuse.city);
  289. this.currentLastLevelCode = this.defaultHosuse.city;
  290. }
  291. if (this.defaultHosuse.area) {
  292. areaCodeList.push(this.defaultHosuse.area);
  293. this.currentLastLevelCode = this.defaultHosuse.area;
  294. }
  295. if (this.defaultHosuse.town) {
  296. areaCodeList.push(this.defaultHosuse.town);
  297. this.currentLastLevelCode = this.defaultHosuse.town;
  298. }
  299. if (this.defaultHosuse.vill) {
  300. areaCodeList.push(this.defaultHosuse.vill);
  301. this.currentLastLevelCode = this.defaultHosuse.vill;
  302. }
  303. this.areaCodeList = areaCodeList;
  304. console.log(areaCodeList);
  305. if (this.addressName == "") {
  306. this.disabled = true;
  307. } else {
  308. this.disabled = false;
  309. }
  310. },
  311. getDefaultArea() {
  312. console.log(this.defaultAddressInfos);
  313. this.addressName = this.defaultAddressInfos.addressName;
  314. this.defaultHosuse.province = this.defaultAddressInfos.provinceCode || "";
  315. this.defaultHosuse.city = this.defaultAddressInfos.cityCode || "";
  316. this.defaultHosuse.area = this.defaultAddressInfos.countyCode || "";
  317. this.defaultHosuse.town = this.defaultAddressInfos.streetCode || "";
  318. this.defaultHosuse.vill = this.defaultAddressInfos.communityCode || "";
  319. this.CurrentLevel = this.defaultAddressInfos.level;
  320. this.handleAreaCode();
  321. },
  322. getCurrentOrg() {
  323. console.log(dataList);
  324. // get("/organization/getCurrentOrg", {}).then((res) => {
  325. let res = Mock.mock({
  326. // 属性 list 的值是一个数组,其中含有 1 到 10 个元素
  327. "data|1-10": [
  328. {
  329. // 属性 id 是一个自增数,起始值为 1,每次增 1
  330. "id|1-10000": "1",
  331. "name|+1": "@city(true)",
  332. },
  333. ],
  334. });
  335. if (res) {
  336. let data = res.data;
  337. this.addressName =
  338. (data.provinceName || "") +
  339. (data.cityName || "") +
  340. (data.countyName || "") +
  341. (data.streetName || "") +
  342. (data.communityName || "");
  343. // this.currentOrgLevel = data.level;
  344. // this.CurrentOrg = data;
  345. // let {province='provinceCode',city='cityCode',area='countyCode',town='streetCode',vill='communityCode'} = data
  346. // this.defaultHosuse = {province='provinceCode',city='cityCode',area='countyCode',town='streetCode',vill='communityCode'}
  347. this.defaultHosuse.province = data.provinceCode;
  348. this.defaultHosuse.city = data.cityCode;
  349. this.defaultHosuse.area = data.countyCode;
  350. this.defaultHosuse.town = data.streetCode;
  351. this.defaultHosuse.vill = data.communityCode;
  352. this.CurrentLevel = data.level;
  353. this.handleAreaCode();
  354. let areaNameObject = {
  355. provinceName: data.provinceName,
  356. cityName: data.cityName,
  357. countyName: data.countyName,
  358. streetName: data.streetName,
  359. communityName: data.communityName,
  360. };
  361. let areaCodeObject = {
  362. provinceCode: data.provinceCode,
  363. cityCode: data.cityCode,
  364. countyCode: data.countyCode,
  365. streetCode: data.streetCode,
  366. communityCode: data.communityCode,
  367. };
  368. let val = {
  369. areaNameObject,
  370. areaCodeObject,
  371. };
  372. this.$emit("selectedAreaList", val);
  373. }
  374. // });
  375. },
  376. },
  377. };
  378. </script>
  379. <style scoped>
  380. </style>