form.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626
  1. <!-- -->
  2. <template>
  3. <div class="m-container">
  4. <h2>
  5. <el-page-header
  6. @back="onCancel"
  7. :content="payType == 'create' ? '创建账号' : '修改账号'"
  8. ></el-page-header>
  9. </h2>
  10. <!-- m-core -->
  11. <div class="w1200" style="overflow: hidden">
  12. <el-form
  13. :model="form"
  14. :rules="rules"
  15. ref="accountForm"
  16. label-position="right"
  17. label-width="180px"
  18. >
  19. <el-card class="box-card">
  20. <el-alert
  21. title="企业信息"
  22. :closable="false"
  23. type="info"
  24. style="margin: 20px 0"
  25. >
  26. </el-alert>
  27. <el-col :span="12" :lg="14" :md="20" :sm="20" :xs="24">
  28. <el-form-item label="商户号" prop="memberId">
  29. <el-input
  30. v-model="form.memberId"
  31. :disabled="payType == 'update' ? true : false"
  32. placeholder="请输入商户号"
  33. ></el-input>
  34. </el-form-item>
  35. <el-form-item label="公司名称" prop="name">
  36. <el-input
  37. v-model="form.name"
  38. placeholder="请输入公司名称"
  39. ></el-input>
  40. </el-form-item>
  41. <el-form-item label="统一社会信用码" prop="socialCreditCode">
  42. <el-input
  43. v-model="form.socialCreditCode"
  44. placeholder="请输入统一社会信用码"
  45. ></el-input>
  46. </el-form-item>
  47. <el-form-item
  48. label="统一社会信用码有效期"
  49. prop="socialCreditCodeExpires"
  50. >
  51. <el-date-picker
  52. v-model="form.socialCreditCodeExpires"
  53. :picker-options="{ firstDayOfWeek: 1 }"
  54. value-format="yyyyMMdd"
  55. type="date"
  56. placeholder="请选择统一社会信用码有效期"
  57. >
  58. </el-date-picker>
  59. </el-form-item>
  60. <el-form-item label="公司法人" prop="legalPerson">
  61. <el-input
  62. v-model="form.legalPerson"
  63. placeholder="请输入公司法人"
  64. ></el-input>
  65. </el-form-item>
  66. <el-form-item label="公司法人手机号" prop="legalMp">
  67. <el-input
  68. v-model="form.legalMp"
  69. maxlength="11"
  70. placeholder="请输入公司法人手机号"
  71. ></el-input>
  72. </el-form-item>
  73. <el-form-item label="法人身份证号" prop="legalCertId">
  74. <el-input
  75. v-model="form.legalCertId"
  76. placeholder="请输入法人身份证号"
  77. ></el-input>
  78. </el-form-item>
  79. <el-form-item label="身份证有效期" prop="legalCertIdExpires">
  80. <el-date-picker
  81. v-model="form.legalCertIdExpires"
  82. :picker-options="{ firstDayOfWeek: 1 }"
  83. value-format="yyyyMMdd"
  84. type="date"
  85. placeholder="请选择身份证有效期"
  86. >
  87. </el-date-picker>
  88. </el-form-item>
  89. <el-form-item label="经营范围" prop="businessScope">
  90. <!-- <el-input v-model="form.businessScope" placeholder="请输入经营范围"></el-input> -->
  91. <el-input
  92. type="textarea"
  93. :rows="3"
  94. v-model="form.businessScope"
  95. placeholder="请输入经营范围"
  96. ></el-input>
  97. </el-form-item>
  98. <el-form-item label="公司地址" prop="address">
  99. <el-input
  100. v-model="form.address"
  101. placeholder="请输入公司地址"
  102. ></el-input>
  103. </el-form-item>
  104. <el-form-item label="证照文件" prop="multipartFile">
  105. <template slot="label">
  106. 证照文件
  107. <el-tooltip placement="top" popper-class="mTooltip">
  108. <div slot="content">
  109. 内容须包含三证合一证件照、法人身份证正面照、法人身份证反面照、开户银行许可证照。
  110. 压缩 zip包后上传。最大限制为 9 M。
  111. <!-- 最大限制为 9 M。 -->
  112. </div>
  113. <i
  114. class="el-icon-question micon el-tooltip"
  115. style="
  116. font-size: 18px;
  117. color: #f56c6c;
  118. top: 2px;
  119. position: relative;
  120. "
  121. ></i>
  122. </el-tooltip>
  123. </template>
  124. <!-- <el-input type="file" class="uploadFile" v-model="form.multipartFile"></el-input> -->
  125. <el-upload
  126. class="avatar-upload"
  127. ref="upload"
  128. :action="ossUploadUrl"
  129. :data="dataObj"
  130. :on-preview="handlePreview"
  131. :on-remove="handleRemove"
  132. :on-change="handleChange"
  133. :file-list="fileList"
  134. accept=".zip"
  135. :multiple="false"
  136. :limit="1"
  137. :auto-upload="false"
  138. >
  139. <el-button slot="trigger" type="primary">选取文件</el-button>
  140. <!-- ,且不超过500kb -->
  141. <div
  142. slot="tip"
  143. style="display: inline; padding-left: 20px"
  144. class="el-upload__tip"
  145. >
  146. 只能上传一个文件
  147. </div>
  148. </el-upload>
  149. <!-- <el-upload class="avatar-uploader"
  150. action="/api-web/uploadFile"
  151. :headers="headers"
  152. :show-file-list="false"
  153. :on-success="handleAvatarSuccess"
  154. :before-upload="beforeAvatarUpload">
  155. <img v-if="form.multipartFile"
  156. :src="form.coverImg"
  157. class="avatar" />
  158. <i v-else
  159. class="el-icon-plus avatar-uploader-icon"></i>
  160. </el-upload> -->
  161. </el-form-item>
  162. <el-form-item label="邮编" prop="zipCode">
  163. <el-input
  164. v-model="form.zipCode"
  165. placeholder="请输入邮编"
  166. ></el-input>
  167. </el-form-item>
  168. </el-col>
  169. </el-card>
  170. <el-card class="box-card">
  171. <el-alert
  172. title="账户设置"
  173. :closable="false"
  174. type="info"
  175. style="margin: 20px 0"
  176. >
  177. </el-alert>
  178. <el-col :span="12" :lg="14" :md="20" :sm="20" :xs="24">
  179. <el-form-item label="银行卡号" prop="cardNo">
  180. <el-input
  181. v-model="form.cardNo"
  182. placeholder="请输入银行卡号"
  183. ></el-input>
  184. </el-form-item>
  185. <el-form-item label="所属银行" prop="bankCode">
  186. <el-select v-model="form.bankCode" placeholder="请选择所属银行">
  187. <el-option
  188. v-for="(item, index) in backList"
  189. :key="index"
  190. :label="item.title"
  191. :value="item.value"
  192. ></el-option>
  193. </el-select>
  194. </el-form-item>
  195. <el-form-item label="银行账户类型" prop="bankAcctType">
  196. <el-select
  197. v-model="form.bankAcctType"
  198. placeholder="请选择银行账户类型"
  199. >
  200. <el-option label="对公" value="1"></el-option>
  201. <el-option label="对私" value="2"></el-option>
  202. </el-select>
  203. </el-form-item>
  204. <el-form-item label="银行卡对应的户名" prop="cardName">
  205. <el-input
  206. v-model="form.cardName"
  207. placeholder="请输入银行卡对应的户名"
  208. ></el-input>
  209. </el-form-item>
  210. <el-form-item label="省市" required>
  211. <el-row>
  212. <el-col :span="12">
  213. <el-form-item prop="provCode" style="margin-bottom: 0">
  214. <el-select
  215. v-model="form.provCode"
  216. style="width: 98% !important"
  217. @change="onProvChange"
  218. placeholder="请选择省份"
  219. >
  220. <el-option
  221. v-for="(item, index) in cityList"
  222. :key="index"
  223. :label="item.title"
  224. :value="item.value"
  225. ></el-option>
  226. </el-select>
  227. </el-form-item>
  228. </el-col>
  229. <el-col :span="12">
  230. <el-form-item prop="areaCode" style="margin-bottom: 0">
  231. <el-select
  232. v-model="form.areaCode"
  233. style="width: 100% !important"
  234. placeholder="请选择城市"
  235. >
  236. <el-option
  237. v-for="(item, index) in selectListCity"
  238. :key="index"
  239. :label="item.title"
  240. :value="item.value"
  241. ></el-option>
  242. </el-select>
  243. </el-form-item>
  244. </el-col>
  245. </el-row>
  246. </el-form-item>
  247. <el-form-item>
  248. <el-button type="primary" @click="onSubmit('accountForm')"
  249. >确 定</el-button
  250. >
  251. <el-button @click="onCancel">取 消</el-button>
  252. </el-form-item>
  253. </el-col>
  254. </el-card>
  255. </el-form>
  256. </div>
  257. </div>
  258. </template>
  259. <script>
  260. import { cityJson } from "../../utils/cityJson";
  261. import { bankJson } from "../../utils/bankJson";
  262. import { getToken } from "@/utils/auth";
  263. import load from "@/utils/loading";
  264. import { createMember, updateMember } from "./api.js";
  265. import { isvalidPhone } from "@/utils/validate";
  266. import { policy } from "@/api/appTenant";
  267. let validPhone = (rule, value, callback) => {
  268. if (!value) {
  269. callback(new Error("请输入公司法人手机号"));
  270. } else if (!isvalidPhone(value)) {
  271. callback(new Error("请输入正确的11位手机号码"));
  272. } else {
  273. callback();
  274. }
  275. };
  276. export default {
  277. name: "ADaPayAccount",
  278. data() {
  279. const query = this.$route.query;
  280. return {
  281. payType: query.type,
  282. row: query.row ? JSON.parse(query.row) : {},
  283. backList: bankJson,
  284. cityList: cityJson,
  285. selectListCity: [],
  286. headers: {
  287. Authorization: getToken()
  288. },
  289. fileList: [],
  290. files: null, // 上传对象
  291. id: null, // 编号
  292. form: {
  293. memberId: null,
  294. name: null,
  295. legalPerson: null,
  296. legalMp: null,
  297. legalCertId: null,
  298. legalCertIdExpires: null,
  299. cardNo: null,
  300. bankCode: null,
  301. provCode: null,
  302. areaCode: null,
  303. socialCreditCode: null,
  304. socialCreditCodeExpires: null,
  305. businessScope: null,
  306. address: null,
  307. multipartFile: null,
  308. zipCode: null,
  309. bankAcctType: null,
  310. cardName: null
  311. },
  312. rules: {
  313. memberId: [
  314. { required: true, message: "请输入商户号", trigger: "blur" }
  315. ],
  316. name: [{ required: true, message: "请输入公司名称", trigger: "blur" }],
  317. legalPerson: [
  318. { required: true, message: "请输入公司法人", trigger: "blur" }
  319. ],
  320. legalMp: [
  321. {
  322. type: "number",
  323. required: true,
  324. validator: validPhone,
  325. trigger: "blur"
  326. }
  327. ],
  328. legalCertId: [
  329. { required: true, message: "请输入法人身份证号", trigger: "blur" }
  330. ],
  331. legalCertIdExpires: [
  332. { required: true, message: "请选择身份证有效期", trigger: "change" }
  333. ],
  334. cardNo: [
  335. { required: true, message: "请输入银行卡号", trigger: "blur" }
  336. ],
  337. bankCode: [
  338. { required: true, message: "请选择所属银行", trigger: "change" }
  339. ],
  340. provCode: [
  341. { required: true, message: "请选择省份", trigger: "change" }
  342. ],
  343. areaCode: [
  344. { required: true, message: "请选择城市", trigger: "change" }
  345. ],
  346. socialCreditCode: [
  347. { required: true, message: "请输入统一社会信用码", trigger: "blur" }
  348. ],
  349. socialCreditCodeExpires: [
  350. {
  351. required: true,
  352. message: "请选择统一社会信用码有效期",
  353. trigger: "change"
  354. }
  355. ],
  356. businessScope: [
  357. { required: true, message: "请输入经营范围", trigger: "blur" }
  358. ],
  359. address: [
  360. { required: true, message: "请输入公司地址", trigger: "blur" }
  361. ],
  362. multipartFile: [
  363. { required: true, message: "请上传证照文件", trigger: "change" }
  364. ],
  365. zipCode: [{ required: true, message: "请输入邮编", trigger: "blur" }]
  366. },
  367. ossUploadUrl: `https://${this.bucket_name}.ks3-cn-beijing.ksyuncs.com/`,
  368. dataObj: {
  369. policy: "",
  370. signature: "",
  371. key: "",
  372. KSSAccessKeyId: "",
  373. // dir: "",
  374. acl: "public-read",
  375. name: ""
  376. // bucket_name: props.bucket_name
  377. },
  378. bucket_name: "daya"
  379. };
  380. },
  381. mounted() {
  382. this.__init();
  383. },
  384. methods: {
  385. __init() {
  386. const query = this.$route.query;
  387. this.payType = query.type;
  388. this.row = query.row ? JSON.parse(query.row) : {};
  389. this.files = null;
  390. this.fileList = [];
  391. this.form.multipartFile = null;
  392. if (this.payType == "update") {
  393. const row = this.row;
  394. this.id = row.id;
  395. this.form = {
  396. memberId: row.memberId,
  397. name: row.name,
  398. legalPerson: row.legalPerson,
  399. legalMp: row.legalMp,
  400. legalCertId: row.legalCertId,
  401. legalCertIdExpires: row.legalCertIdExpires,
  402. cardNo: row.cardNo,
  403. bankCode: row.bankCode,
  404. provCode: row.provCode,
  405. areaCode: row.areaCode,
  406. socialCreditCode: row.socialCreditCode,
  407. socialCreditCodeExpires: row.socialCreditCodeExpires,
  408. businessScope: row.businessScope,
  409. address: row.address,
  410. multipartFile: row.multipartFile,
  411. zipCode: row.zipCode,
  412. bankAcctType: row.bankAcctType,
  413. cardName: row.cardName
  414. };
  415. this.cityList.forEach(item => {
  416. if (item.value == row.provCode) {
  417. this.selectListCity = item.cities;
  418. }
  419. });
  420. } else if (this.payType == "create") {
  421. // this.form = {
  422. // memberId: null,
  423. // name: null,
  424. // legalPerson: null,
  425. // legalMp: null,
  426. // legalCertId: null,
  427. // legalCertIdExpires: null,
  428. // cardNo: null,
  429. // bankCode: null,
  430. // provCode: null,
  431. // areaCode: null,
  432. // socialCreditCode: null,
  433. // socialCreditCodeExpires: null,
  434. // businessScope: null,
  435. // address: null,
  436. // multipartFile: null,
  437. // zipCode: null
  438. // }
  439. this.$refs["accountForm"].resetFields();
  440. }
  441. },
  442. async onSubmit(formName) {
  443. this.$refs[formName].validate(valid => {
  444. if (valid) {
  445. const form = this.form;
  446. let formData = new FormData();
  447. formData.append("memberId", form.memberId);
  448. formData.append("name", form.name);
  449. formData.append("legalPerson", form.legalPerson);
  450. formData.append("legalMp", form.legalMp);
  451. formData.append("legalCertId", form.legalCertId);
  452. formData.append("legalCertIdExpires", form.legalCertIdExpires);
  453. formData.append("cardNo", form.cardNo);
  454. formData.append("bankCode", form.bankCode);
  455. formData.append("provCode", form.provCode);
  456. formData.append("areaCode", form.areaCode);
  457. formData.append("socialCreditCode", form.socialCreditCode);
  458. formData.append(
  459. "socialCreditCodeExpires",
  460. form.socialCreditCodeExpires
  461. );
  462. formData.append("businessScope", form.businessScope);
  463. formData.append("address", form.address);
  464. formData.append("multipartFile", form.multipartFile);
  465. formData.append("zipCode", form.zipCode);
  466. formData.append("bankAcctType", form.bankAcctType);
  467. formData.append("cardName", form.cardName);
  468. if (this.payType == "create") {
  469. createMember(formData).then(res => {
  470. if (res.code == 200) {
  471. this.$message.success("保存成功");
  472. this.onCancel();
  473. } else {
  474. this.$message.error(res.msg);
  475. }
  476. });
  477. } else if (this.payType == "update") {
  478. formData.append("id", this.id);
  479. updateMember(formData).then(res => {
  480. if (res.code == 200) {
  481. this.$message.success("保存成功");
  482. this.onCancel();
  483. } else {
  484. this.$message.error(res.msg);
  485. }
  486. });
  487. }
  488. } else {
  489. this.$nextTick(() => {
  490. let isError = document.getElementsByClassName("is-error");
  491. isError[0].scrollIntoView({
  492. block: "center",
  493. behavior: "smooth"
  494. });
  495. });
  496. return false;
  497. }
  498. });
  499. },
  500. async handleChange(file) {
  501. const isLt2M = file.size / 1024 / 1024 < 9;
  502. if (!isLt2M) {
  503. this.$message.error(`上传文件大小不能超过 ${9}MB!`);
  504. this.fileList = [];
  505. return;
  506. }
  507. try {
  508. let fileName = file.name.replaceAll(" ", "_");
  509. let key = new Date().getTime() + fileName;
  510. let obj = {
  511. filename: fileName,
  512. bucketName: this.bucket_name,
  513. postData: {
  514. filename: fileName,
  515. acl: "public-read",
  516. key: key,
  517. unknowValueField: []
  518. }
  519. };
  520. const res = await policy(obj);
  521. this.dataObj = {
  522. policy: res.data.policy,
  523. signature: res.data.signature,
  524. key: key,
  525. KSSAccessKeyId: res.data.kssAccessKeyId,
  526. // dir: "",
  527. acl: "public-read",
  528. name: fileName
  529. // bucket_name: props.bucket_name
  530. };
  531. this.files = file;
  532. this.form.multipartFile = file.raw;
  533. this.$refs["accountForm"].validateField("multipartFile");
  534. } catch (e) {
  535. console.log(e);
  536. return false;
  537. }
  538. return true;
  539. },
  540. handleRemove(file, fileList) {
  541. this.files = null;
  542. this.form.multipartFile = null;
  543. },
  544. handlePreview(file) {
  545. // (file);
  546. },
  547. onProvChange(value) {
  548. this.form.areaCode = null;
  549. this.cityList.forEach(item => {
  550. if (item.value == value) {
  551. this.selectListCity = item.cities;
  552. }
  553. });
  554. },
  555. onCancel() {
  556. this.files = null;
  557. this.fileList = [];
  558. this.form.multipartFile = null;
  559. this.$store.dispatch("delVisitedViews", this.$route);
  560. this.$router.push({
  561. path: "/sysBasics/adapayManager"
  562. });
  563. }
  564. }
  565. };
  566. </script>
  567. <style lang="scss" scoped>
  568. .box-card {
  569. margin-bottom: 20px;
  570. padding-bottom: 20px;
  571. }
  572. .el-input,
  573. .el-textarea,
  574. .el-select {
  575. width: 100% !important;
  576. }
  577. .el-button--primary {
  578. color: #fff;
  579. &:hover,
  580. &:active,
  581. &:focus {
  582. color: #fff;
  583. }
  584. }
  585. ::v-deep .avatar-uploader {
  586. .el-upload {
  587. border: 1px dashed #d9d9d9;
  588. border-radius: 6px;
  589. cursor: pointer;
  590. position: relative;
  591. overflow: hidden;
  592. &:hover {
  593. border-color: #409eff;
  594. }
  595. }
  596. }
  597. .uploadFile {
  598. ::v-deep .el-input__inner {
  599. padding: 0;
  600. height: 40px;
  601. line-height: 32px;
  602. }
  603. }
  604. .avatar-uploader-icon {
  605. font-size: 28px;
  606. color: #8c939d;
  607. width: 178px;
  608. height: 178px;
  609. line-height: 178px;
  610. text-align: center;
  611. }
  612. .avatar {
  613. width: 178px;
  614. height: 178px;
  615. display: block;
  616. }
  617. .w1200 {
  618. width: 1000px;
  619. margin: 0 auto;
  620. }
  621. </style>