Commit e1f1eec9 by zhaochengxiang

模型配置

parent 0f2b50ba
...@@ -336,4 +336,44 @@ export function* getDesignPrivilege() { ...@@ -336,4 +336,44 @@ export function* getDesignPrivilege() {
export function* getPrivilegeAdmin() { export function* getPrivilegeAdmin() {
return yield call(datamodelerService.getPrivilegeAdmin); return yield call(datamodelerService.getPrivilegeAdmin);
}
export function* getRuleTemplateList() {
return yield call(datamodelerService.getRuleTemplateList);
}
export function* addRuleTemplate(payload) {
return yield call(datamodelerService.addRuleTemplate, payload);
}
export function* updateRuleTemplate(payload) {
return yield call(datamodelerService.updateRuleTemplate, payload);
}
export function* deletesRuleTemplate(payload) {
return yield call(datamodelerService.deletesRuleTemplate, payload);
}
export function* deleteRuleTemplate(payload) {
return yield call(datamodelerService.deleteRuleTemplate, payload);
}
export function* getRuleTemplateDetail(payload) {
return yield call(datamodelerService.getRuleTemplateDetail, payload);
}
export function* getRuleTemplateCheckTypes() {
return yield call(datamodelerService.getRuleTemplateCheckTypes);
}
export function* getRuleTemplateAllCheckPropertyTypes() {
return yield call(datamodelerService.getRuleTemplateAllCheckPropertyTypes);
}
export function* getRuleTemplateAllVerifyExpressionTypes() {
return yield call(datamodelerService.getRuleTemplateAllVerifyExpressionTypes);
}
export function* getRuleTemplateAllVertifyExpressions() {
return yield call(datamodelerService.getRuleTemplateAllVertifyExpressions);
} }
\ No newline at end of file
import { PostFile, GetJSON, PostJSON, Post, Get } from "../util/axios" import { PostFile, GetJSON, PostJSON, Post, Get, Delete } from "../util/axios"
export function loadDataModelCatalog() { export function loadDataModelCatalog() {
return GetJSON("/datamodeler/easyDataModelerCURD/loadDataModelCatalog"); return GetJSON("/datamodeler/easyDataModelerCURD/loadDataModelCatalog");
...@@ -287,4 +287,44 @@ export function getDesignPrivilege() { ...@@ -287,4 +287,44 @@ export function getDesignPrivilege() {
export function getPrivilegeAdmin() { export function getPrivilegeAdmin() {
return Get("/datamodeler/easyDataModelerPrivilegeProvider/getAdmin"); return Get("/datamodeler/easyDataModelerPrivilegeProvider/getAdmin");
}
export function getRuleTemplateList() {
return GetJSON("/shandatamodeler/easyDataModelerRuleTemplate/list");
}
export function addRuleTemplate(payload) {
return PostJSON("/shandatamodeler/easyDataModelerRuleTemplate/add", payload);
}
export function updateRuleTemplate(payload) {
return PostJSON("/shandatamodeler/easyDataModelerRuleTemplate/update", payload);
}
export function deletesRuleTemplate(payload) {
return Delete("/shandatamodeler/easyDataModelerRuleTemplate/dels", payload);
}
export function deleteRuleTemplate(payload) {
return Delete("/shandatamodeler/easyDataModelerRuleTemplate/del", payload);
}
export function getRuleTemplateDetail(payload) {
return GetJSON("/shandatamodeler/easyDataModelerRuleTemplate/getById", payload);
}
export function getRuleTemplateCheckTypes() {
return GetJSON("/shandatamodeler/easyDataModelerRuleTemplate/getCheckTypes");
}
export function getRuleTemplateAllCheckPropertyTypes() {
return GetJSON("/shandatamodeler/easyDataModelerRuleTemplate/getAllCheckPropertyTypes");
}
export function getRuleTemplateAllVerifyExpressionTypes() {
return GetJSON("/shandatamodeler/easyDataModelerRuleTemplate/getAllVerifyExpressionTypes")
}
export function getRuleTemplateAllVertifyExpressions() {
return GetJSON("/shandatamodeler/easyDataModelerRuleTemplate/getAllVerifyExpressions")
} }
\ No newline at end of file
import React from 'react'
import { Input, Space, Modal } from 'antd'
import { dispatch } from '../../../../model'
import PermissionButton from '../../../../util/Component/PermissionButton'
import Table from '../../../../util/Component/Table'
import { showMessage } from '../../../../util'
import Update from './update-rule-template'
const FC = (props) => {
const [keyword, setKeyword] = React.useState()
const [loading, setLoading] = React.useState(false)
const [data, setData] = React.useState()
const [selectedRows, setSelectedRows] = React.useState()
const [updateParams, setUpdateParams] = React.useState({
visible: false,
type: undefined,
item: undefined
})
const [modal, contextHolder] = Modal.useModal()
React.useEffect(() => {
getTemplates()
}, [])
const cols = React.useMemo(() => {
return ([
{
title: '序号',
dataIndex: 'index',
width: 60,
render: (_, __, index) => `${index+1}`
},
{
title: '规则编号',
dataIndex: 'number',
},
{
title: '规则中文名称',
dataIndex: 'name',
},
{
title: '规则描述',
dataIndex: 'remark',
},
{
title: '检查类型',
dataIndex: 'checkTypeName',
},
{
title: '引用次数',
dataIndex: 'referenceCount',
},
])
}, [])
const _data = React.useMemo(() => {
const _keyword = (keyword??'').trim()
return (data??[]).filter(item => !_keyword
|| (item.name??'').indexOf(_keyword) !== -1
|| (item.remark??'').indexOf(_keyword) !== -1
)
}, [data, keyword])
const getTemplates = () => {
setLoading(true)
dispatch({
type: 'datamodel.getRuleTemplateList',
callback: data => {
setLoading(false)
setData(data)
},
error: () => {
setLoading(false)
}
})
}
const onAddClick = () => {
setUpdateParams({
visible: true,
type: 'add',
item: undefined
})
}
const onBatchDeteteClick = () => {
modal.confirm({
title: '提示',
content: '删除规则,引用的规范将同步删除该规则,确定删除吗?',
onOk: () => {
dispatch({
type: 'datamodel.deletesRuleTemplate',
payload: {
templateIds: (selectedRows??[]).map(item => item.id).toString()
},
callback: data => {
showMessage('success', '删除成功')
getTemplates()
}
})
}
})
}
const onDeteteClick = (record) => {
modal.confirm({
title: '提示',
content: '删除规则,引用的规范将同步删除该规则,确定删除吗?',
onOk: () => {
dispatch({
type: 'datamodel.deleteRuleTemplate',
payload: {
templateId: record?.id
},
callback: data => {
showMessage('success', '删除成功')
getTemplates()
}
})
}
})
}
return (
<div>
<div className='d-flex mb-3' style={{ justifyContent: 'space-between', alignItems: 'center' }}>
<Space>
<PermissionButton
onClick={onAddClick}
// permissionKey='新增'
defaultPermission={true}
>
新建
</PermissionButton>
<PermissionButton
onClick={onBatchDeteteClick}
// permissionKey='删除'
defaultPermission={true}
disabled={(selectedRows??[]).length===0}
tip={(selectedRows??[]).length===0?'请先选择规则':''}
>
删除
</PermissionButton>
</Space>
<Input size="middle"
placeholder="规则名称/描述搜索"
value={keyword}
bordered={true} allowClear
onChange={(e) => {
const keyword = e.target.value
setKeyword(keyword)
// $keyword.next((keyword??'').trim())
}}
style={{ width: 270 }}
/>
</div>
<Table
loading={loading}
columns={cols??[]}
dataSource={_data}
pagination={false}
rowSelection={{
selectedRowKeys: (selectedRows??[]).map(item => item.id),
onChange: (selectedRowKeys, selectedRows) => {
setSelectedRows(selectedRows)
},
}}
/>
<Update
{...updateParams}
onCancel={(refresh) => {
setUpdateParams({
visible: false,
type: undefined,
item: undefined
})
refresh && getTemplates()
}}
/>
{contextHolder}
</div>
)
}
export default FC
\ No newline at end of file
import React from "react"
import { Modal, Button, Spin, Form, Input, Select, Space, InputNumber } from "antd"
import { dispatch } from '../../../../model'
const FC = (props) => {
const { visible, type, item, onCancel } = props
const [waiting, setWaiting] = React.useState(false)
const basicRef = React.useRef()
const title = React.useMemo(() => {
if (type === 'add') return '新增检查规则'
if (type === 'update') return '修改检查规则'
if (type === 'detail') return '检查规则详情'
return ''
}, [type])
const close = (refresh = false) => {
setWaiting(false)
onCancel?.(refresh)
}
const save = async() => {
try {
const rows = await basicRef.current?.validate()
setWaiting(true)
if (type === 'add') {
dispatch({
type: 'datamodel.addRuleTemplate',
payload: {
data: rows
},
callback: data => {
close(true)
},
error: () => {
setWaiting(false)
}
})
} else {
dispatch({
type: 'datamodel.updateRuleTemplate',
payload: {
data: {...item, rows}
},
callback: data => {
close(true)
},
error: () => {
setWaiting(false)
}
})
}
} catch (e) {
}
}
const footer = React.useMemo(() => {
return [
<Button key='cancel'
onClick={() => close()}
>取消</Button>,
<Button key='save' type='primary'
onClick={() => save()}
>确定</Button>
]
}, [close, save])
return (
<Modal
visible={visible}
footer={footer}
width='80%'
bodyStyle={{ padding: '15px', overflowX: 'auto', maxHeight: '80vh' }}
title={title}
centered destroyOnClose
onCancel={() => { close() }}
>
<Spin spinning={waiting}>
<Basic ref={basicRef} item={item} />
</Spin>
</Modal>
)
}
export default FC
export const Basic = React.forwardRef(function ({ item }, ref) {
const [loadingCheckTypes, setLoadingCheckTypes] = React.useState(false)
const [checkTypes, setCheckTypes] = React.useState()
const [loadingCheckPropertyTypes, setLoadingCheckPrpertyTypes] = React.useState(false)
const [checkPropertyTypes, setCheckPropertyTypes] = React.useState()
const [loadingExpressionTypes, setLoadingExpressionTypes] = React.useState(false)
const [expressionTypes, setExpressionTypes] = React.useState()
const [loadingExpressions, setLoadingExpressions] = React.useState(false)
const [expressions, setExpressions] = React.useState()
const [form] = Form.useForm()
React.useImperativeHandle(ref, () => ({
validate: async () => {
return await form.validateFields()
},
}), [form])
React.useEffect(() => {
getCheckTypes()
}, [])
const getCheckTypes = () => {
setLoadingCheckTypes(true)
dispatch({
type: 'datamodel.getRuleTemplateCheckTypes',
callback: (data) => {
setLoadingCheckTypes(false)
setCheckTypes(data)
},
error: () => {
setLoadingCheckTypes(false)
}
})
}
const onValuesChange = (changedValues, allValues) => {
console.log('all values', allValues)
}
return (
<Form
form={form}
labelCol={{ span: 3 }}
wrapperCol={{ span: 21 }}
autoComplete="off"
onValuesChange={onValuesChange}
>
<Form.Item name='name' label='规则中文名称'
rules={[{ required: true, message: '请输入规则中文名称!' }]}
>
<Input placeholder='请输入规则中文名称' allowClear />
</Form.Item>
<Form.Item name='remark' label='规则描述'
>
<Input placeholder='请输入规则描述' allowClear />
</Form.Item>
<Form.Item name='alertContent' label='规则提示'
rules={[{ required: true, message: '请输入规则提示!' }]}
>
<Input placeholder='请输入规则提示' allowClear />
</Form.Item>
<Form.Item name='checkType' label='检查类型'
rules={[{ required: true, message: '请选择检查类型!' }]}
>
<Select allowClear loading={loadingCheckTypes}
placeholder='请选择检查类型'
>
{ (checkTypes??[]).map((item, index) => (
<Select.Option key={item.type} value={item.type}>{item.name}</Select.Option>
)) }
</Select>
</Form.Item>
<Form.Item name='checkProperty' label='检查规则'
rules={[{ required: true, message: '请选择检查类型!' }]}
>
<CheckItem />
</Form.Item>
</Form>
)
})
const CheckItem = ({ value, onChange }) => {
const [loadingCheckPropertyTypes, setLoadingCheckPrpertyTypes] = React.useState(false)
const [checkPropertyTypes, setCheckPropertyTypes] = React.useState()
const [loadingExpressionTypes, setLoadingExpressionTypes] = React.useState(false)
const [expressionTypes, setExpressionTypes] = React.useState()
const [loadingExpressionMapping, setLoadingExpressionMapping] = React.useState(false)
const [expressionMapping, setExpressionMapping] = React.useState()
const [currentCheckPropertyType, setCurrentCheckPropertyType] = React.useState()
const [currentExpressionType, setCurrentExpressionType] = React.useState()
const [currentExpression, setCurrentExpression] = React.useState()
React.useEffect(() => {
getCheckPropertyTypes()
getExpressionTypes()
getExpressions()
}, [])
React.useEffect(() => {
onChange?.({...currentCheckPropertyType||{}, ...currentExpressionType||{}, verifyExpression: currentExpression})
}, [currentCheckPropertyType, currentExpressionType, currentExpression])
const visibleExpressions = React.useMemo(() => {
if (currentExpressionType?.expressionTypeEnName) {
return expressionMapping?.[currentExpressionType?.expressionTypeEnName]
}
return []
}, [expressionMapping, currentExpressionType])
const getCheckPropertyTypes = () => {
setLoadingCheckPrpertyTypes(true)
dispatch({
type: 'datamodel.getRuleTemplateAllCheckPropertyTypes',
callback: (data) => {
setLoadingCheckPrpertyTypes(false)
setCheckPropertyTypes(data)
},
error: () => {
setLoadingCheckPrpertyTypes(false)
}
})
}
const getExpressionTypes = () => {
setLoadingExpressionTypes(true)
dispatch({
type: 'datamodel.getRuleTemplateAllVerifyExpressionTypes',
callback: (data) => {
setLoadingExpressionTypes(false)
setExpressionTypes(data)
},
error: () => {
setLoadingExpressionTypes(false)
}
})
}
const getExpressions = () => {
setLoadingExpressionMapping(true)
dispatch({
type: 'datamodel.getRuleTemplateAllVertifyExpressions',
callback: (data) => {
setLoadingExpressionMapping(false)
setExpressionMapping(data)
},
error: () => {
setLoadingExpressionMapping(false)
}
})
}
return (
<Space>
<Select allowClear loading={loadingCheckPropertyTypes}
value={currentCheckPropertyType?.propertyEnName}
onChange={(val) => {
if (val) {
const index = (checkPropertyTypes??[]).findIndex(item => item.propertyEnName === val)
if (index !== -1) {
setCurrentCheckPropertyType(checkPropertyTypes[index])
}
} else {
setCurrentCheckPropertyType()
}
}}
placeholder='请选择检查对象'
>
{ (checkPropertyTypes??[]).map((item, index) => (
<Select.Option key={item.propertyEnName} value={item.propertyEnName}>{item.propertyCnName}</Select.Option>
)) }
</Select>
<Select allowClear loading={loadingExpressionTypes}
value={currentExpressionType?.expressionTypeEnName}
onChange={(val) => {
if (val) {
const index = (expressionTypes??[]).findIndex(item => item.expressionTypeEnName === val)
if (index !== -1) {
setCurrentExpressionType(expressionTypes[index])
}
} else {
setCurrentExpressionType()
}
setCurrentExpression()
}}
placeholder='请选择检查属性'
>
{ (expressionTypes??[]).map((item, index) => (
<Select.Option key={item.expressionTypeEnName} value={item.expressionTypeEnName}>{item.expressionTypeCnName}</Select.Option>
)) }
</Select>
<Select allowClear loading={loadingExpressionMapping}
value={currentExpression?.enName}
onChange={(val) => {
if (val) {
const index = (visibleExpressions??[]).findIndex(item => item.enName === val)
if (index !== -1) {
setCurrentExpression(visibleExpressions[index])
}
} else {
setCurrentExpression()
}
}}
placeholder='请选择表达式'
>
{ (visibleExpressions??[]).map((item, index) => (
<Select.Option key={item.enName} value={item.enName}>{item.cnName}</Select.Option>
)) }
</Select>
{ (currentExpression?.valueType === 'string') && <Input
onChange={(e) => {
setCurrentExpression({
...currentExpression, value: e.target.value
})
}}/> }
{ (currentExpression?.valueType === 'int') && <InputNumber
onChange={(e) => {
setCurrentExpression({
...currentExpression, value: e.target.value
})
}}/> }
{ (currentExpression?.valueType === 'List<String>') && <Input /> }
</Space>
)
}
\ No newline at end of file
...@@ -5,6 +5,7 @@ import { dispatch } from '../../../model'; ...@@ -5,6 +5,7 @@ import { dispatch } from '../../../model';
import WordTemplate from './Component/WordTemplate'; import WordTemplate from './Component/WordTemplate';
import TemplateCURD from './Component/TemplateCURD'; import TemplateCURD from './Component/TemplateCURD';
import ConstraintDetail from './Component/ConstraintDetail'; import ConstraintDetail from './Component/ConstraintDetail';
import RuleTemplateCURD from './Component/rule-template';
import PartitionCURD from './Component/PartitionCURD'; import PartitionCURD from './Component/PartitionCURD';
import './index.less'; import './index.less';
...@@ -58,7 +59,10 @@ const ModelConfig = () => { ...@@ -58,7 +59,10 @@ const ModelConfig = () => {
<TabPane tab='规范配置' key='3'> <TabPane tab='规范配置' key='3'>
<ConstraintDetail /> <ConstraintDetail />
</TabPane> </TabPane>
<TabPane tab='分区配置' key='4'> <TabPane tab='规则库管理' key='4'>
<RuleTemplateCURD />
</TabPane>
<TabPane tab='分区配置' key='5'>
<PartitionCURD /> <PartitionCURD />
</TabPane> </TabPane>
</Tabs> </Tabs>
......
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