ttk-app-core
Version:
enterprise develop framework
397 lines (356 loc) • 15.3 kB
JavaScript
import React from 'react'
import { action as MetaAction, AppLoader } from 'edf-meta-engine'
import { List, fromJS } from 'immutable'
import moment from 'moment'
import config from './config'
import md5 from 'md5'
import { userInfo } from 'os';
import { path } from 'edf-utils'
class action {
constructor(option) {
this.metaAction = option.metaAction
this.config = config.current
this.webapi = this.config.webapi
}
onInit = ({ component, injections }) => {
this.component = component
this.injections = injections
if (this.component.props.setOkListener) {
this.component.props.setOkListener(this.onOk)
}
let info = {}
info.version = path.getVersion()
injections.reduce('init',info)
this.load()
}
onOk = async () => {
return await this.save()
}
load = async () => {
//行业
const industry = await this.webapi.enumDetail.findByEnumId({enumId:200003})
//纳税人身份
const vatTaxpayer = await this.webapi.enumDetail.findByEnumId({enumId:200001})
//企业会计准则
const accountingStandards = await this.webapi.enumDetail.findByEnumId({enumId:200002})
//系统时间
// const date = await this.webapi.enableDate.getServerDate()
const date = new Date().getFullYear() + '-01'
this.injections.reduce('load', industry, vatTaxpayer, accountingStandards, date)
}
userregister = async () => {
const other = this.metaAction.gf('data.other').toJS();
const form = this.metaAction.gf('data.form').toJS();
if(other.step === 1) {
const basicInfo = await this.check([{
path: 'data.form.mobile', value: form.mobile
}, {
path: 'data.form.password', value: form.password
}, {
path: 'data.form.captcha', value: form.captcha
}], 'next')
if (!basicInfo) return
this.clearTimer(false, '获取验证码')
this.metaAction.sf('data.other.step', 2)
//埋点
_hmt && _hmt.push(['_trackEvent', '系统管理', '企业注册', '下一步'])
}else if(other.step === 2) {
const companyInfo = await this.check([{
path: 'data.form.org', value: form.org
}, {
path: 'data.form.industry', value: form.industry
}, {
path: 'data.form.vatTaxpayer', value: form.vatTaxpayer
}])
if (!companyInfo) return
this.metaAction.sf('data.other.step', 3)
}else if(other.step === 3) {
const baseInfo = await this.check([{
path: 'data.form.enableDate', value: form.enableDate
}, {
path: 'data.form.accountingStandard', value: form.accountingStandard
}])
if (!baseInfo) return
let user = { mobile: form.mobile, password: md5(form.password+'*the3Kingdom*'),clearText:Base64.encode(form.password)};
let sysOrg = {name: form.org, industry: form.industry, vatTaxpayer: form.vatTaxpayer}
sysOrg.enabledYear = form.enableDate.split('-')[0]
sysOrg.enabledMonth = form.enableDate.split('-')[1]
sysOrg.accountingStandards = form.accountingStandard
if(sysOrg.vatTaxpayer == '2000010002') {
sysOrg.isSignAndRetreat = false
}else if(sysOrg.vatTaxpayer == '2000010001'){
sysOrg.isSignAndRetreat = true
}
user.sysOrg = sysOrg
let opt = {}
opt.user = user
opt.captcha = form.captcha
opt.sign = form.sign
opt.user.passwordStrength = this.pwdLevel(form.password)
const response = await this.webapi.user.create(opt)
//跳转到门户
if (form.password) {
form.password = md5(form.password + '*the3Kingdom*')
}
sessionStorage['mobile'] = form.mobile
sessionStorage['username'] = response.value.nickname
sessionStorage['_accessToken'] = response.token
sessionStorage['password'] = form.password
sessionStorage['currentOrgStatus'] = null
if (this.component.props.onRedirect && this.config.goAfterLogin) {
this.component.props.onRedirect(this.config.goAfterLogin)
//埋点
_hmt && _hmt.push(['_trackEvent', '系统管理', '企业注册', '立即体验'])
}
}
//TODO
// const user = await this.webapi.user.create(form)
// await this.webapi.sysOrgUser.create({ sysOrgDto: {userId: user.id ,orgId:10001}})
// this.goOrgRegister(form);
}
pwdLevel = (pwd) => {
let level = 0;
let regCn = /[·!#¥(——):;“”‘、,|《。》?、【】[\]]/im;
if((/[0-9]/).test(pwd)) {
level++
}
if((/[a-zA-Z]/).test(pwd)) {
level++
}
if (/[`~!@#$%^&*()_\-=+<>?:"{},.\/;'[\] ]/.test(pwd) || regCn.test(pwd)) {
level++
}
return level
}
getLogo = () => this.config.logo
getBar = () => this.config.bar
countDown = 60 //倒计时
timer = null
getCaptchaing = false
getCaptcha = async () => {
document.querySelector('.captchaInput input').focus()
const mobile = this.metaAction.gf('data.form.mobile')
if(mobile && !(/^1[3|4|5|7|8][0-9]\d{8}$/.test(mobile))){
this.metaAction.sfs({'data.form.mobile': mobile, 'data.other.error.mobile': "请输入正确的手机号"})
return false
}
if(this.getCaptchaing) return
this.getCaptchaing = true
this.metaAction.sf('data.timeStaus',false)
let that = this
this.timer = setInterval(function() {
if(that.countDown == 0) {
that.clearTimer(true, '重新获取')
return
}
that.metaAction.sf('data.time', (--that.countDown)+'s')
}, 1000)
let params = {}
params.mobile = this.metaAction.gf('data.form.mobile')
//1: 注册 2:找回密码 3:修改手机号
params.smsType = 1
const captcha = await this.webapi.captcha.fetch(params)
if(captcha) {
this.metaAction.sf('data.form.sign', captcha)
this.metaAction.toast('success', `验证码已经发送到您的手机`)
}
}
//清除定时器
clearTimer = function(staus, remind) {
this.metaAction.sf('data.timeStaus',true)
this.metaAction.sf('data.time', remind)
this.countDown = 60
this.getCaptchaing = false
clearInterval(this.timer)
}
fieldChange = async (fieldPath, value, operation) => {
await this.check([{ path: fieldPath, value }], operation)
}
//返回上一步
backLastStep = () => {
let step = this.metaAction.gf('data.other.step')
this.metaAction.sf('data.other.step', step-1)
}
showAgreement = async () => {
const ret = await this.metaAction.modal('show', {
title: '用户协议条款',
width : 700,
bodyStyle: {height: 400, overflow: 'auto'},
okText: '同意',
cancelText: '不同意',
className: 'userProtocol',
children: this.metaAction.loadApp('edfx-app-agreement', {
store: this.component.props.store,
})
})
this.metaAction.sf('data.form.agree', !!ret)
}
goOrgRegister = (user) => {
if(!this.config.apps['edfx-app-orgregister']){
throw '请将这个应用加入到带edfx-app-root和edfx-app-login的网站中,跳转功能才能正常使用'
}
if (this.component.props.onRedirect && this.config.goOrgRegister) {
this.config.goOrgRegister.appName = 'edfx-app-orgregister?user='+ JSON.stringify(user)
this.component.props.onRedirect(this.config.goOrgRegister)
}
}
goLogin = (mobile) => {
this.clearTimer(false, '获取验证码')
if(!this.config.apps['edfx-app-login']){
throw '请将这个应用加入到带edfx-app-root和edfx-app-login的网站中,跳转功能才能正常使用'
}
if (this.component.props.onRedirect && this.config.goLogin) {
if(typeof mobile == 'string') {
this.config.goLogin.appParams.mobile = mobile;
this.config.goLogin.appName = 'edfx-app-login?mobile=' + mobile
}
this.component.props.onRedirect(this.config.goLogin)
}
}
check = async (fieldPathAndValues, operation) => {
if (!fieldPathAndValues)
return
let checkResults = []
for (let o of fieldPathAndValues) {
let r = { ...o }
if (o.path == 'data.form.mobile') {
Object.assign(r, await this.checkMobile(o.value, operation))
} else if (o.path == 'data.form.password') {
Object.assign(r, await this.checkPassword(o.value, operation))
} else if (o.path == 'data.form.captcha') {
Object.assign(r, await this.checkCaptcha(o.value, operation))
} else if(o.path == 'data.form.org') {
Object.assign(r, await this.checkOrg(o.value))
} else if(o.path == 'data.form.vatTaxpayer') {
Object.assign(r, await this.checkVatTaxpayer(o.value))
} else if(o.path == 'data.form.enableDate') {
Object.assign(r, await this.checkEnableDate(o.value))
} else if(o.path == 'data.form.accountingStandard') {
Object.assign(r, await this.checkAccountingStandards(o.value))
}
checkResults.push(r)
}
var json = {}
var hasError = true
checkResults.forEach(o => {
json[o.path] = o.value
json[o.errorPath] = o.message
if (o.message)
hasError = false
})
this.metaAction.sfs(json)
return hasError
}
checkMobile = async (mobile, operation) => {
var message
if(operation && operation == 'next') {
if (!mobile)
message = '请输入手机号'
else if (mobile.length != 11)
message = '请输入正确的手机号'
else {
let flag = await this.webapi.user.existsMobile(mobile)
flag && (message = '该手机号已经注册')
}
} else {
if (!mobile)
message = '请输入手机号'
else if(mobile.length == 1 && !(mobile == '1'))
message = '请输入正确的手机号'
else if(mobile.length >1 && mobile.length < 11 && !/^1[3|4|5|8|7]/.test(mobile))
message = '请输入正确的手机号'
else if(mobile.length > 11) {
message = '请输入正确的手机号'
}else if(mobile.length == 11){
if(!/^1[3|4|5|8|7]/.test(mobile)) {
message = '请输入正确的手机号'
return { errorPath: 'data.other.error.mobile', message }
}
let flag = await this.webapi.user.existsMobile(mobile)
flag && (message = '该手机号已经注册')
}
}
return { errorPath: 'data.other.error.mobile', message }
}
checkPassword = async (password) => {
var message
if (!password)
message = '请输入密码'
else if(!/(?=^.{6,20}$)((?=.*[A-Z]){1})((?=.*[a-z]){1})((?=.*[0-9]){1})/.test(password))
message = '6-20位必须包含大写字母、小写字母和数字'
return { errorPath: 'data.other.error.password', message }
}
checkCaptcha = async (captcha, operation) => {
var message
let sign = this.metaAction.gf('data.form.sign')
let mobile = this.metaAction.gf('data.form.mobile')
let params = {
sign: sign,
mobile: mobile,
captcha: captcha
}
if(operation && operation == 'next') {
if (!captcha)
message = '请输入验证码'
else if( !(await this.webapi.captcha.validate(params)))
message = '验证码输入错误'
}
return { errorPath: 'data.other.error.captcha', message }
}
checkOrg = async (org) => {
var message
if (!org) {
message = '请输入企业名称'
}else if(org.length > 200) {
message = '企业名称不要超过200个字符'
}
return { errorPath: 'data.other.error.org', message }
}
checkVatTaxpayer = async (vatTaxpayer) => {
var message
if (!vatTaxpayer) {
message = '纳税人身份不能为空'
}
return { errorPath: 'data.other.error.vatTaxpayer', message }
}
checkEnableDate = async (enableDate) => {
var message
if (!enableDate) {
message = '启用日期不能为空'
}
return { errorPath: 'data.other.error.enableDate', message }
}
checkAccountingStandards = async (accountingStandards) => {
var message
if (!accountingStandards) {
message = '会计准则不能为空'
}
return { errorPath: 'data.other.error.accountingStandards', message }
}
//切换编辑状态
changeDateState = () => {
let state = this.metaAction.gf('data.other').toJS().editDate
this.metaAction.sf('data.other.editDate', !state)
}
changeStandardState = () => {
let state = this.metaAction.gf('data.other').toJS().editStandard
this.metaAction.sf('data.other.editStandard', !state)
}
//检查是否要置灰下一步按钮
checkNext = () => {
let data = this.metaAction.gf('data').toJS()
let step = this.metaAction.gf('data.other').toJS().step
if(step == 1) {
return !((data.form.mobile && !data.other.error.mobile) && (data.form.password && !data.other.error.password) && (data.form.captcha && !data.other.error.captcha) && data.form.agree)
}else if(step == 2) {
return !((data.form.org && !data.other.error.org) && (data.form.vatTaxpayer && !data.other.error.vatTaxpayer))
}
}
}
export default function creator(option) {
const metaAction = new MetaAction(option),
o = new action({ ...option, metaAction }),
ret = { ...metaAction, ...o }
metaAction.config({ metaHandlers: ret })
return ret
}