formYizhifu.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705
  1. <template>
  2. <div>
  3. <div style="padding: 10px 20px 10px 20px;border-bottom: 1px solid #dadada;">
  4. <el-page-header
  5. @back="onCancel"
  6. :content="payType == 'create' ? '创建账号' : '修改账号'"
  7. ></el-page-header>
  8. </div>
  9. <div class="formContainer">
  10. <el-form
  11. :model="form"
  12. ref="accountForm"
  13. label-position="right"
  14. label-width="180px"
  15. >
  16. <el-form-item
  17. label="分部"
  18. prop="organId"
  19. :rules="[
  20. { required: true, message: '请选择分部', trigger: 'change' }
  21. ]"
  22. >
  23. <el-select
  24. class="multiple"
  25. style="width: 180px !important"
  26. v-model.trim="form.organId"
  27. filterable
  28. clearable
  29. placeholder="请选择分部"
  30. >
  31. <el-option
  32. v-for="(item, index) in organList"
  33. :key="index"
  34. :label="item.name"
  35. :value="item.id"
  36. ></el-option>
  37. </el-select>
  38. </el-form-item>
  39. <el-card>
  40. <el-alert
  41. title="企业信息"
  42. :closable="false"
  43. type="warning"
  44. ></el-alert>
  45. <el-form-item
  46. label="公司名称"
  47. prop="name"
  48. :rules="[
  49. { required: true, message: '请输入公司名称', trigger: 'blur' }
  50. ]"
  51. >
  52. <el-input
  53. v-model="form.name"
  54. placeholder="请输入公司名称"
  55. ></el-input>
  56. </el-form-item>
  57. <el-form-item
  58. label="统一社会信用码"
  59. prop="socialCreditCode"
  60. :rules="[
  61. {
  62. required: true,
  63. message: '请输入统一社会信用码',
  64. trigger: 'blur'
  65. }
  66. ]"
  67. >
  68. <el-input
  69. v-model="form.socialCreditCode"
  70. placeholder="请输入统一社会信用码"
  71. ></el-input>
  72. </el-form-item>
  73. <el-form-item
  74. label="商户证件照片"
  75. prop="licenceUrl"
  76. :rules="[
  77. {
  78. required: true,
  79. message: '请上传商户证件照片',
  80. trigger: 'change'
  81. }
  82. ]"
  83. >
  84. <el-upload
  85. class="avatar-upload"
  86. ref="upload"
  87. :action="ossUploadUrl"
  88. :on-change="$event => handleChange($event, 'licenceUrl')"
  89. :on-remove="() => handleRemove('licenceUrl')"
  90. accept="image/*"
  91. :multiple="false"
  92. :limit="1"
  93. :auto-upload="false"
  94. >
  95. <el-button slot="trigger" type="primary" size="small"
  96. >选择文件</el-button
  97. >
  98. <div
  99. style="display: inline; padding-left: 20px"
  100. class="el-upload__tip"
  101. >
  102. 请上传商户证件照片。 最大限制为 9 M。
  103. </div>
  104. </el-upload>
  105. </el-form-item>
  106. <el-form-item
  107. label="开户许可证照片"
  108. prop="openAccountLicenceUrl"
  109. :rules="[
  110. {
  111. required: true,
  112. message: '请上传开户许可证照片',
  113. trigger: 'change'
  114. }
  115. ]"
  116. >
  117. <el-upload
  118. class="avatar-upload"
  119. ref="upload"
  120. :action="ossUploadUrl"
  121. :on-remove="() => handleRemove('openAccountLicenceUrl')"
  122. :on-change="
  123. $event => handleChange($event, 'openAccountLicenceUrl')
  124. "
  125. accept="image/*"
  126. :multiple="false"
  127. :limit="1"
  128. :auto-upload="false"
  129. >
  130. <el-button slot="trigger" type="primary" size="small"
  131. >选择文件</el-button
  132. >
  133. <div
  134. style="display: inline; padding-left: 20px"
  135. class="el-upload__tip"
  136. >
  137. 请上传开户许可证照片。 最大限制为 9 M。
  138. </div>
  139. </el-upload>
  140. </el-form-item>
  141. <el-form-item
  142. label="省市区"
  143. required
  144. prop="provCode"
  145. :rules="[
  146. {
  147. required: true,
  148. message: '请选择省市区',
  149. trigger: 'change'
  150. }
  151. ]"
  152. >
  153. <el-cascader
  154. placeholder="请选择省市区"
  155. style="width: 100%"
  156. :options="cityOptions"
  157. @change="changeCity"
  158. ></el-cascader>
  159. </el-form-item>
  160. <el-form-item
  161. label="详细地址"
  162. prop="address"
  163. :rules="[
  164. {
  165. required: true,
  166. message: '请选择省市区',
  167. trigger: 'blur'
  168. }
  169. ]"
  170. >
  171. <el-input v-model="form.address" placeholder="详细地址"></el-input>
  172. </el-form-item>
  173. </el-card>
  174. <el-card>
  175. <el-alert title="法人设置" :closable="false" type="warning">
  176. </el-alert>
  177. <el-form-item
  178. label="公司法人"
  179. prop="legalPerson"
  180. :rules="[
  181. {
  182. required: true,
  183. message: '请输入公司法人',
  184. trigger: 'blur'
  185. }
  186. ]"
  187. >
  188. <el-input
  189. v-model="form.legalPerson"
  190. placeholder="请输入公司法人"
  191. ></el-input>
  192. </el-form-item>
  193. <el-form-item
  194. label="公司法人手机号"
  195. prop="legalMp"
  196. :rules="[
  197. {
  198. required: true,
  199. message: '请输入公司法人手机号',
  200. trigger: 'blur'
  201. },
  202. {
  203. pattern: /^1[2-9][0-9]\d{8}$/,
  204. message: '请输入正确的手机号',
  205. trigger: 'blur'
  206. }
  207. ]"
  208. >
  209. <el-input
  210. v-model="form.legalMp"
  211. maxlength="11"
  212. placeholder="请输入公司法人手机号"
  213. ></el-input>
  214. </el-form-item>
  215. <el-form-item
  216. label="法人证件类型"
  217. prop="legalLicenceType"
  218. :rules="[
  219. {
  220. required: true,
  221. message: '请选择法人证件类型',
  222. trigger: 'change'
  223. }
  224. ]"
  225. >
  226. <el-select
  227. v-model="form.legalLicenceType"
  228. placeholder="请选择法人证件类型"
  229. >
  230. <el-option label="身份证" value="ID_CARD"></el-option>
  231. <el-option label="护照" value="PASSPORT"></el-option>
  232. <el-option
  233. label="港澳居民往来内地通行证"
  234. value="HM_VISITORPASS"
  235. ></el-option>
  236. </el-select>
  237. </el-form-item>
  238. <el-form-item
  239. label="法人身份证号"
  240. prop="legalCertId"
  241. :rules="[
  242. {
  243. required: true,
  244. message: '请输入法人身份证号',
  245. trigger: 'blur'
  246. }
  247. ]"
  248. >
  249. <el-input
  250. v-model="form.legalCertId"
  251. placeholder="请输入法人身份证号"
  252. ></el-input>
  253. </el-form-item>
  254. <el-form-item
  255. label="法人证件人像面照片"
  256. prop="legalLicenceFrontUrl"
  257. :rules="[
  258. {
  259. required: true,
  260. message: '请上传法人证件人像面照片',
  261. trigger: 'change'
  262. }
  263. ]"
  264. >
  265. <el-upload
  266. class="avatar-upload"
  267. ref="upload"
  268. :action="ossUploadUrl"
  269. :on-change="
  270. $event => handleChange($event, 'legalLicenceFrontUrl')
  271. "
  272. :on-remove="() => handleRemove('legalLicenceFrontUrl')"
  273. accept="image/*"
  274. :multiple="false"
  275. :limit="1"
  276. :auto-upload="false"
  277. >
  278. <el-button slot="trigger" type="primary" size="small"
  279. >选取文件</el-button
  280. >
  281. <div
  282. style="display: inline; padding-left: 20px"
  283. class="el-upload__tip"
  284. >
  285. 请上传法人证件人像面照片。 最大限制为9 M。
  286. </div>
  287. </el-upload>
  288. </el-form-item>
  289. <el-form-item
  290. label="法人证件非人像面照片"
  291. prop="legalLicenceBackUrl"
  292. :rules="[
  293. {
  294. required: true,
  295. message: '请上传法人证件非人像面照片',
  296. trigger: 'change'
  297. }
  298. ]"
  299. >
  300. <el-upload
  301. class="avatar-upload"
  302. ref="upload"
  303. :action="ossUploadUrl"
  304. :on-change="$event => handleChange($event, 'legalLicenceBackUrl')"
  305. :on-remove="() => handleRemove('legalLicenceBackUrl')"
  306. accept="image/*"
  307. :multiple="false"
  308. :limit="1"
  309. :auto-upload="false"
  310. >
  311. <el-button slot="trigger" type="primary" size="small"
  312. >选取文件</el-button
  313. >
  314. <div
  315. style="display: inline; padding-left: 20px"
  316. class="el-upload__tip"
  317. >
  318. 请上传法人证件非人像面照片。 最大限制为9 M。
  319. </div>
  320. </el-upload>
  321. </el-form-item>
  322. </el-card>
  323. <el-card>
  324. <el-alert title="联系人设置" :closable="false" type="warning">
  325. </el-alert>
  326. <el-form-item
  327. label="联系人姓名"
  328. prop="contactName"
  329. :rules="[
  330. {
  331. required: true,
  332. message: '请输入联系人姓名',
  333. trigger: 'blur'
  334. }
  335. ]"
  336. >
  337. <el-input
  338. v-model="form.contactName"
  339. placeholder="请输入联系人姓名"
  340. ></el-input>
  341. </el-form-item>
  342. <el-form-item
  343. label="联系人证件号码"
  344. prop="contactLicenseNo"
  345. :rules="[
  346. {
  347. required: true,
  348. message: '请输入联系人证件号码',
  349. trigger: 'blur'
  350. }
  351. ]"
  352. >
  353. <el-input
  354. v-model="form.contactLicenseNo"
  355. placeholder="请输入联系人证件号码"
  356. ></el-input>
  357. </el-form-item>
  358. <el-form-item
  359. label="联系人手机号码"
  360. prop="contactMobile"
  361. :rules="[
  362. {
  363. required: true,
  364. message: '请输入联系人手机号码',
  365. trigger: 'blur'
  366. },
  367. {
  368. pattern: /^1[2-9][0-9]\d{8}$/,
  369. message: '请输入正确的手机号',
  370. trigger: 'blur'
  371. }
  372. ]"
  373. >
  374. <el-input
  375. v-model="form.contactMobile"
  376. placeholder="请输入联系人手机号码"
  377. ></el-input>
  378. </el-form-item>
  379. <el-form-item
  380. label="联系人邮箱"
  381. prop="contactEmail"
  382. :rules="[
  383. {
  384. required: true,
  385. message: '请输入联系人邮箱',
  386. trigger: 'blur'
  387. }
  388. ]"
  389. >
  390. <el-input
  391. v-model="form.contactEmail"
  392. placeholder="请输入联系人邮箱"
  393. ></el-input>
  394. </el-form-item>
  395. </el-card>
  396. <el-card>
  397. <el-alert title="账户设置" :closable="false" type="warning">
  398. </el-alert>
  399. <el-form-item
  400. label="银行卡号"
  401. prop="cardNo"
  402. :rules="[
  403. {
  404. required: true,
  405. message: '请输入银行卡号',
  406. trigger: 'blur'
  407. }
  408. ]"
  409. >
  410. <el-input
  411. v-model="form.cardNo"
  412. placeholder="请输入银行卡号"
  413. ></el-input>
  414. </el-form-item>
  415. <el-form-item
  416. label="所属银行"
  417. prop="bankCode"
  418. :rules="[
  419. {
  420. required: true,
  421. message: '请选择所属银行',
  422. trigger: 'change'
  423. }
  424. ]"
  425. >
  426. <el-select
  427. v-model="form.bankCode"
  428. placeholder="请选择所属银行"
  429. filterable
  430. >
  431. <el-option
  432. v-for="(item, index) in backList"
  433. :key="index"
  434. :label="item.title"
  435. :value="item.value"
  436. ></el-option>
  437. </el-select>
  438. </el-form-item>
  439. <el-form-item
  440. label="银行账户类型"
  441. prop="bankAcctType"
  442. :rules="[
  443. {
  444. required: true,
  445. message: '请选择银行账户类型',
  446. trigger: 'change'
  447. }
  448. ]"
  449. >
  450. <el-select
  451. v-model="form.bankAcctType"
  452. placeholder="请选择银行账户类型"
  453. >
  454. <el-option
  455. label="单位结算卡"
  456. value="UNIT_SETTLEMENT_CARD"
  457. ></el-option>
  458. <el-option
  459. label="对公账户"
  460. value="ENTERPRISE_ACCOUNT"
  461. ></el-option>
  462. <el-option label="借记卡" value="DEBIT_CARD"></el-option>
  463. <el-option label="存折" value="PASSBOOK"></el-option>
  464. </el-select>
  465. </el-form-item>
  466. <el-form-item>
  467. <el-button type="primary" @click="onSubmit('accountForm')"
  468. >确 定</el-button
  469. >
  470. <el-button @click="onCancel">取 消</el-button>
  471. </el-form-item>
  472. </el-card>
  473. </el-form>
  474. </div>
  475. </div>
  476. </template>
  477. <script>
  478. import { yizhifuJson, cityJson } from "../../utils/cityJson";
  479. import { yiBankJson } from "../../utils/bankJson";
  480. import { yeepayUpload, addSubMerchant, updateMember } from "./api.js";
  481. import { getToken, getTenantId } from "@/utils/auth";
  482. import { policy } from "@/api/appTenant";
  483. import { getEmployeeOrgan } from "@/api/buildTeam";
  484. export default {
  485. name: "AYePayAccount",
  486. props: {
  487. row: {
  488. type: Object,
  489. default: () => {}
  490. }
  491. },
  492. data() {
  493. return {
  494. payType: "create",
  495. backList: yiBankJson,
  496. cityList: cityJson,
  497. cityOptions: yizhifuJson,
  498. selectListCity: [],
  499. organList: [],
  500. headers: {
  501. Authorization: getToken()
  502. },
  503. fileList: [],
  504. files: null, // 上传对象
  505. id: null, // 编号
  506. form: {
  507. memberId: null,
  508. organId: null, // 分部
  509. name: null, // 公司名称
  510. socialCreditCode: null, // 统一社会信用码
  511. licenceUrl: null, // 商户证件照
  512. openAccountLicenceUrl: null, // 开户许可证照片
  513. legalPerson: null, // 公司法人
  514. legalMp: null, // 公司法人手机号
  515. legalLicenceType: null, // 法人证件类型
  516. legalCertId: null, // 法人身份证号
  517. legalLicenceFrontUrl: null, // 法人证件人像面照片
  518. legalLicenceBackUrl: null, // 法人证件非人像面照片
  519. address: null, // 详细地址
  520. contactName: null, // 联系人姓名
  521. contactLicenseNo: null, // 联系人证件号码
  522. contactMobile: null, // 联系人手机号码
  523. contactEmail: null, // 联系人邮箱
  524. cardNo: null, // 银行卡号
  525. bankCode: null, // 所属银行
  526. bankAcctType: null, // 银行账户类型
  527. provCode: null, // 省份
  528. areaCode: null, // 城市
  529. districtCode: null // 区县
  530. },
  531. ossUploadUrl: `/api-web/yeepay/upload`,
  532. dataObj: {
  533. multipartFile: ""
  534. }
  535. };
  536. },
  537. mounted() {
  538. console.log(this.row);
  539. this.__init();
  540. getEmployeeOrgan().then(res => {
  541. if (res.code == 200) {
  542. this.organList = res.data;
  543. }
  544. });
  545. },
  546. methods: {
  547. __init() {
  548. // this.payType = query.type;
  549. if (this.payType == "update") {
  550. const row = this.row;
  551. this.id = row.id;
  552. this.form = {
  553. organId: row.organId,
  554. memberId: row.memberId,
  555. name: row.name,
  556. legalPerson: row.legalPerson,
  557. legalMp: row.legalMp,
  558. legalCertId: row.legalCertId,
  559. cardNo: row.cardNo,
  560. bankCode: row.bankCode,
  561. provCode: row.provCode,
  562. areaCode: row.areaCode,
  563. socialCreditCode: row.socialCreditCode,
  564. address: row.address,
  565. bankAcctType: row.bankAcctType
  566. };
  567. // this.cityList.forEach(item => {
  568. // if (item.value == row.provCode) {
  569. // this.selectListCity = item.cities;
  570. // }
  571. // });
  572. } else if (this.payType == "create") {
  573. this.$refs["accountForm"].resetFields();
  574. }
  575. },
  576. async onSubmit(formName) {
  577. this.$refs[formName].validate(valid => {
  578. if (valid) {
  579. const form = this.form;
  580. let formData = new FormData();
  581. Object.entries(form).forEach(item => {
  582. formData.append(item[0], item[1]);
  583. });
  584. if (this.payType == "create") {
  585. addSubMerchant(formData).then(res => {
  586. if (res.code == 200) {
  587. this.$message.success("保存成功");
  588. this.onCancel();
  589. } else {
  590. this.$message.error(res.msg);
  591. }
  592. });
  593. }
  594. // else if (this.payType == "update") {
  595. // formData.append("id", this.id);
  596. // updateMember(formData).then(res => {
  597. // if (res.code == 200) {
  598. // this.$message.success("保存成功");
  599. // this.onCancel();
  600. // } else {
  601. // this.$message.error(res.msg);
  602. // }
  603. // });
  604. // }
  605. } else {
  606. this.$nextTick(() => {
  607. let isError = document.getElementsByClassName("is-error");
  608. isError[0].scrollIntoView({
  609. block: "center",
  610. behavior: "smooth"
  611. });
  612. });
  613. return false;
  614. }
  615. });
  616. },
  617. successed(response, file, fileList) {
  618. this.uploading = false;
  619. let url = this.ossUploadUrl + "/" + file.raw.key;
  620. if (url) {
  621. this.uploaded.push({
  622. url,
  623. name: file.name.split(".").shift(),
  624. clientShow: "YES"
  625. });
  626. } else {
  627. this.$message.error(res.data?.message || res.msg || "上传失败");
  628. }
  629. console.log(response, file, fileList);
  630. },
  631. async handleChange(file, form_key) {
  632. console.log("🚀 ~ file, key:", file, form_key);
  633. const isLt2M = file.size / 1024 / 1024 < 9;
  634. if (!isLt2M) {
  635. this.$message.error(`上传文件大小不能超过 ${9}MB!`);
  636. this.fileList = [];
  637. return;
  638. }
  639. console.log("🚀 ~ file:", file);
  640. let formData = new FormData();
  641. formData.append("multipartFile", file.raw);
  642. const res = await yeepayUpload(formData);
  643. console.log("🚀 ~ res:", res, form_key);
  644. if (res.data) {
  645. this.$message.success(`上传成功`);
  646. } else {
  647. this.$message.error(`上传失败`);
  648. }
  649. this.form[form_key] = res.data;
  650. this.$refs["accountForm"].validateField(form_key);
  651. return true;
  652. },
  653. handleRemove(form_key) {
  654. this.form[form_key] = null;
  655. },
  656. onCancel() {
  657. this.files = null;
  658. this.fileList = [];
  659. this.$emit("close");
  660. },
  661. /** 省市区改变 */
  662. changeCity(value) {
  663. console.log(value);
  664. this.form.provCode = value[0];
  665. this.form.areaCode = value[1];
  666. this.form.districtCode = value[2];
  667. }
  668. }
  669. };
  670. </script>
  671. <style lang="scss" scoped>
  672. .el-input,
  673. .el-textarea,
  674. .el-select {
  675. width: 100% !important;
  676. }
  677. .el-button--primary {
  678. color: #fff;
  679. &:hover,
  680. &:active,
  681. &:focus {
  682. color: #fff;
  683. }
  684. }
  685. .formContainer {
  686. min-width: 600px;
  687. height: calc(100vh - 45px);
  688. overflow-y: auto;
  689. padding: 10px;
  690. .el-alert,
  691. .el-card {
  692. margin-bottom: 20px;
  693. }
  694. }
  695. </style>