newAdd.vue 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719
  1. <template>
  2. <div class="main">
  3. <div></div>
  4. <el-form ref="ruleForm" :model="formData" label-width="100px" :rules="formRules">
  5. <div class="formContent">
  6. <div class="formContent-item">
  7. <div class="formContent-item_title">基础信息</div>
  8. <div class="formContent-formList">
  9. <div>
  10. <el-form-item label="姓名" prop="name">
  11. <el-input v-model="formData.name" placeholder="请输入姓名"></el-input>
  12. </el-form-item>
  13. <el-form-item label="手机号" prop="phone">
  14. <el-input v-model="formData.phone" placeholder="请输入手机号" maxlength="11"></el-input>
  15. </el-form-item>
  16. <el-form-item label="人员编号">
  17. <el-input v-model="formData.personnelNumber" placeholder="请输入人员编号"></el-input>
  18. </el-form-item>
  19. <el-form-item label="性别" required>
  20. <el-radio v-model="formData.sex" :label="1">男</el-radio>
  21. <el-radio v-model="formData.sex" :label="2">女</el-radio>
  22. </el-form-item>
  23. <el-form-item label="备注">
  24. <el-input type="textarea" v-model="formData.remark" placeholder="请输入备注"></el-input>
  25. </el-form-item>
  26. </div>
  27. <div class="clickUpload">
  28. <div class="clickUpText">
  29. <img class="dataImg" v-if="!!formData.facePictureUrl" :src="formData.facePictureUrl" />
  30. <template v-else>
  31. <img class="bg-img" src="@/assets/img/ownerManagement/img_zhaopian2@2x.png" alt="" />
  32. <div>点击添加人脸照片</div>
  33. </template>
  34. </div>
  35. <el-upload
  36. :headers="token"
  37. ref="uploaduserlogo"
  38. class="mini-upload"
  39. limit="1"
  40. action="/sc-community/upload/uploadFile"
  41. :on-success="uploadsuccess"
  42. :before-upload="beforeAvatarUpload"
  43. :auto-upload="true"
  44. name="file"
  45. >
  46. </el-upload>
  47. </div>
  48. </div>
  49. </div>
  50. <div class="formContent-item">
  51. <div class="formContent-item_title">证件信息</div>
  52. <el-form-item label="证件类型" required>
  53. <el-select v-model="formData.idType" class="width100">
  54. <el-option v-for="(item, index) in idTypeArray" :key="index" :label="item.label" :value="item.status">{{
  55. item.label
  56. }}</el-option>
  57. </el-select>
  58. </el-form-item>
  59. <el-form-item label="证件号码" prop="idNumber" class="width100">
  60. <el-input v-model="formData.idNumber" placeholder="请输入证件号码" maxlength="18"></el-input>
  61. </el-form-item>
  62. <el-form-item label="户籍地址" class="width100">
  63. <el-input v-model="formData.permanentAddress" placeholder="请输入户籍地址"></el-input>
  64. </el-form-item>
  65. <el-form-item label="签发机关" class="width100">
  66. <el-input v-model="formData.issuingAuthority" placeholder="请输入签发机关"></el-input>
  67. </el-form-item>
  68. <el-form-item label="有效期">
  69. <el-date-picker
  70. class="width100"
  71. v-model="effectiveDate"
  72. value-format="yyyy-MM-dd HH:mm:ss"
  73. type="daterange"
  74. range-separator="至"
  75. start-placeholder="选择开始日期"
  76. end-placeholder="选择结束日期"
  77. @change="effectiveDateToggle"
  78. :editable="false"
  79. ></el-date-picker>
  80. </el-form-item>
  81. <el-form-item label="国籍">
  82. <el-select v-model="formData.nationality" clearable class="width100">
  83. <el-option v-for="(item, index) in nationalityArray" :key="index" :label="item.label" :value="item.status">{{
  84. item.label
  85. }}</el-option>
  86. </el-select>
  87. </el-form-item>
  88. <el-form-item label="籍贯">
  89. <el-select v-model="formData.nativePlace" clearable class="width100">
  90. <el-option v-for="(item, index) in nativePlaceArray" :key="index" :label="item.name" :value="item.code">{{
  91. item.name
  92. }}</el-option>
  93. </el-select>
  94. </el-form-item>
  95. <el-form-item label="民族">
  96. <el-select v-model="formData.nation" clearable class="width100">
  97. <el-option v-for="(item, index) in nationArray" :key="index" :label="item.name" :value="item.code">{{
  98. item.name
  99. }}</el-option>
  100. </el-select>
  101. </el-form-item>
  102. <el-form-item label="出生日期">
  103. <el-date-picker
  104. class="width100"
  105. v-model="formData.birthDate"
  106. value-format="yyyy-MM-dd HH:mm:ss"
  107. type="date"
  108. :picker-options="pickerOptions"
  109. placeholder="选择日期"
  110. >
  111. </el-date-picker>
  112. </el-form-item>
  113. </div>
  114. <div class="formContent-item">
  115. <div class="formContent-item_title"><span class="show-required-icon-star"></span> 绑定房产和车位</div>
  116. <div class="ownerScroll">
  117. <div class="formContent-formList house" v-for="(item, index) in formData.houseList" :key="index">
  118. <div class="block-title">
  119. <div class="floor list-title">
  120. {{
  121. `${item.buildingName} ${!!item.unitName ? CheckChinese(item.unitName, '单元') : ''}${
  122. item.roomNumber
  123. }`
  124. }}
  125. </div>
  126. <img class="bg-img" src="@/assets/img/ownerManagement/bg_card@2x.png" alt="" />
  127. <img class="bg-imgIoc" src="@/assets/img/ownerManagement/icon_building@2x.png" alt="" />
  128. </div>
  129. <div class="el-form">
  130. <el-form-item label="类型" required label-width="70px">
  131. <el-select v-model="item.householdType" clearable @change="householdTypeHide(item)">
  132. <el-option
  133. v-for="(item, index) in householdTypeArray"
  134. :key="index"
  135. :label="item.label"
  136. :value="item.status"
  137. >{{ item.label }}</el-option
  138. >
  139. </el-select>
  140. </el-form-item>
  141. <el-form-item label="入住时间" label-width="70px">
  142. <el-date-picker
  143. v-model="item.checkInDate"
  144. value-format="yyyy-MM-dd HH:mm:ss"
  145. type="date"
  146. placeholder="选择日期"
  147. >
  148. </el-date-picker>
  149. </el-form-item>
  150. </div>
  151. <div class="block-title car" v-for="(items, indexs) in item.parkingList" :key="indexs">
  152. <div class="floor list-title">
  153. {{ `${items.garageName}${items.areaName || items.partitionName || ''}-${items.parkingNumber}` }}
  154. </div>
  155. <span class="remove list-title" @click="removeCard(indexs, item)">移除</span>
  156. <img class="bg-img" src="@/assets/img/ownerManagement/bg_card@2x.png" alt="" />
  157. <img class="bg-imgIoc" src="@/assets/img/ownerManagement/icon_car@2x.png" alt="" />
  158. </div>
  159. <div class="addHouse block-title" v-if="!!formData.houseList.length" @click="addCard(item)">
  160. <div class="floor list-title">绑定车位</div>
  161. <img class="bg-img" src="@/assets/img/ownerManagement/bg_card@2x.png" alt="" />
  162. <img class="bg-imgIoc" src="@/assets/img/ownerManagement/icon_car@2x.png" alt="" />
  163. <img class="add" src="@/assets/img/ownerManagement/btn_add@2x.png" />
  164. </div>
  165. <el-button
  166. class="removeHouseButton"
  167. type="primary"
  168. @click="removeHouse(index)"
  169. v-if="formData.houseList.length !== 0"
  170. >删除房产</el-button
  171. >
  172. </div>
  173. <div class="addHouse block-title" v-if="formData.houseList.length == 0" @click="addHouse()">
  174. <div class="floor list-title">绑定房产</div>
  175. <img class="bg-img" src="@/assets/img/ownerManagement/bg_card@2x.png" alt="" />
  176. <img class="bg-imgIoc" src="@/assets/img/ownerManagement/icon_building@2x.png" alt="" />
  177. <img class="add" src="@/assets/img/ownerManagement/btn_add@2x.png" />
  178. </div>
  179. <el-button class="addHouseButton" type="primary" @click="addHouse()" v-if="formData.houseList.length !== 0"
  180. >新增房产</el-button
  181. >
  182. </div>
  183. </div>
  184. </div>
  185. </el-form>
  186. <div class="buttons">
  187. <el-button @click="closes">取消</el-button>
  188. <el-button type="primary" @click="addEdit()">保存</el-button>
  189. </div>
  190. </div>
  191. </template>
  192. <script>
  193. export default {
  194. name: 'ownerManagementAdd',
  195. props: {
  196. params: {
  197. type: Object
  198. },
  199. islook: {
  200. type: Boolean,
  201. default: false
  202. },
  203. isAdd: {
  204. type: Boolean,
  205. default: true
  206. }
  207. },
  208. filters: {
  209. matchingVal(val, arr) {
  210. let v = '';
  211. if (!!val) {
  212. arr.forEach((item) => {
  213. if (!!item.status && item.status === val) {
  214. v = item.label;
  215. } else if (!!item.code && item.code === val) {
  216. v = item.name;
  217. }
  218. });
  219. }
  220. return v;
  221. }
  222. },
  223. data() {
  224. return {
  225. token: {
  226. [localStorage.getItem('SC_token') && 'Authorization']: 'Bearer ' + localStorage.getItem('SC_token')
  227. },
  228. pickerOptions: {
  229. disabledDate(val) {
  230. // return val.getTime() < Date.now() - 8.64e7;
  231. return +new Date(val) > +new Date();
  232. }
  233. },
  234. effectiveDate: [],
  235. formData: {
  236. name: '',
  237. phone: '',
  238. personnelNumber: '',
  239. sex: 1,
  240. remarks: '',
  241. facePictureUrl: '',
  242. id: 0,
  243. idType: 1,
  244. idNumber: '',
  245. permanentAddress: '',
  246. issuingAuthority: '',
  247. effectiveDateStart: '',
  248. effectiveDateEnd: '',
  249. nationality: 1,
  250. nativePlace: '',
  251. nation: '',
  252. birthDate: '',
  253. houseList: []
  254. },
  255. formCols: [
  256. [
  257. {
  258. label: '姓名',
  259. prop: 'name',
  260. slot: 'name',
  261. input: true
  262. },
  263. {
  264. label: '手机号',
  265. prop: 'phone',
  266. slot: 'phone',
  267. input: true
  268. },
  269. {
  270. label: '人员编号',
  271. prop: 'personnelNumber',
  272. slot: 'personnelNumber',
  273. input: true
  274. },
  275. {
  276. label: '性别',
  277. prop: 'sex',
  278. slot: 'sex'
  279. },
  280. {
  281. label: '备注',
  282. prop: 'remarks',
  283. slot: 'remarks'
  284. }
  285. ]
  286. ],
  287. formCols2: [
  288. [
  289. {
  290. label: '证件类型',
  291. prop: 'idType',
  292. slot: 'idType'
  293. },
  294. {
  295. label: '证件号码',
  296. prop: 'idNumber',
  297. slot: 'idNumber',
  298. input: true
  299. },
  300. {
  301. label: '户籍地址',
  302. prop: 'permanentAddress',
  303. slot: 'permanentAddress',
  304. input: true
  305. },
  306. {
  307. label: '签发机关',
  308. prop: 'issuingAuthority',
  309. slot: 'issuingAuthority',
  310. input: true
  311. },
  312. {
  313. label: '有效期',
  314. prop: 'effectiveDate',
  315. slot: 'effectiveDate'
  316. },
  317. {
  318. label: '国籍',
  319. prop: 'nationality',
  320. slot: 'nationality'
  321. },
  322. {
  323. label: '籍贯',
  324. prop: 'nativePlace',
  325. slot: 'nativePlace'
  326. },
  327. {
  328. label: '民族',
  329. prop: 'nation',
  330. slot: 'nation'
  331. },
  332. {
  333. label: '出生日期',
  334. prop: 'birthDate',
  335. slot: 'birthDate'
  336. }
  337. ]
  338. ],
  339. formCols3: [
  340. [
  341. {
  342. label: '类型',
  343. prop: 'householdType',
  344. slot: 'householdType',
  345. showRequired: true
  346. },
  347. {
  348. label: '入住时间',
  349. prop: 'checkInDate',
  350. slot: 'checkInDate'
  351. }
  352. ]
  353. ],
  354. nationalityArray: [
  355. {
  356. status: 1,
  357. label: '中国'
  358. },
  359. {
  360. status: 2,
  361. label: '其他'
  362. }
  363. ],
  364. idTypeArray: [
  365. {
  366. status: 1,
  367. label: '居民身份证'
  368. },
  369. {
  370. status: 2,
  371. label: '居民户口簿'
  372. },
  373. {
  374. status: 3,
  375. label: '暂住证'
  376. },
  377. {
  378. status: 4,
  379. label: '其他'
  380. }
  381. ],
  382. householdTypeArray: [
  383. {
  384. status: 1,
  385. label: '业主'
  386. },
  387. {
  388. status: 2,
  389. label: '亲属'
  390. },
  391. {
  392. status: 3,
  393. label: '租客'
  394. },
  395. {
  396. status: 4,
  397. label: '租户管理员'
  398. },
  399. {
  400. status: 5,
  401. label: '普通员工'
  402. }
  403. ],
  404. formRules: {
  405. name: [this.$valid.selectRequired('填写姓名')],
  406. phone: [this.$valid.patternPhone('填写手机号')],
  407. idNumber: [this.$valid.inputRequired('证件号码')]
  408. },
  409. communityArr: [],
  410. garageArr: []
  411. };
  412. },
  413. created() {
  414. this.$store.dispatch('collapse', true);
  415. if (!!this.params.id) {
  416. this.getDetails(this.params.id);
  417. } else {
  418. if (this.$parent.thisLeftData.type == 'room') {
  419. this.formData.houseList = [
  420. {
  421. checkInDate: '',
  422. householdType: 1,
  423. buildingName: this.$parent.thisLeftData.buildingName,
  424. unitName: this.$parent.thisLeftData.unitName,
  425. roomNumber: this.$parent.thisLeftData.houseName,
  426. houseId: this.$parent.thisLeftData.houseId,
  427. parkingList: []
  428. }
  429. ];
  430. }
  431. }
  432. this.getTenantsTree();
  433. },
  434. beforeDestroy() {
  435. this.$store.dispatch('collapse', false);
  436. },
  437. computed: {
  438. nationArray() {
  439. return this.$store.getters['getNationArray'];
  440. },
  441. nativePlaceArray() {
  442. return this.$store.getters['getNativeArray'];
  443. }
  444. },
  445. methods: {
  446. getDetails(id) {
  447. let url = '/sc-community/scResident/find/' + id;
  448. this.$http
  449. .get(url)
  450. .then(({ data, status, msg }) => {
  451. if (0 === status) {
  452. let { effectiveDateStart, effectiveDateEnd } = data;
  453. if (effectiveDateStart == null || effectiveDateEnd == null) {
  454. effectiveDateStart = '';
  455. effectiveDateEnd = '';
  456. }
  457. this.effectiveDate = [effectiveDateStart, effectiveDateEnd];
  458. this.formData = data;
  459. } else {
  460. this.$message.error(msg);
  461. }
  462. })
  463. .catch(() => {});
  464. },
  465. lookFormCols(cols) {
  466. this[cols][0].forEach((item, index) => {
  467. if (!!item.input) {
  468. item.input = false;
  469. }
  470. });
  471. },
  472. uploadsuccess(response, file, fileList) {
  473. this.$refs.uploaduserlogo.clearFiles();
  474. if (0 === response.status) {
  475. this.formData.facePictureUrl = response.data;
  476. }
  477. },
  478. beforeAvatarUpload(file) {
  479. const isJPG = file.type === 'image/jpeg';
  480. const isLt2M = file.size / 1024 / 1024 < 2;
  481. if (!isJPG) {
  482. this.$message.error('上传头像图片只能是 JPG 格式!');
  483. }
  484. if (!isLt2M) {
  485. this.$message.error('上传头像图片大小不能超过 2MB!');
  486. }
  487. return isJPG && isLt2M;
  488. },
  489. effectiveDateToggle(va) {
  490. let arr = va;
  491. if (!arr) {
  492. arr = ['', ''];
  493. }
  494. this.formData.effectiveDateStart = arr[0];
  495. this.formData.effectiveDateEnd = arr[1];
  496. },
  497. addHouse() {
  498. new Promise((resolve) => {
  499. this.$store.dispatch('addPopup', {
  500. url: '/ownerManagement/stepPage/poptreeSelect.vue',
  501. width: '500px',
  502. height: '400px',
  503. props: {
  504. num: 1,
  505. list: this.formData.houseList || [],
  506. tenantsTree: this.communityArr,
  507. callback: resolve
  508. },
  509. title: '选择房产',
  510. notip: true
  511. });
  512. }).then((res) => {
  513. if (res.length > 0) {
  514. res.forEach((item, index) => {
  515. let newObj = {
  516. checkInDate: '',
  517. householdType: 1,
  518. buildingName: item.buildingName,
  519. unitName: item.unitName,
  520. roomNumber: item.roomNumber,
  521. houseId: item.houseId,
  522. parkingList: []
  523. };
  524. let isExit = this.formData['houseList'].some((is) => {
  525. return is.houseId == item.houseId;
  526. });
  527. if (!isExit) {
  528. this.formData['houseList'].push(newObj);
  529. }
  530. });
  531. }
  532. });
  533. },
  534. addCard(itemObj) {
  535. if (itemObj.householdType !== 1) {
  536. this.$message.error('只能业主才能绑定车位');
  537. return;
  538. }
  539. new Promise((resolve) => {
  540. this.$store.dispatch('addPopup', {
  541. url: '/ownerManagement/stepPage/poptreeSelect.vue',
  542. width: '500px',
  543. height: '400px',
  544. props: {
  545. num: 2,
  546. list: itemObj.parkingList || [],
  547. tenantsTree: this.garageArr,
  548. callback: resolve
  549. },
  550. title: '选择车位',
  551. notip: true
  552. });
  553. }).then((res) => {
  554. if (res.length > 0) {
  555. res.forEach((item, index) => {
  556. let newObj = {
  557. parkingId: item.parkingId,
  558. parkingNumber: item.parkingNumber,
  559. partitionName: item.partitionName,
  560. garageName: item.garageName
  561. };
  562. let isExit = itemObj['parkingList'].some((is) => {
  563. return is.parkingId == item.parkingId;
  564. });
  565. if (!isExit) {
  566. itemObj['parkingList'].push(newObj);
  567. }
  568. });
  569. }
  570. });
  571. },
  572. removeHouse(index) {
  573. this.formData['houseList'].splice(index, 1);
  574. },
  575. removeCard(index, itemObj) {
  576. itemObj['parkingList'].splice(index, 1);
  577. },
  578. closes() {
  579. this.$emit('clerOwnerStatus');
  580. },
  581. addEdit() {
  582. let _this = this;
  583. if (this.formData.houseList.length === 0) {
  584. this.$message.error('房产必须绑定');
  585. return;
  586. }
  587. this.$refs['ruleForm'].validate((valid) => {
  588. debugger;
  589. if (valid) {
  590. let url = '/sc-community/scResident/add';
  591. let params = this.formData;
  592. if (!_this.isAdd) {
  593. url = '/sc-community/scResident/update';
  594. }
  595. this.$http
  596. .post(url, params)
  597. .then(({ status, msg }) => {
  598. if (status == 0) {
  599. this.$message.success(msg);
  600. this.closes();
  601. } else {
  602. this.$message.error(msg);
  603. }
  604. })
  605. .catch(() => {});
  606. } else {
  607. return false;
  608. }
  609. });
  610. },
  611. getTenantsTree() {
  612. this.$http.get('/sc-community/assets/tree/community/find', { buildingType: 1 }).then(({ status, data, msg }) => {
  613. if (status === 0 && data) {
  614. this.dimension(data);
  615. this.communityArr = data;
  616. }
  617. });
  618. this.$http.get('/sc-community/assets/tree/garage/find').then(({ status, data, msg }) => {
  619. if (status === 0 && data) {
  620. this.garageArr = data;
  621. }
  622. });
  623. },
  624. dimension(arr) {
  625. arr.map((item, index) => {
  626. if (!!item.children) {
  627. this.dimension(item.children);
  628. if (item.type == 'unit') {
  629. item.name = this.CheckChinese(item.name, '单元');
  630. } else if (item.type == 'building') {
  631. item.name = this.CheckChinese(item.name, '楼栋');
  632. }
  633. }
  634. });
  635. },
  636. CheckChinese(val, name) {
  637. var reg = new RegExp('[\\u4E00-\\u9FFF]+', 'g');
  638. let newVal = val;
  639. if (!reg.test(val)) {
  640. newVal = val + name;
  641. }
  642. return newVal;
  643. },
  644. householdTypeHide(item) {
  645. if (item.householdType !== 1) {
  646. item.parkingList = [];
  647. }
  648. }
  649. }
  650. };
  651. </script>
  652. <style lang="scss" scoped>
  653. @import '../style.scss';
  654. .formContent-item .ownerScroll {
  655. height: calc(100vh - 250px);
  656. overflow: auto;
  657. padding-right: 10px;
  658. &::-webkit-scrollbar {
  659. width: 5px;
  660. }
  661. &::-webkit-scrollbar-track {
  662. border-radius: 10px;
  663. background: #f4f7f9a8;
  664. }
  665. &::-webkit-scrollbar-thumb {
  666. border-radius: 10px;
  667. background: #c6c4c4a9;
  668. }
  669. .addHouse {
  670. cursor: pointer;
  671. margin-bottom: 20px !important;
  672. img.add {
  673. margin-left: 20px;
  674. width: 13px;
  675. }
  676. }
  677. .block-title.car {
  678. margin-bottom: 20px;
  679. &:nth-of-type(2n) {
  680. margin-right: 20px;
  681. }
  682. }
  683. .formContent-formList.house {
  684. flex-wrap: wrap;
  685. &::after {
  686. content: '';
  687. width: 100%;
  688. height: 1px;
  689. background: #e0e1e3;
  690. margin-bottom: 20px;
  691. }
  692. .el-form {
  693. width: calc(100% - 220px);
  694. /deep/ .el-date-editor.el-input {
  695. width: 100%;
  696. }
  697. }
  698. }
  699. .removeHouseButton {
  700. width: 80px;
  701. height: 32px;
  702. margin-bottom: 20px;
  703. }
  704. }
  705. </style>