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
33a43393
Commit
33a43393
authored
May 21, 2024
by
suhuiguang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
1.需求J071
parent
bc6bb636
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
382 additions
and
284 deletions
+382
-284
JyjcInspectionResult.java
...mos/boot/module/jyjc/api/entity/JyjcInspectionResult.java
+7
-0
JyjcBaseMapper.java
...join/amos/boot/module/jyjc/api/mapper/JyjcBaseMapper.java
+9
-0
JyjcInspectionResultModel.java
...boot/module/jyjc/api/model/JyjcInspectionResultModel.java
+5
-0
NeedTipEquipInfo.java
...oin/amos/boot/module/jyjc/api/model/NeedTipEquipInfo.java
+105
-0
JyjcBaseMapper.xml
...ule-jyjc-api/src/main/resources/mapper/JyjcBaseMapper.xml
+16
-0
CommonController.java
...mos/boot/module/jyjc/biz/controller/CommonController.java
+12
-12
InspectionExpireRemindJob.java
...s/boot/module/jyjc/biz/job/InspectionExpireRemindJob.java
+181
-0
CommonserviceImpl.java
.../boot/module/jyjc/biz/service/impl/CommonserviceImpl.java
+8
-123
EquipRegularlyRemindServicelmpl.java
...yjc/biz/service/impl/EquipRegularlyRemindServicelmpl.java
+0
-130
TzsUserInfoDto.java
.../yeejoin/amos/boot/module/ymt/api/dto/TzsUserInfoDto.java
+6
-0
UseInfoModel.java
...om/yeejoin/amos/boot/module/ymt/api/dto/UseInfoModel.java
+15
-0
TzsUserInfoMapper.java
...in/amos/boot/module/ymt/api/mapper/TzsUserInfoMapper.java
+3
-0
UseInfoMapper.java
...eejoin/amos/boot/module/ymt/api/mapper/UseInfoMapper.java
+2
-1
UseInfoMapper.xml
...odule-ymt-api/src/main/resources/mapper/UseInfoMapper.xml
+13
-18
No files found.
amos-boot-system-tzs/amos-boot-module-jyjc/amos-boot-module-jyjc-api/src/main/java/com/yeejoin/amos/boot/module/jyjc/api/entity/JyjcInspectionResult.java
View file @
33a43393
...
...
@@ -208,4 +208,11 @@ public class JyjcInspectionResult extends BaseEntity {
*/
@TableField
(
value
=
"is_exist_nc"
)
private
Boolean
isExistNc
;
/**
* 安全等级
*/
@TableField
(
value
=
"safety_level"
)
private
String
safetyLevel
;
}
amos-boot-system-tzs/amos-boot-module-jyjc/amos-boot-module-jyjc-api/src/main/java/com/yeejoin/amos/boot/module/jyjc/api/mapper/JyjcBaseMapper.java
View file @
33a43393
package
com
.
yeejoin
.
amos
.
boot
.
module
.
jyjc
.
api
.
mapper
;
import
com.yeejoin.amos.boot.module.ymt.api.dto.TzBaseUnitLicenceDto
;
import
com.yeejoin.amos.boot.module.ymt.api.dto.TzsUserInfoDto
;
import
com.yeejoin.amos.feign.privilege.model.AgencyUserModel
;
import
org.apache.ibatis.annotations.MapKey
;
import
org.apache.ibatis.annotations.Mapper
;
import
org.apache.ibatis.annotations.Param
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Set
;
/**
* Mapper 接口
...
...
@@ -11,6 +17,7 @@ import java.util.Map;
* @author system_generator
* @date 2023-12-13
*/
@Mapper
public
interface
JyjcBaseMapper
{
List
<
TzBaseUnitLicenceDto
>
selectBaseUnitLicenceList
(
Map
<
String
,
Object
>
params
);
...
...
@@ -21,4 +28,6 @@ public interface JyjcBaseMapper {
String
selectBusinessData
(
String
tableName
,
String
instanceId
,
String
key
);
void
updateBusinessData
(
String
tableName
,
String
assignee
,
String
transferToUserIds
,
String
instanceId
,
String
nextTaskId
,
String
key
);
List
<
TzsUserInfoDto
>
selectParentOrgUsers
(
@Param
(
"parentOrgCodeList"
)
Set
<
String
>
parentOrgCodeList
);
}
amos-boot-system-tzs/amos-boot-module-jyjc/amos-boot-module-jyjc-api/src/main/java/com/yeejoin/amos/boot/module/jyjc/api/model/JyjcInspectionResultModel.java
View file @
33a43393
...
...
@@ -171,4 +171,9 @@ public class JyjcInspectionResultModel extends BaseModel {
* 是否存在不符合项
*/
private
Boolean
isExistNc
;
/**
* 安全等级
*/
private
String
safetyLevel
;
}
amos-boot-system-tzs/amos-boot-module-jyjc/amos-boot-module-jyjc-api/src/main/java/com/yeejoin/amos/boot/module/jyjc/api/model/NeedTipEquipInfo.java
0 → 100644
View file @
33a43393
package
com
.
yeejoin
.
amos
.
boot
.
module
.
jyjc
.
api
.
model
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.Getter
;
import
java.util.Arrays
;
import
java.util.Optional
;
import
java.util.Set
;
/**
* @author Administrator
*/
@Data
public
class
NeedTipEquipInfo
{
/**
* 设备唯一标识
*/
private
String
record
;
/**
* 单位信用代码
*/
private
String
useUnitCreditCode
;
private
String
nextInspectDate
;
/**
* 设备代码
*/
private
String
equCode
;
/**
* 设备种类code
*/
private
String
equList
;
/**
* 设备种类名称
*/
private
String
equListName
;
/**
* 直接管辖机构
*/
private
String
orgBranchCode
;
/**
* 上级管辖机构
*/
private
Set
<
String
>
parentOrgBranchCode
;
/**
* 设备提醒可看见的人
*/
private
Set
<
String
>
receiveUsers
;
/**
* 设备提醒可看见的人-字符串
*/
private
String
receiveUserStr
;
/**
* 状态:1-超期;2-临期
*/
private
String
status
;
@AllArgsConstructor
@Getter
private
enum
EquipStatusEnum
{
/**
* 预警枚举
*/
cq
(
"1"
,
"临期预警"
,
"【%s】【%s】设备检验有效期即将到期"
),
lq
(
"2"
,
"超期预警"
,
"【%s】【%s】设备检验有效期已超期"
);
/**
* code
*/
private
String
code
;
private
String
title
;
private
String
template
;
public
static
EquipStatusEnum
getContentByCode
(
String
code
)
{
Optional
<
EquipStatusEnum
>
op
=
Arrays
.
stream
(
EquipStatusEnum
.
values
()).
filter
(
e
->
e
.
code
.
equals
(
code
)).
findFirst
();
return
op
.
orElse
(
null
);
}
}
public
String
getTitle
()
{
return
EquipStatusEnum
.
getContentByCode
(
this
.
status
).
getTitle
();
}
public
String
getContent
()
{
String
template
=
EquipStatusEnum
.
getContentByCode
(
this
.
status
).
getTemplate
();
return
String
.
format
(
template
,
this
.
equListName
,
this
.
getEquCode
());
}
}
amos-boot-system-tzs/amos-boot-module-jyjc/amos-boot-module-jyjc-api/src/main/resources/mapper/JyjcBaseMapper.xml
View file @
33a43393
...
...
@@ -36,6 +36,22 @@
from ${tableName}
where ${key} = #{instanceId}
</select>
<select
id=
"selectParentOrgUsers"
resultType=
"com.yeejoin.amos.boot.module.ymt.api.dto.TzsUserInfoDto"
>
SELECT
group_concat(u.user_id) as amos_user_id,
c.org_code as org_code
FROM
"privilege_user_org_role" u,
privilege_company c
WHERE
u.company_seq = c.sequence_nbr
and
c.org_code in
<foreach
collection=
"parentOrgCodeList"
item=
"orgCode"
open=
"("
close=
")"
separator=
","
>
#{orgCode}
</foreach>
GROUP BY c.org_code
</select>
</mapper>
amos-boot-system-tzs/amos-boot-module-jyjc/amos-boot-module-jyjc-biz/src/main/java/com/yeejoin/amos/boot/module/jyjc/biz/controller/CommonController.java
View file @
33a43393
...
...
@@ -3,10 +3,9 @@ package com.yeejoin.amos.boot.module.jyjc.biz.controller;
import
com.baomidou.mybatisplus.core.toolkit.CollectionUtils
;
import
com.baomidou.mybatisplus.core.toolkit.StringUtils
;
import
com.yeejoin.amos.boot.biz.common.controller.BaseController
;
import
com.yeejoin.amos.boot.module.
common.biz.utils.CommonResponseUtil
;
import
com.yeejoin.amos.boot.module.
jyjc.biz.job.InspectionExpireRemindJob
;
import
com.yeejoin.amos.boot.module.jyjc.biz.service.TaskModelServiceImpl
;
import
com.yeejoin.amos.boot.module.jyjc.biz.service.impl.CommonserviceImpl
;
import
com.yeejoin.amos.boot.module.jyjc.biz.service.impl.EquipRegularlyRemindServicelmpl
;
import
com.yeejoin.amos.boot.module.ymt.api.dto.TzBaseEnterpriseInfoDto
;
import
com.yeejoin.amos.boot.module.ymt.api.entity.TzBaseEnterpriseInfo
;
import
com.yeejoin.amos.boot.module.ymt.api.entity.TzsUserInfo
;
...
...
@@ -38,10 +37,12 @@ public class CommonController extends BaseController {
@Autowired
CommonserviceImpl
commonserviceImpl
;
@Autowired
TaskModelServiceImpl
taskModelService
;
@Autowired
EquipRegularlyRemindServicelmpl
equipRegularlyRemindServicelmpl
;
InspectionExpireRemindJob
regularlyRemindJob
;
private
final
static
String
SBZL_DICT_PRIFIX
=
"JYJC_SBZL"
;
...
...
@@ -127,15 +128,6 @@ public class CommonController extends BaseController {
}
@TycloudOperation
(
ApiLevel
=
UserType
.
AGENCY
)
@GetMapping
(
value
=
"/test1"
)
@ApiOperation
(
httpMethod
=
"GET"
,
value
=
"查询检验检测机构基本信息"
,
notes
=
"查询检验检测机构基本信息"
)
public
ResponseModel
sendReminderMessage
()
{
equipRegularlyRemindServicelmpl
.
sendReminderMessage
();
return
CommonResponseUtil
.
success
();
}
/**
* 公共转办接口
* /common/transfer
...
...
@@ -180,4 +172,12 @@ public class CommonController extends BaseController {
String
dictCode
=
String
.
format
(
"%s_%s"
,
SBZL_DICT_PRIFIX
,
bizType
);
return
ResponseHelper
.
buildResponse
(
Systemctl
.
dictionarieClient
.
dictValues
(
dictCode
).
getResult
());
}
@ApiOperation
(
httpMethod
=
"PUT"
,
value
=
"检验消息提醒"
,
notes
=
"检验消息提醒"
)
@PutMapping
(
value
=
"/test-tip"
)
@TycloudOperation
(
ApiLevel
=
UserType
.
AGENCY
,
needAuth
=
false
)
public
ResponseModel
<
String
>
testMsgTip
(){
regularlyRemindJob
.
sendReminderMessage
();
return
ResponseHelper
.
buildResponse
(
"succese"
);
}
}
amos-boot-system-tzs/amos-boot-module-jyjc/amos-boot-module-jyjc-biz/src/main/java/com/yeejoin/amos/boot/module/jyjc/biz/job/InspectionExpireRemindJob.java
0 → 100644
View file @
33a43393
package
com
.
yeejoin
.
amos
.
boot
.
module
.
jyjc
.
biz
.
job
;
import
cn.hutool.core.bean.BeanUtil
;
import
com.alibaba.fastjson.JSONObject
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.yeejoin.amos.boot.biz.common.entity.BaseEntity
;
import
com.yeejoin.amos.boot.module.jyjc.api.mapper.JyjcBaseMapper
;
import
com.yeejoin.amos.boot.module.jyjc.api.model.NeedTipEquipInfo
;
import
com.yeejoin.amos.boot.module.ymt.api.dto.TzsUserInfoDto
;
import
com.yeejoin.amos.boot.module.ymt.api.dto.UseInfoModel
;
import
com.yeejoin.amos.boot.module.ymt.api.entity.TzsUserInfo
;
import
com.yeejoin.amos.boot.module.ymt.api.enums.EquimentEnum
;
import
com.yeejoin.amos.boot.module.ymt.api.mapper.TzsUserInfoMapper
;
import
com.yeejoin.amos.boot.module.ymt.api.mapper.UseInfoMapper
;
import
com.yeejoin.amos.component.robot.AmosRequestContext
;
import
com.yeejoin.amos.feign.systemctl.Systemctl
;
import
com.yeejoin.amos.feign.systemctl.model.MessageModel
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.stereotype.Service
;
import
org.typroject.tyboot.core.foundation.context.RequestContext
;
import
java.util.*
;
import
java.util.stream.Collectors
;
/**
* @author Administrator
*/
@Service
@Slf4j
public
class
InspectionExpireRemindJob
{
private
static
Map
<
String
,
String
>
EQU_LIST_MAP
=
new
HashMap
<>();
static
{
EQU_LIST_MAP
.
put
(
"9000"
,
"客运索道"
);
EQU_LIST_MAP
.
put
(
"7000"
,
"压力管道元件"
);
EQU_LIST_MAP
.
put
(
"6000"
,
"大型游乐设施"
);
EQU_LIST_MAP
.
put
(
"2000"
,
"压力容器"
);
EQU_LIST_MAP
.
put
(
"F000"
,
"安全附件"
);
EQU_LIST_MAP
.
put
(
"5000"
,
"场(厂)内专用机动车辆"
);
EQU_LIST_MAP
.
put
(
"1000"
,
"锅炉"
);
EQU_LIST_MAP
.
put
(
"8000"
,
"压力管道"
);
EQU_LIST_MAP
.
put
(
"3000"
,
"电梯"
);
EQU_LIST_MAP
.
put
(
"4000"
,
"起重机械"
);
}
private
UseInfoMapper
useInfoMapper
;
private
TzsUserInfoMapper
tzsUserInfoMapper
;
private
AmosRequestContext
amosRequestContext
;
private
JyjcBaseMapper
jyjcBaseMapper
;
public
InspectionExpireRemindJob
(
UseInfoMapper
useInfoMapper
,
TzsUserInfoMapper
tzsUserInfoMapper
,
AmosRequestContext
amosRequestContext
,
JyjcBaseMapper
jyjcBaseMapper
)
{
this
.
useInfoMapper
=
useInfoMapper
;
this
.
tzsUserInfoMapper
=
tzsUserInfoMapper
;
this
.
amosRequestContext
=
amosRequestContext
;
this
.
jyjcBaseMapper
=
jyjcBaseMapper
;
}
public
void
sendReminderMessage
()
{
// 1.查询临期和超期的设备
List
<
NeedTipEquipInfo
>
needTipEquipList
=
getNeedTipEquipList
();
// 2.填充接收人【查询设备的使用单位企业所有人(有amos账号)、设备的管辖机构(所、区县、地市、省)】
this
.
fillReceiveUsers
(
needTipEquipList
);
// 3.按照设备维度创建提醒消息,批量调用平台
this
.
createTask
(
needTipEquipList
);
}
private
List
<
NeedTipEquipInfo
>
getNeedTipEquipList
()
{
// 查询需要进行消息提醒的设备集合
List
<
String
>
statusList
=
new
ArrayList
<>();
statusList
.
add
(
EquimentEnum
.
ZAIYONG
.
getCode
().
toString
());
List
<
UseInfoModel
>
needTipEquipList
=
useInfoMapper
.
selecEquipInfotList
(
statusList
,
30
);
// 对象转换及管辖机构集合填充
return
this
.
buildTipEquipInfoList
(
needTipEquipList
);
}
private
void
fillReceiveUsers
(
List
<
NeedTipEquipInfo
>
needTipEquipList
)
{
// 使用单位
List
<
String
>
allUnitCodes
=
needTipEquipList
.
stream
().
map
(
NeedTipEquipInfo:
:
getUseUnitCreditCode
).
distinct
().
collect
(
Collectors
.
toList
());
// 查询使用单位下的人-数据库-批量查询
List
<
TzsUserInfo
>
useUnitUserList
=
this
.
getUseUnitUserList
(
allUnitCodes
);
// 查询管辖单位下的人-数据库-批量查询
List
<
TzsUserInfoDto
>
superviseUnitUserList
=
this
.
getSuperviseUnitUserList
(
needTipEquipList
);
// 以设备为维度,把 需要发送消息的人进行合并
needTipEquipList
.
forEach
(
e
->
{
e
.
setReceiveUsers
(
useUnitUserList
.
stream
().
filter
(
u
->
e
.
getUseUnitCreditCode
().
equals
(
u
.
getUnitCode
())).
map
(
TzsUserInfo:
:
getAmosUserId
).
collect
(
Collectors
.
toSet
()));
e
.
getReceiveUsers
().
addAll
(
superviseUnitUserList
.
stream
().
filter
(
u
->
e
.
getParentOrgBranchCode
().
contains
(
u
.
getOrgCode
())).
map
(
TzsUserInfoDto:
:
getAmosUserId
).
collect
(
Collectors
.
toSet
()));
});
// 人员去重,字符串可能为:元素1:8551496,8551496,8551496,元素2:8551496,8551497,需要转为8551496、8551497
needTipEquipList
.
forEach
(
e
->
{
Set
<
String
>
userIds
=
new
HashSet
<>();
e
.
getReceiveUsers
().
forEach
(
item
->
{
userIds
.
addAll
(
Arrays
.
asList
(
item
.
split
(
","
)));
});
e
.
setReceiveUsers
(
userIds
);
});
}
private
List
<
TzsUserInfoDto
>
getSuperviseUnitUserList
(
List
<
NeedTipEquipInfo
>
needTipEquipList
)
{
Set
<
String
>
allParentOrgCodes
=
new
HashSet
<>();
needTipEquipList
.
forEach
(
e
->
allParentOrgCodes
.
addAll
(
e
.
getParentOrgBranchCode
()));
return
jyjcBaseMapper
.
selectParentOrgUsers
(
allParentOrgCodes
);
}
private
List
<
TzsUserInfo
>
getUseUnitUserList
(
List
<
String
>
allUnitCodes
)
{
LambdaQueryWrapper
<
TzsUserInfo
>
queryWrapper
=
new
LambdaQueryWrapper
<>();
queryWrapper
.
select
(
TzsUserInfo:
:
getAmosUserId
,
TzsUserInfo:
:
getUnitCode
);
queryWrapper
.
in
(
TzsUserInfo:
:
getUnitCode
,
allUnitCodes
);
queryWrapper
.
eq
(
BaseEntity:
:
getIsDelete
,
false
);
queryWrapper
.
isNotNull
(
TzsUserInfo:
:
getAmosUserId
);
return
tzsUserInfoMapper
.
selectList
(
queryWrapper
);
}
private
List
<
NeedTipEquipInfo
>
buildTipEquipInfoList
(
List
<
UseInfoModel
>
needTipEquipList
)
{
return
needTipEquipList
.
stream
().
map
(
c
->
{
NeedTipEquipInfo
tipEquipInfo
=
new
NeedTipEquipInfo
();
BeanUtil
.
copyProperties
(
c
,
tipEquipInfo
);
Set
<
String
>
parentUnitCodes
=
new
HashSet
<>();
int
index
=
tipEquipInfo
.
getOrgBranchCode
().
lastIndexOf
(
"*"
);
if
(
index
>=
0
)
{
parentUnitCodes
.
add
(
tipEquipInfo
.
getOrgBranchCode
().
substring
(
0
,
index
));
setPatentCode
(
parentUnitCodes
,
tipEquipInfo
.
getOrgBranchCode
().
substring
(
0
,
index
));
}
tipEquipInfo
.
setEquListName
(
EQU_LIST_MAP
.
get
(
tipEquipInfo
.
getEquList
()));
tipEquipInfo
.
setParentOrgBranchCode
(
parentUnitCodes
);
return
tipEquipInfo
;
}).
collect
(
Collectors
.
toList
());
}
private
void
setPatentCode
(
Set
<
String
>
parentUnitCodes
,
String
current
)
{
int
index
=
current
.
lastIndexOf
(
"*"
);
if
(
index
>=
0
)
{
parentUnitCodes
.
add
(
current
.
substring
(
0
,
index
));
setPatentCode
(
parentUnitCodes
,
current
.
substring
(
0
,
index
));
}
}
private
void
createTask
(
List
<
NeedTipEquipInfo
>
needTipEquipList
)
{
List
<
MessageModel
>
messageModels
=
new
LinkedList
<>();
needTipEquipList
.
parallelStream
().
forEach
(
e
->
messageModels
.
add
(
this
.
buildTaskModel
(
e
)));
messageModels
.
forEach
(
m
->
{
RequestContext
.
setToken
(
amosRequestContext
.
getToken
());
RequestContext
.
setProduct
(
amosRequestContext
.
getProduct
());
RequestContext
.
setAppKey
(
amosRequestContext
.
getAppKey
());
log
.
info
(
"开始调用平台创建消息:{}"
,
JSONObject
.
toJSONString
(
m
));
Systemctl
.
messageClient
.
create
(
m
);
});
}
private
MessageModel
buildTaskModel
(
NeedTipEquipInfo
e
)
{
MessageModel
messageModel
=
new
MessageModel
();
// 消息类型
messageModel
.
setTitle
(
e
.
getTitle
());
// 消息内容
messageModel
.
setBody
(
e
.
getContent
());
// 关联id
messageModel
.
setRelationId
(
e
.
getRecord
());
messageModel
.
setMsgType
(
e
.
getStatus
());
messageModel
.
setMsgTypeLabel
(
e
.
getTitle
());
messageModel
.
setRecivers
(
new
ArrayList
<>(
e
.
getReceiveUsers
()));
messageModel
.
setAgencyCode
(
"tzs"
);
messageModel
.
setSendTime
(
new
Date
());
messageModel
.
setTerminal
(
"WEB"
);
return
messageModel
;
}
}
amos-boot-system-tzs/amos-boot-module-jyjc/amos-boot-module-jyjc-biz/src/main/java/com/yeejoin/amos/boot/module/jyjc/biz/service/impl/CommonserviceImpl.java
View file @
33a43393
...
...
@@ -4,7 +4,6 @@ import cn.hutool.core.util.StrUtil;
import
com.alibaba.fastjson.JSONObject
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.toolkit.CollectionUtils
;
import
com.yeejoin.amos.boot.biz.common.bo.ReginParams
;
import
com.yeejoin.amos.boot.biz.common.entity.BaseEntity
;
import
com.yeejoin.amos.boot.biz.common.utils.RedisKey
;
...
...
@@ -13,28 +12,17 @@ import com.yeejoin.amos.boot.module.jyjc.api.enums.OpenBizTypeEnum;
import
com.yeejoin.amos.boot.module.ymt.api.dto.TzBaseEnterpriseInfoDto
;
import
com.yeejoin.amos.boot.module.ymt.api.entity.TzBaseEnterpriseInfo
;
import
com.yeejoin.amos.boot.module.ymt.api.entity.TzsUserInfo
;
import
com.yeejoin.amos.boot.module.ymt.api.enums.FlowStatusEnum
;
import
com.yeejoin.amos.boot.module.ymt.api.mapper.TzBaseEnterpriseInfoMapper
;
import
com.yeejoin.amos.boot.module.ymt.api.mapper.TzsUserInfoMapper
;
import
com.yeejoin.amos.feign.privilege.Privilege
;
import
com.yeejoin.amos.feign.privilege.model.AgencyUserModel
;
import
com.yeejoin.amos.feign.systemctl.Systemctl
;
import
com.yeejoin.amos.feign.systemctl.model.TaskV2Model
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.scheduling.annotation.Async
;
import
org.springframework.stereotype.Service
;
import
org.typroject.tyboot.core.foundation.context.RequestContext
;
import
java.io.UnsupportedEncodingException
;
import
java.lang.reflect.Field
;
import
java.lang.reflect.Modifier
;
import
java.net.URLEncoder
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.stream.Collectors
;
@Service
public
class
CommonserviceImpl
{
...
...
@@ -55,8 +43,6 @@ public class CommonserviceImpl {
RedisUtils
redisUtils
;
@Autowired
TzsUserInfoMapper
userInfoMapper
;
@Autowired
private
WorkflowHelper
workflowHelper
;
@Autowired
TzBaseEnterpriseInfoMapper
enterpriseInfoMapper
;
...
...
@@ -66,18 +52,16 @@ public class CommonserviceImpl {
* @return ReginParams
* @description 获取当前用户注册信息
*/
public
ReginParams
getReginParamsOfCurrentUser
()
{
ReginParams
reginParams
=
JSONObject
.
parseObject
(
redisUtils
.
get
(
RedisKey
.
buildReginKey
(
RequestContext
.
getExeUserId
(),
RequestContext
.
getToken
())).
toString
(),
ReginParams
.
class
);
return
reginParams
;
ReginParams
getReginParamsOfCurrentUser
()
{
return
JSONObject
.
parseObject
(
redisUtils
.
get
(
RedisKey
.
buildReginKey
(
RequestContext
.
getExeUserId
(),
RequestContext
.
getToken
())).
toString
(),
ReginParams
.
class
);
}
public
List
<
TzsUserInfo
>
getUserInfosByUnitCode
(
String
unitCode
)
{
QueryWrapper
userInfoQueryWrapper
=
new
QueryWrapper
<>();
userInfoQueryWrapper
.
eq
(
"unit_code"
,
unitCode
);
userInfoQueryWrapper
.
like
(
"post"
,
jyjcUserPost
);
userInfoQueryWrapper
.
eq
(
"is_delete"
,
false
);
List
<
TzsUserInfo
>
userInfos
=
userInfoMapper
.
selectList
(
userInfoQueryWrapper
);
return
userInfos
;
LambdaQueryWrapper
<
TzsUserInfo
>
userInfoQueryWrapper
=
new
LambdaQueryWrapper
<>();
userInfoQueryWrapper
.
eq
(
TzsUserInfo:
:
getUnitCode
,
unitCode
);
userInfoQueryWrapper
.
like
(
TzsUserInfo:
:
getPost
,
jyjcUserPost
);
userInfoQueryWrapper
.
eq
(
BaseEntity:
:
getIsDelete
,
false
);
return
userInfoMapper
.
selectList
(
userInfoQueryWrapper
);
}
public
List
<
TzsUserInfo
>
getUserListByUnitCodeAndPost
(
String
unitCode
,
String
personType
)
{
...
...
@@ -112,9 +96,7 @@ public class CommonserviceImpl {
List
<
String
>
ids
=
StrUtil
.
split
(
personCode
,
","
);
QueryWrapper
userInfoQueryWrapper
=
new
QueryWrapper
<>();
userInfoQueryWrapper
.
in
(
"sequence_nbr"
,
ids
);
List
<
TzsUserInfo
>
userInfos
=
userInfoMapper
.
selectList
(
userInfoQueryWrapper
);
return
userInfos
;
return
userInfoMapper
.
selectList
(
userInfoQueryWrapper
);
}
...
...
@@ -127,67 +109,6 @@ public class CommonserviceImpl {
}
public
void
buildTaskModel
(
Map
<
String
,
Object
>
params
)
{
TaskV2Model
model
=
new
TaskV2Model
();
//获取待办任务执行人
Map
<
String
,
Object
>
nextNodeInfo
=
workflowHelper
.
getNextWorkflowNode
(
params
.
get
(
"instanceId"
).
toString
());
String
role
=
(
String
)
nextNodeInfo
.
get
(
"role"
);
model
.
setExecuteUserIds
(
role
);
List
<
AgencyUserModel
>
userList
=
Privilege
.
agencyUserClient
.
queryByRoleId
(
role
,
null
,
false
).
getResult
();
List
<
String
>
userIds
=
userList
.
stream
().
map
(
AgencyUserModel:
:
getUserId
).
collect
(
Collectors
.
toList
());
model
.
setExecuteUserIds
(
CollectionUtils
.
isEmpty
(
userIds
)
?
""
:
String
.
join
(
","
,
userIds
));
model
.
setExtras
(
params
.
getOrDefault
(
"extras"
,
""
).
toString
());
model
.
setRelationId
(
params
.
getOrDefault
(
"instanceId"
,
""
).
toString
());
model
.
setRoutePath
(
params
.
getOrDefault
(
"routePath"
,
""
).
toString
());
model
.
setStartDate
((
Date
)
params
.
getOrDefault
(
"startDate"
,
""
));
model
.
setStartUserId
(
params
.
getOrDefault
(
"startUserId"
,
""
).
toString
());
model
.
setTaskContent
(
params
.
getOrDefault
(
"taskContent"
,
""
).
toString
());
model
.
setTaskType
(
params
.
getOrDefault
(
"taskType"
,
""
).
toString
());
model
.
setTaskTypeLabel
(
params
.
getOrDefault
(
"taskTypeLabel"
,
""
).
toString
());
model
.
setTaskTitle
(
params
.
getOrDefault
(
"taskTitle"
,
""
).
toString
());
model
.
setTaskName
(
params
.
getOrDefault
(
"taskName"
,
""
).
toString
());
model
.
setTaskStatus
(
Integer
.
valueOf
(
params
.
getOrDefault
(
"taskStatus"
,
0
).
toString
()));
model
.
setTaskStatusLabel
(
params
.
getOrDefault
(
"taskStatusLabel"
,
""
).
toString
());
model
.
setTaskSource
(
params
.
getOrDefault
(
"taskSource"
,
"workFlow"
).
toString
());
// model.setTerminal(params.getOrDefault("terminal","WEB").toString());
model
.
setCreateDate
(
new
Date
());
//model.setFinishStatus(false);
model
.
setTaskCode
(
params
.
get
(
"taskCode"
).
toString
());
model
.
setRecUserId
(
params
.
get
(
"userId"
).
toString
());
model
.
setAgencyCode
(
params
.
get
(
"agencyCode"
).
toString
());
Systemctl
.
taskV2Client
.
create
(
model
);
}
public
TaskV2Model
updateTaskModel
(
Map
<
String
,
Object
>
params
)
{
ReginParams
reginParams
=
JSONObject
.
parseObject
(
redisUtils
.
get
(
RedisKey
.
buildReginKey
(
RequestContext
.
getExeUserId
(),
RequestContext
.
getToken
())).
toString
(),
ReginParams
.
class
);
List
<
TaskV2Model
>
result
=
Systemctl
.
taskV2Client
.
selectListByRelationId
(
params
.
get
(
"relationId"
).
toString
()).
getResult
();
TaskV2Model
model
=
result
.
stream
().
sorted
((
r1
,
r2
)
->
r2
.
getCreateDate
().
compareTo
(
r1
.
getCreateDate
()))
// 按时间降序排序
.
findFirst
()
.
orElse
(
null
);
model
.
setTaskStatus
(
Integer
.
valueOf
(
params
.
get
(
"taskStatus"
).
toString
()));
model
.
setTaskStatusLabel
(
params
.
get
(
"taskStatusLabel"
).
toString
());
model
.
setEndUserId
(
reginParams
.
getUserModel
().
getUserId
());
model
.
setEndDate
(
new
Date
());
model
.
setRoutePath
(
model
.
getRoutePath
().
replace
(
"roleIds"
,
"role"
).
replace
(
"edit"
,
"look"
));
//model.setFinishStatus(true);
Systemctl
.
taskV2Client
.
update
(
model
,
model
.
getSequenceNbr
());
//修改model并返回 用于组装新待办
model
.
setEndUserId
(
null
);
model
.
setTaskStatus
(
null
);
model
.
setEndDate
(
null
);
model
.
setSequenceNbr
(
null
);
//model.setCreateUserId(reginParams.getUserModel().getUserId());
model
.
setCreateDate
(
new
Date
());
model
.
setTaskStatus
(
FlowStatusEnum
.
REJECTED
.
getCode
());
model
.
setTaskStatusLabel
(
FlowStatusEnum
.
REJECTED
.
getName
());
model
.
setStartDate
(
new
Date
());
return
model
;
}
@Async
public
void
sendMessage
(
HashMap
<
String
,
String
>
smsParams
,
List
<
String
>
phones
)
{
for
(
String
phone
:
phones
)
{
...
...
@@ -196,40 +117,4 @@ public class CommonserviceImpl {
}
}
public
void
deleteTaskModel
(
String
id
)
{
List
<
TaskV2Model
>
result
=
Systemctl
.
taskV2Client
.
selectListByRelationId
(
id
).
getResult
();
TaskV2Model
model
=
result
.
stream
().
sorted
((
r1
,
r2
)
->
r2
.
getCreateDate
().
compareTo
(
r1
.
getCreateDate
()))
// 按时间降序排序
.
findFirst
()
.
orElse
(
null
);
Systemctl
.
taskV2Client
.
delete
(
String
.
valueOf
(
model
.
getSequenceNbr
()));
}
public
<
T
>
String
toQueryParams
(
T
obj
)
throws
UnsupportedEncodingException
{
StringBuilder
sb
=
new
StringBuilder
();
for
(
Class
<?>
clazz
=
obj
.
getClass
();
!
clazz
.
equals
(
Object
.
class
);
clazz
=
clazz
.
getSuperclass
())
{
Field
[]
fields
=
clazz
.
getDeclaredFields
();
for
(
Field
field
:
fields
)
{
if
(!
Modifier
.
isStatic
(
field
.
getModifiers
()))
{
field
.
setAccessible
(
true
);
try
{
Object
value
=
field
.
get
(
obj
);
if
(
value
!=
null
&&
!
""
.
equals
(
value
))
{
String
encodedValue
=
URLEncoder
.
encode
(
value
.
toString
(),
"UTF-8"
);
sb
.
append
(
field
.
getName
()).
append
(
'='
).
append
(
encodedValue
).
append
(
'&'
);
}
}
catch
(
IllegalAccessException
e
)
{
throw
new
RuntimeException
(
e
);
}
}
}
}
return
sb
.
length
()
>
0
?
sb
.
substring
(
0
,
sb
.
length
()
-
1
)
:
""
;
}
}
amos-boot-system-tzs/amos-boot-module-jyjc/amos-boot-module-jyjc-biz/src/main/java/com/yeejoin/amos/boot/module/jyjc/biz/service/impl/EquipRegularlyRemindServicelmpl.java
deleted
100644 → 0
View file @
bc6bb636
package
com
.
yeejoin
.
amos
.
boot
.
module
.
jyjc
.
biz
.
service
.
impl
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.yeejoin.amos.boot.biz.common.utils.DateUtils
;
import
com.yeejoin.amos.boot.module.jyjc.api.enums.BizTypeEnum
;
import
com.yeejoin.amos.boot.module.ymt.api.common.StringUtil
;
import
com.yeejoin.amos.boot.module.ymt.api.dto.UseInfoModel
;
import
com.yeejoin.amos.boot.module.ymt.api.entity.TzsUserInfo
;
import
com.yeejoin.amos.boot.module.ymt.api.mapper.TzsUserInfoMapper
;
import
com.yeejoin.amos.boot.module.ymt.api.mapper.UseInfoMapper
;
import
com.yeejoin.amos.feign.systemctl.Systemctl
;
import
com.yeejoin.amos.feign.systemctl.model.MessageModel
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.scheduling.annotation.Async
;
import
org.springframework.scheduling.annotation.EnableScheduling
;
import
org.springframework.scheduling.annotation.Scheduled
;
import
org.springframework.stereotype.Service
;
import
java.text.ParseException
;
import
java.util.*
;
import
java.util.stream.Collectors
;
@EnableScheduling
@Service
@Slf4j
public
class
EquipRegularlyRemindServicelmpl
{
@Autowired
private
UseInfoMapper
useInfoMapper
;
@Autowired
private
TzsUserInfoMapper
tzsUserInfoMapper
;
@Autowired
CommonserviceImpl
commonservice
;
@Scheduled
(
cron
=
"${equip-hint:0 0 8 * * ?}"
)
public
void
sendReminderMessage
(){
//获取当前日期
String
currentDate
=
DateUtils
.
getDateNowShortStr
();
Date
curDate
=
null
;
try
{
curDate
=
DateUtils
.
dateParse
(
currentDate
,
null
);
}
catch
(
ParseException
e
)
{
e
.
printStackTrace
();
}
Date
date
=
DateUtils
.
dateAddDays
(
curDate
,
31
);
List
<
String
>
types
=
new
ArrayList
<>();
List
<
String
>
status
=
new
ArrayList
<>();
types
.
add
(
"DTJC"
);
types
.
add
(
"DQJY"
);
//查询需要发送消息的设备
// LambdaQueryWrapper<UseInfo> query = new LambdaQueryWrapper<>();
// query.in(UseInfo::getLastInspectType,types);
// query.in(UseInfo::getStatus,status);
// query.le(UseInfo::getNextInspectDate,date).or().ge(UseInfo::getNextInspectDate,currentDate);
// List<UseInfo> equips = useInfoMapper.selectList(query);
//
List
<
UseInfoModel
>
equips
=
useInfoMapper
.
selecEquipInfotList
(
types
,
status
,
date
,
curDate
);
//超期设备
List
<
UseInfoModel
>
cqEquip
=
new
ArrayList
<>();
//临期设备
List
<
UseInfoModel
>
lqEquip
=
new
ArrayList
<>();
for
(
UseInfoModel
equip
:
equips
)
{
//下次检验时间小于当前时间为超期 反之为临期
if
(
DateUtils
.
dateCompare
(
equip
.
getNextInspectDate
(),
curDate
)
<
0
){
cqEquip
.
add
(
equip
);
}
else
{
lqEquip
.
add
(
equip
);
}
}
Map
<
String
,
List
<
UseInfoModel
>>
cqEquips
=
cqEquip
.
stream
().
collect
(
Collectors
.
groupingBy
(
UseInfoModel:
:
getUseUnitCreditCode
));
Map
<
String
,
List
<
UseInfoModel
>>
lqEquips
=
lqEquip
.
stream
().
collect
(
Collectors
.
groupingBy
(
UseInfoModel:
:
getUseUnitCreditCode
));
for
(
String
s
:
cqEquips
.
keySet
())
{
//查询单位下共有多少超期及临期装备
List
<
UseInfoModel
>
useInfos
=
cqEquips
.
get
(
s
);
int
cq
=
useInfos
.
size
();
int
lq
=
lqEquips
.
containsKey
(
s
)?
lqEquips
.
get
(
s
).
size
():
0
;
//查询符合发送规则的人员电话
LambdaQueryWrapper
<
TzsUserInfo
>
queryWrapper
=
new
LambdaQueryWrapper
<>();
queryWrapper
.
like
(
TzsUserInfo:
:
getPost
,
"6552"
);
queryWrapper
.
isNotNull
(
TzsUserInfo:
:
getPhone
);
List
<
TzsUserInfo
>
tzsUserInfos
=
tzsUserInfoMapper
.
selectList
(
queryWrapper
);
List
<
String
>
phones
=
tzsUserInfos
.
stream
().
filter
(
e
->
StringUtil
.
isNotEmpty
(
e
.
getPhone
())).
map
(
TzsUserInfo:
:
getPhone
).
collect
(
Collectors
.
toList
());
List
<
String
>
userIds
=
tzsUserInfos
.
stream
().
filter
(
e
->
StringUtil
.
isNotEmpty
(
e
.
getAmosUserId
())).
map
(
TzsUserInfo:
:
getAmosUserId
).
collect
(
Collectors
.
toList
());
// 组装短信内容 发送短信
HashMap
<
String
,
String
>
smsParams
=
new
HashMap
<>();
smsParams
.
put
(
"smsCode"
,
"EQU_TZS_001"
);
smsParams
.
put
(
"lq"
,
String
.
valueOf
(
lq
));
smsParams
.
put
(
"cq"
,
String
.
valueOf
(
cq
));
commonservice
.
sendMessage
(
smsParams
,
phones
);
//发送平台消息
if
(
lqEquips
.
containsKey
(
s
)){
useInfos
.
addAll
(
lqEquips
.
get
(
s
));
}
for
(
UseInfoModel
useInfo
:
useInfos
)
{
Date
nextInspectDate
=
useInfo
.
getNextInspectDate
();
try
{
MessageModel
messageModel
=
new
MessageModel
();
messageModel
.
setCategory
(
1
);
//1 :消息通知
messageModel
.
setRelationId
(
useInfo
.
getRecord
());
int
day
=
DateUtils
.
dateBetween
(
nextInspectDate
,
curDate
);
int
day1
=
DateUtils
.
dateBetween
(
nextInspectDate
,
date
);
if
(
day
>
0
)
{
messageModel
.
setTitle
(
"设备超期提醒"
);
messageModel
.
setBody
(
useInfo
.
getProductName
()+
"("
+(
useInfo
.
getSupervisoryCode
()==
null
?
""
:
useInfo
.
getSupervisoryCode
()+
") 已超期"
+
Math
.
abs
(
day
)+
"天"
));
}
else
if
(
day1
>
0
){
messageModel
.
setTitle
(
"设备临期提醒"
);
messageModel
.
setBody
(
useInfo
.
getProductName
()+
"("
+(
useInfo
.
getSupervisoryCode
()==
null
?
""
:
useInfo
.
getSupervisoryCode
()+
") 还有"
+
Math
.
abs
(
day1
)+
"天将到期"
));
}
messageModel
.
setRecivers
(
userIds
);
messageModel
.
setIsSendWeb
(
true
);
messageModel
.
setMsgType
(
"EQUIP_HINT"
);
messageModel
.
setMsgTypeLabel
(
"设备检验"
);
Systemctl
.
messageClient
.
create
(
messageModel
);
log
.
info
(
"信息发送完成"
);
}
catch
(
ParseException
e
)
{
e
.
printStackTrace
();
}
}
}
}
}
amos-boot-system-tzs/amos-boot-module-ymt/amos-boot-module-ymt-api/src/main/java/com/yeejoin/amos/boot/module/ymt/api/dto/TzsUserInfoDto.java
View file @
33a43393
...
...
@@ -62,6 +62,12 @@ public class TzsUserInfoDto extends BaseDto {
@ApiModelProperty
(
value
=
"账户名"
)
private
String
amosUserName
;
@ApiModelProperty
(
value
=
"单位编码"
)
private
String
unitCode
;
@ApiModelProperty
(
value
=
"单位orgCode"
)
private
String
orgCode
;
@ApiModelProperty
(
value
=
"单位名称"
)
private
String
unitName
;
...
...
amos-boot-system-tzs/amos-boot-module-ymt/amos-boot-module-ymt-api/src/main/java/com/yeejoin/amos/boot/module/ymt/api/dto/UseInfoModel.java
View file @
33a43393
...
...
@@ -82,4 +82,19 @@ public class UseInfoModel extends BaseDto {
private
String
lastInspectType
;
private
String
record
;
/**
* 设备代码
*/
private
String
equCode
;
/**
* 设备种类
*/
private
String
equList
;
/**
* 管辖机构
*/
private
String
orgBranchCode
;
}
amos-boot-system-tzs/amos-boot-module-ymt/amos-boot-module-ymt-api/src/main/java/com/yeejoin/amos/boot/module/ymt/api/mapper/TzsUserInfoMapper.java
View file @
33a43393
...
...
@@ -6,6 +6,9 @@ import com.yeejoin.amos.boot.module.ymt.api.dto.TzsUserInfoDto;
import
com.yeejoin.amos.boot.module.ymt.api.entity.TzsUserInfo
;
import
org.apache.ibatis.annotations.Param
;
import
java.util.List
;
import
java.util.Set
;
public
interface
TzsUserInfoMapper
extends
BaseMapper
<
TzsUserInfo
>
{
Page
<
TzsUserInfoDto
>
selectPageMessage
(
@Param
(
"page"
)
Page
<
TzsUserInfoDto
>
page
,
@Param
(
"dto"
)
TzsUserInfoDto
dto
);
}
amos-boot-system-tzs/amos-boot-module-ymt/amos-boot-module-ymt-api/src/main/java/com/yeejoin/amos/boot/module/ymt/api/mapper/UseInfoMapper.java
View file @
33a43393
...
...
@@ -3,6 +3,7 @@ package com.yeejoin.amos.boot.module.ymt.api.mapper;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.yeejoin.amos.boot.module.ymt.api.dto.UseInfoModel
;
import
com.yeejoin.amos.boot.module.ymt.api.entity.UseInfo
;
import
org.apache.ibatis.annotations.Param
;
import
java.util.Date
;
import
java.util.List
;
...
...
@@ -15,7 +16,7 @@ import java.util.List;
*/
public
interface
UseInfoMapper
extends
BaseMapper
<
UseInfo
>
{
List
<
UseInfoModel
>
selecEquipInfotList
(
List
<
String
>
types
,
List
<
String
>
statusList
,
Date
date
,
Date
curDate
);
List
<
UseInfoModel
>
selecEquipInfotList
(
@Param
(
"statusList"
)
List
<
String
>
statusList
,
@Param
(
"interval"
)
int
interval
);
void
updateByRecord
(
String
record
,
Date
nextInspectDate
,
String
lastInspectType
,
String
lastInspectReportNo
);
}
amos-boot-system-tzs/amos-boot-module-ymt/amos-boot-module-ymt-api/src/main/resources/mapper/UseInfoMapper.xml
View file @
33a43393
...
...
@@ -15,33 +15,28 @@
<select
id=
"selecEquipInfotList"
resultType=
"com.yeejoin.amos.boot.module.ymt.api.dto.UseInfoModel"
>
SELECT
use.RECORD,
use.USE_UNIT_CREDIT_CODE,
other.SUPERVISORY_CODE as supervisoryCode,
register.PRODUCT_NAME as productName,
use.NEXT_INSPECT_DATE as nextInspectDate,
base.contact_phone as phone
use.RECORD,
use.USE_UNIT_CREDIT_CODE,
register.EQU_CODE,
register.EQU_LIST,
use.NEXT_INSPECT_DATE as nextInspectDate,
supervision.ORG_BRANCH_CODE,
CASE (NEXT_INSPECT_DATE > CURRENT_DATE)
WHEN true THEN 1
ELSE 2
END as status
FROM
idx_biz_jg_use_info use
LEFT JOIN idx_biz_jg_other_info other on other.RECORD = use.RECORD
LEFT JOIN idx_biz_jg_register_info register on register.RECORD = use.RECORD
LEFT JOIN idx_biz_jg_register_info register on register.RECORD = use.RECORD
LEFT JOIN idx_biz_jg_supervision_info supervision on supervision.RECORD = use.RECORD
LEFT JOIN privilege_company pc on pc.org_code = supervision.ORG_BRANCH_CODE
LEFT JOIN tz_base_enterprise_info base on base.use_code = pc.company_code
<where>
<if
test=
"statusList.size() > 0"
>
and
STATUS
in
and
EQU_STATE
in
<foreach
collection=
"statusList"
item=
"item"
open=
"("
close=
")"
separator=
","
>
#{item}
</foreach>
</if>
<if
test=
"types.size() > 0"
>
and LAST_INSPECT_TYPE in
<foreach
collection=
"types"
item=
"item"
open=
"("
close=
")"
separator=
","
>
#{item}
</foreach>
</if>
and (#{date} >= NEXT_INSPECT_DATE or #{curDate} > NEXT_INSPECT_DATE)
and (NEXT_INSPECT_DATE - CURRENT_DATE
<![CDATA[<=]]>
#{interval} or NEXT_INSPECT_DATE > CURRENT_DATE)
</where>
</select>
</mapper>
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