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