Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
amos-boot-biz
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
项目统一框架
amos-boot-biz
Commits
c900e534
Commit
c900e534
authored
Nov 18, 2022
by
KeYong
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/develop_dl_plan6' into develop_dl_plan6
parents
af6a9948
0e21ef68
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
148 additions
and
20 deletions
+148
-20
IFirefightersService.java
.../boot/module/common/api/service/IFirefightersService.java
+2
-0
IOrgUsrService.java
...n/amos/boot/module/common/api/service/IOrgUsrService.java
+1
-1
EquipmentSpecificIndex.java
...oin/equipmanage/common/entity/EquipmentSpecificIndex.java
+9
-0
OrgPersonController.java
...oot/module/common/biz/controller/OrgPersonController.java
+2
-2
FirefightersServiceImpl.java
...dule/common/biz/service/impl/FirefightersServiceImpl.java
+28
-1
OrgUsrServiceImpl.java
...oot/module/common/biz/service/impl/OrgUsrServiceImpl.java
+47
-14
MqttReceiveServiceImpl.java
...join/equipmanage/service/impl/MqttReceiveServiceImpl.java
+48
-0
FirefightersController.java
...oot/module/jcs/biz/controller/FirefightersController.java
+2
-1
application-dev.properties
...ystem-equip/src/main/resources/application-dev.properties
+5
-0
EquipmentSpecificIndexMapper.xml
...rc/main/resources/mapper/EquipmentSpecificIndexMapper.xml
+3
-0
application-roma.properties
...ls-message/src/main/resources/application-roma.properties
+1
-1
No files found.
amos-boot-module/amos-boot-module-api/amos-boot-module-common-api/src/main/java/com/yeejoin/amos/boot/module/common/api/service/IFirefightersService.java
View file @
c900e534
...
...
@@ -36,4 +36,6 @@ public interface IFirefightersService {
void
saveFirefightersByUser
(
PeopleInfoDto
firefighters
);
BigScreen1VO
getFireForceInfoByCode
(
String
companyCode
);
String
getCompanyName
(
String
bizOrgCode
);
}
amos-boot-module/amos-boot-module-api/amos-boot-module-common-api/src/main/java/com/yeejoin/amos/boot/module/common/api/service/IOrgUsrService.java
View file @
c900e534
...
...
@@ -368,7 +368,7 @@ public interface IOrgUsrService {
* @param id
* @return
*/
String
deleteFirefighterPeopleById
(
Long
id
);
String
deleteFirefighterPeopleById
(
Long
id
,
String
type
);
OrgUsr
selectParentOrgUsr
(
OrgUsr
orgUsr
);
...
...
amos-boot-module/amos-boot-module-api/amos-boot-module-equip-api/src/main/java/com/yeejoin/equipmanage/common/entity/EquipmentSpecificIndex.java
View file @
c900e534
...
...
@@ -162,4 +162,13 @@ public class EquipmentSpecificIndex extends BaseEntity {
@TableField
(
exist
=
false
)
private
String
bizOrgCode
;
@ApiModelProperty
(
value
=
"装备系统code"
)
@TableField
(
exist
=
false
)
private
String
specificCode
;
@ApiModelProperty
(
value
=
"装备定义名称"
)
@TableField
(
exist
=
false
)
private
String
equipmentName
;
}
amos-boot-module/amos-boot-module-biz/amos-boot-module-common-biz/src/main/java/com/yeejoin/amos/boot/module/common/biz/controller/OrgPersonController.java
View file @
c900e534
...
...
@@ -426,8 +426,8 @@ public class OrgPersonController extends BaseController {
@TycloudOperation
(
ApiLevel
=
UserType
.
AGENCY
)
@RequestMapping
(
value
=
"/people/firefighter/{id}"
,
method
=
RequestMethod
.
DELETE
)
@ApiOperation
(
httpMethod
=
"DELETE"
,
value
=
"根据id删除"
,
notes
=
"根据id删除"
)
public
ResponseModel
<
String
>
deleteFirefighterPeopleById
(
@PathVariable
Long
id
)
{
return
ResponseHelper
.
buildResponse
(
iOrgUsrService
.
deleteFirefighterPeopleById
(
id
));
public
ResponseModel
<
String
>
deleteFirefighterPeopleById
(
@PathVariable
Long
id
,
@PathVariable
String
type
)
{
return
ResponseHelper
.
buildResponse
(
iOrgUsrService
.
deleteFirefighterPeopleById
(
id
,
type
));
}
/**
*
...
...
amos-boot-module/amos-boot-module-biz/amos-boot-module-common-biz/src/main/java/com/yeejoin/amos/boot/module/common/biz/service/impl/FirefightersServiceImpl.java
View file @
c900e534
...
...
@@ -241,7 +241,7 @@ public class FirefightersServiceImpl extends BaseService<FirefightersDto, Firefi
OrgPersonDto
orgPersonDto
=
new
OrgPersonDto
();
BeanUtils
.
copyProperties
(
orgUsr
,
orgPersonDto
);
List
<
DynamicFormInstance
>
dynamicFormInstances
=
orgUsrService
.
dynamicFormColumn
(
peopleInfoDto
.
getFirefighters
()
,
false
);
List
<
DynamicFormInstance
>
dynamicFormInstances
=
orgUsrService
.
dynamicFormColumn
(
peopleInfoDto
,
false
);
orgPersonDto
.
setDynamicFormValue
(
dynamicFormInstances
);
try
{
orgUsrService
.
updateByIdOrgPerson
(
orgPersonDto
,
id
);
...
...
@@ -329,4 +329,31 @@ public class FirefightersServiceImpl extends BaseService<FirefightersDto, Firefi
bigScreen1VO
.
setUsrSignInfoByCode
(
usrSignInfoByBizOrgCode
);
return
bigScreen1VO
;
}
@Override
public
String
getCompanyName
(
String
bizOrgCode
)
{
LambdaQueryWrapper
<
OrgUsr
>
lambda
=
new
QueryWrapper
<
OrgUsr
>().
lambda
();
lambda
.
eq
(
OrgUsr:
:
getBizOrgCode
,
bizOrgCode
);
lambda
.
eq
(
OrgUsr:
:
getIsDelete
,
false
);
OrgUsr
orgUsr
=
orgUsrMapper
.
selectList
(
lambda
).
get
(
0
);
if
(!
ObjectUtils
.
isEmpty
(
orgUsr
.
getBizOrgType
())
&&
"COMPANY"
.
equals
(
orgUsr
.
getBizOrgType
()))
{
return
orgUsr
.
getBizOrgName
();
}
else
{
return
getCompanyNameById
(
orgUsr
.
getParentId
());
}
}
private
String
getCompanyNameById
(
String
id
)
{
LambdaQueryWrapper
<
OrgUsr
>
lambda
=
new
QueryWrapper
<
OrgUsr
>().
lambda
();
lambda
.
eq
(
OrgUsr:
:
getSequenceNbr
,
id
);
lambda
.
eq
(
OrgUsr:
:
getIsDelete
,
false
);
OrgUsr
orgUsr
=
orgUsrMapper
.
selectList
(
lambda
).
get
(
0
);
if
(!
ObjectUtils
.
isEmpty
(
orgUsr
.
getBizOrgType
())
&&
"COMPANY"
.
equals
(
orgUsr
.
getBizOrgType
()))
{
return
orgUsr
.
getBizOrgName
();
}
else
{
return
getCompanyNameById
(
orgUsr
.
getParentId
());
}
}
}
amos-boot-module/amos-boot-module-biz/amos-boot-module-common-biz/src/main/java/com/yeejoin/amos/boot/module/common/biz/service/impl/OrgUsrServiceImpl.java
View file @
c900e534
...
...
@@ -1085,11 +1085,11 @@ public class OrgUsrServiceImpl extends BaseService<OrgUsrDto, OrgUsr, OrgUsrMapp
}
else
{
orgUsr
.
setBizOrgCode
(
getOrgCodeStr
());
}
if
(!
ObjectUtils
.
isEmpty
(
OrgPersonVo
.
getAmosOrgId
()))
{
AgencyUserModel
user
=
Privilege
.
agencyUserClient
.
queryByUserId
(
OrgPersonVo
.
getAmosOrgId
()).
getResult
();
OrgPersonVo
.
setAmosOrgCode
(
user
.
getRealName
());
}
//已在前面对此字段赋值 废弃
//
if (!ObjectUtils.isEmpty(OrgPersonVo.getAmosOrgId())) {
//
AgencyUserModel user = Privilege.agencyUserClient.queryByUserId(OrgPersonVo.getAmosOrgId()).getResult();
//
OrgPersonVo.setAmosOrgCode(user.getRealName());
//
}
return
saveOrgUsrDynamicFormInstance
(
orgUsr
,
OrgPersonVo
.
getDynamicFormValue
());
}
...
...
@@ -2989,7 +2989,7 @@ public class OrgUsrServiceImpl extends BaseService<OrgUsrDto, OrgUsr, OrgUsrMapp
OrgUsr
orgUsr
=
peopleSaveOrgUsr
(
peopleInfoDto
.
getFirefighters
());
// 2.保存cb_dynamic_form_instance表 人员基本信息
OrgUsrDto
orgUsrDto
=
saveDynamicformInstance
(
orgUsr
,
peopleInfoDto
.
getFirefighters
()
);
OrgUsrDto
orgUsrDto
=
saveDynamicformInstance
(
orgUsr
,
peopleInfoDto
);
Long
sequenceNbr
=
orgUsrDto
.
getSequenceNbr
();
if
(!
ObjectUtils
.
isEmpty
(
sequenceNbr
))
{
peopleInfoDto
.
getFirefightersContacts
().
setOrgUsrId
(
sequenceNbr
.
toString
());
...
...
@@ -3039,21 +3039,21 @@ public class OrgUsrServiceImpl extends BaseService<OrgUsrDto, OrgUsr, OrgUsrMapp
return
orgUsr
;
}
private
OrgUsrDto
saveDynamicformInstance
(
OrgUsr
orgUsr
,
PeopleBasicInfoDto
peopleBasic
InfoDto
)
{
List
<
DynamicFormInstance
>
dynamicFormInstancelist
=
dynamicFormColumn
(
people
Basic
InfoDto
,
true
);
private
OrgUsrDto
saveDynamicformInstance
(
OrgUsr
orgUsr
,
PeopleInfoDto
people
InfoDto
)
{
List
<
DynamicFormInstance
>
dynamicFormInstancelist
=
dynamicFormColumn
(
peopleInfoDto
,
true
);
return
saveOrgUsrDynamicFormInstance
(
orgUsr
,
dynamicFormInstancelist
);
}
public
List
<
DynamicFormInstance
>
dynamicFormColumn
(
People
BasicInfoDto
peopleBasic
InfoDto
,
boolean
flag
){
public
List
<
DynamicFormInstance
>
dynamicFormColumn
(
People
InfoDto
people
InfoDto
,
boolean
flag
){
// 动态字段填充
List
<
DynamicFormInitDto
>
dynamicFormColumn
=
dynamicFormColumnServiceImpl
.
getFormlist
(
"246"
);
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
// 获取对象属性和值
Field
[]
fields
=
people
BasicInfoDto
.
getClass
().
getDeclaredFields
();
Field
[]
fields
=
people
InfoDto
.
getFirefighters
()
.
getClass
().
getDeclaredFields
();
for
(
Field
field
:
fields
)
{
try
{
field
.
setAccessible
(
true
);
Object
value
=
field
.
get
(
people
BasicInfoDto
);
Object
value
=
field
.
get
(
people
InfoDto
.
getFirefighters
()
);
String
name
=
field
.
getName
();
map
.
put
(
name
,
value
);
}
catch
(
Exception
ex
){
...
...
@@ -3067,6 +3067,15 @@ public class OrgUsrServiceImpl extends BaseService<OrgUsrDto, OrgUsr, OrgUsrMapp
dynamicFormValue
.
add
(
DynamicFormInitDto
.
getFormItemDescr
());
});
FirefightersPost
firefightersPost
=
peopleInfoDto
.
getPostEduDtoObj
().
getFirefightersPost
();
PeopleBasicInfoDto
firefighters
=
peopleInfoDto
.
getFirefighters
();
String
s2
=
JSONObject
.
toJSONString
(
firefighters
);
Map
map2
=
JSONObject
.
parseObject
(
s2
,
Map
.
class
);
String
s
=
JSONObject
.
toJSONString
(
firefightersPost
);
Map
map1
=
JSONObject
.
parseObject
(
s
,
Map
.
class
);
map1
.
putAll
(
map2
);
dynamicFormValue
.
forEach
(
dynamicFormInstanceDto
->
{
String
key
=
dynamicFormInstanceDto
.
getFieldCode
();
Object
value
=
map
.
get
(
key
);
...
...
@@ -3100,10 +3109,34 @@ public class OrgUsrServiceImpl extends BaseService<OrgUsrDto, OrgUsr, OrgUsrMapp
}
DynamicFormInstance
dynamicFormInstance
=
new
DynamicFormInstance
();
BeanUtils
.
copyProperties
(
dynamicFormInstanceDto
,
dynamicFormInstance
);
// 修改bug 8364
if
(
"gender"
.
equals
(
dynamicFormInstance
.
getFieldCode
())){
dynamicFormInstance
.
setFieldValueLabel
(
"346"
.
equals
(
String
.
valueOf
(
dynamicFormInstance
.
getFieldValue
()))?
"男"
:
"女"
);
}
if
(
"peopleType"
.
equals
(
dynamicFormInstance
.
getFieldCode
())
&&
dynamicFormInstance
.
getFieldValue
()
!=
null
){
dynamicFormInstance
.
setFieldValueLabel
(
dataDictionaryService
.
getById
(
dynamicFormInstance
.
getFieldValue
()).
getName
());
}
if
(
"positionType"
.
equals
(
dynamicFormInstance
.
getFieldCode
())
&&
peopleInfoDto
.
getFirefighters
().
getJobTitleCode
()
!=
null
){
dynamicFormInstance
.
setFieldValueLabel
(
dataDictionaryService
.
getById
(
peopleInfoDto
.
getFirefighters
().
getJobTitleCode
()).
getName
());
}
if
(
"administrativePositionCode"
.
equals
(
dynamicFormInstance
.
getFieldCode
())
&&
firefightersPost
.
getAdministrativePositionCode
()
!=
null
){
dynamicFormInstance
.
setFieldValueLabel
(
dataDictionaryService
.
getById
(
map1
.
get
(
"administrativePositionCode"
).
toString
()).
getName
());
}
String
fieldCode
=
dynamicFormInstance
.
getFieldCode
();
if
(
"auditCycle"
.
equals
(
dynamicFormInstance
.
getFieldCode
())
&&
dynamicFormInstance
.
getFieldValue
()
!=
null
){
dynamicFormInstance
.
setFieldValue
(
map1
.
get
(
fieldCode
).
toString
());
dynamicFormInstance
.
setFieldValueLabel
(
dataDictionaryService
.
getById
(
dynamicFormInstance
.
getFieldValue
()).
getName
());
}
if
(
"certificateType"
.
equals
(
dynamicFormInstance
.
getFieldCode
())){
dynamicFormInstance
.
setFieldValue
(
map1
.
get
(
fieldCode
)
==
null
?
""
:
map1
.
get
(
fieldCode
).
toString
());
dynamicFormInstance
.
setFieldValueLabel
(
map1
.
get
(
"certificateTypeCode"
)
==
null
?
""
:
map1
.
get
(
"certificateTypeCode"
).
toString
());
}
if
(
map1
.
containsKey
(
fieldCode
)
&&
fieldCode
.
contains
(
"Code"
)
){
dynamicFormInstance
.
setFieldValue
(
map1
.
get
(
fieldCode
)
==
null
?
""
:
map1
.
get
(
fieldCode
).
toString
());
}
if
(
map1
.
containsKey
(
fieldCode
.
substring
(
0
,
fieldCode
.
length
()-
4
))){
dynamicFormInstance
.
setFieldValueLabel
(
map1
.
get
(
fieldCode
.
substring
(
0
,
fieldCode
.
length
()-
4
)).
toString
());
}
dynamicFormInstancelist
.
add
(
dynamicFormInstance
);
});
...
...
@@ -3403,13 +3436,13 @@ public class OrgUsrServiceImpl extends BaseService<OrgUsrDto, OrgUsr, OrgUsrMapp
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
String
deleteFirefighterPeopleById
(
Long
id
)
{
public
String
deleteFirefighterPeopleById
(
Long
id
,
String
type
)
{
String
flag
=
deleteFirefighters
(
id
);
// 基础信息人员类型修改为非消防
UpdateWrapper
<
DynamicFormInstance
>
updateWrapper
=
new
UpdateWrapper
<>();
updateWrapper
.
eq
(
"instance_id"
,
id
);
updateWrapper
.
eq
(
"field_code"
,
"peopleType"
);
updateWrapper
.
set
(
"field_value"
,
"1"
);
updateWrapper
.
set
(
"field_value"
,
type
);
if
(
"0"
.
equals
(
flag
))
{
dynamicFormInstanceService
.
update
(
updateWrapper
);
}
...
...
amos-boot-module/amos-boot-module-biz/amos-boot-module-equip-biz/src/main/java/com/yeejoin/equipmanage/service/impl/MqttReceiveServiceImpl.java
View file @
c900e534
...
...
@@ -180,6 +180,12 @@ public class MqttReceiveServiceImpl implements MqttReceiveService {
@Value
(
"${equipManage.name}"
)
private
String
serverName
;
@Value
(
"${state.code:code}"
)
private
String
stationCode
;
@Value
(
"${state.name:name}"
)
private
String
stationName
;
@Value
(
"${mqtt.vehicle.topic}"
)
private
String
carTopic
;
...
...
@@ -382,6 +388,48 @@ public class MqttReceiveServiceImpl implements MqttReceiveService {
iotDataVO
.
getKey
().
toLowerCase
().
equals
(
FHS_WirelessliquidDetector_WaterLevel
.
toLowerCase
()))
{
doWaterPoolLevel
(
iotDataVO
,
equipmentSpecificIndex
);
}
// 遥测遥信数据推送云端kafka
JSONObject
jsonObjectXf
=
new
JSONObject
();
jsonObjectXf
.
put
(
"data_class"
,
"realdata"
);
// 遥测
if
(
equipmentSpeIndex
.
getIsTrend
()
==
1
)
{
jsonObjectXf
.
put
(
"data_type"
,
"analog"
);
}
else
{
jsonObjectXf
.
put
(
"data_type"
,
"state"
);
}
String
date
=
DateUtils
.
date2LongStr
(
new
Date
());
jsonObjectXf
.
put
(
"op_type"
,
"subscribe_emergency"
);
JSONObject
jsonObjectCondition
=
new
JSONObject
();
jsonObjectCondition
.
put
(
"station_psr_id"
,
stationCode
);
jsonObjectCondition
.
put
(
"station_name"
,
stationName
);
jsonObjectCondition
.
put
(
"data_upload_time"
,
date
);
jsonObjectXf
.
put
(
"condition"
,
jsonObjectCondition
);
JSONObject
jsonObjectData
=
new
JSONObject
();
jsonObjectData
.
put
(
"psrId"
,
stationCode
);
jsonObjectData
.
put
(
"astId"
,
equipmentSpecificIndex
.
getSpecificCode
());
jsonObjectData
.
put
(
"equipType"
,
equipmentSpecificIndex
.
getEquipmentCode
());
jsonObjectData
.
put
(
"name"
,
equipmentSpecificIndex
.
getEquipmentSpecificName
()+
"-"
+
equipmentSpecificIndex
.
getEquipmentSpecificIndexName
());
if
(
value
.
equals
(
"true"
))
{
jsonObjectData
.
put
(
"value"
,
"1"
);
}
else
if
(
value
.
equals
(
"false"
))
{
jsonObjectData
.
put
(
"value"
,
"0"
);
}
else
{
jsonObjectData
.
put
(
"value"
,
value
);
}
jsonObjectData
.
put
(
"measurementType"
,
equipmentSpecificIndex
.
getEquipmentIndexKey
());
jsonObjectData
.
put
(
"dateTime"
,
date
);
jsonObjectData
.
put
(
"quality"
,
"0"
);
// 量测质量码:0 有效,1 无效
List
<
JSONObject
>
jsonObjects
=
Arrays
.
asList
(
jsonObjectData
);
jsonObjectXf
.
put
(
"data"
,
jsonObjects
);
try
{
emqKeeper
.
getMqttClient
().
publish
(
"emq.xf.created"
,
jsonObjectXf
.
toString
().
getBytes
(),
1
,
false
);
}
catch
(
MqttException
e
)
{
e
.
printStackTrace
();
}
}
}
});
...
...
amos-boot-module/amos-boot-module-biz/amos-boot-module-jcs-biz/src/main/java/com/yeejoin/amos/boot/module/jcs/biz/controller/FirefightersController.java
View file @
c900e534
...
...
@@ -519,12 +519,13 @@ public class FirefightersController extends BaseController {
firefightersQueryWrapper1
.
like
(
"biz_org_code"
,
bizOrgCode
);
firefightersQueryWrapper1
.
eq
(
"people_type"
,
"1601"
);
firefightersQueryWrapper1
.
eq
(
"is_delete"
,
"0"
);
String
companyName
=
iFirefightersService
.
getCompanyName
(
bizOrgCode
);
List
<
Firefighters
>
firefighters
=
iFirefightersService
.
getBaseMapper
().
selectList
(
firefightersQueryWrapper1
);
firefighters
.
stream
().
forEach
(
e
->
{
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
map
.
put
(
"name"
,
e
.
getName
());
map
.
put
(
"jobTitle"
,
e
.
getJobTitle
());
map
.
put
(
"bizOrgName"
,
e
.
getBizOrgName
()
);
map
.
put
(
"bizOrgName"
,
companyName
);
map
.
put
(
"bizOrgCode"
,
bizOrgCode
);
map
.
put
(
"amosUserId"
,
e
.
getOrgUsrId
());
map
.
put
(
"personnelPhotos"
,
e
.
getPersonnelPhotos
());
...
...
amos-boot-system-equip/src/main/resources/application-dev.properties
View file @
c900e534
...
...
@@ -111,3 +111,7 @@ equipment.scrap.cron=0 0 9 * * ?
equipment.pressurepump.start
=
FHS_PressurePump_Start
# 稳压泵停止信号
equipment.pressurepump.stop
=
FHS_PressurePump_Stop
# 站端标识
state.code
=
JP
state.name
=
NAME
\ No newline at end of file
amos-boot-system-equip/src/main/resources/mapper/EquipmentSpecificIndexMapper.xml
View file @
c900e534
...
...
@@ -47,9 +47,12 @@
wei.unit AS indexUnitName,
wes.org_code AS orgCode,
ed.`name` AS equipmentSpecificName,
ed.equipment_name AS equipmentName,
wes.iot_code AS iotCode,
wes.code AS specificCode,
wei.`name` AS equipmentSpecificIndexName,
wei.`value_enum` AS valueEnum,
wei.is_trend AS isTrend,
wes.qr_code AS qrCode,
wesi.update_date AS updateDate,
ed.code AS equipmentCode,
...
...
amos-boot-utils/amos-boot-utils-message/src/main/resources/application-roma.properties
View file @
c900e534
...
...
@@ -101,7 +101,7 @@ emqx.max-inflight=1000
# 下面个配置默认站端 中心级系统的时候注释掉上边 放开下边
#站端配置
#需要监听得kafka消息主题 根据是否是中心极和站端选择需要监听得主题进行配置
kafka.topics
=
null.t
opic
kafka.topics
=
JKXT2BP-XF-T
opic
#需要监听得eqm消息主题 根据是否是中心极和站端选择需要监听得主题进行配置 emq.iot.created,
emq.topic
=
emq.xf.created,emq.iot.created,emq.patrol.created,emq.sign.created,emq.bussSign.created,emq.user.created
...
...
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