mh_jy_safe_web/src/components/CustomPages/SE/SE001EditPage.js

583 lines
23 KiB
JavaScript
Raw Normal View History

2025-08-25 10:08:30 +08:00
import { message } from "antd/lib/index";
import { Button, Popconfirm, Row, Col, Checkbox, Radio, Form, Input, Select, Table, Upload, Icon } from 'antd';
import React from 'react';
import { initFilter, extendRule, extendInclude, setDataFieldValue, guid, initQueryFilter } from "../../../utils/common";
import { connect } from 'dva';
import config from "../../../config";
const Option = Select.Option;
class SE001EditPage extends React.Component {
constructor(props) {
super(props);
let readonly = false;
if (props.data.id !== "" && props.data.btnConfig && props.data.btnConfig.customParams) {
let params = props.data.btnConfig.customParams;
if (params.indexOf('VIEW=1') != -1) {
readonly = true;
}
}
this.state = {
data: {
},
TYPE: null,
NAME: "",
TRAINNAME: "",
ANSWER: null,
USAGE: 0,
SELECT_POINTS: [],
SELECT_POSTS: [],
SELECT_NOTIFYS: [],
OPTIONS: [
{ label: "[A]", value: "" },
{ label: "[B]", value: "" },
{ label: "[C]", value: "" },
{ label: "[D]", value: "" },
{ label: "[E]", value: "" },
],
FILE_ID: null,
POINTS: [],
POSTS: [],
NOTIFYS: [],
readonly: readonly,
};
};
componentDidMount() {
this.loadData();
this.loadPoints();
this.loadPosts();
this.loadNotifys();
}
BtnClose = () => {
if (typeof this.props.data.onCancel != "undefined" && typeof this.props.data.onCancel == 'function')
this.props.data.onCancel();
}
loadPoints = () => {
let json = initQueryFilter(this.props.login.OrgId, 1, 1000, "NAME", 0);
this.props.dispatch({
type: 'app/getDataByPost',
payload: json,
url: 'SE/TestEnumPoint/OrderPaged',
onComplete: (ret) => {
if (ret) {
this.setState({ POINTS: ret })
}
}
});
}
loadPosts = () => {
let json = initQueryFilter(this.props.login.OrgId, 1, 1000, "CODE", 0);
this.props.dispatch({
type: 'app/getDataByPost',
payload: json,
url: 'FM/UserPost/OrderPaged',
onComplete: (ret) => {
if (ret) {
this.setState({ POSTS: ret })
}
}
});
}
loadNotifys = () => {
let json = initQueryFilter(this.props.login.OrgId, 1, 1000, "CODE", 0);
this.props.dispatch({
type: 'app/getDataByPost',
payload: json,
url: 'SE/SETest/getNotifyNames',
onComplete: (ret) => {
if (ret) {
this.setState({ NOTIFYS: ret })
}
}
});
}
loadData = () => {
if (this.props.data.id == "")
return;
let json = initFilter(this.props.login.OrgId);
extendRule(json, 'ID', 1, this.props.data.id);
extendInclude(json, 'Nav_Posts');
extendInclude(json, 'Nav_Posts.Nav_Post');
extendInclude(json, 'Nav_Points');
extendInclude(json, 'Nav_Points.Nav_Point');
json.IgnoreDataRule = true;
this.props.dispatch({
type: 'app/getDataByPost',
payload: json,
url: 'SE/Test/Get',
onComplete: (ret) => {
if (ret) {
let points = [];
let posts = [];
let notifys = [];
if (ret.Nav_Points) {
ret.Nav_Points.map(it => {
points.push(it.POINT_ID)
})
}
if (ret.Nav_Posts) {
ret.Nav_Posts.map(it => {
if (it.POST_ID)
posts.push(it.POST_ID)
})
}
if (ret.Nav_Posts) {
ret.Nav_Posts.map(it => {
if (it.POST_ID)
posts.push(it.POST_ID)
})
}
if (ret.TRAINNAME != "") {
ret.TRAINNAME?.split("、").map(item => {
notifys.push(item)
})
}
let OPTIONS = this.state.OPTIONS;
OPTIONS[0].value = ret.OPTION_A;
OPTIONS[1].value = ret.OPTION_B;
OPTIONS[2].value = ret.OPTION_C;
OPTIONS[3].value = ret.OPTION_D;
OPTIONS[4].value = ret.OPTION_E;
this.setState({
data: ret,
TYPE: ret.TYPE,
NAME: ret.NAME,
ANSWER: ret.ANSWER,
FILE_ID: ret.FILE_ID,
USAGE: ret.USAGE,
OPTIONS: OPTIONS,
SELECT_POINTS: points,
SELECT_POSTS: posts,
SELECT_NOTIFYS: notifys,
})
}
}
});
}
onSave = () => {
if (-1 === [0, 1, 2].indexOf(this.state.TYPE)) {
message.error(`请选择题型`);
return;
}
if (!this.state.NAME || this.state.NAME.length == 0) {
message.error(`请输入题目`);
return;
}
if ((this.state.USAGE & 7) == 0) {
message.error(`请选择适用表单`);
return;
}
if (this.state.SELECT_POINTS.length == 0) {
message.error(`请选择知识点`);
return;
}
if (this.state.TYPE == 0) {
if (this.state.ANSWER !== 1 && this.state.ANSWER !== 2) {
message.error(`请选择答案`);
return;
}
}
if (this.state.TYPE == 1) {
if (-1 == [1, 2, 4, 8, 16].indexOf(this.state.ANSWER)) {
message.error(`请选择答案`);
return;
}
}
if (this.state.TYPE == 2) {
if ((this.state.ANSWER & 0xf) == 0) {
message.error(`请选择答案`);
return;
}
}
if (this.state.TYPE == 1 || this.state.TYPE == 2) {
for (let it of this.state.OPTIONS) {
if (it.value === '' && it.label != "[E]") {
message.error(`选项不可为空`);
return;
}
}
}
let data = JSON.parse(JSON.stringify(this.state.data));
data.NAME = this.state.NAME;
data.TYPE = this.state.TYPE;
data.USAGE = this.state.USAGE;
data.ANSWER = this.state.ANSWER;
if (!data.ID) {
data.ID = guid()
}
if (!data.ORG_ID) {
data.ORG_ID = this.props.login.OrgId
}
//处理适用岗位
if (!data.Nav_Posts) {
data.Nav_Posts = [];
}
let posts = JSON.parse(JSON.stringify(this.state.SELECT_POSTS));
let map = {};
for (let it of data.Nav_Posts) {
map[it.POST_ID] = true;
if (-1 === posts.indexOf(it.POST_ID)) {
it.IS_DELETED = true;
}
}
for (let it of posts) {
if (!map[it]) {
data.Nav_Posts.push({
ID: guid(),
TEST_ID: data.ID,
POST_ID: it
})
}
}
//处理知识点
if (!data.Nav_Points) {
data.Nav_Points = [];
}
let points = JSON.parse(JSON.stringify(this.state.SELECT_POINTS));
map = {};
for (let it of data.Nav_Points) {
map[it.POINT_ID] = true;
if (-1 === points.indexOf(it.POINT_ID)) {
it.IS_DELETED = true;
}
}
for (let it of points) {
if (!map[it]) {
data.Nav_Points.push({
ID: guid(),
TEST_ID: data.ID,
POINT_ID: it
})
}
}
//处理培训名称
data.TRAINNAME = this.state.SELECT_NOTIFYS.join("、");
if (this.state.updateFileList && this.state.updateFileList.length > 0) {
let item = this.state.updateFileList[this.state.updateFileList.length - 1];
if (item.response && item.response.Data) {
this.state.FILE_ID = item.response.Data
}
}
data.FILE_ID = this.state.FILE_ID
if (this.state.TYPE == 0) {
data.OPTION_A = '';
data.OPTION_B = '';
data.OPTION_C = '';
data.OPTION_D = '';
data.OPTION_E = '';
} else {
data.OPTION_A = this.state.OPTIONS[0].value;
data.OPTION_B = this.state.OPTIONS[1].value;
data.OPTION_C = this.state.OPTIONS[2].value;
data.OPTION_D = this.state.OPTIONS[3].value;
data.OPTION_E = this.state.OPTIONS[4].value;
}
this.props.dispatch({
type: 'app/getDataByPost',
payload: data,
url: 'SE/SETest/FullUpdate',
onComplete: (ret) => {
if (ret) {
message.success('保存成功!');
if (this.state.data.CREATE_TIME==undefined) {
this.state.data = {};
this.state.TYPE = null;
this.state.NAME = "";
this.state.ANSWER = null;
this.state.USAGE = 0;
this.state.SELECT_POINTS = [];
this.state.SELECT_POSTS = [];
this.state.SELECT_NOTIFYS = [];
this.state.TRAINNAME = "";
this.state.OPTIONS = [
{ label: "[A]", value: "" },
{ label: "[B]", value: "" },
{ label: "[C]", value: "" },
{ label: "[D]", value: "" },
{ label: "[E]", value: "" },
];
this.state.FILE_ID = null;
}
this.BtnClose();
}
}
});
}
fmtEnum(name, value) {
const enums = this.props.app.enums;
if (!enums || !enums[name]) return '';
return enums[name].enums[value] || '';
}
render() {
const layout = {
labelCol: { span: 8 },
wrapperCol: { span: 16 },
};
const formItemLayout = {
labelCol: { span: 6 },
wrapperCol: { span: 14 },
};
const btnItemLayout = {
labelCol: { span: 6 },
wrapperCol: { span: 14 },
colon: false
};
const uploadFilesProps = {
name: 'file',
action: config.serviceHost + 'PF/File/UploadFile',
data: { OrgId: this.props.login.OrgId },
fileList: this.state.updateFileList,
onChange: (info) => {
this.setState({
updateFileList: info.fileList,
});
if (info.file.status === 'done') {
message.success(`${info.file.name} file uploaded successfully`);
} else if (info.file.status === 'error') {
message.error(`${info.file.name} file upload failed.`);
}
},
};
return (
<Form {...layout}>
<Form.Item label={'适用表单'} {...formItemLayout}>
<Checkbox disabled={this.state.readonly} checked={(this.state.USAGE & 1) !== 0} onChange={(evt) => {
if (!evt.target.checked) {
this.setState({ USAGE: this.state.USAGE & (~1) })
} else {
this.setState({ USAGE: this.state.USAGE | 1 })
}
}}>安全意识调查
</Checkbox>
<Checkbox disabled={this.state.readonly} checked={(this.state.USAGE & 2) !== 0} onChange={(evt) => {
if (!evt.target.checked) {
this.setState({ USAGE: this.state.USAGE & (~2) })
} else {
this.setState({ USAGE: this.state.USAGE | 2 })
}
}}>培训
</Checkbox>
<Checkbox disabled={this.state.readonly} checked={(this.state.USAGE & 4) !== 0} onChange={(evt) => {
if (!evt.target.checked) {
this.setState({ USAGE: this.state.USAGE & (~4) })
} else {
this.setState({ USAGE: this.state.USAGE | 4 })
}
}}>事故事件
</Checkbox>
</Form.Item>
<Form.Item label={'适用岗位'} {...formItemLayout}>
<Select disabled={this.state.readonly} value={this.state.SELECT_POSTS} mode="multiple" style={{ width: '100%' }}
onChange={(value) => {
this.setState({
SELECT_POSTS: value
});
}}
filterOption={(input, option) =>
option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0
}
>
{
this.state.POSTS.map(it => {
return <Option value={it.ID}>{it.NAME}</Option>
})
}
</Select>
</Form.Item>
<Form.Item label={'知识点'} {...formItemLayout}>
<Select disabled={this.state.readonly} value={this.state.SELECT_POINTS} mode="multiple" style={{ width: '100%' }} onChange={(value) => {
this.setState({
SELECT_POINTS: value
});
}}>
{
(this.state.USAGE & 1) !== 0 && (
<Select.OptGroup label="安全意识调查">
{
this.state.POINTS.filter(it => (it.TYPE & 1) === 1).map(it => {
return <Option value={it.ID}>{it.NAME}</Option>
})
}
</Select.OptGroup>
)
}
{
(this.state.USAGE & 2) !== 0 && (
<Select.OptGroup label="培训">
{
this.state.POINTS.filter(it => (it.TYPE & 2) === 2).map(it => {
return <Option value={it.ID}>{it.NAME}</Option>
})
}
</Select.OptGroup>
)
}
{
(this.state.USAGE & 4) !== 0 && (
<Select.OptGroup label="事故事件">
{
this.state.POINTS.filter(it => (it.TYPE & 4) === 4).map(it => {
return <Option value={it.ID}>{it.NAME}</Option>
})
}
</Select.OptGroup>
)
}
</Select>
</Form.Item>
<Form.Item label={'培训名称'} {...formItemLayout}>
<Select disabled={this.state.readonly} value={this.state.SELECT_NOTIFYS} mode="multiple" style={{ width: '100%' }}
onChange={(value) => {
this.setState({
SELECT_NOTIFYS: value
});
}}
filterOption={(input, option) =>
option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0
}
>
{
this.state.NOTIFYS.map(it => {
return <Option value={it.NAME}>{it.NAME}</Option>
})
}
</Select>
</Form.Item>
<Form.Item label={'题型'} {...formItemLayout}>
<Select disabled={this.state.readonly} value={this.state.TYPE} style={{ width: '100%' }} onChange={(value) => {
this.setState({
TYPE: value
});
}}>
{
this.props.app.enums && this.props.app.enums.SETestTypeEnum && this.props.app.enums.SETestTypeEnum.options ?
this.props.app.enums.SETestTypeEnum.options.map(t => {
return <Option value={t.value}>{t.label}</Option>
}) : null
}
</Select>
</Form.Item>
{
[0, 1, 2].indexOf(this.state.TYPE) !== -1 && (
<Form.Item label={'题目'} {...formItemLayout}>
<Input.TextArea disabled={this.state.readonly} rows={2} value={this.state.NAME} onChange={(e) => {
this.setState({
NAME: e.target.value
});
}} />
</Form.Item>
)
}
{
(this.state.TYPE === 1 || this.state.TYPE === 2) && (
<Form.Item label={'选项'} {...formItemLayout}>
{
this.state.OPTIONS.map((it, idx) => {
return (
<Input disabled={this.state.readonly} addonBefore={it.label} value={it.value} onChange={(e) => {
var options = this.state.OPTIONS;
options[idx].value = e.target.value;
this.setState({ OPTIONS: options });
}}>
</Input>
)
})
}
</Form.Item>
)
}
{
[0, 1, 2].indexOf(this.state.TYPE) !== -1 && (
<Form.Item label={'答案'} {...formItemLayout}>
{
this.state.TYPE === 0 && (
<Select disabled={this.state.readonly} value={this.state.ANSWER} style={{ width: '100%' }} onChange={(value) => {
this.setState({
ANSWER: value
});
}}>
<Option value={1}></Option>
<Option value={2}></Option>
</Select>
)
}
{
this.state.TYPE === 1 && (
<Radio.Group disabled={this.state.readonly} value={this.state.ANSWER} onChange={(evt) => {
this.setState({ ANSWER: evt.target.value })
}} >
{
this.state.OPTIONS.map((it, idx) => {
return (<Radio value={1 << idx}>{it.label}</Radio>)
})
}
</Radio.Group>
)
}
{
this.state.TYPE === 2 && (
this.state.OPTIONS.map((it, idx) => {
return (
<Checkbox
disabled={this.state.readonly}
checked={(this.state.ANSWER & (1 << idx)) !== 0}
onChange={(evt) => {
if (!evt.target.checked) {
this.setState({ ANSWER: this.state.ANSWER & (~(1 << idx)) })
} else {
this.setState({ ANSWER: this.state.ANSWER | (1 << idx) })
}
}}>
{it.label}
</Checkbox>
)
})
)
}
</Form.Item>
)
}
{/* {
!this.state.readonly && (
<Form.Item label={'附件'} {...formItemLayout}>
<Upload {...uploadFilesProps}>
{
<Button>
<Icon type="upload" /> 上传附件
</Button>
}
</Upload>
</Form.Item>
)
} */}
{
!this.state.readonly && (
<Form.Item label=' ' {...btnItemLayout}>
<Button type="primary" onClick={() => { this.onSave(); }}>
保存
</Button>
</Form.Item>
)
}
</Form>
);
}
}
export default connect(({ login, app }) => ({ login, app }))(SE001EditPage)