2025-08-25 10:08:30 +08:00
|
|
|
import { message } from "antd/lib/index";
|
|
|
|
|
import { Button, Popconfirm, Row, Col, Form, Input, InputNumber, DatePicker, Select, Table } from 'antd';
|
|
|
|
|
import React from 'react';
|
|
|
|
|
import { initFilter, extendRule, extendInclude, setDataFieldValue, guid, initQueryFilter } from "../../../utils/common";
|
|
|
|
|
import styles from '../../CustomPages/HI/StepForm.css';
|
|
|
|
|
import { connect } from 'dva';
|
|
|
|
|
import moment from 'moment';
|
|
|
|
|
|
|
|
|
|
class SEConfigPage extends React.Component {
|
2026-04-10 14:38:18 +08:00
|
|
|
|
2025-08-25 10:08:30 +08:00
|
|
|
constructor(props) {
|
|
|
|
|
super(props);
|
|
|
|
|
this.state = {
|
|
|
|
|
isLoading: false,
|
|
|
|
|
data: {
|
|
|
|
|
ID: null,
|
|
|
|
|
SAFE_SERVEY_TRIGGER_TIME: null,
|
|
|
|
|
S_TEST_COUNT: 0,
|
|
|
|
|
S_TEST_SCORE: 0,
|
|
|
|
|
S_TEST_TOTAL: 0,
|
|
|
|
|
M_TEST_COUNT: 0,
|
|
|
|
|
M_TEST_SCORE: 0,
|
|
|
|
|
M_TEST_TOTAL: 0,
|
|
|
|
|
C_TEST_COUNT: 0,
|
|
|
|
|
C_TEST_SCORE: 0,
|
|
|
|
|
C_TEST_TOTAL: 0,
|
|
|
|
|
DEP_TRAIN_PLAN_START_TIME: null,
|
|
|
|
|
DEP_TRAIN_PLAN_END_TIME: null,
|
|
|
|
|
TRAIN_SURVEY_TRIGGER_TIME: null,
|
2026-04-10 14:38:18 +08:00
|
|
|
APPROVAL_ROLE_ID: null,
|
|
|
|
|
optionsSelect: null
|
2025-08-25 10:08:30 +08:00
|
|
|
},
|
|
|
|
|
};
|
2026-04-10 14:38:18 +08:00
|
|
|
|
2025-08-25 10:08:30 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
componentDidMount() {
|
2026-04-10 14:38:18 +08:00
|
|
|
this.ini();
|
|
|
|
|
// this.loadData();
|
2025-08-25 10:08:30 +08:00
|
|
|
}
|
|
|
|
|
BtnClose = () => {
|
|
|
|
|
if (typeof this.props.closeFn != "undefined")
|
|
|
|
|
this.props.closeFn();
|
|
|
|
|
else if (typeof this.props.data.closeTab == 'function') {
|
|
|
|
|
this.props.data.closeTab(this.props.data.id)
|
|
|
|
|
} else if (typeof this.props.onCancel === "function") {
|
|
|
|
|
this.props.onCancel();
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-04-10 14:38:18 +08:00
|
|
|
ini = () => {
|
|
|
|
|
let json = initFilter(this.props.login.OrgId);
|
|
|
|
|
json.Parameter22 = this.props.data.ORG_ID_HV;
|
|
|
|
|
var that = this
|
|
|
|
|
this.props.dispatch({
|
|
|
|
|
type: 'app/getDataByPost',
|
|
|
|
|
payload: json,
|
|
|
|
|
url: 'PF/ApprovalRole/Entities',
|
|
|
|
|
onComplete: (ret) => {
|
|
|
|
|
if (ret && ret.length > 0) {
|
|
|
|
|
let data = this.state.data;
|
|
|
|
|
data.optionsSelect = ret;
|
|
|
|
|
this.setState(data)
|
|
|
|
|
this.loadData()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
}
|
2025-08-25 10:08:30 +08:00
|
|
|
loadData = () => {
|
|
|
|
|
let json = initFilter(this.props.login.OrgId);
|
2025-12-22 15:33:31 +08:00
|
|
|
json.Parameter22 = this.props.data.ORG_ID_HV;
|
2025-08-25 10:08:30 +08:00
|
|
|
this.props.dispatch({
|
|
|
|
|
type: 'app/getDataByPost',
|
|
|
|
|
payload: json,
|
|
|
|
|
url: 'SE/SEConfig/Entities',
|
|
|
|
|
onComplete: (ret) => {
|
|
|
|
|
if (ret && ret.length > 0) {
|
2026-04-10 14:38:18 +08:00
|
|
|
ret[0].optionsSelect = this.state.data.optionsSelect
|
2025-08-25 10:08:30 +08:00
|
|
|
this.setState({ data: ret[0] });
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
fmtEnum(name, value) {
|
|
|
|
|
const enums = this.props.app.enums;
|
|
|
|
|
if (!enums || !enums[name]) return '';
|
|
|
|
|
return enums[name].enums[value] || '';
|
|
|
|
|
}
|
|
|
|
|
onSave = () => {
|
|
|
|
|
let data = JSON.parse(JSON.stringify(this.state.data));
|
2025-11-19 17:26:08 +08:00
|
|
|
// if (data.DEP_TRAIN_PLAN_END_TIME && data.DEP_TRAIN_PLAN_START_TIME) {
|
|
|
|
|
// let s = new Date(data.DEP_TRAIN_PLAN_START_TIME);
|
|
|
|
|
// let e = new Date(data.DEP_TRAIN_PLAN_END_TIME);
|
|
|
|
|
// if (e.getTime() - s.getTime() < 1 * 24 * 60 * 60 * 1000) {
|
|
|
|
|
// message.error('截止时间至少比开始时间大一天');
|
|
|
|
|
// return;
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
if (!data.DEP_TRAIN_PLAN_START_TIME) {
|
|
|
|
|
message.error('请填写公司培训计划触发时间');
|
|
|
|
|
return;
|
2025-08-25 10:08:30 +08:00
|
|
|
}
|
|
|
|
|
if (!data.ID) {
|
|
|
|
|
data.ID = guid();
|
|
|
|
|
}
|
|
|
|
|
this.setState({ isLoading: true });
|
|
|
|
|
this.props.dispatch({
|
|
|
|
|
type: 'app/getDataByPost',
|
|
|
|
|
payload: data,
|
|
|
|
|
url: 'SE/SEConfig/FullUpdate',
|
|
|
|
|
onComplete: (ret) => {
|
|
|
|
|
if (ret) {
|
|
|
|
|
message.success('保存成功!');
|
|
|
|
|
this.setState({ isLoading: false });
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
2026-04-10 14:38:18 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
onselectChange = (value) => {
|
|
|
|
|
debugger
|
|
|
|
|
let data = this.state.data;
|
|
|
|
|
data.APPROVAL_ROLE_ID = value;
|
|
|
|
|
this.setState(data)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onBlur = () => {
|
|
|
|
|
console.log('blur');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onFocus = () => {
|
|
|
|
|
console.log('focus');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onSearch = (val) => {
|
|
|
|
|
console.log('search:', val);
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-25 10:08:30 +08:00
|
|
|
render() {
|
|
|
|
|
const { data } = this.state;
|
|
|
|
|
const dateFormat = 'MM-DD';
|
2026-04-10 14:38:18 +08:00
|
|
|
const { Option } = Select;
|
2025-08-25 10:08:30 +08:00
|
|
|
return <>
|
|
|
|
|
<div style={{ padding: '10px' }}>
|
|
|
|
|
<Button style={{ marginLeft: '8px' }} onClick={() => this.onSave()} icon="save" type="primary" loading={this.state.isLoading}>保存</Button>
|
|
|
|
|
</div>
|
|
|
|
|
<div ref={el => (this.componentRef = el)} style={{ padding: '20px', backgroundColor: 'FFF' }} id={'tableId' + this.props.data.id}>
|
|
|
|
|
<h1 style={{ textAlign: 'center', margin: '15px' }}>安全教育培训基础设置</h1>
|
|
|
|
|
<table style={{ width: '100%', textAlign: 'center', borderTop: '1px solid #333', borderLeft: '1px solid #333' }} className={styles.PrintForm}>
|
|
|
|
|
<tr>
|
|
|
|
|
<td colSpan={24} rowSpan={1} >题库设置</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td colSpan={4} rowSpan={1} >是非题数目</td>
|
|
|
|
|
<td colSpan={4} rowSpan={1} >
|
|
|
|
|
<InputNumber value={data.C_TEST_COUNT} min={0} max={9999}
|
|
|
|
|
onChange={
|
|
|
|
|
value => {
|
|
|
|
|
let data = this.state.data;
|
|
|
|
|
data.C_TEST_COUNT = value;
|
|
|
|
|
this.setState(data)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
>
|
|
|
|
|
</InputNumber>
|
|
|
|
|
</td>
|
|
|
|
|
<td colSpan={4} rowSpan={1} >是非题分值</td>
|
|
|
|
|
<td colSpan={4} rowSpan={1} >
|
|
|
|
|
<InputNumber value={data.C_TEST_SCORE} min={0} max={9999}
|
|
|
|
|
onChange={
|
|
|
|
|
value => {
|
|
|
|
|
let data = this.state.data;
|
|
|
|
|
data.C_TEST_SCORE = value;
|
|
|
|
|
this.setState(data)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
>
|
|
|
|
|
</InputNumber>
|
|
|
|
|
</td>
|
|
|
|
|
<td colSpan={4} rowSpan={1} >是非题总分</td>
|
|
|
|
|
<td colSpan={4} rowSpan={1} >{data.C_TEST_COUNT * data.C_TEST_SCORE}</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td colSpan={4} rowSpan={1} >单选题数目</td>
|
|
|
|
|
<td colSpan={4} rowSpan={1} >
|
|
|
|
|
<InputNumber value={data.S_TEST_COUNT} min={0} max={9999}
|
|
|
|
|
onChange={
|
|
|
|
|
value => {
|
|
|
|
|
let data = this.state.data;
|
|
|
|
|
data.S_TEST_COUNT = value;
|
|
|
|
|
this.setState(data)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
>
|
|
|
|
|
</InputNumber>
|
|
|
|
|
</td>
|
|
|
|
|
<td colSpan={4} rowSpan={1} >单选题分值</td>
|
|
|
|
|
<td colSpan={4} rowSpan={1} >
|
|
|
|
|
<InputNumber value={data.S_TEST_SCORE} min={0} max={9999}
|
|
|
|
|
onChange={
|
|
|
|
|
value => {
|
|
|
|
|
let data = this.state.data;
|
|
|
|
|
data.S_TEST_SCORE = value;
|
|
|
|
|
this.setState(data)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
>
|
|
|
|
|
</InputNumber>
|
|
|
|
|
</td>
|
|
|
|
|
<td colSpan={4} rowSpan={1} >单选题总分</td>
|
|
|
|
|
<td colSpan={4} rowSpan={1} >{data.S_TEST_COUNT * data.S_TEST_SCORE}</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td colSpan={4} rowSpan={1} >多选题数目</td>
|
|
|
|
|
<td colSpan={4} rowSpan={1} >
|
|
|
|
|
<InputNumber value={data.M_TEST_COUNT} min={0} max={9999}
|
|
|
|
|
onChange={
|
|
|
|
|
value => {
|
|
|
|
|
let data = this.state.data;
|
|
|
|
|
data.M_TEST_COUNT = value;
|
|
|
|
|
this.setState(data)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
>
|
|
|
|
|
</InputNumber>
|
|
|
|
|
</td>
|
|
|
|
|
<td colSpan={4} rowSpan={1} >多选题分值</td>
|
|
|
|
|
<td colSpan={4} rowSpan={1} >
|
|
|
|
|
<InputNumber value={data.M_TEST_SCORE} min={0} max={9999}
|
|
|
|
|
onChange={
|
|
|
|
|
value => {
|
|
|
|
|
let data = this.state.data;
|
|
|
|
|
data.M_TEST_SCORE = value;
|
|
|
|
|
this.setState(data)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
>
|
|
|
|
|
</InputNumber>
|
|
|
|
|
</td>
|
|
|
|
|
<td colSpan={4} rowSpan={1} >多选题总分</td>
|
|
|
|
|
<td colSpan={4} rowSpan={1} >{data.M_TEST_COUNT * data.M_TEST_SCORE}</td>
|
|
|
|
|
</tr>
|
2026-02-04 14:42:22 +08:00
|
|
|
<tr>
|
|
|
|
|
<td colSpan={4} rowSpan={1} >培训补考限制次数</td>
|
|
|
|
|
<td colSpan={20} rowSpan={1} >
|
|
|
|
|
<InputNumber value={data.COUNT_RETRY} min={0} max={100}
|
|
|
|
|
onChange={value => {
|
|
|
|
|
let data = this.state.data;
|
|
|
|
|
data.COUNT_RETRY = value;
|
|
|
|
|
this.setState(data)
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
</InputNumber>
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2025-08-25 10:08:30 +08:00
|
|
|
<tr>
|
|
|
|
|
<td colSpan={4} rowSpan={1} >合格线</td>
|
2025-11-13 17:53:20 +08:00
|
|
|
<td colSpan={20} rowSpan={1} >
|
2025-08-25 10:08:30 +08:00
|
|
|
<InputNumber value={data.PASS_MARK} min={0} max={100}
|
|
|
|
|
onChange={
|
|
|
|
|
value => {
|
|
|
|
|
let data = this.state.data;
|
|
|
|
|
data.PASS_MARK = value;
|
|
|
|
|
this.setState(data)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
>
|
|
|
|
|
</InputNumber>
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td colSpan={4} rowSpan={1} >试题总分</td>
|
|
|
|
|
<td colSpan={20} rowSpan={1} > {data.C_TEST_COUNT * data.C_TEST_SCORE + data.S_TEST_COUNT * data.S_TEST_SCORE + data.M_TEST_COUNT * data.M_TEST_SCORE}
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td colSpan={24} rowSpan={1} >其它设置</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td colSpan={4} rowSpan={1} >安全意识调查触发时间</td>
|
|
|
|
|
<td colSpan={20} rowSpan={1} >
|
|
|
|
|
<DatePicker
|
|
|
|
|
format={dateFormat}
|
|
|
|
|
value={data.SAFE_SERVEY_TRIGGER_TIME ? moment(data.SAFE_SERVEY_TRIGGER_TIME) : null}
|
|
|
|
|
onChange={value => {
|
|
|
|
|
let data = this.state.data;
|
2025-11-26 21:28:57 +08:00
|
|
|
data.SAFE_SERVEY_TRIGGER_TIME = moment(value);
|
2025-08-25 10:08:30 +08:00
|
|
|
this.setState(data)
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td colSpan={4} rowSpan={1} >培训需求调查触发时间</td>
|
|
|
|
|
<td colSpan={20} rowSpan={1} >
|
|
|
|
|
<DatePicker
|
|
|
|
|
format={dateFormat}
|
|
|
|
|
value={data.TRAIN_SURVEY_TRIGGER_TIME ? moment(data.TRAIN_SURVEY_TRIGGER_TIME) : null}
|
|
|
|
|
onChange={value => {
|
|
|
|
|
let data = this.state.data;
|
|
|
|
|
data.TRAIN_SURVEY_TRIGGER_TIME = value;
|
|
|
|
|
this.setState(data)
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
2025-11-13 17:53:20 +08:00
|
|
|
<td colSpan={4} rowSpan={1} >公司培训计划触发时间</td>
|
2026-04-10 14:38:18 +08:00
|
|
|
<td colSpan={8} rowSpan={1} >
|
2025-11-13 17:53:20 +08:00
|
|
|
<DatePicker
|
|
|
|
|
format={dateFormat}
|
|
|
|
|
value={data.DEP_TRAIN_PLAN_START_TIME ? moment(data.DEP_TRAIN_PLAN_START_TIME) : null}
|
|
|
|
|
onChange={value => {
|
|
|
|
|
let data = this.state.data;
|
|
|
|
|
data.DEP_TRAIN_PLAN_START_TIME = value;
|
|
|
|
|
this.setState(data)
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
</td>
|
2026-04-10 14:38:18 +08:00
|
|
|
<td colSpan={4} rowSpan={1} >接收角色</td>
|
|
|
|
|
<td colSpan={8} rowSpan={1} >
|
|
|
|
|
<Select
|
|
|
|
|
showSearch
|
|
|
|
|
style={{ width: 300 }}
|
|
|
|
|
placeholder="请选择接收角色"
|
|
|
|
|
value={data.APPROVAL_ROLE_ID}
|
|
|
|
|
onChange={(value) => {
|
|
|
|
|
data.APPROVAL_ROLE_ID = value;
|
|
|
|
|
this.setState(data)
|
|
|
|
|
}}
|
|
|
|
|
filterOption={(input, option) =>
|
|
|
|
|
option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0
|
|
|
|
|
}
|
|
|
|
|
>
|
|
|
|
|
{data.optionsSelect?.map(item =>
|
|
|
|
|
(<Option key={item.ID} value={item.ID} label={item.NAME} >{item.NAME}</Option>)
|
|
|
|
|
)}
|
|
|
|
|
</Select>
|
|
|
|
|
</td>
|
2025-11-13 17:53:20 +08:00
|
|
|
</tr>
|
|
|
|
|
|
2026-04-10 14:38:18 +08:00
|
|
|
{/*
|
|
|
|
|
render: (text, record, index) => {
|
|
|
|
|
return <Select value={text != "-1" ? text : ""} optionFilterProp='name' onChange={(e) => this.onSelectChange(e, record, 'PLATFORM_TYPE', index)}>
|
|
|
|
|
{
|
|
|
|
|
enums && enums.CMEvaluateStatusEnum && enums.CMEvaluateStatusEnum.options ? enums.CMEvaluateStatusEnum.options.map(t => {
|
|
|
|
|
return <Option value={t.value}>{t.label}</Option>
|
|
|
|
|
}) : null
|
|
|
|
|
}
|
|
|
|
|
</Select>;
|
|
|
|
|
|
|
|
|
|
*/}
|
|
|
|
|
|
|
|
|
|
|
2025-11-13 17:53:20 +08:00
|
|
|
{/* <tr>
|
2025-08-25 10:08:30 +08:00
|
|
|
<td colSpan={4} rowSpan={1} >部门培训计划发起时间</td>
|
|
|
|
|
<td colSpan={20} rowSpan={1} >
|
|
|
|
|
<DatePicker
|
|
|
|
|
format={dateFormat}
|
|
|
|
|
value={data.DEP_TRAIN_PLAN_START_TIME ? moment(data.DEP_TRAIN_PLAN_START_TIME) : null}
|
|
|
|
|
onChange={value => {
|
|
|
|
|
let data = this.state.data;
|
|
|
|
|
data.DEP_TRAIN_PLAN_START_TIME = value;
|
|
|
|
|
this.setState(data)
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td colSpan={4} rowSpan={1} >部门培训计划截至时间</td>
|
|
|
|
|
<td colSpan={20} rowSpan={1} >
|
|
|
|
|
<DatePicker
|
|
|
|
|
format={dateFormat}
|
|
|
|
|
value={data.DEP_TRAIN_PLAN_END_TIME ? moment(data.DEP_TRAIN_PLAN_END_TIME) : null}
|
|
|
|
|
onChange={value => {
|
|
|
|
|
let data = this.state.data;
|
|
|
|
|
data.DEP_TRAIN_PLAN_END_TIME = value;
|
|
|
|
|
this.setState(data)
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
</td>
|
2025-11-13 17:53:20 +08:00
|
|
|
</tr> */}
|
2025-08-25 10:08:30 +08:00
|
|
|
|
|
|
|
|
</table>
|
|
|
|
|
</div>
|
|
|
|
|
</>
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default connect(({ login, app }) => ({ login, app }))(SEConfigPage)
|