524 lines
14 KiB
JavaScript
524 lines
14 KiB
JavaScript
|
|
import {
|
|||
|
|
message
|
|||
|
|
} from 'antd';
|
|||
|
|
import {
|
|||
|
|
observable,
|
|||
|
|
action
|
|||
|
|
} from 'mobx';
|
|||
|
|
import {
|
|||
|
|
WeaForm
|
|||
|
|
} from 'comsMobx';
|
|||
|
|
import * as API from '../apis/systeminfo';
|
|||
|
|
import * as Util from '../util/index';
|
|||
|
|
import moment from 'moment';
|
|||
|
|
import _isNaN from 'lodash/isNaN';
|
|||
|
|
import * as mobx from 'mobx';
|
|||
|
|
import {
|
|||
|
|
WeaTools
|
|||
|
|
} from 'ecCom'
|
|||
|
|
import * as PublicFunc from '../util/pulic-func';
|
|||
|
|
import {
|
|||
|
|
i18n
|
|||
|
|
} from '../public/i18n';
|
|||
|
|
import {
|
|||
|
|
WeaLocaleProvider
|
|||
|
|
} from 'ecCom';
|
|||
|
|
import {
|
|||
|
|
checkWeakPass
|
|||
|
|
} from "../util/PASSUtil.js";
|
|||
|
|
|
|||
|
|
const getLabel = WeaLocaleProvider.getLabel;
|
|||
|
|
const toJS = mobx.toJS;
|
|||
|
|
|
|||
|
|
export class HrmSystemInfo {
|
|||
|
|
loading = false;
|
|||
|
|
title = i18n.label.sysInfo;
|
|||
|
|
viewDate = new moment().format('YYYY-MM-DD');
|
|||
|
|
pickerValue = new moment().add(1, 'day').format('YYYY-MM-DD');
|
|||
|
|
|
|||
|
|
@observable hrmId = '';
|
|||
|
|
@observable isEditor = false;
|
|||
|
|
@observable checkValue = '0';
|
|||
|
|
@observable inputVlaue = '';
|
|||
|
|
@observable selectValue = '0';
|
|||
|
|
@observable form = new WeaForm();
|
|||
|
|
@observable buttons = {};
|
|||
|
|
@observable formFields = [];
|
|||
|
|
@observable settings = {};
|
|||
|
|
@observable weekInfo = {};
|
|||
|
|
@observable date = new Date().getTime();
|
|||
|
|
@observable isSelef = false;
|
|||
|
|
@observable openRSA = "0";
|
|||
|
|
|
|||
|
|
@observable options = [{
|
|||
|
|
key: '0',
|
|||
|
|
showname: '启用'
|
|||
|
|
}, {
|
|||
|
|
key: '2',
|
|||
|
|
showname: '网段策略'
|
|||
|
|
}];
|
|||
|
|
|
|||
|
|
@observable bodyConf = [{
|
|||
|
|
title: '签到信息',
|
|||
|
|
icon: 'icon-Human-resources-Sign-in-information',
|
|||
|
|
fields: ['signintime', 'signinip'],
|
|||
|
|
isRow: false,
|
|||
|
|
fieldsConf: [{
|
|||
|
|
title: '时间',
|
|||
|
|
icon: 'icon-Human-resources-late',
|
|||
|
|
}, {
|
|||
|
|
title: 'IP',
|
|||
|
|
icon: 'icon-Human-resources-IP',
|
|||
|
|
isIp: true,
|
|||
|
|
}]
|
|||
|
|
}, {
|
|||
|
|
title: '签退信息',
|
|||
|
|
icon: 'icon-Human-resources-Sign-out',
|
|||
|
|
fields: ['signouttime', 'signoutip'],
|
|||
|
|
isRow: false,
|
|||
|
|
fieldsConf: [{
|
|||
|
|
title: '时间',
|
|||
|
|
icon: 'icon-Human-resources-late',
|
|||
|
|
}, {
|
|||
|
|
title: 'IP',
|
|||
|
|
icon: 'icon-Human-resources-IP',
|
|||
|
|
isIp: true,
|
|||
|
|
}]
|
|||
|
|
}, {
|
|||
|
|
title: '微博填写',
|
|||
|
|
icon: 'icon-Human-resources-micro-blog',
|
|||
|
|
fields: ['blogcreated'],
|
|||
|
|
isRow: true,
|
|||
|
|
fieldsConf: [{
|
|||
|
|
title: '时间',
|
|||
|
|
icon: 'icon-Human-resources-late',
|
|||
|
|
}]
|
|||
|
|
}, {
|
|||
|
|
title: '出差信息',
|
|||
|
|
icon: 'icon-Human-resources-business-travel',
|
|||
|
|
fields: ['businesstravelbegin', 'businesstravelend'],
|
|||
|
|
isRow: false,
|
|||
|
|
fieldsConf: [{
|
|||
|
|
title: '开始',
|
|||
|
|
icon: 'icon-Human-resources-late',
|
|||
|
|
}, {
|
|||
|
|
title: '结束',
|
|||
|
|
icon: 'icon-Human-resources-late',
|
|||
|
|
}]
|
|||
|
|
}, {
|
|||
|
|
title: '移动签到',
|
|||
|
|
icon: 'icon-Human-resources-Mobile-sign-in',
|
|||
|
|
fields: ['mobilesignaddr'],
|
|||
|
|
isRow: true,
|
|||
|
|
fieldsConf: [{
|
|||
|
|
title: '地址',
|
|||
|
|
icon: 'icon-Human-resources-Mobile-sign-in',
|
|||
|
|
}]
|
|||
|
|
}]
|
|||
|
|
|
|||
|
|
@action
|
|||
|
|
init = () => {
|
|||
|
|
this.viewDate = new moment().format('YYYY-MM-DD');
|
|||
|
|
this.isEditor = false;
|
|||
|
|
this.checkValue = '0';
|
|||
|
|
this.inputVlaue = '';
|
|||
|
|
this.selectValue = '0';
|
|||
|
|
this.form = new WeaForm();
|
|||
|
|
this.buttons = {};
|
|||
|
|
this.formFields = [];
|
|||
|
|
this.settings = {};
|
|||
|
|
this.weekInfo = {};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
getFormField = () => {
|
|||
|
|
let params = {
|
|||
|
|
id: this.hrmId
|
|||
|
|
};
|
|||
|
|
API.getFormField(params).then((data) => {
|
|||
|
|
this.buttons = data.buttons;
|
|||
|
|
this.formFields = data.condition;
|
|||
|
|
this.checkValue = data.needauto,
|
|||
|
|
this.pickerValue = data.enableDate,
|
|||
|
|
this.selectValue = data.enableUsbType,
|
|||
|
|
this.inputVlaue = data.enableDate && data.enableDate != '' && moment(data.enableDate).diff(moment(), 'days') + 1,
|
|||
|
|
this.settings = data.settings;
|
|||
|
|
this.isSelef = data.isSelef;
|
|||
|
|
this.openRSA = data.openRSA;
|
|||
|
|
this.form = new WeaForm();
|
|||
|
|
this.form.initFormFields(data.condition);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
getWeekInfo = (v) => {
|
|||
|
|
let params = {
|
|||
|
|
id: this.hrmId,
|
|||
|
|
datefrom: v
|
|||
|
|
};
|
|||
|
|
API.getWeekInfo(params).then((data) => {
|
|||
|
|
this.weekInfo = data
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
getDateLabel = () => {
|
|||
|
|
let str = this.viewDate;
|
|||
|
|
if (new moment().format('YYYY-MM-DD') == this.viewDate) str = '今天';
|
|||
|
|
return str;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
onCheckChange = (v) => {
|
|||
|
|
this.checkValue = v;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
onInputChange = (v) => {
|
|||
|
|
if (v && !_isNaN(parseInt(v)) && parseInt(v) > 0) {
|
|||
|
|
this.inputVlaue = v;
|
|||
|
|
this.pickerValue = new moment().add(parseInt(v), 'day').format('YYYY-MM-DD');
|
|||
|
|
} else {
|
|||
|
|
this.inputVlaue = '';
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
onPickerChange = (v) => {
|
|||
|
|
this.pickerValue = v;
|
|||
|
|
this.inputVlaue = moment(v).diff(moment(), 'days') + 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
onSelectChange = (v) => {
|
|||
|
|
this.selectValue = v;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
edit = () => {
|
|||
|
|
const formParams = this.getFormParams();
|
|||
|
|
const usbState = formParams.usbstate || '';
|
|||
|
|
|
|||
|
|
this.formFields && this.formFields.forEach(c => {
|
|||
|
|
c.items.forEach(field => {
|
|||
|
|
let domkey = field.domkey[0] || '';
|
|||
|
|
if ((usbState == '0' && (domkey == 'tokenKey' || domkey == 'serial')) || domkey === 'validatecode') {
|
|||
|
|
field.viewAttr = 3;
|
|||
|
|
} else {
|
|||
|
|
field.viewAttr = 2;
|
|||
|
|
}
|
|||
|
|
if (field.conditionType == 'BROWSER') {
|
|||
|
|
field.browserConditionParam.viewAttr = 2;
|
|||
|
|
}
|
|||
|
|
if (domkey === 'classification' && this.isSelef) {
|
|||
|
|
field.viewAttr = 1;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
this.isEditor = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
doSave = () =>{
|
|||
|
|
if(this.loading) return;
|
|||
|
|
this.loading = true;
|
|||
|
|
const formParams = this.form.getFormParams();
|
|||
|
|
const userUsbType = formParams.userUsbType || '';
|
|||
|
|
const usbstate = formParams.usbstate || '';
|
|||
|
|
const tokenKey = formParams.tokenKey || '';
|
|||
|
|
const hrmId = this.hrmId;
|
|||
|
|
if (!this.beforeSave()) {
|
|||
|
|
this.loading = false;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
let __this = this;
|
|||
|
|
|
|||
|
|
if (userUsbType == "3" && usbstate != "1" && tokenKey != "") { //动态令牌
|
|||
|
|
let params = {};
|
|||
|
|
params.id = hrmId;
|
|||
|
|
params.tokenKey = tokenKey;
|
|||
|
|
WeaTools.callApi('/api/hrm/sysadmin/checkIsUsed', 'POST', params).then((data) => {
|
|||
|
|
if (data.isUsed) {
|
|||
|
|
message.warning('令牌序列号已经绑定给' + data.lastname + ',不能重复绑定!');
|
|||
|
|
this.loading = false;
|
|||
|
|
} else {
|
|||
|
|
__this.doAjaxSave();
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
} else {
|
|||
|
|
__this.doAjaxSave();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
RSAEcrypt = (password,password1) => {
|
|||
|
|
return new Promise( (resolve, reject) => {
|
|||
|
|
//异步加载ras文件
|
|||
|
|
loadjs.isDefined('rsa') ? loadjs.ready('rsa', () => {
|
|||
|
|
if ( this.openRSA && this.openRSA == '1') {
|
|||
|
|
password = __RSAEcrypt__.rsa_data_encrypt(password);
|
|||
|
|
password1 = __RSAEcrypt__.rsa_data_encrypt(password1);
|
|||
|
|
}
|
|||
|
|
resolve({password,password1});
|
|||
|
|
}) : loadjs(["/js/rsa/jsencrypt.js", "/js/rsa/rsa.js"], 'rsa', {
|
|||
|
|
async: false,
|
|||
|
|
success: () => {
|
|||
|
|
if (this.openRSA && this.openRSA == '1') {
|
|||
|
|
const callback = () => {
|
|||
|
|
password = __RSAEcrypt__.rsa_data_encrypt(password);
|
|||
|
|
password1 = __RSAEcrypt__.rsa_data_encrypt(password1);
|
|||
|
|
resolve({password, password1});
|
|||
|
|
}
|
|||
|
|
__RSAEcrypt__.initRsaCode(callback);
|
|||
|
|
} else {
|
|||
|
|
resolve({password, password1});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
doAjaxSave = () => {
|
|||
|
|
const hrmId = this.hrmId;
|
|||
|
|
const formParams = this.form.getFormParams();
|
|||
|
|
let params = {
|
|||
|
|
needauto: this.checkValue,
|
|||
|
|
enableDate: this.pickerValue,
|
|||
|
|
enableUsbType: this.selectValue
|
|||
|
|
};
|
|||
|
|
params = { ...{
|
|||
|
|
id: hrmId
|
|||
|
|
},
|
|||
|
|
...params,
|
|||
|
|
...formParams
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
let {
|
|||
|
|
password,
|
|||
|
|
password1
|
|||
|
|
} = params;
|
|||
|
|
|
|||
|
|
this.RSAEcrypt(password,password1).then(data => {
|
|||
|
|
params = {
|
|||
|
|
...params,
|
|||
|
|
password:data.password,
|
|||
|
|
password1:data.password1
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const {
|
|||
|
|
validatecode
|
|||
|
|
} = formParams;
|
|||
|
|
|
|||
|
|
if (!validatecode) {
|
|||
|
|
message.warning(getLabel(386319, '必填字段不完整!'));
|
|||
|
|
this.loading = false;
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
const save = () => {
|
|||
|
|
API.doSave(params).then((data) => {
|
|||
|
|
if (data.status == '1') {
|
|||
|
|
message.success(i18n.message.saveSuccess());
|
|||
|
|
this.isEditor = false;
|
|||
|
|
this.getFormField();
|
|||
|
|
|
|||
|
|
this.form.updateFields({
|
|||
|
|
validatecode: {
|
|||
|
|
value: ''
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
} else {
|
|||
|
|
message.warning(data.message);
|
|||
|
|
}
|
|||
|
|
this.loading = false;
|
|||
|
|
this.date = new Date().getTime();
|
|||
|
|
}, error => {
|
|||
|
|
message.warning(error.message);
|
|||
|
|
this.loading = false;
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
if (formParams.password === "qwertyuiop") {
|
|||
|
|
save();
|
|||
|
|
}else{
|
|||
|
|
checkWeakPass(params.password,() => {
|
|||
|
|
save();
|
|||
|
|
},() =>{
|
|||
|
|
this.loading = false;
|
|||
|
|
this.date = new Date().getTime();
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
backCard = () => {
|
|||
|
|
this.form.updateFields({
|
|||
|
|
validatecode: {
|
|||
|
|
value: ''
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
const hrmId = this.hrmId;
|
|||
|
|
this.isEditor = false;
|
|||
|
|
this.getFormField({
|
|||
|
|
hrmId
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
updateKey = () => {
|
|||
|
|
const formParams = this.form.getFormParams();
|
|||
|
|
let needusb = formParams.userUsbType || '';
|
|||
|
|
if (needusb == "2") {
|
|||
|
|
let returnstr = PublicFunc.getUserName() || '';
|
|||
|
|
if (returnstr != "") {
|
|||
|
|
form.updateFields({ ...formParams,
|
|||
|
|
...{
|
|||
|
|
loginid: {
|
|||
|
|
name: 'loginid',
|
|||
|
|
value: returnstr
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
} else if (needusb == "3") {
|
|||
|
|
this.bindTokenKey();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bindTokenKey = () => {
|
|||
|
|
const hrmId = this.hrmId;
|
|||
|
|
const title = "";
|
|||
|
|
let url = "/spa/hrm/index_mobx.html#/main/hrm/BindTokenKey?requestFrom=system&userid=" + hrmId;
|
|||
|
|
const dialog = ecCom.WeaTools.createDialog({
|
|||
|
|
title,
|
|||
|
|
url,
|
|||
|
|
style: {
|
|||
|
|
width: 700,
|
|||
|
|
height: 365
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
dialog.show();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
beforeSave = () => {
|
|||
|
|
const formParams = this.form.getFormParams();
|
|||
|
|
const userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
|
|||
|
|
const isOpera = userAgent.indexOf("Opera") > -1; //判断是否Opera浏览器
|
|||
|
|
const isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera; //判断是否IE浏览器
|
|||
|
|
const userUsbType = formParams.userUsbType || '';
|
|||
|
|
const usbstate = formParams.usbstate || '';
|
|||
|
|
const serial = formParams.serial || '';
|
|||
|
|
const tokenKey = formParams.tokenKey || '';
|
|||
|
|
const loginid = formParams.loginid || '';
|
|||
|
|
const email = formParams.email || '';
|
|||
|
|
const needauto = this.checkValue || '';
|
|||
|
|
const enableDate = this.pickerValue || '';
|
|||
|
|
|
|||
|
|
let username = "";
|
|||
|
|
|
|||
|
|
if (userUsbType == 2) {
|
|||
|
|
if (!isIE) {
|
|||
|
|
message.warning("您的浏览器不支持修改使用海泰key的账号密码,请使用IE浏览器");
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
//读取硬件usbkey赋值
|
|||
|
|
username = PublicFunc.getUserName();
|
|||
|
|
if (username == '') return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (usbstate != "1") {
|
|||
|
|
let flag = true;
|
|||
|
|
if (userUsbType == "2" && serial == "") {
|
|||
|
|
flag = false;
|
|||
|
|
} else if (userUsbType == "3" && tokenKey == "") {
|
|||
|
|
flag = false;
|
|||
|
|
}
|
|||
|
|
if (!flag) {
|
|||
|
|
message.warning(i18n.message.requireFieldNone());
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (needauto == '1' && enableDate == '') {
|
|||
|
|
message.warning(i18n.message.requireFieldNone());
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (userUsbType == '3' && tokenKey != "" && (!this.isdigit(tokenKey) || tokenKey.length != 10)) {
|
|||
|
|
message.warning(getLabel(387344, "令牌序列号必须为10位数字!"));
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
// if (loginid.indexOf(" ") != -1 || loginid.indexOf(";") != -1 || loginid.indexOf("--") != -1 || loginid.indexOf("'") != -1) {
|
|||
|
|
// message.warning(getLabel(387345, "登录名中不能有“空格、分号、--、单引号”字符"));
|
|||
|
|
// return false;
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
if ("2" == userUsbType) { //海泰key
|
|||
|
|
if (loginid != username) {
|
|||
|
|
message.warning(getLabel(387346, "系统用户名与Key中的不匹配!"));
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (!this.checkPassword()) return false;
|
|||
|
|
if (!PublicFunc.chkMail(email)) return false;
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
isdigit = (s) => {
|
|||
|
|
var r, re;
|
|||
|
|
re = /\d*/i; //\d表示数字,*表示匹配多个数字
|
|||
|
|
r = s.match(re);
|
|||
|
|
return (r == s) ? true : false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
checkPassword = () => {
|
|||
|
|
const formParams = this.form.getFormParams();
|
|||
|
|
let cs = formParams.password || ''; //新密码
|
|||
|
|
let cs1 = formParams.password1 || ''; //确认密码
|
|||
|
|
let passwordComplexity = this.settings.passwordComplexity;
|
|||
|
|
let minpasslen = this.settings.minpasslen;
|
|||
|
|
let checkpass = true;
|
|||
|
|
|
|||
|
|
if (cs == '' || cs == "qwertyuiop") return checkpass;
|
|||
|
|
|
|||
|
|
if (cs.length < minpasslen) {
|
|||
|
|
message.warning(getLabel(387347, "密码长度不能小于") + minpasslen);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if (cs != cs1) {
|
|||
|
|
message.warning(getLabel(387351, "密码确认不正确"));
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (passwordComplexity == "1") {
|
|||
|
|
const complexity11 = /[a-z]+/;
|
|||
|
|
const complexity12 = /[A-Z]+/;
|
|||
|
|
const complexity13 = /\d+/;
|
|||
|
|
if (cs != "") {
|
|||
|
|
if (complexity11.test(cs) && complexity12.test(cs) && complexity13.test(cs)) {
|
|||
|
|
checkpass = true;
|
|||
|
|
} else {
|
|||
|
|
message.warning(getLabel(533396, "新密码不符合要求,必须为字母大写、字母小写、数字组合!请重新输入!"));
|
|||
|
|
checkpass = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
} else if (passwordComplexity == "2") {
|
|||
|
|
const complexity21 = /[a-zA-Z_]+/;
|
|||
|
|
const complexity22 = /\W+/;
|
|||
|
|
const complexity23 = /\d+/;
|
|||
|
|
if (cs != "") {
|
|||
|
|
if (complexity21.test(cs) && complexity22.test(cs) && complexity23.test(cs)) {
|
|||
|
|
checkpass = true;
|
|||
|
|
} else {
|
|||
|
|
message.warning(getLabel(533374, "新密码不符合要求,必须为字母、数字、特殊字符组合!请重新输入!"));
|
|||
|
|
checkpass = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return checkpass;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
onPickerHandler = (v) => {
|
|||
|
|
v = new moment(v).format('YYYY-MM-DD');
|
|||
|
|
this.getWeekInfo(v);
|
|||
|
|
this.viewDate = v;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
getFormParams = () => {
|
|||
|
|
return this.form.getFormParams();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|