Commit 79311bc5 authored by 邓超's avatar 邓超

fix: 对运维平台进行优化,修改测试到的问题

parent 6f3ea24c
Pipeline #35929 skipped with stages
...@@ -9,6 +9,7 @@ import { ...@@ -9,6 +9,7 @@ import {
notification, notification,
Spin, Spin,
} from 'antd'; } from 'antd';
import copy from 'copy-to-clipboard';
import PageContainer from '@/components/BasePageContainer'; import PageContainer from '@/components/BasePageContainer';
import styles from './ManagementDataBase.less'; import styles from './ManagementDataBase.less';
import { import {
...@@ -177,6 +178,22 @@ const ManagementDataBase = () => { ...@@ -177,6 +178,22 @@ const ManagementDataBase = () => {
// setContent(text); // setContent(text);
setContent(arr); setContent(arr);
}; };
// 复制SQL
const copySql = text => {
if (copy(text)) {
notification.success({
message: '提示',
duration: 3,
description: '复制成功',
});
} else {
notification.error({
message: '提示',
duration: 3,
description: '复制失败',
});
}
};
const autoCheckColumns = [ const autoCheckColumns = [
{ {
title: '表名称', title: '表名称',
...@@ -212,6 +229,16 @@ const ManagementDataBase = () => { ...@@ -212,6 +229,16 @@ const ManagementDataBase = () => {
key: 'Message', key: 'Message',
ellipsis: true, ellipsis: true,
}, },
{
title: 'SQL语句',
dataIndex: 'DiffSql',
key: 'DiffSql',
render: text => (
<Button size="small" type="primary" onClick={() => copySql(text)}>
复制SQL
</Button>
),
},
]; ];
const logColumns = [ const logColumns = [
{ {
......
...@@ -431,7 +431,7 @@ const MiniMenu = props => { ...@@ -431,7 +431,7 @@ const MiniMenu = props => {
dragMenu({ dragMenu({
menuID: obj.id, menuID: obj.id,
newParentID: obj.parentId || -1, newParentID: obj.parentId.toString() || '-1',
menuList: String(arrList) || '', menuList: String(arrList) || '',
_version: 9999, _version: 9999,
_dc: Date.now(), _dc: Date.now(),
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
max-height: 20rem; max-height: 20rem;
overflow-y: scroll; overflow-y: scroll;
.ant-card{ .ant-card{
width: 80%; width: 83%;
margin-left: 4rem; margin-left: 4rem;
} }
.ant-card-head-title{ .ant-card-head-title{
......
...@@ -136,8 +136,9 @@ const Flow = () => { ...@@ -136,8 +136,9 @@ const Flow = () => {
dataIndex: 'extendWebPage', dataIndex: 'extendWebPage',
align: 'center', align: 'center',
render: text => ( render: text => (
// eslint-disable-next-line react/no-danger <span style={{ color: text === '(默认)' ? 'grey' : '000000D9' }}>
<span dangerouslySetInnerHTML={{ __html: text }} /> {text}
</span>
), ),
}, },
{ {
...@@ -145,8 +146,9 @@ const Flow = () => { ...@@ -145,8 +146,9 @@ const Flow = () => {
dataIndex: 'extendMobilePage', dataIndex: 'extendMobilePage',
align: 'center', align: 'center',
render: text => ( render: text => (
// eslint-disable-next-line react/no-danger <span style={{ color: text === '(默认)' ? 'grey' : '000000D9' }}>
<span dangerouslySetInnerHTML={{ __html: text }} /> {text}
</span>
), ),
}, },
{ {
...@@ -155,8 +157,9 @@ const Flow = () => { ...@@ -155,8 +157,9 @@ const Flow = () => {
align: 'center', align: 'center',
width: 80, width: 80,
render: text => ( render: text => (
// eslint-disable-next-line react/no-danger <span style={{ color: text === '(无)' ? 'grey' : '000000D9' }}>
<span dangerouslySetInnerHTML={{ __html: text }} /> {text}
</span>
), ),
}, },
{ {
...@@ -164,8 +167,9 @@ const Flow = () => { ...@@ -164,8 +167,9 @@ const Flow = () => {
dataIndex: 'flowEndBehavior', dataIndex: 'flowEndBehavior',
align: 'center', align: 'center',
render: text => ( render: text => (
// eslint-disable-next-line react/no-danger <span style={{ color: text === '(不做处理)' ? 'grey' : '000000D9' }}>
<span dangerouslySetInnerHTML={{ __html: text }} /> {text}
</span>
), ),
}, },
{ {
...@@ -179,8 +183,7 @@ const Flow = () => { ...@@ -179,8 +183,7 @@ const Flow = () => {
dataIndex: 'errorNodes', dataIndex: 'errorNodes',
align: 'center', align: 'center',
render: text => ( render: text => (
// eslint-disable-next-line react/no-danger <span style={{ color: text === '(无)' ? 'grey' : 'red' }}>{text}</span>
<span dangerouslySetInnerHTML={{ __html: text }} />
), ),
}, },
{ {
...@@ -188,8 +191,9 @@ const Flow = () => { ...@@ -188,8 +191,9 @@ const Flow = () => {
dataIndex: 'interfaceConfig', dataIndex: 'interfaceConfig',
align: 'center', align: 'center',
render: text => ( render: text => (
// eslint-disable-next-line react/no-danger <span style={{ color: text === '(无)' ? 'grey' : '000000D9' }}>
<span dangerouslySetInnerHTML={{ __html: text }} /> {text}
</span>
), ),
}, },
{ {
......
...@@ -82,45 +82,30 @@ const Timelimit = props => { ...@@ -82,45 +82,30 @@ const Timelimit = props => {
title: '规则名称', title: '规则名称',
dataIndex: 'Name', dataIndex: 'Name',
align: 'center', align: 'center',
render: text => (
// eslint-disable-next-line react/no-danger
<span dangerouslySetInnerHTML={{ __html: text }} />
),
}, },
{ {
title: '开始节点', title: '开始节点',
dataIndex: 'StartNode', dataIndex: 'StartNode',
align: 'center', align: 'center',
render: text => (
// eslint-disable-next-line react/no-danger
<span dangerouslySetInnerHTML={{ __html: text }} />
),
}, },
{ {
title: '结束节点', title: '结束节点',
dataIndex: 'EndNode', dataIndex: 'EndNode',
align: 'center', align: 'center',
render: text => (
// eslint-disable-next-line react/no-danger
<span dangerouslySetInnerHTML={{ __html: text }} />
),
}, },
{ {
title: '默认时限', title: '默认时限',
dataIndex: 'TimeLimit', dataIndex: 'TimeLimit',
align: 'center', align: 'center',
render: text => (
// eslint-disable-next-line react/no-danger
<span dangerouslySetInnerHTML={{ __html: text }} />
),
}, },
{ {
title: '时限指派字段', title: '时限指派字段',
dataIndex: 'TimeLimitFieldHtml', dataIndex: 'TimeLimitField',
align: 'center', align: 'center',
render: text => ( render: text => (
// eslint-disable-next-line react/no-danger <span style={{ color: text === '(未配置)' ? 'grey' : '#0000009D' }}>
<span dangerouslySetInnerHTML={{ __html: text }} /> {text}
</span>
), ),
}, },
{ {
...@@ -128,8 +113,9 @@ const Timelimit = props => { ...@@ -128,8 +113,9 @@ const Timelimit = props => {
dataIndex: 'TimeoutField', dataIndex: 'TimeoutField',
align: 'center', align: 'center',
render: text => ( render: text => (
// eslint-disable-next-line react/no-danger <span style={{ color: text === '(未配置)' ? 'grey' : '#0000009D' }}>
<span dangerouslySetInnerHTML={{ __html: text }} /> {text}
</span>
), ),
}, },
{ {
......
...@@ -230,8 +230,7 @@ const AddModal = props => { ...@@ -230,8 +230,7 @@ const AddModal = props => {
<Select> <Select>
{timeLimitFlowNodes.map(item => ( {timeLimitFlowNodes.map(item => (
<Option value={item.Name} key={item.ID}> <Option value={item.Name} key={item.ID}>
{/* eslint-disable-next-line react/no-danger */} <span>{item.Name}</span>
<span dangerouslySetInnerHTML={{ __html: item.Name }} />
</Option> </Option>
))} ))}
</Select> </Select>
...@@ -244,8 +243,7 @@ const AddModal = props => { ...@@ -244,8 +243,7 @@ const AddModal = props => {
<Select> <Select>
{timeLimitFlowNodes.map(item => ( {timeLimitFlowNodes.map(item => (
<Option value={item.Name} key={item.ID}> <Option value={item.Name} key={item.ID}>
{/* eslint-disable-next-line react/no-danger */} <span>{item.Name}</span>
<span dangerouslySetInnerHTML={{ __html: item.Name }} />
</Option> </Option>
))} ))}
</Select> </Select>
......
...@@ -93,6 +93,17 @@ const FlowNode = () => { ...@@ -93,6 +93,17 @@ const FlowNode = () => {
} }
setExpandedRowKeys(data); setExpandedRowKeys(data);
}; };
// 表格内文案样式
const textStyleOne = (text, record) => {
if (record.colorType === 2) {
return 'red';
}
if (text === '(未配置)') {
return 'grey';
}
return '000000D9';
};
// 定义展开的表格 // 定义展开的表格
const createUnfoldTable = itemTable => { const createUnfoldTable = itemTable => {
const columns = [ const columns = [
...@@ -101,12 +112,15 @@ const FlowNode = () => { ...@@ -101,12 +112,15 @@ const FlowNode = () => {
dataIndex: 'name', dataIndex: 'name',
width: 149, width: 149,
align: 'left', align: 'left',
render: text => ( render: (text, record) => (
<div <div
style={{ paddingLeft: 60 }} style={{
// eslint-disable-next-line react/no-danger paddingLeft: 60,
dangerouslySetInnerHTML={{ __html: text }} color: record.colorType === 2 ? 'red' : '#000000D9',
/> }}
>
{text}
</div>
), ),
}, },
{ {
...@@ -114,19 +128,15 @@ const FlowNode = () => { ...@@ -114,19 +128,15 @@ const FlowNode = () => {
dataIndex: 'aliasName', dataIndex: 'aliasName',
align: 'center', align: 'center',
width: 80, width: 80,
render: text => ( render: text => <span>{text}</span>,
// eslint-disable-next-line react/no-danger
<span dangerouslySetInnerHTML={{ __html: text }} />
),
}, },
{ {
title: '移交方式', title: '移交方式',
dataIndex: 'extendHandover', dataIndex: 'extendHandover',
align: 'center', align: 'center',
width: 80, width: 80,
render: text => ( render: (text, record) => (
// eslint-disable-next-line react/no-danger <span style={{ color: textStyleOne(text, record) }}>{text}</span>
<span dangerouslySetInnerHTML={{ __html: text }} />
), ),
}, },
{ {
...@@ -134,9 +144,8 @@ const FlowNode = () => { ...@@ -134,9 +144,8 @@ const FlowNode = () => {
dataIndex: 'extendNodeType', dataIndex: 'extendNodeType',
align: 'center', align: 'center',
width: 80, width: 80,
render: text => ( render: (text, record) => (
// eslint-disable-next-line react/no-danger <span style={{ color: textStyleOne(text, record) }}>{text}</span>
<span dangerouslySetInnerHTML={{ __html: text }} />
), ),
}, },
{ {
...@@ -147,10 +156,9 @@ const FlowNode = () => { ...@@ -147,10 +156,9 @@ const FlowNode = () => {
ellipsis: { ellipsis: {
showTitle: true, showTitle: true,
}, },
render: text => ( render: (text, record) => (
<Tooltip placement="topLeft" title={text}> <Tooltip placement="topLeft" title={text}>
{/* eslint-disable-next-line react/no-danger */} <span style={{ color: textStyleOne(text, record) }}>{text}</span>
<span dangerouslySetInnerHTML={{ __html: text }} />
</Tooltip> </Tooltip>
), ),
}, },
...@@ -159,15 +167,21 @@ const FlowNode = () => { ...@@ -159,15 +167,21 @@ const FlowNode = () => {
dataIndex: 'extendSeeFields', dataIndex: 'extendSeeFields',
align: 'center', align: 'center',
width: 80, width: 80,
render: (text, record) => (
<span style={{ color: record.colorType === 2 ? 'red' : '#000000D9' }}>
{text}
</span>
),
}, },
{ {
title: '字段', title: '字段',
dataIndex: 'extendFields', dataIndex: 'extendFields',
align: 'center', align: 'center',
width: 80, width: 80,
render: text => ( render: (text, record) => (
// eslint-disable-next-line react/no-danger <span style={{ color: record.colorType === 2 ? 'red' : '#000000D9' }}>
<span dangerouslySetInnerHTML={{ __html: text }} /> {text}
</span>
), ),
}, },
...@@ -176,9 +190,10 @@ const FlowNode = () => { ...@@ -176,9 +190,10 @@ const FlowNode = () => {
dataIndex: 'extendEditableLater', dataIndex: 'extendEditableLater',
align: 'center', align: 'center',
width: 80, width: 80,
render: text => ( render: (text, record) => (
// eslint-disable-next-line react/no-danger <span style={{ color: record.colorType === 2 ? 'red' : '#000000D9' }}>
<span dangerouslySetInnerHTML={{ __html: text }} /> {text}
</span>
), ),
}, },
{ {
...@@ -186,9 +201,10 @@ const FlowNode = () => { ...@@ -186,9 +201,10 @@ const FlowNode = () => {
dataIndex: 'extendRollbackable', dataIndex: 'extendRollbackable',
align: 'center', align: 'center',
width: 80, width: 80,
render: text => ( render: (text, record) => (
// eslint-disable-next-line react/no-danger <span style={{ color: record.colorType === 2 ? 'red' : '#000000D9' }}>
<span dangerouslySetInnerHTML={{ __html: text }} /> {text}
</span>
), ),
}, },
{ {
...@@ -196,9 +212,10 @@ const FlowNode = () => { ...@@ -196,9 +212,10 @@ const FlowNode = () => {
dataIndex: 'extendRollbackNode', dataIndex: 'extendRollbackNode',
align: 'center', align: 'center',
width: 80, width: 80,
render: text => ( render: (text, record) => (
// eslint-disable-next-line react/no-danger <span style={{ color: record.colorType === 2 ? 'red' : '#000000D9' }}>
<span dangerouslySetInnerHTML={{ __html: text }} /> {text}
</span>
), ),
}, },
{ {
...@@ -206,9 +223,10 @@ const FlowNode = () => { ...@@ -206,9 +223,10 @@ const FlowNode = () => {
dataIndex: 'tranferable', dataIndex: 'tranferable',
align: 'center', align: 'center',
width: 80, width: 80,
render: text => ( render: (text, record) => (
// eslint-disable-next-line react/no-danger <span style={{ color: record.colorType === 2 ? 'red' : '#000000D9' }}>
<span dangerouslySetInnerHTML={{ __html: text }} /> {text}
</span>
), ),
}, },
{ {
...@@ -216,9 +234,10 @@ const FlowNode = () => { ...@@ -216,9 +234,10 @@ const FlowNode = () => {
dataIndex: 'eventInformation', dataIndex: 'eventInformation',
align: 'center', align: 'center',
width: 80, width: 80,
render: text => ( render: (text, record) => (
// eslint-disable-next-line react/no-danger <span style={{ color: record.colorType === 2 ? 'red' : '#000000D9' }}>
<span dangerouslySetInnerHTML={{ __html: text }} /> {text}
</span>
), ),
}, },
{ {
......
...@@ -28,8 +28,11 @@ ...@@ -28,8 +28,11 @@
// 编辑节点表单 // 编辑节点表单
.formData { .formData {
height: 32rem; height: calc(100vh - 162px);
overflow-y: scroll; overflow-y: scroll;
.ant-radio-wrapper {
min-width: 130px;
}
.filedListItem { .filedListItem {
display: flex; display: flex;
flex-wrap: nowrap; flex-wrap: nowrap;
......
...@@ -85,55 +85,67 @@ const AuxiliaryView = props => { ...@@ -85,55 +85,67 @@ const AuxiliaryView = props => {
title: '前端便签', title: '前端便签',
dataIndex: 'WebLabel', dataIndex: 'WebLabel',
align: 'center', align: 'center',
render: text => ( render: text => {
// eslint-disable-next-line react/no-danger if (text === '(未配置)' || text === '(无)') {
<span dangerouslySetInnerHTML={{ __html: text }} /> return <span style={{ color: 'grey' }}>{text}</span>;
), }
return <span>{text}</span>;
},
}, },
{ {
title: '前端视图', title: '前端视图',
dataIndex: 'WebPage', dataIndex: 'WebPage',
align: 'center', align: 'center',
render: text => ( render: text => {
// eslint-disable-next-line react/no-danger if (text === '(未配置)' || text === '(无)') {
<span dangerouslySetInnerHTML={{ __html: text }} /> return <span style={{ color: 'grey' }}>{text}</span>;
), }
return <span>{text}</span>;
},
}, },
{ {
title: '前端参数', title: '前端参数',
dataIndex: 'WebParam', dataIndex: 'WebParam',
align: 'center', align: 'center',
render: text => ( render: text => {
// eslint-disable-next-line react/no-danger if (text === '(未配置)' || text === '(无)') {
<span dangerouslySetInnerHTML={{ __html: text }} /> return <span style={{ color: 'grey' }}>{text}</span>;
), }
return <span>{text}</span>;
},
}, },
{ {
title: '手持标签', title: '手持标签',
dataIndex: 'MobileLabel', dataIndex: 'MobileLabel',
align: 'center', align: 'center',
render: text => ( render: text => {
// eslint-disable-next-line react/no-danger if (text === '(未配置)' || text === '(无)') {
<span dangerouslySetInnerHTML={{ __html: text }} /> return <span style={{ color: 'grey' }}>{text}</span>;
), }
return <span>{text}</span>;
},
}, },
{ {
title: '手持视图', title: '手持视图',
dataIndex: 'MobilePage', dataIndex: 'MobilePage',
align: 'center', align: 'center',
render: text => ( render: text => {
// eslint-disable-next-line react/no-danger if (text === '(未配置)' || text === '(无)') {
<span dangerouslySetInnerHTML={{ __html: text }} /> return <span style={{ color: 'grey' }}>{text}</span>;
), }
return <span>{text}</span>;
},
}, },
{ {
title: '手持参数', title: '手持参数',
dataIndex: 'MobileParam', dataIndex: 'MobileParam',
align: 'center', align: 'center',
render: text => ( render: text => {
// eslint-disable-next-line react/no-danger if (text === '(未配置)' || text === '(无)') {
<span dangerouslySetInnerHTML={{ __html: text }} /> return <span style={{ color: 'grey' }}>{text}</span>;
), }
return <span>{text}</span>;
},
}, },
{ {
title: '操作', title: '操作',
......
...@@ -10,7 +10,6 @@ import { ...@@ -10,7 +10,6 @@ import {
import { import {
Form, Form,
Modal,
Input, Input,
Radio, Radio,
Select, Select,
...@@ -18,6 +17,8 @@ import { ...@@ -18,6 +17,8 @@ import {
Checkbox, Checkbox,
Button, Button,
message, message,
Drawer,
Space,
} from 'antd'; } from 'antd';
import { PlusOutlined } from '@ant-design/icons'; import { PlusOutlined } from '@ant-design/icons';
import Fieldselection from './nodeEditComponents/Fieldselection'; import Fieldselection from './nodeEditComponents/Fieldselection';
...@@ -99,58 +100,47 @@ const NodeEdit = props => { ...@@ -99,58 +100,47 @@ const NodeEdit = props => {
loadEventFields({ eventTableName: value.TableName }).then(res => { loadEventFields({ eventTableName: value.TableName }).then(res => {
if (res.code === 0) { if (res.code === 0) {
let defaultCheckedList = value[val] ? value[val].split(',') : []; let defaultCheckedList = value[val] ? value[val].split(',') : [];
// 处理数据为树形结构 // 处理树形结构
let keylist = new Set(); let checkList = res.data.map(item => {
let list = new Map(); let plainOptions = [];
res.data.forEach(item => { item.root.forEach(ele => {
keylist.add(item.group); plainOptions = [...plainOptions, ele.fieldName];
if (keylist.has(item.group)) { });
let listItem = list.get(item.group); return {
// 存入check得选项,是否全选,选中的选项' groupName: item.groupName,
if (listItem) { plainOptions,
list.set(item.group, { defaultCheckedList: [],
plainOptions: [...listItem.plainOptions, item.fieldName], };
defaultCheckedList: [],
});
} else {
list.set(item.group, {
plainOptions: [item.fieldName],
defaultCheckedList: [],
});
}
}
}); });
let checkList = [...list];
defaultCheckedList.forEach(item => { defaultCheckedList.forEach(item => {
checkList.forEach(element => { checkList.forEach(element => {
// 当前得模块是否有当前字段 // 当前得模块是否有当前字段
let indeterminate = element[1].plainOptions.some( let indeterminate = element.plainOptions.some(
checkName => checkName === item, checkName => checkName === item,
); );
// 处理已选中的字段 // 处理已选中的字段
if (indeterminate) { if (indeterminate) {
element[1].defaultCheckedList.push(item); element.defaultCheckedList.push(item);
} }
if ( if (
element[1].defaultCheckedList.length > 0 && element.defaultCheckedList.length > 0 &&
element[1].defaultCheckedList.length < element.defaultCheckedList.length < element.plainOptions.length
element[1].plainOptions.length
) { ) {
element[1].indeterminate = true; element.indeterminate = true;
} else { } else {
element[1].indeterminate = false; element.indeterminate = false;
} }
// 处理是否全选字段 // 处理是否全选字段
if ( if (
element[1].defaultCheckedList.length === element.defaultCheckedList.length === element.plainOptions.length
element[1].plainOptions.length
) { ) {
element[1].checkAll = true; element.checkAll = true;
} else { } else {
element[1].checkAll = false; element.checkAll = false;
} }
}); });
}); });
console.log(checkList, 'checkList');
setFieldList(checkList); setFieldList(checkList);
setTimeout(() => { setTimeout(() => {
setShowField(true); setShowField(true);
...@@ -215,14 +205,19 @@ const NodeEdit = props => { ...@@ -215,14 +205,19 @@ const NodeEdit = props => {
} }
}; };
return ( return (
<Modal <Drawer
title="流程节点配置" title="流程节点配置"
width="500px"
onClose={handleCancel}
visible={visible} visible={visible}
onOk={onFinish} footer={
width="800px" <Space>
onCancel={handleCancel} <Button onClick={handleCancel}>取消</Button>
maskClosable={false} <Button onClick={onFinish} type="primary">
centered 确定
</Button>
</Space>
}
> >
<Form <Form
form={form} form={form}
...@@ -329,13 +324,13 @@ const NodeEdit = props => { ...@@ -329,13 +324,13 @@ const NodeEdit = props => {
/> />
</div> </div>
</Form.Item> </Form.Item>
<Form.Item label="查看字段(工程模型)"> <Form.Item label="查看字段">
<div className={styles.filedListItem}> <div className={styles.filedListItem}>
<Form.Item <Form.Item
name="SeeFields" name="SeeFields"
style={{ marginBottom: 0, width: '100%' }} style={{ marginBottom: 0, width: '100%' }}
> >
<Input placeholder="请选择查看字段" allowClear /> <Input placeholder="请选择查看字段(工程模型)" allowClear />
</Form.Item> </Form.Item>
<Button <Button
type="dashed" type="dashed"
...@@ -379,7 +374,7 @@ const NodeEdit = props => { ...@@ -379,7 +374,7 @@ const NodeEdit = props => {
fieldList={fieldList} fieldList={fieldList}
onSubumit={val => setFiled(val)} onSubumit={val => setFiled(val)}
/> />
</Modal> </Drawer>
); );
}; };
export default NodeEdit; export default NodeEdit;
...@@ -19,7 +19,7 @@ const Fieldselection = props => { ...@@ -19,7 +19,7 @@ const Fieldselection = props => {
return; return;
} }
checkList.forEach(element => { checkList.forEach(element => {
arr = [...arr, ...element[1].defaultCheckedList]; arr = [...arr, ...element.defaultCheckedList];
}); });
setSelectList(arr); setSelectList(arr);
// 初始化拖拽 // 初始化拖拽
...@@ -35,11 +35,11 @@ const Fieldselection = props => { ...@@ -35,11 +35,11 @@ const Fieldselection = props => {
const onChange = (list, index) => { const onChange = (list, index) => {
setCheckList(value => { setCheckList(value => {
const chooseList = JSON.parse(JSON.stringify(value)); const chooseList = JSON.parse(JSON.stringify(value));
chooseList[index][1].defaultCheckedList = list; chooseList[index].defaultCheckedList = list;
chooseList[index][1].indeterminate = chooseList[index].indeterminate =
!!list.length && list.length < chooseList[index][1].plainOptions.length; !!list.length && list.length < chooseList[index].plainOptions.length;
chooseList[index][1].checkAll = chooseList[index].checkAll =
list.length === chooseList[index][1].plainOptions.length; list.length === chooseList[index].plainOptions.length;
return chooseList; return chooseList;
}); });
}; };
...@@ -47,11 +47,11 @@ const Fieldselection = props => { ...@@ -47,11 +47,11 @@ const Fieldselection = props => {
const onCheckAllChange = (e, index) => { const onCheckAllChange = (e, index) => {
setCheckList(value => { setCheckList(value => {
const chooseList = JSON.parse(JSON.stringify(value)); const chooseList = JSON.parse(JSON.stringify(value));
chooseList[index][1].defaultCheckedList = e.target.checked chooseList[index].defaultCheckedList = e.target.checked
? chooseList[index][1].plainOptions ? chooseList[index].plainOptions
: []; : [];
chooseList[index][1].indeterminate = false; chooseList[index].indeterminate = false;
chooseList[index][1].checkAll = e.target.checked; chooseList[index].checkAll = e.target.checked;
return chooseList; return chooseList;
}); });
}; };
...@@ -98,19 +98,21 @@ const Fieldselection = props => { ...@@ -98,19 +98,21 @@ const Fieldselection = props => {
<div className={styles.cardBox} key={index}> <div className={styles.cardBox} key={index}>
<div className={styles.title}> <div className={styles.title}>
<Divider orientation="left" className={styles.cardDivider}> <Divider orientation="left" className={styles.cardDivider}>
<span style={{ marginRight: '10px' }}>{item[0]}</span> <span style={{ marginRight: '10px' }}>
{item.groupName}
</span>
<Checkbox <Checkbox
indeterminate={item[1].indeterminate} indeterminate={item.indeterminate}
onChange={e => onCheckAllChange(e, index)} onChange={e => onCheckAllChange(e, index)}
checked={item[1].checkAll} checked={item.checkAll}
/> />
</Divider> </Divider>
</div> </div>
<div className={styles.filedList}> <div className={styles.filedList}>
<CheckboxGroup <CheckboxGroup
key={index} key={index}
options={item[1].plainOptions} options={item.plainOptions}
value={item[1].defaultCheckedList} value={item.defaultCheckedList}
onChange={list => onChange(list, index)} onChange={list => onChange(list, index)}
/> />
</div> </div>
......
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
import { Form, Modal, Input, Select, Radio, Checkbox, notification, Tooltip } from 'antd'; import {
Form,
Modal,
Input,
Select,
Radio,
Checkbox,
notification,
Tooltip,
Drawer,
Space,
Button,
} from 'antd';
import { import {
getField, loadTableFields, LoadEventFields, LoadEventType, UpdateFields getField,
} from '@/services/platform/bs' loadTableFields,
import styles from './index.less' LoadEventFields,
import ChangeAdd from './changeAdd' LoadEventType,
UpdateFields,
} from '@/services/platform/bs';
import styles from './index.less';
import ChangeAdd from './changeAdd';
import { PlusSquareOutlined } from '@ant-design/icons'; import { PlusSquareOutlined } from '@ant-design/icons';
import { shape } from 'prop-types'; import { shape } from 'prop-types';
const AddModal = props => { const AddModal = props => {
const { callBackSubmit = () => { }, isType, itemData, isVisible, formObj1 } = props; const {
const [loading, setLoading] = useState(false); callBackSubmit = () => {},
const [fieldName, setFieldName] = useState([]); // 弹窗 isType,
const [eventList, setEventList] = useState([]); // 事件 itemData,
const [filed, setFiled] = useState({}); // 事件 isVisible,
const [verification, setVerification] = useState([]); formObj1,
const [Shape, setShape] = useState('文本') onCancel,
const [characteristics, setCharacteristics] = useState(['文本', '数值', '唯一值文本', '多行文本', '编码', '地址', '本人部门', '本人姓名', '本人ID', '选择器', '搜索选择器', '值选择器', '值复选器', '业务选择器', '可编辑值选择器', '平铺值选择器', '站点选择器', '人员选择器', '人员选择器新', '城市选择器', '台账选择器', '附件', '可预览附件', '图片', '可预览图片', '录音', '视频', '日期时间', '日期', '日期月份', '日期年份', '日期周', '时分秒', '设备选择', '坐标控件', '区域控件', '路径控件', '智能抄表', '二维码识别', '设备二维码', '位置坐标']) } = props;
const [visible, setVisible] = useState(false); // 弹窗 const [loading, setLoading] = useState(false);
const [isShow, setIsShow] = useState(false); // 弹窗 const [fieldName, setFieldName] = useState([]); // 弹窗
const [type, setType] = useState(''); // 弹窗类型 const [eventList, setEventList] = useState([]); // 事件
const [formObj, setFormObj] = useState({ rule: [], numerical: '' }); const [filed, setFiled] = useState({}); // 事件
const [characterValue, setCharacterValue] = useState('') const [verification, setVerification] = useState([]);
const [pramData, setPramData] = useState({ Unit: '', ExceptionEvent: '', Group: '', RowSpan: 0, ColSpan: 0, ReadOnly: false, EditableLater: false, ExceptionValue: '', Preset: '', picture: false, must: false, coordinates: false }) const [Shape, setShape] = useState('文本');
const [checkedList, setCheckedList] = useState([]);//选中的复选框内容 const [characteristics, setCharacteristics] = useState([
const { TextArea } = Input; '文本',
const [form] = Form.useForm(); '数值',
const { Item } = Form; '唯一值文本',
// 提交 '多行文本',
const onSubmit = () => { '编码',
form.validateFields().then(validate => { '地址',
if (validate) { '本人部门',
setLoading(true); '本人姓名',
let obj = form.getFieldsValue(); '本人ID',
let data = [{ Unit: pramData.Unit || '', StoreType: "nvarchar(255)", Group: pramData.Group || '', Shape, ExceptionEvent: pramData.ExceptionEvent || '', RowSpan: pramData.RowSpan || 0, ColSpan: pramData.ColSpan || 0, ReadOnly: pramData.ReadOnly || false, EditableLater: pramData.EditableLater || false, ExceptionValue: pramData.ExceptionValue || '', Preset: pramData.Preset || '', ID: Number(itemData.ID), Name: obj.Name, Alias: obj.Alias, SyncEvent: obj.SyncEvent, ValidationRule: obj.ValidationRule, ExceptionEventFields: characterValue }] '选择器',
'搜索选择器',
switch (Shape) { '值选择器',
case '编码': '值复选器',
data[0].Config = `${obj.code}.${obj.prefix ? obj.prefix : ''}`; '业务选择器',
break '可编辑值选择器',
case '坐标控件': '平铺值选择器',
pramData.coordinates ? data[0].Config = '当前坐标' : data[0].Config = ''; '站点选择器',
break '人员选择器',
case '图片': case '可预览图片': '人员选择器新',
data[0].Preset = pramData.picture ? '拍照相册' : ''; '城市选择器',
data[0].ValidationRule = pramData.must ? 'required' : '' '台账选择器',
break '附件',
default: '可预览附件',
data[0].Config = obj.Config; '图片',
} '可预览图片',
UpdateFields(data).then(res => { '录音',
setLoading(false); '视频',
if (res.msg === "Ok" || res.msg === "") { '日期时间',
form.resetFields(); '日期',
callBackSubmit(); '日期月份',
notification.success({ '日期年份',
message: '提示', '日期周',
duration: 3, '时分秒',
description: '修改成功', '设备选择',
}); '坐标控件',
'区域控件',
} else { '路径控件',
notification.error({ '智能抄表',
message: '提示', '二维码识别',
duration: 3, '设备二维码',
description: res.msg, '位置坐标',
}); ]);
} const [visible, setVisible] = useState(false); // 弹窗
}) const [isShow, setIsShow] = useState(false); // 弹窗
const [type, setType] = useState(''); // 弹窗类型
const [formObj, setFormObj] = useState({ rule: [], numerical: '' });
const [characterValue, setCharacterValue] = useState('');
const [pramData, setPramData] = useState({
Unit: '',
ExceptionEvent: '',
Group: '',
RowSpan: 0,
ColSpan: 0,
ReadOnly: false,
EditableLater: false,
ExceptionValue: '',
Preset: '',
picture: false,
must: false,
coordinates: false,
});
const [checkedList, setCheckedList] = useState([]); //选中的复选框内容
const { TextArea } = Input;
const [form] = Form.useForm();
const { Item } = Form;
// 提交
const onSubmit = () => {
form.validateFields().then(validate => {
if (validate) {
setLoading(true);
let obj = form.getFieldsValue();
let data = [
{
Unit: pramData.Unit || '',
StoreType: 'nvarchar(255)',
Group: pramData.Group || '',
Shape,
ExceptionEvent: pramData.ExceptionEvent || '',
RowSpan: pramData.RowSpan || 0,
ColSpan: pramData.ColSpan || 0,
ReadOnly: pramData.ReadOnly || false,
EditableLater: pramData.EditableLater || false,
ExceptionValue: pramData.ExceptionValue || '',
Preset: pramData.Preset || '',
ID: Number(itemData.ID),
Name: obj.Name,
Alias: obj.Alias,
SyncEvent: obj.SyncEvent,
ValidationRule: obj.ValidationRule,
ExceptionEventFields: characterValue,
},
];
} switch (Shape) {
case '编码':
data[0].Config = `${obj.code}.${obj.prefix ? obj.prefix : ''}`;
break;
case '坐标控件':
pramData.coordinates
? (data[0].Config = '当前坐标')
: (data[0].Config = '');
break;
case '图片':
case '可预览图片':
data[0].Preset = pramData.picture ? '拍照相册' : '';
data[0].ValidationRule = pramData.must ? 'required' : '';
break;
default:
data[0].Config = obj.Config;
}
UpdateFields(data).then(res => {
setLoading(false);
if (res.msg === 'Ok' || res.msg === '') {
form.resetFields();
callBackSubmit();
notification.success({
message: '提示',
duration: 3,
description: '修改成功',
});
} else {
notification.error({
message: '提示',
duration: 3,
description: res.msg,
});
}
}); });
}; }
});
};
useEffect(() => {
useEffect(() => { if (isType != '') {
if (isType != '') { let req1 = getField({ fieldID: itemData.ID });
let req1 = getField({ fieldID: itemData.ID }) let req2 = loadTableFields({ tableName: formObj1 });
let req2 = loadTableFields({ tableName: formObj1 }) let req3 = LoadEventType({});
let req3 = LoadEventType({}) Promise.all([req1, req2, req3]).then(res => {
Promise.all([req1, req2, req3]).then(res => { res[1].msg === 'Ok' && setFieldName(res[1].data.root);
res[1].msg === 'Ok' && setFieldName(res[1].data.root) res[2].msg === 'Ok' && setEventList(res[2].data.root);
res[2].msg === 'Ok' && setEventList(res[2].data.root) if (res[0].msg === 'Ok') {
if (res[0].msg === 'Ok') { form.setFieldsValue({ ...res[0].data.root });
form.setFieldsValue({ ...res[0].data.root }) if (res[0].data.root.ExceptionEventFields === '') {
if (res[0].data.root.ExceptionEventFields === '') { setCharacterValue('');
setCharacterValue('') setCheckedList([]);
setCheckedList([]) setIsShow(false);
setIsShow(false) } else {
} else { setIsShow(true);
setIsShow(true) setCharacterValue(res[0].data.root.ExceptionEventFields);
setCharacterValue(res[0].data.root.ExceptionEventFields) setCheckedList(res[0].data.root.ExceptionEventFields.split(','));
setCheckedList(res[0].data.root.ExceptionEventFields.split(',')) }
} setShape(res[0].data.root.Shape);
setShape(res[0].data.root.Shape) let coordinates = false,
let coordinates = false, picture = false, must = false picture = false,
switch (res[0].data.root.Shape) { must = false;
case '坐标控件': switch (res[0].data.root.Shape) {
res[0].data.root.Config === "当前坐标" ? coordinates = true : coordinates = false case '坐标控件':
break res[0].data.root.Config === '当前坐标'
case '图片': case '可预览图片': ? (coordinates = true)
res[0].data.root.Preset === "拍照相册" ? picture = true : picture = false; : (coordinates = false);
res[0].data.root.ValidationRule === "required" ? must = true : must = false break;
break case '图片':
case '编码': case '可预览图片':
let code = res[0].data.root.Config.split(".") res[0].data.root.Preset === '拍照相册'
form.setFieldsValue({ code: code[0] || '', prefix: code[1] === "undefined" ? '' : code[1] }); ? (picture = true)
break : (picture = false);
res[0].data.root.ValidationRule === 'required'
} ? (must = true)
setPramData({ ...res[0].data.root, coordinates, must, picture }) : (must = false);
let index = res[2].data.root.find(item => { return item.Name == res[0].data.root.ExceptionEvent }) break;
console.log('index',index); case '编码':
getFieldData(index.TableName) let code = res[0].data.root.Config.split('.');
} form.setFieldsValue({
}) code: code[0] || '',
prefix: code[1] === 'undefined' ? '' : code[1],
});
break;
}
setPramData({ ...res[0].data.root, coordinates, must, picture });
let index = res[2].data.root.find(item => {
return item.Name == res[0].data.root.ExceptionEvent;
});
console.log('index', index);
getFieldData(index.TableName);
} }
});
}, [isVisible]);
const layout = {
layout: 'horizontal',
labelCol: {
span: 4,
},
wrapperCol: {
span: 17,
},
};
const handleChange = (value) => {
form.setFieldsValue({ schemename: value });
} }
}, [isVisible]);
const layout = {
layout: 'horizontal',
labelCol: {
span: 3,
},
wrapperCol: {
span: 30,
},
};
const onOK = prop => { const handleChange = value => {
setVisible(false); form.setFieldsValue({ schemename: value });
if (type === 'rule') { };
form.setFieldsValue({ ValidationRule: prop });
} else {
setCheckedList(prop.checkedList)
setCharacterValue(prop.str)
}
}; const onOK = prop => {
const add = (type) => { setVisible(false);
let obj = form.getFieldsValue(); if (type === 'rule') {
let data = { ...formObj } form.setFieldsValue({ ValidationRule: prop });
if (obj.ValidationRule) { } else {
let arr = obj.ValidationRule.split(",") setCheckedList(prop.checkedList);
arr.map(item => { setCharacterValue(prop.str);
switch (item) {
case 'required':
data.rule.push(item);
break;
case 'emphasis':
data.rule.push(item);
break;
case 'sensitive':
data.rule.push(item);
break;
default:
data.numerical = item
}
})
} else {
data = { rule: [], numerical: '' }
}
setType(type);
setFormObj(data)
setVisible(true);
} }
};
const handleEvent = (value, e) => { const add = type => {
let data = { ...pramData } let obj = form.getFieldsValue();
data.ExceptionEvent = e.name let data = { ...formObj };
if (e.tablename) { if (obj.ValidationRule) {
getFieldData(e.tablename) let arr = obj.ValidationRule.split(',');
setPramData(data) arr.map(item => {
} else { switch (item) {
setIsShow(false) case 'required':
setFiled({}) data.rule.push(item);
setCharacterValue('') break;
setCheckedList([]) case 'emphasis':
data.rule.push(item);
break;
case 'sensitive':
data.rule.push(item);
break;
default:
data.numerical = item;
} }
});
} else {
data = { rule: [], numerical: '' };
} }
const getFieldData = (value) => { setType(type);
LoadEventFields({ eventTableName: value, distinctFields: '' }).then(res => { setFormObj(data);
if (res.msg === 'Ok') { setVisible(true);
setFiled(formateArrDataA(res.data.root, 'group')) };
setIsShow(true)
}
}) const handleEvent = (value, e) => {
let data = { ...pramData };
data.ExceptionEvent = e.name;
if (e.tablename) {
getFieldData(e.tablename);
setPramData(data);
} else {
setIsShow(false);
setFiled({});
setCharacterValue('');
setCheckedList([]);
} }
};
const getFieldData = value => {
LoadEventFields({ eventTableName: value, distinctFields: '' }).then(res => {
if (res.msg === 'Ok') {
setFiled(formateArrDataA(res.data.root, 'group'));
setIsShow(true);
}
});
};
const formateArrDataA = (initialArr, name) => {
const formateArrDataA = (initialArr, name) => { // 判定传参是否符合规则
// 判定传参是否符合规则 if (!(initialArr instanceof Array)) {
if (!(initialArr instanceof Array)) { return '请传入正确格式的数组';
return '请传入正确格式的数组'
}
if (!name) {
return '请传入对象属性'
}
//先获取一下这个数组中有多少个"name"
let nameArr = []
for (let i in initialArr) {
if (nameArr.indexOf(initialArr[i][`${name}`]) === -1) {
nameArr.push(initialArr[i][`${name}`])
}
}
//新建一个包含多个list的结果对象
let tempObj = {}
// 根据不同的"name"生成多个数组
for (let k in nameArr) {
for (let j in initialArr) {
if (initialArr[j][`${name}`] == nameArr[k]) {
// 每次外循环时新建一个对应"name"的数组, 内循环时当前数组不变
tempObj[nameArr[k]] = tempObj[nameArr[k]] || []
tempObj[nameArr[k]].push(initialArr[j])
}
}
}
for (let key in tempObj) {
let arr = []
tempObj[key].map(item => {
tempObj[key] = arr;
arr.push(item.fieldName)
})
}
return tempObj
} }
const handleCharacteristics = (value) => { if (!name) {
let data = { ...pramData } return '请传入对象属性';
setShape(value)
data.must = false
data.coordinates = false
data.picture = false
data.Preset = ''
setPramData(data)
form.setFieldsValue({ ValidationRule: '' });
if (value.indexOf("日期") != -1 || value === "时分秒") {
form.setFieldsValue({ Config: undefined });
}
} }
const onCharacterValue = (e) => { //先获取一下这个数组中有多少个"name"
setCharacterValue(e.target.value) let nameArr = [];
for (let i in initialArr) {
if (nameArr.indexOf(initialArr[i][`${name}`]) === -1) {
nameArr.push(initialArr[i][`${name}`]);
}
} }
const onChangeReady = (e, str) => { //新建一个包含多个list的结果对象
let data = { ...pramData } let tempObj = {};
switch (str) { // 根据不同的"name"生成多个数组
case 'ReadOnly': for (let k in nameArr) {
data.ReadOnly = e.target.checked; for (let j in initialArr) {
break; if (initialArr[j][`${name}`] == nameArr[k]) {
case 'EditableLater': // 每次外循环时新建一个对应"name"的数组, 内循环时当前数组不变
data.EditableLater = e.target.checked tempObj[nameArr[k]] = tempObj[nameArr[k]] || [];
break; tempObj[nameArr[k]].push(initialArr[j]);
case 'must':
data.must = e.target.checked
break;
case 'picture':
data.picture = e.target.checked
break;
case 'coordinates':
data.coordinates = e.target.checked
break;
} }
setPramData(data) }
} }
const handleInput = (e, str) => { for (let key in tempObj) {
let data = { ...pramData } let arr = [];
switch (str) { tempObj[key].map(item => {
case 'Unit': tempObj[key] = arr;
data.Unit = e.target.value; arr.push(item.fieldName);
break; });
case 'RowSpan':
data.RowSpan = e.target.value;
break;
case 'Preset':
data.Preset = e.target.value;
break;
case 'ExceptionValue':
data.ExceptionValue = e.target.value;
break;
default:
break
}
setPramData(data)
} }
const handleSeparator = (value) => { return tempObj;
let data = { ...pramData } };
switch (value) { const handleCharacteristics = value => {
case '6': let data = { ...pramData };
data.Preset = '是' setShape(value);
form.setFieldsValue({ Config: '是,否' }); data.must = false;
break; data.coordinates = false;
case '7': data.picture = false;
data.Preset = '否' data.Preset = '';
form.setFieldsValue({ Config: '是,否' }); setPramData(data);
break; form.setFieldsValue({ ValidationRule: '' });
case '8': if (value.indexOf('日期') != -1 || value === '时分秒') {
data.Preset = '否' form.setFieldsValue({ Config: undefined });
form.setFieldsValue({ Config: '否,是' }); }
break; };
} const onCharacterValue = e => {
setPramData(data) setCharacterValue(e.target.value);
};
const onChangeReady = (e, str) => {
let data = { ...pramData };
switch (str) {
case 'ReadOnly':
data.ReadOnly = e.target.checked;
break;
case 'EditableLater':
data.EditableLater = e.target.checked;
break;
case 'must':
data.must = e.target.checked;
break;
case 'picture':
data.picture = e.target.checked;
break;
case 'coordinates':
data.coordinates = e.target.checked;
break;
}
setPramData(data);
};
const handleInput = (e, str) => {
let data = { ...pramData };
switch (str) {
case 'Unit':
data.Unit = e.target.value;
break;
case 'RowSpan':
data.RowSpan = e.target.value;
break;
case 'Preset':
data.Preset = e.target.value;
break;
case 'ExceptionValue':
data.ExceptionValue = e.target.value;
break;
default:
break;
} }
return ( setPramData(data);
<> };
<Modal const handleSeparator = value => {
title='修改' let data = { ...pramData };
bodyStyle={{ width: '100%', minHeight: '100px' }} switch (value) {
width="700px" case '6':
destroyOnClose data.Preset = '是';
maskClosable={false} form.setFieldsValue({ Config: '是,否' });
centered={true} break;
cancelText="取消" case '7':
okText="确认" data.Preset = '否';
{...props} form.setFieldsValue({ Config: '是,否' });
visible={isVisible} break;
onOk={() => onSubmit()} case '8':
confirmLoading={loading} data.Preset = '否';
forceRender={true} form.setFieldsValue({ Config: '否,是' });
getContainer={false} break;
}
setPramData(data);
};
return (
<>
<Drawer
title="修改"
width="600px"
// {...props}
visible={isVisible}
onClose={onCancel}
footer={
<Space>
<Button onClick={onCancel}>取消</Button>
<Button onClick={onSubmit} type="primary">
确定
</Button>
</Space>
}
>
{isVisible && (
<Form form={form} {...layout}>
<Item
label="字段名"
name="Name"
rules={[{ required: true, message: '请输入表名' }]}
> >
{isVisible && ( <Input placeholder="请输入别名" disabled />
<Form form={form} {...layout} > </Item>
<Item <Item label="别名" name="Alias">
label="字段名" <Input placeholder="请输入别名" allowClear />
name="Name" </Item>
rules={[{ required: true, message: '请输入表名' }]} <Item name="ReadOnly" label="属性">
> <div>
<Input placeholder="请输入别名" disabled /> <Checkbox
</Item> checked={pramData.ReadOnly}
<Item onChange={e => onChangeReady(e, 'ReadOnly')}
label="别名" >
name="Alias" 只读
> </Checkbox>
<Input placeholder="请输入别名" allowClear /> <Checkbox
</Item> checked={pramData.EditableLater}
<Item onChange={e => onChangeReady(e, 'EditableLater')}
name="ReadOnly" >
label="属性" 允许补正(事后修改)
> </Checkbox>
<div> </div>
<Checkbox checked={pramData.ReadOnly} onChange={(e) => onChangeReady(e, 'ReadOnly')}>只读</Checkbox> </Item>
<Checkbox checked={pramData.EditableLater} onChange={(e) => onChangeReady(e, 'EditableLater')}>允许补正(事后修改)</Checkbox> <Item label="同步" name="SyncEvent">
</div> <Radio.Group>
</Item> <Radio value={0} style={{ marginRight: '0.5rem' }}>
<Item 不同步
label="同步" </Radio>
name="SyncEvent" <Radio value={1} style={{ marginRight: '0.5rem' }}>
> 工单 → 事件
<Radio.Group> </Radio>
<Radio value={0} style={{ marginRight: '0.5rem' }}>不同步</Radio> <Radio value={2}>事件(上报时) → 工单</Radio>
<Radio value={1} style={{ marginRight: '0.5rem' }}>工单 → 事件</Radio> </Radio.Group>
<Radio value={2} >事件(上报时) → 工单</Radio> </Item>
</Radio.Group>
</Item>
<Item <Item label="形态">
label="形态" <div className={styles.listEvent}>
<Select
style={{ width: '42%' }}
value={Shape}
onChange={handleCharacteristics}
>
{characteristics.length
? characteristics.map((item, index) => {
return (
<Select.Option key={index} value={item}>
{item}
</Select.Option>
);
})
: ''}
</Select>
<div className={styles.unit}>
单位:
<Input
style={{ width: '5rem' }}
placeholder=""
allowClear
value={pramData.Unit}
onChange={e => handleInput(e, 'Unit')}
/>
</div>
<div className={styles.unit}>
宽:
<Input
style={{ width: '4rem' }}
placeholder=""
allowClear
value={pramData.RowSpan}
onChange={e => handleInput(e, 'RowSpan')}
/>
</div>
</div>
</Item>
{(() => {
switch (Shape) {
case '编码':
return (
<>
<Item label="前缀" name="prefix">
<Input
style={{ width: '95%' }}
placeholder=""
allowClear
/>
</Item>
<Item label="编码方式" name="code">
<Radio.Group>
<Radio
value="年份编码"
style={{ marginRight: '0.5rem' }}
>
XJ-2019-000001(前缀-年份-六位编码)
</Radio>
<Radio
value="年月编码"
style={{ marginRight: '0.5rem' }}
>
XJ-201909-000001(前缀-年份月份-六位编码)
</Radio>
<Radio value="一般编码" defaultChecked>
XJ00000001(前缀 八位编码)
</Radio>
</Radio.Group>
</Item>
</>
);
case '值选择器':
case '值复选器':
case '可编辑值选择器':
case '平铺值选择器':
return (
<>
{' '}
<Item label="可选值" name="Config">
<TextArea allowClear />
</Item>
<Item colon={false} label=" ">
{' '}
<div style={{ display: 'flex', alignItems: 'center' }}>
<span style={{ marginRight: '0.4rem' }}>
以英文逗号为分隔符填写,或其他分隔符粘贴:
</span>
<Select
onChange={handleSeparator}
style={{ width: '30%' }}
>
<Select.Option value="0">
以,分隔(英文逗号)
</Select.Option>
<Select.Option value="1">
以/分隔(正斜杠)
</Select.Option>
<Select.Option value="2">
以\\分隔(反斜杠)
</Select.Option>
<Select.Option value="3">
以、分隔(中文顿号)
</Select.Option>
<Select.Option value="4">
以;分隔(英文分号)
</Select.Option>
<Select.Option value="5">
以;分隔(中文分号)
</Select.Option>
<Select.Option value="6">(是)/否</Select.Option>
<Select.Option value="7">是/(否)</Select.Option>
<Select.Option value="8">(否)/是</Select.Option>
</Select>
</div>
</Item>
</>
);
case '图片':
case '可预览图片':
return (
<Item name="ReadOnly" label="选项">
<div>
<Checkbox
checked={pramData.picture}
onChange={e => onChangeReady(e, 'picture')}
> >
<div className={styles.listEvent}> 允许从相册选取
<Select style={{ width: '42%' }} value={Shape} onChange={handleCharacteristics}> </Checkbox>
{characteristics.length ? characteristics.map((item, index) => { return <Select.Option key={index} value={item}>{item}</Select.Option>; }) : ''} <Checkbox
</Select> checked={pramData.must}
<div className={styles.unit}>单位:<Input style={{ width: '5rem' }} placeholder="" allowClear value={pramData.Unit} onChange={(e) => handleInput(e, 'Unit')} /></div> onChange={e => onChangeReady(e, 'must')}
<div className={styles.unit}>宽:<Input style={{ width: '4rem' }} placeholder="" allowClear value={pramData.RowSpan} onChange={(e) => handleInput(e, 'RowSpan')} /></div>
</div>
</Item>
{(() => {
switch (Shape) {
case '编码':
return <>
<Item
label="前缀"
name="prefix"
>
<Input style={{ width: '95%' }} placeholder="" allowClear />
</Item>
<Item
label="编码方式"
name="code"
>
<Radio.Group>
<Radio value='年份编码' style={{ marginRight: '0.5rem' }}>XJ-2019-000001(前缀-年份-六位编码)</Radio>
<Radio value='年月编码' style={{ marginRight: '0.5rem' }}>XJ-201909-000001(前缀-年份月份-六位编码)</Radio>
<Radio value='一般编码' defaultChecked >XJ00000001(前缀 八位编码)</Radio>
</Radio.Group>
</Item>
</>
case '值选择器': case '值复选器': case '可编辑值选择器': case '平铺值选择器':
return <> <Item
label="可选值"
name="Config"
>
<TextArea allowClear />
</Item>
<Item
colon={false}
label=" "
> <div style={{ display: 'flex', alignItems: 'center' }}>
<span style={{ marginRight: '0.4rem' }}>以英文逗号为分隔符填写,或其他分隔符粘贴:</span>
<Select onChange={handleSeparator} style={{ width: '30%' }}>
<Select.Option value='0'>以,分隔(英文逗号)</Select.Option>
<Select.Option value='1'>以/分隔(正斜杠)</Select.Option>
<Select.Option value='2'>以\\分隔(反斜杠)</Select.Option>
<Select.Option value='3'>以、分隔(中文顿号)</Select.Option>
<Select.Option value='4'>以;分隔(英文分号)</Select.Option>
<Select.Option value='5'>以;分隔(中文分号)</Select.Option>
<Select.Option value='6'>(是)/否</Select.Option>
<Select.Option value='7'>是/(否)</Select.Option>
<Select.Option value='8'>(否)/是</Select.Option>
</Select>
</div>
</Item>
</>
case '图片': case '可预览图片':
return <Item
name="ReadOnly"
label="选项"
>
<div>
<Checkbox checked={pramData.picture} onChange={(e) => onChangeReady(e, 'picture')}>允许从相册选取</Checkbox>
<Checkbox checked={pramData.must} onChange={(e) => onChangeReady(e, 'must')}>必填字段</Checkbox>
</div>
</Item>
case '日期时间': case '日期': case '日期月份': case '日期年份': case '日期周': case '时分秒':
return <Item
label="选项"
name="Config"
>
<Radio.Group style={{ marginTop: '0.3rem' }}>
<Radio value='默认为空' defaultChecked style={{ width: '18rem', marginBottom: '0.5rem' }}>默认为空</Radio>
<Radio value='' >默认为当前时间</Radio>
<Radio value='不可选择' style={{ width: '18rem' }}>锁定为当前时间(通过用户点击刷新)</Radio>
<Radio value='不超过当前时间' >不超过当前时间</Radio>
</Radio.Group>
</Item>
case '坐标控件':
return <Item
label="选项"
name="Config"
>
<div>
<Checkbox value='当前坐标' style={{ marginRight: '0.2rem' }} checked={pramData.coordinates} onChange={(e) => onChangeReady(e, 'coordinates')}></Checkbox>锁定为当前位置坐标
</div>
</Item>
default:
return <Item
label="配置"
name="Config"
>
<TextArea allowClear />
</Item>
}
}
)()}
{Shape === '图片' || Shape === '可预览图片' ? '' :
<Item
label="预设值"
>
<div className={styles.listEvent}>
<Input style={{ width: '40%', height: '1.8rem' }} value={pramData.Preset} onChange={(e) => handleInput(e, 'Preset')} placeholder="" allowClear />
<Item
style={{ marginLeft: '1rem' }}
label="验证"
name="ValidationRule"
style={{ margin: '0 0 0 1rem' }}
>
<Input style={{ width: '95%' }} placeholder="" allowClear />
</Item>
<Tooltip title="选择验证规则">
<PlusSquareOutlined
onClick={() => add('rule')}
style={{ fontSize: '24px', color: '#1890FF', display: 'flex', alignItems: 'center' }}
/>
</Tooltip>
</div>
</Item>
}
<Item
label="异常值"
> >
<div className={styles.listEvent}> 必填字段
<Input style={{ width: '40%', height: '1.8rem' }} value={pramData.ExceptionValue} onChange={(e) => handleInput(e, 'ExceptionValue')} placeholder="" allowClear /> </Checkbox>
<Item </div>
style={{ marginLeft: '1rem' }} </Item>
label="触发事件" );
name="ExceptionEvent" case '日期时间':
style={{ margin: '0 0 0 1rem' }} case '日期':
> case '日期月份':
<Select style={{ width: '12rem' }} onChange={handleEvent}> case '日期年份':
{eventList.length ? eventList.map((item, index) => { return <Select.Option key={index} tablename={item.TableName} name={item.Name} value={item.ID}>{item.Name}</Select.Option>; }) : ''} case '日期周':
</Select> case '时分秒':
</Item> return (
</div> <Item label="选项" name="Config">
</Item> <Radio.Group style={{ marginTop: '0.3rem' }}>
<Item <Radio
label="字段集" value="默认为空"
defaultChecked
style={{ width: '18rem', marginBottom: '0.5rem' }}
> >
<div className={styles.listEvent}> 默认为空
<Input style={{ width: '93%' }} placeholder="" disabled={!isShow} onChange={onCharacterValue} allowClear value={characterValue} /> </Radio>
<Tooltip title={!isShow ? '' : '字符集选择'}> <Radio value="">默认为当前时间</Radio>
<PlusSquareOutlined <Radio value="不可选择" style={{ width: '18rem' }}>
onClick={() => !isShow ? '' : add('characteristics')} 锁定为当前时间(通过用户点击刷新)
style={{ fontSize: '24px', color: !isShow ? 'gray' : '#1890FF', cursor: !isShow ? 'no-drop' : 'pointer', display: 'flex', alignItems: 'center', marginLeft: '0.5rem' }} </Radio>
/> <Radio value="不超过当前时间">不超过当前时间</Radio>
</Tooltip> </Radio.Group>
</div> </Item>
</Item> );
</Form> case '坐标控件':
)} return (
</Modal> <Item label="选项" name="Config">
<ChangeAdd <div>
visible={visible} <Checkbox
onCancel={() => setVisible(false)} value="当前坐标"
callBackSubmit={onOK} style={{ marginRight: '0.2rem' }}
newCheckedList={checkedList} checked={pramData.coordinates}
isType={type} onChange={e => onChangeReady(e, 'coordinates')}
filed={filed} />
characterValue={characterValue} 锁定为当前位置坐标
formObj={formObj} /> </div>
</> </Item>
); );
default:
return (
<Item label="配置" name="Config">
<TextArea allowClear />
</Item>
);
}
})()}
{Shape === '图片' || Shape === '可预览图片' ? (
''
) : (
<Item label="预设值">
<div className={styles.listEvent}>
<Input
style={{ width: '40%', height: '1.8rem' }}
value={pramData.Preset}
onChange={e => handleInput(e, 'Preset')}
placeholder=""
allowClear
/>
<Item
style={{ marginLeft: '1rem' }}
label="验证"
name="ValidationRule"
style={{ margin: '0 0 0 1rem' }}
>
<Input style={{ width: '95%' }} placeholder="" allowClear />
</Item>
<Tooltip title="选择验证规则">
<PlusSquareOutlined
onClick={() => add('rule')}
style={{
fontSize: '24px',
color: '#1890FF',
display: 'flex',
alignItems: 'center',
}}
/>
</Tooltip>
</div>
</Item>
)}
<Item label="异常值">
<div className={styles.listEvent}>
<Input
style={{ width: '40%', height: '1.8rem' }}
value={pramData.ExceptionValue}
onChange={e => handleInput(e, 'ExceptionValue')}
placeholder=""
allowClear
/>
<Item
style={{ marginLeft: '1rem' }}
label="触发事件"
name="ExceptionEvent"
style={{ margin: '0 0 0 1rem' }}
>
<Select style={{ width: '12rem' }} onChange={handleEvent}>
{eventList.length
? eventList.map((item, index) => {
return (
<Select.Option
key={index}
tablename={item.TableName}
name={item.Name}
value={item.ID}
>
{item.Name}
</Select.Option>
);
})
: ''}
</Select>
</Item>
</div>
</Item>
<Item label="字段集">
<div className={styles.listEvent}>
<Input
style={{ width: '93%' }}
placeholder=""
disabled={!isShow}
onChange={onCharacterValue}
allowClear
value={characterValue}
/>
<Tooltip title={!isShow ? '' : '字符集选择'}>
<PlusSquareOutlined
onClick={() => (!isShow ? '' : add('characteristics'))}
style={{
fontSize: '24px',
color: !isShow ? 'gray' : '#1890FF',
cursor: !isShow ? 'no-drop' : 'pointer',
display: 'flex',
alignItems: 'center',
marginLeft: '0.5rem',
}}
/>
</Tooltip>
</div>
</Item>
</Form>
)}
<ChangeAdd
visible={visible}
onCancel={() => setVisible(false)}
callBackSubmit={onOK}
newCheckedList={checkedList}
isType={type}
filed={filed}
characterValue={characterValue}
formObj={formObj}
/>
</Drawer>
</>
);
}; };
export default AddModal; export default AddModal;
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
import { import {
Form, Form,
Modal, Modal,
Space, Space,
Table, Table,
Button, Button,
Popconfirm, Popconfirm,
Spin, Spin,
notification, notification,
Tooltip Tooltip,
} from 'antd'; } from 'antd';
import { EditOutlined, DeleteOutlined,SortDescendingOutlined,PlusSquareOutlined,RollbackOutlined } from '@ant-design/icons'; import {
import { reloadTableFields, removeFields, loadUnattachedTables } from '@/services/platform/bs'; EditOutlined,
DeleteOutlined,
SortDescendingOutlined,
PlusSquareOutlined,
RollbackOutlined,
} from '@ant-design/icons';
import {
reloadTableFields,
removeFields,
loadUnattachedTables,
} from '@/services/platform/bs';
import FieldEditor from './fieldEditor'; import FieldEditor from './fieldEditor';
import { useHistory } from 'react-router-dom'; import { useHistory } from 'react-router-dom';
import styles from './index.less' import styles from './index.less';
import AffiliateAdd from '../bsmanager/tablemanager/components/Field/affiliateAdd' import AffiliateAdd from '../bsmanager/tablemanager/components/Field/affiliateAdd';
import LoadGroup from '../bsmanager/tablemanager/components/Field/loadGroup' import LoadGroup from '../bsmanager/tablemanager/components/Field/loadGroup';
const AddModal = props => { const AddModal = props => {
const history = useHistory(); const history = useHistory();
const [allData, setAllData] = useState([]); const [allData, setAllData] = useState([]);
const [tableList, setTableList] = useState([]) const [tableList, setTableList] = useState([]);
const [tableData, setTableData] = useState([]); const [tableData, setTableData] = useState([]);
const [treeLoading, setTreeLoading] = useState(false); const [treeLoading, setTreeLoading] = useState(false);
const [formObj, setFormObj] = useState(''); const [formObj, setFormObj] = useState('');
const [flag, setFlag] = useState(0); // 弹窗类型 const [flag, setFlag] = useState(0); // 弹窗类型
const [isVisible, setIsVisible] = useState(false); // 弹窗 const [isVisible, setIsVisible] = useState(false); // 弹窗
const [isType, setIsType] = useState(''); // 弹窗类型 const [isType, setIsType] = useState(''); // 弹窗类型
const [itemData, setItemData] = useState({}); const [itemData, setItemData] = useState({});
const [select, setSelect] = useState([]) const [select, setSelect] = useState([]);
const [selectTableName, setSelectTableName] = useState({}) const [selectTableName, setSelectTableName] = useState({});
const [pramFormObj, setPramFormObj] = useState({}); const [pramFormObj, setPramFormObj] = useState({});
const [visible, setVisible] = useState(false); // 弹窗 const [visible, setVisible] = useState(false); // 弹窗
const [type, setType] = useState(''); // 弹窗类型 const [type, setType] = useState(''); // 弹窗类型
const editor = record => { const editor = record => {
setIsType('edit'); setIsType('edit');
setIsVisible(true); setIsVisible(true);
setItemData(record); setItemData(record);
}; };
const Submit = prop => { const Submit = prop => {
setIsVisible(false); setIsVisible(false);
setFlag(flag + 1); setFlag(flag + 1);
}; };
const getField = () => { const getField = () => {
loadUnattachedTables().then(res => { loadUnattachedTables().then(res => {
if (res.data.root && res.data.root.length) { if (res.data.root && res.data.root.length) {
setTableList(res.data.root) setTableList(res.data.root);
} }
});
}) };
// 处理表格特殊样式
const styleConfig = record => {
if (record.Type === 1) {
return 'red';
} }
const expandedRowRender = (item) => { if (record.Type === 2) {
const columns = [ return 'grey';
{ }
title: '字段名', return '000000D9';
dataIndex: 'name', };
key: 'name', const expandedRowRender = item => {
width: 190,
align: 'left',
render: text => <div style={{ paddingLeft: '2rem' }}>{text}</div>,
},
{
title: '别名',
dataIndex: 'alias',
key: 'alias',
align: 'center',
width: 200,
},
{
title: '字段类型',
dataIndex: 'storeType',
key: 'storeType',
align: 'center',
width: 200,
},
{
title: '形态',
dataIndex: 'shape',
key: 'shape',
align: 'center',
width: 200,
},
{
title: '配置',
dataIndex: 'config',
key: 'config',
align: 'center',
width: 200,
},
{
title: '只读',
dataIndex: 'readOnly',
key: 'readOnly',
align: 'center',
width: 200,
},
{
title: '同步',
dataIndex: 'syncEvent',
key: 'syncEvent',
align: 'center',
width: 200,
},
{
title: '操作',
width: 250,
ellipsis: true,
align: 'center',
render: (text, record) => (
<Space>
<Tooltip title="修改">
<EditOutlined style={{ fontSize: '16px', color: '#1890FF' }}
onClick={() => {
editor(record);
}}>
编辑
</EditOutlined>
</Tooltip>
<div onClick={e => e.stopPropagation()}>
<Popconfirm
title="是否删除该字段?"
okText="确认"
cancelText="取消"
onConfirm={() => {
deleteChart(record);
}}
>
<Tooltip title="删除">
<DeleteOutlined style={{ fontSize: '16px', color: '#e86060' }}>删除</DeleteOutlined>
</Tooltip>
</Popconfirm>
</div>
</Space>
),
},
];
return <Table columns={columns} onRow={record => {
return {
onDoubleClick: event => {
event.stopPropagation()
editor(record);
},
onClick: event => {
event.stopPropagation()
setSelectTableName(record)
}, // 点击行
}
}} bordered rowClassName={setRowClassName} showHeader={false} dataSource={allData[item.type]} pagination={false} />;
};
const setRowClassName = (record) =>
Object.entries(record).toString() === Object.entries(selectTableName).toString() ? styles.clickRowStyle : '';
const columns = [ const columns = [
{
title: '字段名',
dataIndex: 'name',
key: 'name',
width: 190,
align: 'left',
render: (text, record) => (
<div style={{ paddingLeft: '2rem', color: styleConfig(record) }}>
{text}
</div>
),
},
{
title: '别名',
dataIndex: 'alias',
key: 'alias',
align: 'center',
width: 200,
render: (text, record) => (
<span style={{ color: styleConfig(record) }}>{text} </span>
),
},
{
title: '字段类型',
dataIndex: 'storeType',
key: 'storeType',
align: 'center',
width: 200,
render: (text, record) => (
<span style={{ color: styleConfig(record) }}>{text} </span>
),
},
{
title: '形态',
dataIndex: 'shape',
key: 'shape',
align: 'center',
width: 200,
render: (text, record) => (
<span style={{ color: styleConfig(record) }}>{text} </span>
),
},
{
title: '配置',
dataIndex: 'config',
key: 'config',
align: 'center',
width: 200,
render: (text, record) => (
<span style={{ color: styleConfig(record) }}>{text} </span>
),
},
{ {
title: '字段名', title: '只读',
dataIndex: 'type', dataIndex: 'readOnly',
key: 'type', key: 'readOnly',
align: 'left', align: 'center',
width: 150, width: 200,
render: text => { render: (text, record) => (
return (<a >{text}(共{allData[text] ? allData[text].length : ''}条)</a>) <span style={{ color: styleConfig(record) }}>{text} </span>
} ),
},
}, {
{ title: '同步',
title: '别名', dataIndex: 'syncEvent',
dataIndex: 'alias', key: 'syncEvent',
key: 'alias', align: 'center',
align: 'center', width: 200,
width: 200, render: (text, record) => (
}, <span style={{ color: styleConfig(record) }}>{text} </span>
{ ),
title: '字段类型', },
dataIndex: 'storeType', {
key: 'storeType', title: '操作',
align: 'center', width: 250,
width: 200, ellipsis: true,
}, align: 'center',
{ render: (text, record) => (
title: '形态', <Space>
dataIndex: 'shape', <Tooltip title="修改">
key: 'shape', <EditOutlined
align: 'center', style={{ fontSize: '16px', color: '#1890FF' }}
width: 200, onClick={() => {
}, editor(record);
{ }}
title: '配置', >
dataIndex: 'config', 编辑
key: 'config', </EditOutlined>
align: 'center', </Tooltip>
width: 200, <div onClick={e => e.stopPropagation()}>
}, <Popconfirm
title="是否删除该字段?"
{ okText="确认"
title: '只读', cancelText="取消"
dataIndex: 'readOnly', onConfirm={() => {
key: 'readOnly', deleteChart(record);
align: 'center', }}
width: 200, >
}, <Tooltip title="删除">
{ <DeleteOutlined
title: '同步', style={{ fontSize: '16px', color: '#e86060' }}
dataIndex: 'syncEvent', >
key: 'syncEvent', 删除
align: 'center', </DeleteOutlined>
width: 200, </Tooltip>
}, </Popconfirm>
{ </div>
title: '操作', </Space>
width: 250, ),
ellipsis: true, },
key: 'title', ];
align: 'center',
}, return (
<Table
columns={columns}
onRow={record => {
return {
onDoubleClick: event => {
event.stopPropagation();
editor(record);
},
onClick: event => {
event.stopPropagation();
setSelectTableName(record);
}, // 点击行
};
}}
bordered
rowClassName={setRowClassName}
showHeader={false}
dataSource={allData[item.type]}
pagination={false}
/>
);
};
const setRowClassName = record =>
Object.entries(record).toString() ===
Object.entries(selectTableName).toString()
? styles.clickRowStyle
: '';
const columns = [
{
title: '字段名',
dataIndex: 'type',
key: 'type',
align: 'left',
width: 150,
render: text => {
return (
<a>
{text}(共{allData[text] ? allData[text].length : ''}条)
</a>
);
},
},
{
title: '别名',
dataIndex: 'alias',
key: 'alias',
align: 'center',
width: 200,
},
{
title: '字段类型',
dataIndex: 'storeType',
key: 'storeType',
align: 'center',
width: 200,
},
{
title: '形态',
dataIndex: 'shape',
key: 'shape',
align: 'center',
width: 200,
},
{
title: '配置',
dataIndex: 'config',
key: 'config',
align: 'center',
width: 200,
},
]; {
useEffect(() => { title: '只读',
if (props.match.params.id) { dataIndex: 'readOnly',
setFormObj(props.match.params.id) key: 'readOnly',
setTreeLoading(true); align: 'center',
reloadTableFields({ width: 200,
tableName: props.match.params.id, },
}).then(res => { {
setTreeLoading(false); title: '同步',
if (res.msg === 'Ok') { dataIndex: 'syncEvent',
let arr = formateArrDataA(res.data.root, 'group') key: 'syncEvent',
let newArr = [] align: 'center',
Object.keys(arr).map((item, index) => { width: 200,
newArr.push({ type: item, key: index, id: index }) },
}) {
setAllData(arr); title: '操作',
setTableData(newArr); width: 250,
setSelect(newArr) ellipsis: true,
} key: 'title',
}); align: 'center',
getField() },
} ];
}, [flag]); useEffect(() => {
const formateArrDataA = (initialArr, name) => { if (props.match.params.id) {
// 判定传参是否符合规则 setFormObj(props.match.params.id);
if (!(initialArr instanceof Array)) { setTreeLoading(true);
return '请传入正确格式的数组' reloadTableFields({
tableName: props.match.params.id,
}).then(res => {
setTreeLoading(false);
if (res.msg === 'Ok') {
let arr = formateArrDataA(res.data.root, 'group');
let newArr = [];
Object.keys(arr).map((item, index) => {
newArr.push({ type: item, key: index, id: index });
});
setAllData(arr);
setTableData(newArr);
setSelect(newArr);
} }
if (!name) { });
return '请传入对象属性' getField();
}
//先获取一下这个数组中有多少个"name"
let nameArr = []
for (let i in initialArr) {
if (nameArr.indexOf(initialArr[i][`${name}`]) === -1) {
nameArr.push(initialArr[i][`${name}`])
}
}
//新建一个包含多个list的结果对象
let tempObj = {}
// 根据不同的"name"生成多个数组
for (let k in nameArr) {
for (let j in initialArr) {
if (initialArr[j][`${name}`] == nameArr[k]) {
// 每次外循环时新建一个对应"name"的数组, 内循环时当前数组不变
tempObj[nameArr[k]] = tempObj[nameArr[k]] || []
tempObj[nameArr[k]].push(initialArr[j])
}
}
}
for (let keys in tempObj) {
let arr = []
tempObj[keys].map((item, index) => {
tempObj[keys] = arr;
item.key = index
arr.push(item)
})
}
return tempObj
} }
// 删除表字段 }, [flag]);
const deleteChart = record => { const formateArrDataA = (initialArr, name) => {
removeFields({ fieldIDs: record.ID }).then(res => { // 判定传参是否符合规则
if (res.msg === 'Ok' || res.msg === '') { if (!(initialArr instanceof Array)) {
notification.success({ return '请传入正确格式的数组';
message: '提示',
duration: 3,
description: '删除成功',
});
setFlag(flag + 1);
} else {
notification.error({
message: '提示',
duration: 3,
description: res.msg,
});
}
});
};
// 返回上一级
const back = () => {
let template = props.history.location.state.template
history.push({ pathname: '/platformCenter/bsmanger/tablemanger', state: { template } })
} }
const onUnfold = (expanded, record) => { if (!name) {
const data = [...select] return '请传入对象属性';
let index = data.indexOf(record) }
if (expanded) { //先获取一下这个数组中有多少个"name"
data.push(record) let nameArr = [];
} else { for (let i in initialArr) {
data.splice(index, 1) if (nameArr.indexOf(initialArr[i][`${name}`]) === -1) {
nameArr.push(initialArr[i][`${name}`]);
}
}
//新建一个包含多个list的结果对象
let tempObj = {};
// 根据不同的"name"生成多个数组
for (let k in nameArr) {
for (let j in initialArr) {
if (initialArr[j][`${name}`] == nameArr[k]) {
// 每次外循环时新建一个对应"name"的数组, 内循环时当前数组不变
tempObj[nameArr[k]] = tempObj[nameArr[k]] || [];
tempObj[nameArr[k]].push(initialArr[j]);
} }
setSelect(data) }
} }
//附加 for (let keys in tempObj) {
const add = (record) => { let arr = [];
setPramFormObj(props.history.location.state.template); tempObj[keys].map((item, index) => {
setType('affiliateAdd'); tempObj[keys] = arr;
setVisible(true); item.key = index;
arr.push(item);
});
} }
//分组与排序 return tempObj;
const sort = (record) => { };
setPramFormObj(props.history.location.state.template); // 删除表字段
setType('sort'); const deleteChart = record => {
setVisible(true); removeFields({ fieldIDs: record.ID }).then(res => {
if (res.msg === 'Ok' || res.msg === '') {
notification.success({
message: '提示',
duration: 3,
description: '删除成功',
});
setFlag(flag + 1);
} else {
notification.error({
message: '提示',
duration: 3,
description: res.msg,
});
}
});
};
// 返回上一级
const back = () => {
let template = props.history.location.state.template;
history.push({
pathname: '/platformCenter/bsmanger/tablemanger',
state: { template },
});
};
const onUnfold = (expanded, record) => {
const data = [...select];
let index = data.indexOf(record);
if (expanded) {
data.push(record);
} else {
data.splice(index, 1);
} }
const onSubmit = prop => { setSelect(data);
setVisible(false); };
setFlag(flag + 1) //附加
}; const add = record => {
return ( setPramFormObj(props.history.location.state.template);
setType('affiliateAdd');
<><Spin tip="loading..." spinning={treeLoading}> setVisible(true);
<div className={styles.containerBox}> };
<div className={styles.config}><div className={styles.title}>{formObj}(字段配置)</div> //分组与排序
<div className={styles.btn}> const sort = record => {
<Button type="primary" icon={<PlusSquareOutlined />} onClick={add}>附加</Button> setPramFormObj(props.history.location.state.template);
<Button type="primary" icon={<SortDescendingOutlined /> }onClick={sort}>分组排序</Button> setType('sort');
<Button type="primary" icon={<RollbackOutlined />} onClick={back}>返回</Button></div> setVisible(true);
</div> };
const onSubmit = prop => {
<Table setVisible(false);
columns={columns} setFlag(flag + 1);
dataSource={tableData} };
expandable={{ expandedRowRender }} return (
size="small" <>
rowKey='id' <Spin tip="loading..." spinning={treeLoading}>
expandedRowKeys={select.map(item => item.key)} //展开的行 <div className={styles.containerBox}>
expandRowByClick={true} <div className={styles.config}>
defaultExpandAllRows={true} <div className={styles.title}>{formObj}(字段配置)</div>
pagination={false} <div className={styles.btn}>
scroll={{ y: 'calc(100vh - 186px)' }} <Button
size="small" type="primary"
onExpand={onUnfold} /> icon={<PlusSquareOutlined />}
onClick={add}
>
附加
</Button>
<Button
type="primary"
icon={<SortDescendingOutlined />}
onClick={sort}
>
分组排序
</Button>
<Button type="primary" icon={<RollbackOutlined />} onClick={back}>
返回
</Button>
</div> </div>
</Spin><FieldEditor </div>
isVisible={isVisible}
isType={isType}
itemData={itemData}
formObj1={formObj}
onCancel={() => setIsVisible(false)}
callBackSubmit={Submit} />
{visible && type === 'affiliateAdd' && (
<AffiliateAdd
visible={visible}
tableList={tableList}
type={type}
onCancel={() => setVisible(false)}
callBackSubmit={onSubmit}
formObj={pramFormObj}
/>
)}
{visible && type === 'sort' && ( <Table
<LoadGroup columns={columns}
visible={visible} dataSource={tableData}
type={type} expandable={{ expandedRowRender }}
formObj={pramFormObj} size="small"
onCancel={() => setVisible(false)} rowKey="id"
callBackSubmit={onSubmit} expandedRowKeys={select.map(item => item.key)} //展开的行
/> expandRowByClick={true}
)}</> defaultExpandAllRows={true}
pagination={false}
scroll={{ y: 'calc(100vh - 186px)' }}
size="small"
onExpand={onUnfold}
/>
</div>
</Spin>
<FieldEditor
isVisible={isVisible}
isType={isType}
itemData={itemData}
formObj1={formObj}
onCancel={() => setIsVisible(false)}
callBackSubmit={Submit}
/>
{visible && type === 'affiliateAdd' && (
<AffiliateAdd
visible={visible}
tableList={tableList}
type={type}
onCancel={() => setVisible(false)}
callBackSubmit={onSubmit}
formObj={pramFormObj}
/>
)}
); {visible && type === 'sort' && (
<LoadGroup
visible={visible}
type={type}
formObj={pramFormObj}
onCancel={() => setVisible(false)}
callBackSubmit={onSubmit}
/>
)}
</>
);
}; };
export default AddModal; export default AddModal;
...@@ -107,6 +107,7 @@ const UserManage = () => { ...@@ -107,6 +107,7 @@ const UserManage = () => {
const [searchWord, setSearchWord] = useState(''); // 关键字 const [searchWord, setSearchWord] = useState(''); // 关键字
const [currentSelectOrg, setCurrentSelectOrg] = useState('-1'); // 左侧机构树-选中组织,字符串类型默认全部机构'-1',注意用户表中的OUID是数字 const [currentSelectOrg, setCurrentSelectOrg] = useState('-1'); // 左侧机构树-选中组织,字符串类型默认全部机构'-1',注意用户表中的OUID是数字
const [currentSelectOldOrg, setCurrentSelectOldOrg] = useState([]); // 更改机构时的树-原先选中组织 const [currentSelectOldOrg, setCurrentSelectOldOrg] = useState([]); // 更改机构时的树-原先选中组织
const [showSearchStyle, setShowSearchStyle] = useState(false); // 是否显示模糊查询样式
/** ***Modal弹框,是否可视**** */ /** ***Modal弹框,是否可视**** */
const [userVisible, setUserVisible] = useState(false); // 添加用户 const [userVisible, setUserVisible] = useState(false); // 添加用户
...@@ -143,7 +144,7 @@ const UserManage = () => { ...@@ -143,7 +144,7 @@ const UserManage = () => {
const [currentOrgArea, setCurrentOrgArea] = useState(''); const [currentOrgArea, setCurrentOrgArea] = useState('');
const [currentOrgDistinct, setCurrentOrgDistinct] = useState(''); const [currentOrgDistinct, setCurrentOrgDistinct] = useState('');
const [saveExtentFlag, setSaveExtentFlag] = useState(0); const [saveExtentFlag, setSaveExtentFlag] = useState(0);
const [filteredValue,setFilteredValue] =useState([]); const [filteredValue, setFilteredValue] = useState([]);
const { Search } = Input; const { Search } = Input;
const setRowClassName = record => const setRowClassName = record =>
record.userID === selectColor.userID ? styles.clickRowStyle : ''; record.userID === selectColor.userID ? styles.clickRowStyle : '';
...@@ -155,30 +156,14 @@ const UserManage = () => { ...@@ -155,30 +156,14 @@ const UserManage = () => {
key: 'loginName', key: 'loginName',
width: 150, width: 150,
// fixed: 'left', // fixed: 'left',
render: item => ( render: item => searchStyle(item),
<div
ref={r => {
if (r) {
r.innerHTML = item;
}
}}
/>
),
}, },
{ {
title: '用户姓名', title: '用户姓名',
dataIndex: 'userName', dataIndex: 'userName',
key: 'userName', key: 'userName',
width: 150, width: 150,
render: item => ( render: item => searchStyle(item),
<div
ref={r => {
if (r) {
r.innerHTML = item;
}
}}
/>
),
}, },
{ {
title: '所在机构', title: '所在机构',
...@@ -196,17 +181,9 @@ const UserManage = () => { ...@@ -196,17 +181,9 @@ const UserManage = () => {
key: 'phone', key: 'phone',
width: 150, width: 150,
ellipsis: true, ellipsis: true,
render: record => { render: text => {
if (record) { if (text) {
return ( return searchStyle(text);
<div
ref={r => {
if (r) {
r.innerHTML = record;
}
}}
/>
);
} }
return <span>未绑定</span>; return <span>未绑定</span>;
}, },
...@@ -338,10 +315,7 @@ const UserManage = () => { ...@@ -338,10 +315,7 @@ const UserManage = () => {
<div style={{ width: '130px' }}> <div style={{ width: '130px' }}>
<Form form={form}> <Form form={form}>
<Item> <Item>
<Radio.Group <Radio.Group value={selectValue} onChange={onTypeChange}>
value={selectValue}
onChange={onTypeChange}
>
<Space direction="vertical"> <Space direction="vertical">
<Radio value={0}>访客</Radio> <Radio value={0}>访客</Radio>
<Radio value={1}>普通用户</Radio> <Radio value={1}>普通用户</Radio>
...@@ -387,7 +361,19 @@ const UserManage = () => { ...@@ -387,7 +361,19 @@ const UserManage = () => {
), ),
}, },
]; ];
// 模糊查询匹配的样式
const searchStyle = val => {
let n;
if (showSearchStyle) {
n = val.replace(
new RegExp(searchWord, 'g'),
`<span style='color:red'>${searchWord}</span>`,
);
} else {
n = val;
}
return <div dangerouslySetInnerHTML={{ __html: n }} />;
};
// 获取搜索框的值 // 获取搜索框的值
const handleSearch = e => { const handleSearch = e => {
setSearchWord(e.target.value); setSearchWord(e.target.value);
...@@ -419,7 +405,7 @@ const UserManage = () => { ...@@ -419,7 +405,7 @@ const UserManage = () => {
<span className={styles.titleText}>{org.text}</span> <span className={styles.titleText}>{org.text}</span>
<span className={styles.tip}> <span className={styles.tip}>
<Tooltip title="" className={styles.fs}> <Tooltip title="" className={styles.fs}>
<Dropdown overlay={orgButtonMenu} disabled={currentOrgOperate} > <Dropdown overlay={orgButtonMenu} disabled={currentOrgOperate}>
<PlusOutlined <PlusOutlined
style={{ marginLeft: 20 }} style={{ marginLeft: 20 }}
onClick={e => e.stopPropagation()} onClick={e => e.stopPropagation()}
...@@ -472,7 +458,7 @@ const UserManage = () => { ...@@ -472,7 +458,7 @@ const UserManage = () => {
.then(newres => { .then(newres => {
if (newres.code === 0) { if (newres.code === 0) {
let res = newres.data; let res = newres.data;
console.log(res) console.log(res);
setTreeLoading(false); setTreeLoading(false);
setTreeData(res); setTreeData(res);
setTreeDataCopy(res); setTreeDataCopy(res);
...@@ -511,8 +497,8 @@ const UserManage = () => { ...@@ -511,8 +497,8 @@ const UserManage = () => {
// 点击树节点,获取当前机构下所有用户 // 点击树节点,获取当前机构下所有用户
const onSelect = (props, e) => { const onSelect = (props, e) => {
console.log(e) console.log(e);
console.log(props) console.log(props);
setTableLoading(true); setTableLoading(true);
if (e) { if (e) {
setOrgTitle(e.node.title.props.children[0].props.children); setOrgTitle(e.node.title.props.children[0].props.children);
...@@ -533,6 +519,7 @@ const UserManage = () => { ...@@ -533,6 +519,7 @@ const UserManage = () => {
groupID: props[0], groupID: props[0],
}).then(res => { }).then(res => {
if (res.code === 0) { if (res.code === 0) {
console.log(res);
setCurrentOrgArea(res.data.MapRange); setCurrentOrgArea(res.data.MapRange);
setCurrentOrgDistinct(res.data.AreeName); setCurrentOrgDistinct(res.data.AreeName);
} }
...@@ -562,6 +549,7 @@ const UserManage = () => { ...@@ -562,6 +549,7 @@ const UserManage = () => {
item.key = index; item.key = index;
return item; return item;
}); });
setShowSearchStyle(false);
setTableData(table); setTableData(table);
} else { } else {
setTableLoading(false); setTableLoading(false);
...@@ -773,12 +761,12 @@ const UserManage = () => { ...@@ -773,12 +761,12 @@ const UserManage = () => {
const onTypeChange = value => { const onTypeChange = value => {
setSelctValue(value.target.value); setSelctValue(value.target.value);
}; };
const authUser = (record) => { const authUser = record => {
setCurrentUser(record); setCurrentUser(record);
console.log(selectValue) console.log(selectValue);
AddUserAuthSetting({ AddUserAuthSetting({
userId: record.userID, userId: record.userID,
userLevel: selectValue userLevel: selectValue,
}).then(res => { }).then(res => {
if (res.code === 0) { if (res.code === 0) {
message.info('提交成功'); message.info('提交成功');
...@@ -817,12 +805,14 @@ const UserManage = () => { ...@@ -817,12 +805,14 @@ const UserManage = () => {
setOrgTitle('全部机构搜索结果'); // 设置表头 setOrgTitle('全部机构搜索结果'); // 设置表头
setCurrentSelectOrg('-1'); // 清空选中机构 setCurrentSelectOrg('-1'); // 清空选中机构
console.log(res.data); console.log(res.data);
setShowSearchStyle(true);
setTableData(res.data); setTableData(res.data);
setTableLength(res.data.length); setTableLength(res.data.length);
} else { } else {
notification.error({ notification.error({
message: '提交失败', message: '提示',
description: res.message, duration: 3,
description: res.msg,
}); });
} }
}) })
...@@ -1137,7 +1127,7 @@ const UserManage = () => { ...@@ -1137,7 +1127,7 @@ const UserManage = () => {
let res = newres.data; let res = newres.data;
setTreeLoading(false); setTreeLoading(false);
setSearchWord(''); setSearchWord('');
setFilteredValue([]) setFilteredValue([]);
// 第一次加载,默认选择第一个组织 // 第一次加载,默认选择第一个组织
onSelect([res[0].id], false); onSelect([res[0].id], false);
} else { } else {
...@@ -1154,9 +1144,9 @@ const UserManage = () => { ...@@ -1154,9 +1144,9 @@ const UserManage = () => {
message.error(err); message.error(err);
}); });
}; };
const onChangeInput = (filters) =>{ const onChangeInput = filters => {
setFilteredValue(filters.OUName); setFilteredValue(filters.OUName);
} };
// 更改机构范围 // 更改机构范围
const submitExtent = (extent, areaName) => { const submitExtent = (extent, areaName) => {
...@@ -1177,14 +1167,14 @@ const UserManage = () => { ...@@ -1177,14 +1167,14 @@ const UserManage = () => {
setEditOrgExtentVisible(false); setEditOrgExtentVisible(false);
}; };
const addChange =e=>{ const addChange = e => {
console.log(e) console.log(e);
e.domEvent.stopPropagation() e.domEvent.stopPropagation();
} };
/** ***操作按钮**** */ /** ***操作按钮**** */
// 机构操作 // 机构操作
const orgButtonMenu = ( const orgButtonMenu = (
<Menu onClick={e =>addChange(e)}> <Menu onClick={e => addChange(e)}>
<Menu.Item key="1" onClick={addUser} icon={<UserAddOutlined />}> <Menu.Item key="1" onClick={addUser} icon={<UserAddOutlined />}>
添加用户 添加用户
</Menu.Item> </Menu.Item>
...@@ -1194,7 +1184,7 @@ const UserManage = () => { ...@@ -1194,7 +1184,7 @@ const UserManage = () => {
</Menu> </Menu>
); );
const orgButtonMenu1 = ( const orgButtonMenu1 = (
<Menu onClick={e =>addChange(e)}> <Menu onClick={e => addChange(e)}>
<Menu.Item key="3" onClick={editOrg} icon={<EditOutlined />}> <Menu.Item key="3" onClick={editOrg} icon={<EditOutlined />}>
编辑当前机构 编辑当前机构
</Menu.Item> </Menu.Item>
...@@ -1231,7 +1221,7 @@ const UserManage = () => { ...@@ -1231,7 +1221,7 @@ const UserManage = () => {
{/* 左侧机构树 */} {/* 左侧机构树 */}
<Spin spinning={treeLoading} tip="loading..."> <Spin spinning={treeLoading} tip="loading...">
<Card <Card
style={{overflowY:'hidden'}} style={{ overflowY: 'hidden' }}
className={classnames({ className={classnames({
[styles.orgContainer]: true, [styles.orgContainer]: true,
[styles.orgContainerHide]: !treeVisible, [styles.orgContainerHide]: !treeVisible,
...@@ -1242,7 +1232,7 @@ const UserManage = () => { ...@@ -1242,7 +1232,7 @@ const UserManage = () => {
style={{ style={{
fontSize: '15px ', fontSize: '15px ',
fontWeight: 'bold', fontWeight: 'bold',
marginLeft: '15px' marginLeft: '15px',
}} }}
> >
机构列表 机构列表
...@@ -1254,11 +1244,13 @@ const UserManage = () => { ...@@ -1254,11 +1244,13 @@ const UserManage = () => {
color: '#1890FF', color: '#1890FF',
fontSize: '25px', fontSize: '25px',
verticalAlign: 'middle', verticalAlign: 'middle',
marginLeft: '67%' marginLeft: '67%',
}} }}
/> />
</Tooltip> </Tooltip>
<hr style={{ width: '95%', color: '#eeecec' ,marginLeft: '15px'}} /> <hr
style={{ width: '95%', color: '#eeecec', marginLeft: '15px' }}
/>
{treeData.length > 0 && ( {treeData.length > 0 && (
<Tree <Tree
showIcon="true" showIcon="true"
...@@ -1271,7 +1263,7 @@ const UserManage = () => { ...@@ -1271,7 +1263,7 @@ const UserManage = () => {
onSelect={onSelect} onSelect={onSelect}
height={ height={
treeData.length && treeData.length > 30 treeData.length && treeData.length > 30
? treeData.length * 18+50 ? treeData.length * 18 + 50
: 1000 : 1000
} }
treeData={treeData.map(t => mapTree(t))} treeData={treeData.map(t => mapTree(t))}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment