form.vue 18 KB

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