form.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. <!-- -->
  2. <template>
  3. <div class="m-container">
  4. <h2>
  5. <el-page-header @back="onCancel"
  6. :content="(payType == 'create' ? '创建账号' : '修改账号')"></el-page-header>
  7. </h2>
  8. <div class="m-core"
  9. style="overflow: hidden">
  10. <el-col :span="10">
  11. <el-form :model="form"
  12. :rules="rules"
  13. ref="accountForm"
  14. label-position="right"
  15. label-width="180px">
  16. <el-form-item label="商户号"
  17. prop="memberId">
  18. <el-input v-model="form.memberId"
  19. :disabled="payType == 'update' ? true : false"
  20. placeholder="请输入商户号"></el-input>
  21. </el-form-item>
  22. <el-form-item label="公司名称"
  23. prop="name">
  24. <el-input v-model="form.name"
  25. placeholder="请输入公司名称"></el-input>
  26. </el-form-item>
  27. <el-form-item label="公司法人"
  28. prop="legalPerson">
  29. <el-input v-model="form.legalPerson"
  30. placeholder="请输入公司法人"></el-input>
  31. </el-form-item>
  32. <el-form-item label="公司法人手机号"
  33. prop="legalMp">
  34. <el-input v-model="form.legalMp"
  35. placeholder="请输入公司法人手机号"></el-input>
  36. </el-form-item>
  37. <el-form-item label="法人身份证号"
  38. prop="legalCertId">
  39. <el-input v-model="form.legalCertId"
  40. placeholder="请输入法人身份证号"></el-input>
  41. </el-form-item>
  42. <el-form-item label="身份证有效期"
  43. prop="legalCertIdExpires">
  44. <el-date-picker v-model="form.legalCertIdExpires"
  45. :picker-options="{ firstDayOfWeek:1 }"
  46. value-format="yyyyMMdd"
  47. type="date"
  48. placeholder="请选择身份证有效期">
  49. </el-date-picker>
  50. </el-form-item>
  51. <el-form-item label="银行卡号"
  52. prop="cardNo">
  53. <el-input v-model="form.cardNo"
  54. placeholder="请输入银行卡号"></el-input>
  55. </el-form-item>
  56. <el-form-item label="所属银行"
  57. prop="bankCode">
  58. <el-select v-model="form.bankCode"
  59. placeholder="请选择所属银行">
  60. <el-option v-for="(item, index) in backList"
  61. :key="index"
  62. :label="item.title"
  63. :value="item.value"></el-option>
  64. </el-select>
  65. </el-form-item>
  66. <el-form-item label="省市"
  67. required>
  68. <el-row>
  69. <el-col :span="12">
  70. <el-form-item prop="provCode">
  71. <el-select v-model="form.provCode"
  72. style="width: 98% !important"
  73. @change="onProvChange"
  74. placeholder="请选择省份">
  75. <el-option v-for="(item, index) in cityList"
  76. :key="index"
  77. :label="item.title"
  78. :value="item.value"></el-option>
  79. </el-select>
  80. </el-form-item>
  81. </el-col>
  82. <el-col :span="12">
  83. <el-form-item prop="areaCode">
  84. <el-select v-model="form.areaCode"
  85. style="width: 100% !important"
  86. placeholder="请选择城市">
  87. <el-option v-for="(item, index) in selectListCity"
  88. :key="index"
  89. :label="item.title"
  90. :value="item.value"></el-option>
  91. </el-select>
  92. </el-form-item>
  93. </el-col>
  94. </el-row>
  95. </el-form-item>
  96. <el-form-item label="统一社会信用码"
  97. prop="socialCreditCode">
  98. <el-input v-model="form.socialCreditCode"
  99. placeholder="请输入统一社会信用码"></el-input>
  100. </el-form-item>
  101. <el-form-item label="统一社会信用码有效期"
  102. prop="socialCreditCodeExpires">
  103. <el-date-picker v-model="form.socialCreditCodeExpires"
  104. :picker-options="{ firstDayOfWeek:1 }"
  105. value-format="yyyyMMdd"
  106. type="date"
  107. placeholder="请选择统一社会信用码有效期">
  108. </el-date-picker>
  109. </el-form-item>
  110. <el-form-item label="经营范围"
  111. prop="businessScope">
  112. <!-- <el-input v-model="form.businessScope" placeholder="请输入经营范围"></el-input> -->
  113. <el-input type="textarea"
  114. :rows="3"
  115. v-model="form.businessScope"
  116. placeholder="请输入经营范围"></el-input>
  117. </el-form-item>
  118. <el-form-item label="公司地址"
  119. prop="address">
  120. <el-input v-model="form.address"
  121. placeholder="请输入公司地址"></el-input>
  122. </el-form-item>
  123. <el-form-item label="证照文件"
  124. prop="multipartFile">
  125. <!-- <el-input type="file" class="uploadFile" v-model="form.multipartFile"></el-input> -->
  126. <el-upload class="avatar-upload"
  127. ref="upload"
  128. action="/api-web/uploadFile"
  129. :on-preview="handlePreview"
  130. :on-remove="handleRemove"
  131. :on-change="handleChange"
  132. :file-list="fileList"
  133. :multiple="false"
  134. :limit="1"
  135. :auto-upload="false">
  136. <el-button slot="trigger"
  137. type="primary">选取文件</el-button>
  138. <!-- ,且不超过500kb -->
  139. <div slot="tip"
  140. style="display: inline; padding-left: 20px;"
  141. class="el-upload__tip">只能上传一个文件</div>
  142. </el-upload>
  143. <!-- <el-upload class="avatar-uploader"
  144. action="/api-web/uploadFile"
  145. :headers="headers"
  146. :show-file-list="false"
  147. :on-success="handleAvatarSuccess"
  148. :before-upload="beforeAvatarUpload">
  149. <img v-if="form.multipartFile"
  150. :src="form.coverImg"
  151. class="avatar" />
  152. <i v-else
  153. class="el-icon-plus avatar-uploader-icon"></i>
  154. </el-upload> -->
  155. </el-form-item>
  156. <el-form-item label="邮编"
  157. prop="zipCode">
  158. <el-input v-model="form.zipCode"
  159. placeholder="请输入邮编"></el-input>
  160. </el-form-item>
  161. <el-form-item>
  162. <el-button type="primary"
  163. @click="onSubmit('accountForm')">确 定</el-button>
  164. <el-button @click="onCancel">取 消</el-button>
  165. </el-form-item>
  166. </el-form>
  167. </el-col>
  168. </div>
  169. </div>
  170. </template>
  171. <script>
  172. import { cityJson } from "./cityJson";
  173. import { bankJson } from "./bankJson";
  174. import { getToken } from "@/utils/auth";
  175. import load from '@/utils/loading'
  176. import { createMember, updateMember } from './api.js'
  177. import { isvalidPhone } from '@/utils/validate'
  178. let validPhone = (rule, value, callback) => {
  179. if (!value) {
  180. callback(new Error('请输入公司法人手机号'))
  181. } else if (!isvalidPhone(value)) {
  182. callback(new Error('请输入正确的11位手机号码'))
  183. } else {
  184. callback()
  185. }
  186. }
  187. export default {
  188. name: 'ADaPayAccount',
  189. data () {
  190. const query = this.$route.query
  191. return {
  192. payType: query.type,
  193. row: query.row ? JSON.parse(query.row) : {},
  194. backList: bankJson,
  195. cityList: cityJson,
  196. selectListCity: [],
  197. headers: {
  198. Authorization: getToken()
  199. },
  200. fileList: [],
  201. files: null, // 上传对象
  202. id: null, // 编号
  203. form: {
  204. memberId: null,
  205. name: null,
  206. legalPerson: null,
  207. legalMp: null,
  208. legalCertId: null,
  209. legalCertIdExpires: null,
  210. cardNo: null,
  211. bankCode: null,
  212. provCode: null,
  213. areaCode: null,
  214. socialCreditCode: null,
  215. socialCreditCodeExpires: null,
  216. businessScope: null,
  217. address: null,
  218. multipartFile: null,
  219. zipCode: null
  220. },
  221. rules: {
  222. memberId: [{ required: true, message: '请输入商户号', trigger: 'blur' }],
  223. name: [{ required: true, message: '请输入公司名称', trigger: 'blur' }],
  224. legalPerson: [{ required: true, message: '请输入公司法人', trigger: 'blur' }],
  225. legalMp: [{ type: 'number', required: true, validator: validPhone, trigger: 'blur' }],
  226. legalCertId: [{ required: true, message: '请输入法人身份证号', trigger: 'blur' }],
  227. legalCertIdExpires: [{ required: true, message: '请选择身份证有效期', trigger: 'change' }],
  228. cardNo: [{ required: true, message: '请输入银行卡号', trigger: 'blur' }],
  229. bankCode: [{ required: true, message: '请选择所属银行', trigger: 'change' }],
  230. provCode: [{ required: true, message: '请选择省份', trigger: 'change' }],
  231. areaCode: [{ required: true, message: '请选择城市', trigger: 'change' }],
  232. socialCreditCode: [{ required: true, message: '请输入统一社会信用码', trigger: 'blur' }],
  233. socialCreditCodeExpires: [{ required: true, message: '请选择统一社会信用码有效期', trigger: 'change' }],
  234. businessScope: [{ required: true, message: '请输入经营范围', trigger: 'blur' }],
  235. address: [{ required: true, message: '请输入公司地址', trigger: 'blur' }],
  236. multipartFile: [{ required: true, message: '请上传证照文件', trigger: 'change' }],
  237. zipCode: [{ required: true, message: '请输入邮编', trigger: 'blur' }]
  238. }
  239. };
  240. },
  241. mounted () {
  242. this.__init()
  243. },
  244. methods: {
  245. __init () {
  246. const query = this.$route.query
  247. this.payType = query.type
  248. this.row = query.row ? JSON.parse(query.row) : {}
  249. this.files = null
  250. this.fileList = []
  251. this.form.multipartFile = null
  252. if (this.payType == 'update') {
  253. const row = this.row
  254. this.id = row.id
  255. this.form = {
  256. memberId: row.memberId,
  257. name: row.name,
  258. legalPerson: row.legalPerson,
  259. legalMp: row.legalMp,
  260. legalCertId: row.legalCertId,
  261. legalCertIdExpires: row.legalCertIdExpires,
  262. cardNo: row.cardNo,
  263. bankCode: row.bankCode,
  264. provCode: row.provCode,
  265. areaCode: row.areaCode,
  266. socialCreditCode: row.socialCreditCode,
  267. socialCreditCodeExpires: row.socialCreditCodeExpires,
  268. businessScope: row.businessScope,
  269. address: row.address,
  270. multipartFile: row.multipartFile,
  271. zipCode: row.zipCode
  272. }
  273. this.cityList.forEach(item => {
  274. if (item.value == row.provCode) {
  275. this.selectListCity = item.cities
  276. }
  277. })
  278. } else if (this.payType == 'create') {
  279. // this.form = {
  280. // memberId: null,
  281. // name: null,
  282. // legalPerson: null,
  283. // legalMp: null,
  284. // legalCertId: null,
  285. // legalCertIdExpires: null,
  286. // cardNo: null,
  287. // bankCode: null,
  288. // provCode: null,
  289. // areaCode: null,
  290. // socialCreditCode: null,
  291. // socialCreditCodeExpires: null,
  292. // businessScope: null,
  293. // address: null,
  294. // multipartFile: null,
  295. // zipCode: null
  296. // }
  297. this.$refs["accountForm"].resetFields()
  298. }
  299. },
  300. async onSubmit (formName) {
  301. this.$refs[formName].validate(valid => {
  302. if (valid) {
  303. const form = this.form
  304. let formData = new FormData()
  305. formData.append("memberId", form.memberId)
  306. formData.append("name", form.name)
  307. formData.append("legalPerson", form.legalPerson)
  308. formData.append("legalMp", form.legalMp)
  309. formData.append("legalCertId", form.legalCertId)
  310. formData.append("legalCertIdExpires", form.legalCertIdExpires)
  311. formData.append("cardNo", form.cardNo)
  312. formData.append("bankCode", form.bankCode)
  313. formData.append("provCode", form.provCode)
  314. formData.append("areaCode", form.areaCode)
  315. formData.append("socialCreditCode", form.socialCreditCode)
  316. formData.append("socialCreditCodeExpires", form.socialCreditCodeExpires)
  317. formData.append("businessScope", form.businessScope)
  318. formData.append("address", form.address)
  319. formData.append("multipartFile", form.multipartFile)
  320. formData.append("zipCode", form.zipCode)
  321. if (this.payType == 'create') {
  322. createMember(formData).then(res => {
  323. if (res.code == 200) {
  324. this.$message.success('保存成功')
  325. this.onCancel()
  326. } else {
  327. this.$message.error(res.msg)
  328. }
  329. })
  330. } else if (this.payType == 'update') {
  331. formData.append('id', this.id)
  332. updateMember(formData).then(res => {
  333. if (res.code == 200) {
  334. this.$message.success('保存成功')
  335. this.onCancel()
  336. } else {
  337. this.$message.error(res.msg)
  338. }
  339. })
  340. }
  341. } else {
  342. this.$nextTick(() => {
  343. let isError = document.getElementsByClassName('is-error')
  344. isError[0].scrollIntoView({
  345. block: 'center',
  346. behavior: 'smooth',
  347. })
  348. })
  349. return false;
  350. }
  351. });
  352. },
  353. handleChange (file) {
  354. this.files = file
  355. this.form.multipartFile = file.raw
  356. this.$refs["accountForm"].validateField('multipartFile')
  357. },
  358. handleRemove (file, fileList) {
  359. this.files = null
  360. this.form.multipartFile = null
  361. },
  362. handlePreview (file) {
  363. // (file);
  364. },
  365. onProvChange (value) {
  366. this.form.areaCode = null
  367. this.cityList.forEach(item => {
  368. if (item.value == value) {
  369. this.selectListCity = item.cities
  370. }
  371. })
  372. },
  373. onCancel () {
  374. this.files = null
  375. this.fileList = []
  376. this.form.multipartFile = null
  377. this.$store.dispatch('delVisitedViews', this.$route)
  378. this.$router.push({
  379. path: "/sysBasics/adapayManager"
  380. });
  381. }
  382. },
  383. };
  384. </script>
  385. <style lang='scss' scoped>
  386. .el-input,
  387. .el-textarea,
  388. .el-select {
  389. width: 100% !important;
  390. }
  391. .el-button--primary {
  392. background: #14928a;
  393. border-color: #14928a;
  394. color: #fff;
  395. &:hover,
  396. &:active,
  397. &:focus {
  398. background: #14928a;
  399. border-color: #14928a;
  400. color: #fff;
  401. }
  402. }
  403. /deep/.avatar-uploader {
  404. .el-upload {
  405. border: 1px dashed #d9d9d9;
  406. border-radius: 6px;
  407. cursor: pointer;
  408. position: relative;
  409. overflow: hidden;
  410. &:hover {
  411. border-color: #409eff;
  412. }
  413. }
  414. }
  415. .uploadFile {
  416. /deep/.el-input__inner {
  417. padding: 0;
  418. height: 40px;
  419. line-height: 32px;
  420. }
  421. }
  422. .avatar-uploader-icon {
  423. font-size: 28px;
  424. color: #8c939d;
  425. width: 178px;
  426. height: 178px;
  427. line-height: 178px;
  428. text-align: center;
  429. }
  430. .avatar {
  431. width: 178px;
  432. height: 178px;
  433. display: block;
  434. }
  435. </style>