巴青农资商城

entryForm.js 7.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. import {
  2. MERCHANT_TYPE_PERSON,
  3. MERCHANT_TYPE_ENTERPRISE,
  4. VALID_RANGE
  5. } from '@/utils/entryConstants'
  6. import { isMobile } from '@/utils/memberValidate'
  7. const EMAIL_REG = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
  8. function emptyPersonSubject() {
  9. return {
  10. merchantType: MERCHANT_TYPE_PERSON,
  11. personName: '',
  12. idCardType: '1',
  13. idCardNo: '',
  14. birthDate: '',
  15. idValidType: '1',
  16. idValidStart: '',
  17. idValidEnd: '',
  18. residenceAddress: '',
  19. gender: '',
  20. idCardFront: '',
  21. idCardBack: '',
  22. contactName: '',
  23. contactPhone: '',
  24. contactEmail: '',
  25. bankName: '',
  26. bankBranch: '',
  27. bankAccount: ''
  28. }
  29. }
  30. function emptyPersonBiz() {
  31. return {
  32. merchantType: MERCHANT_TYPE_PERSON,
  33. merchantName: '',
  34. servicePhone: '',
  35. bizRegionCode: '',
  36. bizRegionName: '',
  37. bizDetailAddress: ''
  38. }
  39. }
  40. function emptyEnterpriseSubject() {
  41. return {
  42. merchantType: MERCHANT_TYPE_ENTERPRISE,
  43. companyName: '',
  44. regRegionCode: '',
  45. regRegionName: '',
  46. companyDetailAddress: '',
  47. businessScope: '',
  48. creditCode: '',
  49. licenseValidType: '1',
  50. licenseValidStart: '',
  51. licenseValidEnd: '',
  52. legalName: '',
  53. legalResidence: '',
  54. legalGender: '',
  55. legalBirthDate: '',
  56. legalIdCardType: '1',
  57. legalIdCardNo: '',
  58. legalIdValidType: '1',
  59. legalIdValidStart: '',
  60. legalIdValidEnd: '',
  61. legalIdCardFront: '',
  62. legalIdCardBack: '',
  63. contactName: '',
  64. contactPhone: '',
  65. contactEmail: '',
  66. bankName: '',
  67. bankBranch: '',
  68. bankAccount: '',
  69. corpBankAccount: '',
  70. accountPermit: ''
  71. }
  72. }
  73. function emptyEnterpriseBiz() {
  74. return {
  75. merchantType: MERCHANT_TYPE_ENTERPRISE,
  76. bizRegionCode: '',
  77. bizRegionName: '',
  78. bizDetailAddress: '',
  79. businessLicense: ''
  80. }
  81. }
  82. function emptyShop() {
  83. return {
  84. shopName: '',
  85. shopAvatar: '',
  86. shopPhone: '',
  87. shopDesc: ''
  88. }
  89. }
  90. /** 创建空白入驻表单 */
  91. export function createEntryForm(merchantType = MERCHANT_TYPE_PERSON) {
  92. const isPerson = merchantType === MERCHANT_TYPE_PERSON
  93. return {
  94. merchantType,
  95. subject: isPerson ? emptyPersonSubject() : emptyEnterpriseSubject(),
  96. biz: isPerson ? emptyPersonBiz() : emptyEnterpriseBiz(),
  97. shop: emptyShop(),
  98. agreementAccepted: false
  99. }
  100. }
  101. /** 省市区写入 biz/reg 字段 */
  102. export function applyRegion(target, region) {
  103. if (!target || !region) return
  104. target.bizRegionCode = region.code || ''
  105. target.bizRegionName = region.name || ''
  106. }
  107. export function applyRegRegion(target, region) {
  108. if (!target || !region) return
  109. target.regRegionCode = region.code || ''
  110. target.regRegionName = region.name || ''
  111. }
  112. function requireText(value, msg) {
  113. if (!(value || '').trim()) return msg
  114. return ''
  115. }
  116. function requireEmail(value) {
  117. const t = (value || '').trim()
  118. if (!t) return '请输入常用邮箱'
  119. if (!EMAIL_REG.test(t)) return '邮箱格式不正确'
  120. return ''
  121. }
  122. function checkValidPeriod(label, type, start, end) {
  123. if (!type) return `请选择${label}有效期类型`
  124. if (type === VALID_RANGE && (!start || !end)) {
  125. return `请填写${label}有效期`
  126. }
  127. return ''
  128. }
  129. /** 前端分步校验,返回错误文案或空 */
  130. export function validateEntryStep(form, stepKey) {
  131. const { merchantType, subject, biz, shop } = form
  132. const isPerson = merchantType === MERCHANT_TYPE_PERSON
  133. if (stepKey === 'type') {
  134. return merchantType ? '' : '请选择主体类型'
  135. }
  136. if (isPerson) {
  137. if (stepKey === 'subject') {
  138. return (
  139. requireText(subject.personName, '请输入姓名') ||
  140. requireText(subject.residenceAddress, '请输入居住地址') ||
  141. requireText(subject.gender, '请选择性别') ||
  142. requireText(subject.birthDate, '请选择出生日期') ||
  143. requireText(subject.idCardNo, '请输入证件号码') ||
  144. checkValidPeriod('证件', subject.idValidType, subject.idValidStart, subject.idValidEnd) ||
  145. requireText(subject.idCardFront, '请上传证件照正面') ||
  146. requireText(subject.idCardBack, '请上传证件照反面') ||
  147. requireText(subject.contactName, '请输入联系人姓名') ||
  148. (!isMobile(subject.contactPhone) ? '请输入正确的联系人手机' : '') ||
  149. requireEmail(subject.contactEmail) ||
  150. requireText(subject.bankName, '请输入开户银行') ||
  151. requireText(subject.bankBranch, '请输入开户支行') ||
  152. requireText(subject.bankAccount, '请输入银行账号')
  153. )
  154. }
  155. if (stepKey === 'biz') {
  156. return (
  157. requireText(biz.merchantName, '请输入商户名称') ||
  158. requireText(biz.servicePhone, '请输入客服电话') ||
  159. (requireText(biz.bizRegionCode, '请选择经营地址') || requireText(biz.bizRegionName, '请选择经营地址')) ||
  160. requireText(biz.bizDetailAddress, '请输入经营详细地址')
  161. )
  162. }
  163. } else {
  164. if (stepKey === 'subject') {
  165. return (
  166. requireText(subject.companyName, '请输入企业名称') ||
  167. (requireText(subject.regRegionCode, '请选择注册地址') || requireText(subject.regRegionName, '请选择注册地址')) ||
  168. requireText(subject.companyDetailAddress, '请输入注册详细地址') ||
  169. requireText(subject.businessScope, '请输入经营范围') ||
  170. requireText(subject.creditCode, '请输入统一社会信用代码') ||
  171. checkValidPeriod('营业', subject.licenseValidType, subject.licenseValidStart, subject.licenseValidEnd) ||
  172. requireText(subject.legalName, '请输入法人姓名') ||
  173. requireText(subject.legalResidence, '请输入法人居住地址') ||
  174. requireText(subject.legalGender, '请选择法人性别') ||
  175. requireText(subject.legalBirthDate, '请选择法人出生日期') ||
  176. requireText(subject.legalIdCardNo, '请输入法人证件号码') ||
  177. checkValidPeriod('法人证件', subject.legalIdValidType, subject.legalIdValidStart, subject.legalIdValidEnd) ||
  178. requireText(subject.legalIdCardFront, '请上传法人证件照正面') ||
  179. requireText(subject.legalIdCardBack, '请上传法人证件照反面') ||
  180. requireText(subject.contactName, '请输入联系人姓名') ||
  181. (!isMobile(subject.contactPhone) ? '请输入正确的联系人手机' : '') ||
  182. requireEmail(subject.contactEmail) ||
  183. requireText(subject.bankName, '请输入开户银行') ||
  184. requireText(subject.bankBranch, '请输入开户支行') ||
  185. requireText(subject.bankAccount, '请输入银行账号') ||
  186. requireText(subject.corpBankAccount, '请输入对公银行账号') ||
  187. requireText(subject.accountPermit, '请上传开户许可证')
  188. )
  189. }
  190. if (stepKey === 'biz') {
  191. return (
  192. (requireText(biz.bizRegionCode, '请选择经营地址') || requireText(biz.bizRegionName, '请选择经营地址')) ||
  193. requireText(biz.bizDetailAddress, '请输入经营详细地址') ||
  194. requireText(biz.businessLicense, '请上传营业执照')
  195. )
  196. }
  197. }
  198. if (stepKey === 'shop') {
  199. return (
  200. requireText(shop.shopName, '请输入店铺名称') ||
  201. requireText(shop.shopPhone, '请输入联系电话') ||
  202. requireText(shop.shopAvatar, '请上传店铺 Logo')
  203. )
  204. }
  205. if (stepKey === 'submit') {
  206. if (!form.agreementAccepted) return '请先阅读并同意入驻协议'
  207. }
  208. return ''
  209. }
  210. /** 提交前组装 DTO(新主体完整申请) */
  211. export function buildEntrySubmitPayload(form) {
  212. return {
  213. subject: { ...form.subject, merchantType: form.merchantType },
  214. biz: { ...form.biz, merchantType: form.merchantType },
  215. shop: { ...form.shop },
  216. agreementAccepted: !!form.agreementAccepted
  217. }
  218. }
  219. /** 仅开店铺:仅提交 shop + 协议勾选(主体/经营由后端合并已有商户) */
  220. export function buildShopOnlySubmitPayload(form) {
  221. return {
  222. shop: { ...form.shop },
  223. agreementAccepted: !!form.agreementAccepted
  224. }
  225. }