Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
C
CivManage
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ReactWeb5
CivManage
Commits
5c469cbf
Commit
5c469cbf
authored
May 13, 2021
by
shaoan123
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
根据预测方案接口的更改修改界面传值
parent
e58aea02
Pipeline
#27557
skipped with stages
Changes
6
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
195 additions
and
71 deletions
+195
-71
.env
.env
+1
-1
AddModal.jsx
...s/artificial/policiesIssued/predictionConfig/AddModal.jsx
+57
-37
predictionConfig.jsx
...cial/policiesIssued/predictionConfig/predictionConfig.jsx
+0
-12
index.jsx
...mCenter/bsmanager/tablemanager/components/Field/index.jsx
+115
-12
index.jsx
src/pages/platformCenter/bsmanager/tablemanager/index.jsx
+21
-8
api.js
src/services/webConfig/api.js
+1
-1
No files found.
.env
View file @
5c469cbf
# PUBLIC_PATH = reactOMS, 默认转发 /cityinterface
# PUBLIC_PATH = reactOMS, 默认转发 /cityinterface
PROXY=/Cityinterface:http://192.168.1
9.105:8049;/Publish:http://192.168.19.105:8049;/Web4:http://192.168.19.105:8049;/CityTemp:http://192.168.19.105:8049
PROXY=/Cityinterface:http://192.168.1
2.121:8082;/Publish:http://192.168.12.121:8082;/Web4:http://192.168.12.121:8082;/CityTemp:http://192.168.12.121:8082
# 可设置第二个代理,test为转发前缀,后面为代理转发的地址
# 可设置第二个代理,test为转发前缀,后面为代理转发的地址
# PROXY2 = test : http://localhost:8006/
# PROXY2 = test : http://localhost:8006/
...
...
src/pages/artificial/policiesIssued/predictionConfig/AddModal.jsx
View file @
5c469cbf
import
React
,
{
useState
,
useEffect
}
from
'react'
;
import
React
,
{
useState
,
useEffect
}
from
'react'
;
import
{
Form
,
Modal
,
Input
,
Select
,
notification
,
DatePicker
,
Spin
,
Button
,
Card
,
Row
,
Col
}
from
'antd'
;
import
{
Form
,
Modal
,
Input
,
Select
,
notification
,
Spin
,
Button
,
Card
,
Row
,
Col
}
from
'antd'
;
import
styles
from
'../policiesIssued.less'
import
styles
from
'../policiesIssued.less'
// import moment from 'moment';
// import locale from 'antd/es/date-picker/locale/zh_CN';
// import 'moment/locale/zh-cn';
import
moment
from
'moment'
import
locale
from
'antd/lib/date-picker/locale/zh_CN'
import
'moment/locale/zh-cn'
moment
.
locale
(
'zh-cn'
)
import
{
import
{
getEquipmentInfo
,
getQutaList
,
addPredictOptions
,
getSceneNameInfo
,
editPredictOptions
getEquipmentInfo
,
getQutaList
,
addPredictOptions
,
getSceneNameInfo
,
editPredictOptions
}
from
'@/services/intelligence/api'
;
}
from
'@/services/intelligence/api'
;
import
{
DeleteOutlined
}
from
'@ant-design/icons'
;
import
{
DeleteOutlined
}
from
'@ant-design/icons'
;
const
{
RangePicker
}
=
DatePicker
;
const
{
TextArea
}
=
Input
;
const
{
TextArea
}
=
Input
;
const
AddModal
=
props
=>
{
const
AddModal
=
props
=>
{
const
{
callBackSubmit
=
()
=>
{
},
type
,
formObj
,
visible
,
deviceType
}
=
props
;
const
{
callBackSubmit
=
()
=>
{
},
type
,
formObj
,
visible
,
deviceType
}
=
props
;
...
@@ -25,6 +15,9 @@ const AddModal = props => {
...
@@ -25,6 +15,9 @@ const AddModal = props => {
const
[
deviceList
,
setDeviceList
]
=
useState
([]);
//设备列表
const
[
deviceList
,
setDeviceList
]
=
useState
([]);
//设备列表
const
[
card
,
setCard
]
=
useState
([]);
//卡片列表值
const
[
card
,
setCard
]
=
useState
([]);
//卡片列表值
const
[
timeType
,
setTimeType
]
=
useState
([
'分钟'
,
'小时'
,
'天'
]);
const
[
timeType
,
setTimeType
]
=
useState
([
'分钟'
,
'小时'
,
'天'
]);
const
[
PredictType
,
setPredictType
]
=
useState
([
'日'
,
'周'
,
'月'
]);
const
[
showTime
,
setShowTime
]
=
useState
(
true
);
const
[
commonType
,
setCommonType
]
=
useState
([
'自定义'
,
'同周日'
,
'同月日'
]);
const
[
intervalType
,
setIntervalType
]
=
useState
(
'分钟'
)
const
[
intervalType
,
setIntervalType
]
=
useState
(
'分钟'
)
const
[
CycleValue
,
setCycleValue
]
=
useState
(
''
)
const
[
CycleValue
,
setCycleValue
]
=
useState
(
''
)
const
[
sceneList
,
setSceneList
]
=
useState
([])
const
[
sceneList
,
setSceneList
]
=
useState
([])
...
@@ -35,23 +28,21 @@ const AddModal = props => {
...
@@ -35,23 +28,21 @@ const AddModal = props => {
form
.
validateFields
().
then
(
validate
=>
{
form
.
validateFields
().
then
(
validate
=>
{
if
(
validate
)
{
if
(
validate
)
{
let
obj
=
form
.
getFieldsValue
();
let
obj
=
form
.
getFieldsValue
();
let
DateFrom
=
moment
(
obj
.
time
[
0
]).
format
(
'YYYY-MM-DD'
)
let
DateTo
=
moment
(
obj
.
time
[
1
]).
format
(
'YYYY-MM-DD'
)
let
PredictDateFrom
=
moment
(
obj
.
PredictTime
[
0
]).
format
(
'YYYY-MM-DD'
)
let
PredictDateTo
=
moment
(
obj
.
PredictTime
[
1
]).
format
(
'YYYY-MM-DD'
)
let
api
=
addPredictOptions
let
api
=
addPredictOptions
let
query
=
{
let
query
=
{
SceneName
:
obj
.
SceneName
,
SceneName
:
obj
.
SceneName
,
Cycle
:
intervalType
,
Cycle
:
intervalType
,
CycleValue
:
CycleValue
,
CycleValue
:
CycleValue
,
DateFrom
:
DateFrom
,
DateTo
:
DateTo
,
DeviceType
:
obj
.
DeviceType
,
DeviceType
:
obj
.
DeviceType
,
PredictDateFrom
,
PredictDateTo
,
PredictName
:
obj
.
PredictName
,
PredictName
:
obj
.
PredictName
,
Remarks
:
obj
.
Remarks
,
Remarks
:
obj
.
Remarks
,
DeviceDetails
:
card
DeviceDetails
:
card
,
PredictCycle
:
obj
.
PredictCycle
?
obj
.
PredictCycle
:
''
,
PredictCycleValue
:
obj
.
PredictCycleValue
,
StatisticCycle
:
obj
.
StatisticCycle
,
PredictType
:
obj
.
PredictType
,
StatisticCycleValue
:
obj
.
StatisticCycleValue
}
}
// card.length ? query.DeviceDetails = card : delete query.DeviceDetails
// card.length ? query.DeviceDetails = card : delete query.DeviceDetails
type
===
'edit'
?
(
query
.
ID
=
formObj
.
ID
)
&&
(
api
=
editPredictOptions
)
:
delete
query
.
ID
&&
(
api
=
addPredictOptions
)
type
===
'edit'
?
(
query
.
ID
=
formObj
.
ID
)
&&
(
api
=
editPredictOptions
)
:
delete
query
.
ID
&&
(
api
=
addPredictOptions
)
...
@@ -110,7 +101,8 @@ const AddModal = props => {
...
@@ -110,7 +101,8 @@ const AddModal = props => {
}
}
else
{
else
{
setDeviceList
([])
setDeviceList
([])
form
.
setFieldsValue
({
time
:
[
moment
(
formObj
.
DateFrom
,
"YYYYMMDD"
),
moment
(
formObj
.
DateTo
,
"YYYYMMDD"
)],
PredictTime
:
[
moment
(
formObj
.
PredictDateFrom
,
"YYYYMMDD"
),
moment
(
formObj
.
PredictDateTo
,
"YYYYMMDD"
)],
...
formObj
});
formObj
.
PredictType
===
'日'
?
setShowTime
(
true
)
:
setShowTime
(
false
)
form
.
setFieldsValue
({
...
formObj
});
setCycleValue
(
formObj
.
CycleValue
);
setCycleValue
(
formObj
.
CycleValue
);
setIntervalType
(
formObj
.
Cycle
);
setIntervalType
(
formObj
.
Cycle
);
if
(
formObj
.
DeviceDetails
.
length
)
{
if
(
formObj
.
DeviceDetails
.
length
)
{
...
@@ -239,11 +231,14 @@ const AddModal = props => {
...
@@ -239,11 +231,14 @@ const AddModal = props => {
const
clearInput
=
(
index
)
=>
{
const
clearInput
=
(
index
)
=>
{
form
.
setFieldsValue
({
form
.
setFieldsValue
({
[
`deviceCode
${
index
}
`
]:
undefined
,
[
`deviceCode
${
index
}
`
]:
undefined
,
[
`indextr
${
index
}
`
]:
undefined
,
[
`indextr
${
index
}
`
]:
undefined
,
[
`max
${
index
}
`
]:
undefined
,
[
`max
${
index
}
`
]:
undefined
,
[
`min
${
index
}
`
]:
undefined
[
`min
${
index
}
`
]:
undefined
})
})
}
}
const
selectPredictType
=
(
value
)
=>
{
value
===
'日'
?
setShowTime
(
true
)
:
setShowTime
(
false
)
}
//选择小时,分,天
//选择小时,分,天
const
selectCycleValue
=
(
e
)
=>
{
const
selectCycleValue
=
(
e
)
=>
{
setCycleValue
(
e
.
target
.
value
)
setCycleValue
(
e
.
target
.
value
)
...
@@ -292,23 +287,48 @@ const AddModal = props => {
...
@@ -292,23 +287,48 @@ const AddModal = props => {
{
deviceType
.
length
?
deviceType
.
map
((
item
,
index
)
=>
{
return
<
Select
.
Option
key=
{
index
}
value=
{
item
.
DeviceType
}
>
{
item
.
DeviceType
}
</
Select
.
Option
>
})
:
''
}
{
deviceType
.
length
?
deviceType
.
map
((
item
,
index
)
=>
{
return
<
Select
.
Option
key=
{
index
}
value=
{
item
.
DeviceType
}
>
{
item
.
DeviceType
}
</
Select
.
Option
>
})
:
''
}
</
Select
>
</
Select
>
</
Item
>
</
Item
>
<
Item
<
Item
label=
"
首次执行时间
"
label=
"
预测维度
"
name=
"
tim
e"
name=
"
PredictTyp
e"
rules=
{
[{
required
:
true
,
message
:
'请选择
首次执行时间
'
}]
}
rules=
{
[{
required
:
true
,
message
:
'请选择
预测维度
'
}]
}
>
>
<
Select
onChange=
{
selectPredictType
}
>
{
PredictType
.
length
?
PredictType
.
map
((
item
,
index
)
=>
{
return
<
Select
.
Option
key=
{
index
}
value=
{
item
}
>
{
item
}
</
Select
.
Option
>
})
:
''
}
</
Select
>
</
Item
>
{
showTime
?
<
Item
label=
"维度类别"
name=
"PredictCycle"
rules=
{
[{
required
:
true
,
message
:
'请选择维度类别'
}]
}
>
<
Select
>
{
commonType
.
length
?
commonType
.
map
((
item
,
index
)
=>
{
return
<
Select
.
Option
key=
{
index
}
value=
{
item
}
>
{
item
}
</
Select
.
Option
>
})
:
''
}
</
Select
>
</
Item
>
:
''
}
<
RangePicker
locale=
{
locale
}
<
Item
style=
{
{
width
:
'100%'
}
}
/>
label=
"预测维度值"
name=
"PredictCycleValue"
rules=
{
[{
required
:
true
,
message
:
'请输入预测维度值'
}]
}
>
<
Input
placeholder=
"请输入任务名称"
allowClear
/>
</
Item
>
</
Item
>
<
Item
<
Item
label=
"
首次计算时间
"
label=
"
统计维度
"
name=
"
PredictTim
e"
name=
"
StatisticCycl
e"
rules=
{
[{
required
:
true
,
message
:
'请选择
首次执行时间
'
}]
}
rules=
{
[{
required
:
true
,
message
:
'请选择
预测维度
'
}]
}
>
>
<
Select
>
<
RangePicker
locale=
{
locale
}
{
PredictType
.
length
?
PredictType
.
map
((
item
,
index
)
=>
{
return
<
Select
.
Option
key=
{
index
}
value=
{
item
}
>
{
item
}
</
Select
.
Option
>
})
:
''
}
style=
{
{
width
:
'100%'
}
}
/>
</
Select
>
</
Item
>
<
Item
label=
"统计维度值"
name=
"StatisticCycleValue"
rules=
{
[{
required
:
true
,
message
:
'请选择维度类别'
}]
}
>
<
Input
placeholder=
"请输入任务名称"
allowClear
/>
</
Item
>
</
Item
>
<
Item
<
Item
label=
"预测间隔"
label=
"预测间隔"
...
@@ -372,7 +392,7 @@ const AddModal = props => {
...
@@ -372,7 +392,7 @@ const AddModal = props => {
label=
"最小值"
label=
"最小值"
name=
{
'min'
+
index
}
name=
{
'min'
+
index
}
>
>
<
Input
placeholder=
"请输入最小值"
style=
{
{
width
:
'98%'
}
}
onChange=
{
(
value
)
=>
inputMin
(
value
,
index
)
}
index=
{
index
}
allowClear
/>
<
Input
placeholder=
"请输入最小值"
style=
{
{
width
:
'98%'
}
}
onChange=
{
(
value
)
=>
inputMin
(
value
,
index
)
}
index=
{
index
}
allowClear
/>
</
Item
>
</
Item
>
</
Col
>
</
Col
>
<
Col
span=
{
12
}
>
<
Col
span=
{
12
}
>
...
@@ -380,7 +400,7 @@ const AddModal = props => {
...
@@ -380,7 +400,7 @@ const AddModal = props => {
label=
"最大值"
label=
"最大值"
name=
{
'max'
+
index
}
name=
{
'max'
+
index
}
>
>
<
Input
style=
{
{
width
:
'98%'
,
marginLeft
:
'0.4rem'
}
}
placeholder=
"请输入最大值"
onChange=
{
(
value
)
=>
inputMax
(
value
,
index
)
}
index=
{
index
}
allowClear
/>
<
Input
style=
{
{
width
:
'98%'
,
marginLeft
:
'0.4rem'
}
}
placeholder=
"请输入最大值"
onChange=
{
(
value
)
=>
inputMax
(
value
,
index
)
}
index=
{
index
}
allowClear
/>
</
Item
>
</
Item
>
</
Col
>
</
Col
>
</
Row
>
</
Row
>
...
...
src/pages/artificial/policiesIssued/predictionConfig/predictionConfig.jsx
View file @
5c469cbf
...
@@ -51,18 +51,6 @@ const VectorData = props => {
...
@@ -51,18 +51,6 @@ const VectorData = props => {
</
Space
>
</
Space
>
)
)
},
},
{
title
:
'首次执行时间'
,
dataIndex
:
'DateFrom'
,
key
:
'DateFrom'
,
align
:
'center'
},
{
title
:
'首次计算时间'
,
dataIndex
:
'PredictDateFrom'
,
key
:
'PredictDateFrom'
,
align
:
'center'
},
{
{
title
:
'描述'
,
title
:
'描述'
,
dataIndex
:
'Remarks'
,
dataIndex
:
'Remarks'
,
...
...
src/pages/platformCenter/bsmanager/tablemanager/components/Field/index.jsx
View file @
5c469cbf
import
React
,
{
useState
,
useEffect
}
from
'react'
import
React
,
{
useState
,
useEffect
}
from
'react'
;
import
{
CM_Table_ReloadFields
}
from
'@/services/platform/bs'
import
{
Form
,
Modal
,
Input
,
Select
,
AutoComplete
,
Button
,
notification
}
from
'antd'
;
const
FieldEdit
=
()
=>
{
import
{
return
(
SetServiceConfig
,
GetAllConfig
<
div
>
}
from
'@/services/webConfig/api'
;
</
div
>
)
const
{
Option
}
=
Select
;
}
const
AddModal
=
props
=>
{
export
default
FieldEdit
const
{
callBackSubmit
=
()
=>
{
},
type
,
formObj
,
visible
,
listData
}
=
props
;
\ No newline at end of file
const
[
loading
,
setLoading
]
=
useState
(
false
);
const
[
form
]
=
Form
.
useForm
();
const
{
Item
}
=
Form
;
// 提交
const
onSubmit
=
()
=>
{
form
.
validateFields
().
then
(
validate
=>
{
if
(
validate
)
{
setLoading
(
true
);
let
obj
=
form
.
getFieldsValue
();
SetServiceConfig
({
schemename
:
obj
.
schemename
,
terminalType
:
type
===
'add'
?
'web'
:
'phone'
,
isBaseMap
:
'false'
,
jsonCfg
:
type
===
'add'
?
JSON
.
stringify
({
type
:
'dynamic'
})
:
JSON
.
stringify
({
isDefault
:
false
})
})
.
then
(
res
=>
{
setLoading
(
false
);
if
(
res
.
msg
===
"Ok"
)
{
form
.
resetFields
();
callBackSubmit
();
notification
.
success
({
message
:
'提示'
,
duration
:
3
,
description
:
'新增成功'
,
});
}
else
{
notification
.
error
({
message
:
'提示'
,
duration
:
3
,
description
:
'新增失败'
,
});
}
})
.
catch
(
err
=>
{
notification
.
error
({
message
:
'提示'
,
duration
:
3
,
description
:
'新增失败'
,
});
setLoading
(
false
);
});
}
});
};
const
onFinish
=
value
=>
{
};
useEffect
(()
=>
{
if
(
type
!=
''
){
form
.
setFieldsValue
({
schemename
:
listData
[
0
]
});
}
},
[
visible
]);
const
layout
=
{
layout
:
'horizontal'
,
labelCol
:
{
span
:
4
,
},
wrapperCol
:
{
span
:
16
,
},
};
const
handleChange
=
(
value
)
=>
{
form
.
setFieldsValue
({
schemename
:
value
});
}
return
(
<
Modal
title=
{
`${type === 'add' ? '元数据发布' : '编辑'}`
}
bodyStyle=
{
{
width
:
'100%'
,
minHeight
:
'100px'
}
}
style=
{
{
top
:
'150px'
}
}
width=
"700px"
destroyOnClose
maskClosable=
{
false
}
cancelText=
"取消"
okText=
"确认"
{
...
props
}
onOk=
{
()
=>
onSubmit
()
}
confirmLoading=
{
loading
}
forceRender=
{
true
}
getContainer=
{
false
}
>
{
visible
&&
(
<
Form
form=
{
form
}
{
...
layout
}
onFinish=
{
onFinish
}
>
<
Item
label=
"方案名"
name=
"schemename"
rules=
{
[{
required
:
true
,
message
:
'请选择服务名'
}]
}
>
<
Select
onChange=
{
handleChange
}
>
{
listData
.
map
((
item
,
index
)
=>
{
return
<
Option
value=
{
item
}
key=
{
index
}
>
{
item
}
</
Option
>
})
}
</
Select
>
</
Item
>
</
Form
>
)
}
</
Modal
>
);
};
export
default
AddModal
;
src/pages/platformCenter/bsmanager/tablemanager/index.jsx
View file @
5c469cbf
...
@@ -7,20 +7,23 @@ import {
...
@@ -7,20 +7,23 @@ import {
Input
,
Input
,
Button
,
Button
,
Select
,
Select
,
Popconfirm
,
Popconfirm
message
}
from
'antd'
;
}
from
'antd'
;
import
{
PlusCircleOutlined
}
from
'@ant-design/icons'
;
import
{
PlusCircleOutlined
}
from
'@ant-design/icons'
;
import
PageContainer
from
'@/components/BasePageContainer'
;
import
PageContainer
from
'@/components/BasePageContainer'
;
import
{
CM_Table_LoadTable
}
from
'@/services/platform/bs'
import
{
CM_Table_LoadTable
}
from
'@/services/platform/bs'
import
styles
from
'./index.less'
import
styles
from
'./index.less'
import
AddModal
from
'./components/Field/index'
const
{
Search
}
=
Input
;
const
{
Search
}
=
Input
;
const
{
Option
}
=
Select
;
const
{
Option
}
=
Select
;
const
placeholder
=
"请输入表名"
const
placeholder
=
"请输入表名"
const
TableManager
=
()
=>
{
const
TableManager
=
()
=>
{
const
[
visible
,
setVisible
]
=
useState
(
false
);
// 弹窗
const
[
type
,
setType
]
=
useState
(
''
);
// 弹窗类型
const
[
formObj
,
setFormObj
]
=
useState
({});
const
[
flag
,
setFlag
]
=
useState
(
0
);
// 弹窗类型
const
columns
=
[
const
columns
=
[
{
{
...
@@ -98,8 +101,6 @@ const TableManager = () => {
...
@@ -98,8 +101,6 @@ const TableManager = () => {
},
},
{
{
title
:
'操作'
,
title
:
'操作'
,
dataIndex
:
'action'
,
key
:
'action'
,
width
:
250
,
width
:
250
,
ellipsis
:
true
,
ellipsis
:
true
,
render
:
(
text
,
record
)
=>
(
render
:
(
text
,
record
)
=>
(
...
@@ -143,14 +144,18 @@ const TableManager = () => {
...
@@ -143,14 +144,18 @@ const TableManager = () => {
];
];
const
[
tableData
,
setTableData
]
=
useState
([])
const
[
tableData
,
setTableData
]
=
useState
([])
useEffect
(()
=>
{
useEffect
((
record
)
=>
{
loadTable
()
loadTable
()
},
[])
},
[])
//修改表名
const
changeDesc
=
()
=>
{
const
changeDesc
=
()
=>
{
}
}
const
onSubmit
=
prop
=>
{
setVisible
(
false
);
setFlag
(
flag
+
1
)
};
const
AddTable
=
()
=>
{
const
AddTable
=
()
=>
{
}
}
...
@@ -195,10 +200,18 @@ const TableManager = () => {
...
@@ -195,10 +200,18 @@ const TableManager = () => {
dataSource=
{
tableData
}
dataSource=
{
tableData
}
pagination=
{
{
pageSize
:
20
}
}
pagination=
{
{
pageSize
:
20
}
}
scroll=
{
{
y
:
700
}
}
scroll=
{
{
y
:
700
}
}
size=
"small"
size=
"small"
rowKey=
{
(
record
,
index
)
=>
`complete${record.tableID}${index}`
}
/>
/>
</
div
>
</
div
>
</
div
>
</
div
>
<
AddModal
visible=
{
visible
}
onCancel=
{
()
=>
setVisible
(
false
)
}
callBackSubmit=
{
onSubmit
}
type=
{
type
}
formObj=
{
formObj
}
/>
</
PageContainer
>
</
PageContainer
>
)
)
...
...
src/services/webConfig/api.js
View file @
5c469cbf
...
@@ -163,7 +163,7 @@ export const GetMaplayerByTerminalType = query =>
...
@@ -163,7 +163,7 @@ export const GetMaplayerByTerminalType = query =>
// 获取全部
// 获取全部
export
const
GettMaplayer
=
query
=>
export
const
GettMaplayer
=
query
=>
get
(
`
${
PUBLISH_SERVICE
}
/Maplayer/GetMaplayer`
,
query
);
get
(
`
${
PUBLISH_SERVICE
}
/Maplayer/Get
t
Maplayer`
,
query
);
//设置底图数据
//设置底图数据
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment