Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
Y
yifu-mvp
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
fangxinjiang
yifu-mvp
Commits
a1a8e758
Commit
a1a8e758
authored
Oct 09, 2023
by
fangxinjiang
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/MVP1.5.8' into MVP1.5.8
parents
db51ea9b
a9c7f27b
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
366 additions
and
108 deletions
+366
-108
ArchivesConstants.java
...ud/plus/v1/yifu/archives/constants/ArchivesConstants.java
+5
-0
EmployeeContractCheckVO.java
...oud/plus/v1/yifu/archives/vo/EmployeeContractCheckVO.java
+43
-0
TEmpContractAlertController.java
...yifu/archives/controller/TEmpContractAlertController.java
+14
-1
TEmpContractAlertService.java
...us/v1/yifu/archives/service/TEmpContractAlertService.java
+2
-0
TEmpContractAlertServiceImpl.java
...u/archives/service/impl/TEmpContractAlertServiceImpl.java
+285
-106
SysMenu.java
...om/yifu/cloud/plus/v1/yifu/permission/entity/SysMenu.java
+12
-0
SysMenuMapper.xml
...ermission-biz/src/main/resources/mapper/SysMenuMapper.xml
+5
-1
No files found.
yifu-archives/yifu-archives-api/src/main/java/com/yifu/cloud/plus/v1/yifu/archives/constants/ArchivesConstants.java
View file @
a1a8e758
...
...
@@ -163,4 +163,9 @@ public class ArchivesConstants {
* 合同之前
**/
public
static
final
String
CONTRACT_CREATE_TYPE
=
"合同之后"
;
public
static
final
String
CONTRACT_CHECK_CONSTANTS_IDCARD_1
=
"身份证"
;
public
static
final
String
CONTRACT_CHECK_CONSTANTS_IDCARD_2
=
" | 身份证"
;
public
static
final
String
CONTRACT_CHECK_CONSTANTS_NO
=
"合同申请编号:"
;
}
yifu-archives/yifu-archives-api/src/main/java/com/yifu/cloud/plus/v1/yifu/archives/vo/EmployeeContractCheckVO.java
0 → 100644
View file @
a1a8e758
/*
* Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the yifu4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
*/
package
com
.
yifu
.
cloud
.
plus
.
v1
.
yifu
.
archives
.
vo
;
import
com.alibaba.excel.annotation.ExcelProperty
;
import
com.alibaba.excel.annotation.write.style.ColumnWidth
;
import
com.alibaba.excel.annotation.write.style.HeadFontStyle
;
import
com.yifu.cloud.plus.v1.yifu.common.core.vo.RowIndex
;
import
lombok.Data
;
import
java.io.Serializable
;
/**
* 人员档案表excel导出对应的实体
*
* @author hgw
* @date 2022-6-24 15:15:24
*/
@Data
@ColumnWidth
(
10
)
public
class
EmployeeContractCheckVO
extends
RowIndex
implements
Serializable
{
private
static
final
long
serialVersionUID
=
1L
;
@ColumnWidth
(
20
)
@HeadFontStyle
(
fontHeightInPoints
=
11
)
@ExcelProperty
(
value
=
"身份证号"
)
private
String
empIdcard
;
}
yifu-archives/yifu-archives-biz/src/main/java/com/yifu/cloud/plus/v1/yifu/archives/controller/TEmpContractAlertController.java
View file @
a1a8e758
...
...
@@ -197,7 +197,7 @@ public class TEmpContractAlertController {
* 获取反馈日志详情
*
* @author wzb
* @param
id
* @param
applyNo
* @return {@link R}
*/
@Operation
(
summary
=
"获取反馈日志详情"
,
description
=
"获取反馈日志详情"
)
...
...
@@ -223,4 +223,17 @@ public class TEmpContractAlertController {
}
/**
* 员工合同续签原因排查
*
* @author fxj
* @date 2023-09-01 17:31:05
**/
@SneakyThrows
@Operation
(
description
=
"员工合同续签原因排查"
)
@SysLog
(
"员工合同续签原因排查"
)
@PostMapping
(
"/importListAdd"
)
public
R
<
List
<
ErrorMessage
>>
importListAdd
(
@RequestBody
MultipartFile
file
)
{
return
tEmpContractAlertService
.
importDiy
(
file
.
getInputStream
());
}
}
yifu-archives/yifu-archives-biz/src/main/java/com/yifu/cloud/plus/v1/yifu/archives/service/TEmpContractAlertService.java
View file @
a1a8e758
...
...
@@ -66,4 +66,6 @@ public interface TEmpContractAlertService extends IService<TEmpContractAlert> {
**/
R
<
List
<
EmpContractAlertUpdateVO
>>
batchUpdate
(
InputStream
inputStream
);
R
<
List
<
ErrorMessage
>>
importDiy
(
InputStream
inputStream
);
}
yifu-archives/yifu-archives-biz/src/main/java/com/yifu/cloud/plus/v1/yifu/archives/service/impl/TEmpContractAlertServiceImpl.java
View file @
a1a8e758
...
...
@@ -39,6 +39,7 @@ import com.yifu.cloud.plus.v1.yifu.archives.service.TEmpContractAlertService;
import
com.yifu.cloud.plus.v1.yifu.archives.vo.ChangeFeedBackAllVo
;
import
com.yifu.cloud.plus.v1.yifu.archives.vo.ContractAlertSearchVo
;
import
com.yifu.cloud.plus.v1.yifu.archives.vo.EmpContractAlertUpdateVO
;
import
com.yifu.cloud.plus.v1.yifu.archives.vo.EmployeeContractCheckVO
;
import
com.yifu.cloud.plus.v1.yifu.common.core.constant.CommonConstants
;
import
com.yifu.cloud.plus.v1.yifu.common.core.util.*
;
import
com.yifu.cloud.plus.v1.yifu.common.core.vo.YifuUser
;
...
...
@@ -68,7 +69,7 @@ import java.util.*;
@Service
public
class
TEmpContractAlertServiceImpl
extends
ServiceImpl
<
TEmpContractAlertMapper
,
TEmpContractAlert
>
implements
TEmpContractAlertService
{
private
final
TEmployeeContractInfoMapper
contractInfoMapper
;
private
final
TEmployeeContractInfoMapper
contractInfoMapper
;
private
final
TEmployeeInfoMapper
employeeInfoMapper
;
...
...
@@ -82,32 +83,32 @@ public class TEmpContractAlertServiceImpl extends ServiceImpl<TEmpContractAlertM
public
IPage
<
TEmpContractAlert
>
pageDiy
(
Page
page
,
ContractAlertSearchVo
searchVo
)
{
LambdaQueryWrapper
<
TEmpContractAlert
>
wrapper
=
buildQueryWrapper
(
searchVo
);
wrapper
.
isNotNull
(
TEmpContractAlert:
:
getId
);
if
(
Common
.
isNotNull
(
searchVo
.
getContractEndStart
())){
wrapper
.
ge
(
TEmpContractAlert:
:
getContractEnd
,
searchVo
.
getContractEndStart
());
if
(
Common
.
isNotNull
(
searchVo
.
getContractEndStart
()))
{
wrapper
.
ge
(
TEmpContractAlert:
:
getContractEnd
,
searchVo
.
getContractEndStart
());
}
if
(
Common
.
isNotNull
(
searchVo
.
getContractEndEnd
())){
wrapper
.
le
(
TEmpContractAlert:
:
getContractEnd
,
searchVo
.
getContractEndEnd
());
if
(
Common
.
isNotNull
(
searchVo
.
getContractEndEnd
()))
{
wrapper
.
le
(
TEmpContractAlert:
:
getContractEnd
,
searchVo
.
getContractEndEnd
());
}
if
(
Common
.
isNotNull
(
searchVo
.
getAuthSql
()))
{
wrapper
.
last
(
searchVo
.
getAuthSql
()
+
" order by CREATE_TIME desc"
);
}
else
{
wrapper
.
orderByDesc
(
BaseEntity:
:
getCreateTime
);
}
return
baseMapper
.
selectPage
(
page
,
wrapper
);
return
baseMapper
.
selectPage
(
page
,
wrapper
);
}
@Override
public
List
<
TEmpContractAlert
>
listDiy
(
ContractAlertSearchVo
searchVo
)
{
LambdaQueryWrapper
<
TEmpContractAlert
>
wrapper
=
buildQueryWrapper
(
searchVo
);
List
<
String
>
idList
=
Common
.
getList
(
searchVo
.
getIds
());
if
(
Common
.
isNotNull
(
idList
)){
wrapper
.
in
(
TEmpContractAlert:
:
getId
,
idList
);
if
(
Common
.
isNotNull
(
idList
))
{
wrapper
.
in
(
TEmpContractAlert:
:
getId
,
idList
);
}
if
(
Common
.
isNotNull
(
searchVo
.
getContractEndStart
())){
wrapper
.
ge
(
TEmpContractAlert:
:
getContractEnd
,
searchVo
.
getContractEndStart
());
if
(
Common
.
isNotNull
(
searchVo
.
getContractEndStart
()))
{
wrapper
.
ge
(
TEmpContractAlert:
:
getContractEnd
,
searchVo
.
getContractEndStart
());
}
if
(
Common
.
isNotNull
(
searchVo
.
getContractEndEnd
())){
wrapper
.
le
(
TEmpContractAlert:
:
getContractEnd
,
searchVo
.
getContractEndEnd
());
if
(
Common
.
isNotNull
(
searchVo
.
getContractEndEnd
()))
{
wrapper
.
le
(
TEmpContractAlert:
:
getContractEnd
,
searchVo
.
getContractEndEnd
());
}
if
(
Common
.
isNotNull
(
searchVo
.
getAuthSql
()))
{
if
(
Common
.
isNotNull
(
searchVo
.
getAuthSql
())
&&
searchVo
.
getAuthSql
().
contains
(
"a."
))
{
...
...
@@ -121,14 +122,14 @@ public class TEmpContractAlertServiceImpl extends ServiceImpl<TEmpContractAlertM
private
long
noPageCountDiy
(
ContractAlertSearchVo
searchVo
)
{
LambdaQueryWrapper
<
TEmpContractAlert
>
wrapper
=
buildQueryWrapper
(
searchVo
);
List
<
String
>
idList
=
Common
.
getList
(
searchVo
.
getIds
());
if
(
Common
.
isNotNull
(
idList
)){
wrapper
.
in
(
TEmpContractAlert:
:
getId
,
idList
);
if
(
Common
.
isNotNull
(
idList
))
{
wrapper
.
in
(
TEmpContractAlert:
:
getId
,
idList
);
}
if
(
Common
.
isNotNull
(
searchVo
.
getContractEndStart
())){
wrapper
.
ge
(
TEmpContractAlert:
:
getContractEnd
,
searchVo
.
getContractEndStart
());
if
(
Common
.
isNotNull
(
searchVo
.
getContractEndStart
()))
{
wrapper
.
ge
(
TEmpContractAlert:
:
getContractEnd
,
searchVo
.
getContractEndStart
());
}
if
(
Common
.
isNotNull
(
searchVo
.
getContractEndEnd
())){
wrapper
.
le
(
TEmpContractAlert:
:
getContractEnd
,
searchVo
.
getContractEndEnd
());
if
(
Common
.
isNotNull
(
searchVo
.
getContractEndEnd
()))
{
wrapper
.
le
(
TEmpContractAlert:
:
getContractEnd
,
searchVo
.
getContractEndEnd
());
}
if
(
Common
.
isNotNull
(
searchVo
.
getAuthSql
()))
{
if
(
Common
.
isNotNull
(
searchVo
.
getAuthSql
())
&&
searchVo
.
getAuthSql
().
contains
(
"a."
))
{
...
...
@@ -136,8 +137,8 @@ public class TEmpContractAlertServiceImpl extends ServiceImpl<TEmpContractAlertM
}
wrapper
.
last
(
searchVo
.
getAuthSql
());
}
if
(
searchVo
.
getLimitStart
()
>=
0
&&
searchVo
.
getLimitEnd
()
>=
0
){
wrapper
.
last
(
" limit "
+
searchVo
.
getLimitStart
()
+
","
+
searchVo
.
getLimitEnd
());
if
(
searchVo
.
getLimitStart
()
>=
0
&&
searchVo
.
getLimitEnd
()
>=
0
)
{
wrapper
.
last
(
" limit "
+
searchVo
.
getLimitStart
()
+
","
+
searchVo
.
getLimitEnd
());
}
return
baseMapper
.
selectCount
(
wrapper
);
}
...
...
@@ -152,11 +153,11 @@ public class TEmpContractAlertServiceImpl extends ServiceImpl<TEmpContractAlertM
try
{
out
=
response
.
getOutputStream
();
response
.
setContentType
(
CommonConstants
.
MULTIPART_FORM_DATA
);
response
.
setHeader
(
CommonConstants
.
CONTENT_DISPOSITION
,
CommonConstants
.
ATTACHMENT_FILENAME
+
URLEncoder
.
encode
(
fileName
,
CommonConstants
.
UTF8
));
response
.
setHeader
(
CommonConstants
.
CONTENT_DISPOSITION
,
CommonConstants
.
ATTACHMENT_FILENAME
+
URLEncoder
.
encode
(
fileName
,
CommonConstants
.
UTF8
));
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,然后文件流会自动关闭
ExcelWriter
excelWriter
=
EasyExcel
.
write
(
out
,
TEmpBadRecord
.
class
).
build
();
int
index
=
0
;
if
(
count
>
CommonConstants
.
ZERO_INT
)
{
if
(
count
>
CommonConstants
.
ZERO_INT
)
{
WriteSheet
writeSheet
;
ExcelUtil
<
TEmpContractAlert
>
util
;
for
(
int
i
=
0
;
i
<=
count
;
)
{
...
...
@@ -164,35 +165,35 @@ public class TEmpContractAlertServiceImpl extends ServiceImpl<TEmpContractAlertM
searchVo
.
setLimitStart
(
i
);
searchVo
.
setLimitEnd
(
CommonConstants
.
EXCEL_EXPORT_LIMIT
);
list
=
listDiy
(
searchVo
);
if
(
Common
.
isNotNull
(
list
)){
if
(
Common
.
isNotNull
(
list
))
{
util
=
new
ExcelUtil
<>(
TEmpContractAlert
.
class
);
for
(
TEmpContractAlert
vo
:
list
)
{
util
.
convertEntity
(
vo
,
null
,
null
,
null
);
for
(
TEmpContractAlert
vo
:
list
)
{
util
.
convertEntity
(
vo
,
null
,
null
,
null
);
}
}
if
(
Common
.
isNotNull
(
list
)){
writeSheet
=
EasyExcel
.
writerSheet
(
ArchivesConstants
.
EMP_BAD_RECORD
+
index
).
build
();
excelWriter
.
write
(
list
,
writeSheet
);
if
(
Common
.
isNotNull
(
list
))
{
writeSheet
=
EasyExcel
.
writerSheet
(
ArchivesConstants
.
EMP_BAD_RECORD
+
index
).
build
();
excelWriter
.
write
(
list
,
writeSheet
);
index
++;
i
=
i
+
CommonConstants
.
EXCEL_EXPORT_LIMIT
;
}
if
(
Common
.
isNotNull
(
list
)){
if
(
Common
.
isNotNull
(
list
))
{
list
.
clear
();
}
}
excelWriter
.
finish
();
}
else
{
WriteSheet
writeSheet
=
EasyExcel
.
writerSheet
(
ArchivesConstants
.
EMP_BAD_RECORD
+
index
).
build
();
excelWriter
.
write
(
list
,
writeSheet
);
}
else
{
WriteSheet
writeSheet
=
EasyExcel
.
writerSheet
(
ArchivesConstants
.
EMP_BAD_RECORD
+
index
).
build
();
excelWriter
.
write
(
list
,
writeSheet
);
excelWriter
.
finish
();
}
if
(
Common
.
isNotNull
(
list
)){
if
(
Common
.
isNotNull
(
list
))
{
list
.
clear
();
}
out
.
flush
();
}
catch
(
Exception
e
)
{
log
.
error
(
"执行异常"
,
e
);
}
finally
{
}
catch
(
Exception
e
)
{
log
.
error
(
"执行异常"
,
e
);
}
finally
{
try
{
if
(
null
!=
out
)
{
out
.
close
();
...
...
@@ -203,55 +204,55 @@ public class TEmpContractAlertServiceImpl extends ServiceImpl<TEmpContractAlertM
}
}
private
LambdaQueryWrapper
buildQueryWrapper
(
ContractAlertSearchVo
entity
){
private
LambdaQueryWrapper
buildQueryWrapper
(
ContractAlertSearchVo
entity
)
{
LambdaQueryWrapper
<
TEmpContractAlert
>
wrapper
=
Wrappers
.
lambdaQuery
();
if
(
ArrayUtil
.
isNotEmpty
(
entity
.
getCreateTimes
()))
{
wrapper
.
ge
(
TEmpContractAlert:
:
getCreateTime
,
entity
.
getCreateTimes
()[
0
])
.
le
(
TEmpContractAlert:
:
getCreateTime
,
entity
.
getCreateTimes
()[
1
]);
}
if
(
Common
.
isNotNull
(
entity
.
getEmpName
())){
wrapper
.
eq
(
TEmpContractAlert:
:
getEmpName
,
entity
.
getEmpName
());
if
(
Common
.
isNotNull
(
entity
.
getEmpName
()))
{
wrapper
.
eq
(
TEmpContractAlert:
:
getEmpName
,
entity
.
getEmpName
());
}
if
(
Common
.
isNotNull
(
entity
.
getEmpIdcard
())){
wrapper
.
eq
(
TEmpContractAlert:
:
getEmpIdcard
,
entity
.
getEmpIdcard
());
if
(
Common
.
isNotNull
(
entity
.
getEmpIdcard
()))
{
wrapper
.
eq
(
TEmpContractAlert:
:
getEmpIdcard
,
entity
.
getEmpIdcard
());
}
if
(
Common
.
isNotNull
(
entity
.
getProject
())){
wrapper
.
eq
(
TEmpContractAlert:
:
getProject
,
entity
.
getProject
());
if
(
Common
.
isNotNull
(
entity
.
getProject
()))
{
wrapper
.
eq
(
TEmpContractAlert:
:
getProject
,
entity
.
getProject
());
}
if
(
Common
.
isNotNull
(
entity
.
getProjectNo
())){
wrapper
.
eq
(
TEmpContractAlert:
:
getProjectNo
,
entity
.
getProjectNo
());
if
(
Common
.
isNotNull
(
entity
.
getProjectNo
()))
{
wrapper
.
eq
(
TEmpContractAlert:
:
getProjectNo
,
entity
.
getProjectNo
());
}
if
(
Common
.
isNotNull
(
entity
.
getEmpType
())){
wrapper
.
eq
(
TEmpContractAlert:
:
getEmpType
,
entity
.
getEmpType
());
if
(
Common
.
isNotNull
(
entity
.
getEmpType
()))
{
wrapper
.
eq
(
TEmpContractAlert:
:
getEmpType
,
entity
.
getEmpType
());
}
if
(
Common
.
isNotNull
(
entity
.
getContractType
())){
wrapper
.
eq
(
TEmpContractAlert:
:
getContractType
,
entity
.
getContractType
());
if
(
Common
.
isNotNull
(
entity
.
getContractType
()))
{
wrapper
.
eq
(
TEmpContractAlert:
:
getContractType
,
entity
.
getContractType
());
}
if
(
Common
.
isNotNull
(
entity
.
getContractTerm
())){
wrapper
.
eq
(
TEmpContractAlert:
:
getContractTerm
,
entity
.
getContractTerm
());
if
(
Common
.
isNotNull
(
entity
.
getContractTerm
()))
{
wrapper
.
eq
(
TEmpContractAlert:
:
getContractTerm
,
entity
.
getContractTerm
());
}
if
(
Common
.
isNotNull
(
entity
.
getFileProvince
())){
wrapper
.
eq
(
TEmpContractAlert:
:
getFileProvince
,
entity
.
getFileProvince
());
if
(
Common
.
isNotNull
(
entity
.
getFileProvince
()))
{
wrapper
.
eq
(
TEmpContractAlert:
:
getFileProvince
,
entity
.
getFileProvince
());
}
if
(
Common
.
isNotNull
(
entity
.
getFileCity
())){
wrapper
.
eq
(
TEmpContractAlert:
:
getFileCity
,
entity
.
getFileCity
());
if
(
Common
.
isNotNull
(
entity
.
getFileCity
()))
{
wrapper
.
eq
(
TEmpContractAlert:
:
getFileCity
,
entity
.
getFileCity
());
}
if
(
Common
.
isNotNull
(
entity
.
getFileTown
())){
wrapper
.
eq
(
TEmpContractAlert:
:
getFileTown
,
entity
.
getFileTown
());
if
(
Common
.
isNotNull
(
entity
.
getFileTown
()))
{
wrapper
.
eq
(
TEmpContractAlert:
:
getFileTown
,
entity
.
getFileTown
());
}
if
(
Common
.
isNotNull
(
entity
.
getAlertPerson
())){
wrapper
.
eq
(
TEmpContractAlert:
:
getAlertPerson
,
entity
.
getAlertPerson
());
if
(
Common
.
isNotNull
(
entity
.
getAlertPerson
()))
{
wrapper
.
eq
(
TEmpContractAlert:
:
getAlertPerson
,
entity
.
getAlertPerson
());
}
if
(
Common
.
isNotNull
(
entity
.
getDueFlag
())){
wrapper
.
eq
(
TEmpContractAlert:
:
getDueFlag
,
entity
.
getDueFlag
());
if
(
Common
.
isNotNull
(
entity
.
getDueFlag
()))
{
wrapper
.
eq
(
TEmpContractAlert:
:
getDueFlag
,
entity
.
getDueFlag
());
}
if
(
Common
.
isNotNull
(
entity
.
getHandleStatus
())){
wrapper
.
eq
(
TEmpContractAlert:
:
getHandleStatus
,
entity
.
getHandleStatus
());
if
(
Common
.
isNotNull
(
entity
.
getHandleStatus
()))
{
wrapper
.
eq
(
TEmpContractAlert:
:
getHandleStatus
,
entity
.
getHandleStatus
());
}
if
(
Common
.
isNotNull
(
entity
.
getDaysDue
())){
wrapper
.
eq
(
TEmpContractAlert:
:
getDaysDue
,
entity
.
getDaysDue
());
if
(
Common
.
isNotNull
(
entity
.
getDaysDue
()))
{
wrapper
.
eq
(
TEmpContractAlert:
:
getDaysDue
,
entity
.
getDaysDue
());
}
if
(
Common
.
isNotNull
(
entity
.
getUnitId
()))
{
wrapper
.
eq
(
TEmpContractAlert:
:
getUnitId
,
entity
.
getUnitId
());
...
...
@@ -262,13 +263,15 @@ public class TEmpContractAlertServiceImpl extends ServiceImpl<TEmpContractAlertM
if
(
Common
.
isNotNull
(
entity
.
getUnitNo
()))
{
wrapper
.
eq
(
TEmpContractAlert:
:
getUnitNo
,
entity
.
getUnitNo
());
}
if
(
Common
.
isNotNull
(
entity
.
getIsFeedback
())){
wrapper
.
eq
(
TEmpContractAlert:
:
getIsFeedback
,
entity
.
getIsFeedback
());
if
(
Common
.
isNotNull
(
entity
.
getIsFeedback
()))
{
wrapper
.
eq
(
TEmpContractAlert:
:
getIsFeedback
,
entity
.
getIsFeedback
());
}
return
wrapper
;
}
/**
* 定时任务生成合同续签代码信息
*
* @return R<List>
* @Author FXJ
* @Date 2022-07-4
...
...
@@ -321,12 +324,11 @@ public class TEmpContractAlertServiceImpl extends ServiceImpl<TEmpContractAlertM
}
private
void
initExistMap
(
Map
<
String
,
TEmpContractAlert
>
existMap
)
{
List
<
TEmpContractAlert
>
exists
=
baseMapper
.
selectList
(
Wrappers
.<
TEmpContractAlert
>
query
());
if
(
Common
.
isNotNull
(
exists
)){
for
(
TEmpContractAlert
alert
:
exists
)
{
existMap
.
put
(
alert
.
getContractId
(),
alert
);
if
(
Common
.
isNotNull
(
exists
))
{
for
(
TEmpContractAlert
alert
:
exists
)
{
existMap
.
put
(
alert
.
getContractId
(),
alert
);
}
}
}
...
...
@@ -336,44 +338,44 @@ public class TEmpContractAlertServiceImpl extends ServiceImpl<TEmpContractAlertM
Map
<
String
,
TEmpContractAlert
>
alertMap
,
Map
<
String
,
TEmpContractAlert
>
existMap
)
{
TEmployeeInfo
employeeInfo
=
employeeInfoMapper
.
selectById
(
contract
.
getEmpId
());
if
(
Common
.
isNotNull
(
employeeInfo
)){
if
(
Common
.
isNotNull
(
employeeInfo
))
{
TEmployeeProject
project
=
projectMapper
.
selectOne
(
Wrappers
.<
TEmployeeProject
>
query
().
lambda
()
.
eq
(
TEmployeeProject:
:
getEmpIdcard
,
employeeInfo
.
getEmpIdcard
())
.
eq
(
TEmployeeProject:
:
getDeleteFlag
,
CommonConstants
.
ZERO_STRING
)
.
eq
(
TEmployeeProject:
:
getDeptNo
,
contract
.
getDeptNo
())
.
eq
(
TEmployeeProject:
:
getEmpIdcard
,
employeeInfo
.
getEmpIdcard
())
.
eq
(
TEmployeeProject:
:
getDeleteFlag
,
CommonConstants
.
ZERO_STRING
)
.
eq
(
TEmployeeProject:
:
getDeptNo
,
contract
.
getDeptNo
())
.
last
(
CommonConstants
.
LAST_ONE_SQL
));
if
(
Common
.
isNotNull
(
project
)
&&
((
Common
.
isNotNull
(
project
.
getProjectStatus
())
&&
project
.
getProjectStatus
().
intValue
()==
CommonConstants
.
ONE_INT
)
&&
project
.
getProjectStatus
().
intValue
()
==
CommonConstants
.
ONE_INT
)
||
(
!
CommonConstants
.
ZERO_STRING
.
equals
(
project
.
getEmpNatrue
())
&&
!
CommonConstants
.
ONE_STRING
.
equals
(
project
.
getEmpNatrue
())
&&
!
CommonConstants
.
THREE_STRING
.
equals
(
project
.
getEmpNatrue
()))
))
{
))
{
return
;
}
if
(
Common
.
isEmpty
(
project
)){
if
(
Common
.
isEmpty
(
project
))
{
return
;
}
}
else
{
}
else
{
return
;
}
TEmpContractAlert
alert
=
alertMap
.
get
(
contract
.
getEmpIdcard
()
+
CommonConstants
.
DOWN_LINE_STRING
+
contract
.
getDeptNo
());
TEmpContractAlert
alert
=
alertMap
.
get
(
contract
.
getEmpIdcard
()
+
CommonConstants
.
DOWN_LINE_STRING
+
contract
.
getDeptNo
());
// 存在多个审核通过的数据 用最新的审核通过的合同覆盖已有的
if
(
Common
.
isNotNull
(
alert
)
&&
Common
.
isNotNull
(
alert
.
getAuditTime
())
&&
Common
.
isNotNull
(
contract
.
getAuditTimeLast
())
&&
alert
.
getAuditTime
().
after
(
LocalDateTimeUtils
.
convertLDTToDate
(
contract
.
getAuditTimeLast
()))){
&&
alert
.
getAuditTime
().
after
(
LocalDateTimeUtils
.
convertLDTToDate
(
contract
.
getAuditTimeLast
())))
{
return
;
}
TEmpContractAlert
exist
=
null
;
if
(
Common
.
isNotNull
(
contract
)){
if
(
Common
.
isNotNull
(
contract
))
{
exist
=
existMap
.
get
(
contract
.
getId
());
}
alert
=
new
TEmpContractAlert
();
if
(
Common
.
isNotNull
(
exist
)
&&
Common
.
isNotNull
(
exist
.
getFirstAlertTime
())){
if
(
Common
.
isNotNull
(
exist
)
&&
Common
.
isNotNull
(
exist
.
getFirstAlertTime
()))
{
alert
.
setFirstAlertTime
(
exist
.
getFirstAlertTime
());
}
else
{
}
else
{
alert
.
setFirstAlertTime
(
new
Date
());
}
FeedBackDetail
feedBackDetail1
=
feedbackDetailMapper
.
findByApplyNo
(
contract
.
getApplyNo
());
...
...
@@ -406,38 +408,39 @@ public class TEmpContractAlertServiceImpl extends ServiceImpl<TEmpContractAlertM
alert
.
setContractStart
(
contract
.
getContractStart
());
alert
.
setContractEnd
(
contract
.
getContractEnd
());
alert
.
setAuditTime
(
LocalDateTimeUtils
.
convertLDTToDate
(
contract
.
getAuditTimeLast
()));
if
(
Common
.
isNotNull
(
contract
.
getFileProvince
())){
if
(
Common
.
isNotNull
(
contract
.
getFileProvince
()))
{
alert
.
setFileProvince
(
Integer
.
toString
(
contract
.
getFileProvince
()));
}
if
(
Common
.
isNotNull
(
contract
.
getFileCity
())){
if
(
Common
.
isNotNull
(
contract
.
getFileCity
()))
{
alert
.
setFileCity
(
Integer
.
toString
(
contract
.
getFileCity
()));
}
if
(
Common
.
isNotNull
(
contract
.
getFileTown
())){
if
(
Common
.
isNotNull
(
contract
.
getFileTown
()))
{
alert
.
setFileTown
(
Integer
.
toString
(
contract
.
getFileTown
()));
}
alert
.
setEmpType
(
contract
.
getEmpNatrue
());
alert
.
setContractType
(
contract
.
getContractName
());
alert
.
setContractTerm
(
contract
.
getContractType
());
if
(
Common
.
isNotNull
(
alert
.
getContractEnd
())){
if
(
Common
.
isNotNull
(
contract
.
getContractEnd
())
&&
DateUtil
.
daysBetween
(
alert
.
getContractEnd
(),
nowDate
)
>
0
)
{
alert
.
setDaysOver
(
DateUtil
.
daysBetween
(
alert
.
getContractEnd
(),
nowDate
));
if
(
Common
.
isNotNull
(
alert
.
getContractEnd
()))
{
if
(
Common
.
isNotNull
(
contract
.
getContractEnd
())
&&
DateUtil
.
daysBetween
(
alert
.
getContractEnd
(),
nowDate
)
>
0
)
{
alert
.
setDaysOver
(
DateUtil
.
daysBetween
(
alert
.
getContractEnd
(),
nowDate
));
alert
.
setDueFlag
(
CommonConstants
.
ONE_STRING
);
alert
.
setDaysDue
(
null
);
}
else
{
alert
.
setDaysDue
(
DateUtil
.
daysBetween
(
nowDate
,
alert
.
getContractEnd
()));
}
else
{
alert
.
setDaysDue
(
DateUtil
.
daysBetween
(
nowDate
,
alert
.
getContractEnd
()));
alert
.
setDueFlag
(
CommonConstants
.
ZERO_STRING
);
alert
.
setDaysOver
(
null
);
}
}
alert
.
setHandleStatus
(
CommonConstants
.
ZERO_STRING
);
alertMap
.
put
(
alert
.
getEmpIdcard
()
+
CommonConstants
.
DOWN_LINE_STRING
+
alert
.
getProjectNo
(),
alert
);
alertMap
.
put
(
alert
.
getEmpIdcard
()
+
CommonConstants
.
DOWN_LINE_STRING
+
alert
.
getProjectNo
(),
alert
);
}
@Transactional
(
rollbackFor
=
{
Exception
.
class
})
@Override
public
boolean
changeFeedBackAll
(
ChangeFeedBackAllVo
changeFeedBackAllVo
)
{
YifuUser
user
=
SecurityUtils
.
getUser
();
FeedBackDetail
feedbackDetail
;
List
<
FeedBackDetail
>
details
=
new
ArrayList
<>();
List
<
FeedBackDetail
>
details
=
new
ArrayList
<>();
for
(
int
i
=
0
;
i
<
changeFeedBackAllVo
.
getIds
().
length
;
i
++)
{
feedbackDetail
=
new
FeedBackDetail
();
feedbackDetail
.
setFeedbackPerson
(
user
.
getNickname
());
...
...
@@ -448,13 +451,13 @@ public class TEmpContractAlertServiceImpl extends ServiceImpl<TEmpContractAlertM
feedbackDetail
.
setIsFeedback
(
CommonConstants
.
ONE_INT
);
details
.
add
(
feedbackDetail
);
}
if
(
Common
.
isNotEmpty
(
details
)){
if
(
Common
.
isNotEmpty
(
details
))
{
feedBackDetailService
.
saveBatch
(
details
);
}
changeFeedBackAllVo
.
setIsFeedback
(
CommonConstants
.
ONE_INTEGER
);
changeFeedBackAllVo
.
setFeedbackPerson
(
user
.
getNickname
());
changeFeedBackAllVo
.
setFeedbackTime
(
DateTime
.
now
());
return
baseMapper
.
changeFeedBackAll
(
changeFeedBackAllVo
);
changeFeedBackAllVo
.
setFeedbackPerson
(
user
.
getNickname
());
changeFeedBackAllVo
.
setFeedbackTime
(
DateTime
.
now
());
return
baseMapper
.
changeFeedBackAll
(
changeFeedBackAllVo
);
}
@Override
...
...
@@ -473,14 +476,14 @@ public class TEmpContractAlertServiceImpl extends ServiceImpl<TEmpContractAlertM
public
R
<
List
<
EmpContractAlertUpdateVO
>>
batchUpdate
(
InputStream
inputStream
)
{
List
<
EmpContractAlertUpdateVO
>
errorMessageList
=
new
ArrayList
<>();
ExcelUtil
<
EmpContractAlertUpdateVO
>
util1
=
new
ExcelUtil
<>(
EmpContractAlertUpdateVO
.
class
);
Map
<
String
,
String
>
reasonMap
=
new
HashMap
<>();
reasonMap
.
put
(
"已确定待续签"
,
"已经和客户单位或员工沟通好,因时间或地点原因未能签订的"
);
reasonMap
.
put
(
"未确定是否续签"
,
"因客户单位原因,暂时不能确定是否与员工继续签订劳动合同;"
);
reasonMap
.
put
(
"商务合同未签"
,
"业务部门未进行商务合同的续签"
);
reasonMap
.
put
(
"已签待更新"
,
"已完成劳动合同续签未进行人力云系统更新的"
);
reasonMap
.
put
(
"离职/退休/待派减"
,
"经确定离职、退休的员工,等待人力云系统派单减少"
);
reasonMap
.
put
(
"产假/工伤/病假"
,
"因产假、工伤、病假原因暂时无法正常续签的"
);
reasonMap
.
put
(
"其他"
,
"其他原因,添加具体原因备注"
);
Map
<
String
,
String
>
reasonMap
=
new
HashMap
<>();
reasonMap
.
put
(
"已确定待续签"
,
"已经和客户单位或员工沟通好,因时间或地点原因未能签订的"
);
reasonMap
.
put
(
"未确定是否续签"
,
"因客户单位原因,暂时不能确定是否与员工继续签订劳动合同;"
);
reasonMap
.
put
(
"商务合同未签"
,
"业务部门未进行商务合同的续签"
);
reasonMap
.
put
(
"已签待更新"
,
"已完成劳动合同续签未进行人力云系统更新的"
);
reasonMap
.
put
(
"离职/退休/待派减"
,
"经确定离职、退休的员工,等待人力云系统派单减少"
);
reasonMap
.
put
(
"产假/工伤/病假"
,
"因产假、工伤、病假原因暂时无法正常续签的"
);
reasonMap
.
put
(
"其他"
,
"其他原因,添加具体原因备注"
);
// 写法2:
// 匿名内部类 不用额外写一个DemoDataListener
...
...
@@ -608,4 +611,180 @@ public class TEmpContractAlertServiceImpl extends ServiceImpl<TEmpContractAlertM
}
}
@Override
public
R
<
List
<
ErrorMessage
>>
importDiy
(
InputStream
inputStream
)
{
List
<
ErrorMessage
>
errorMessageList
=
new
ArrayList
<>();
ExcelUtil
<
EmployeeContractCheckVO
>
util1
=
new
ExcelUtil
<>(
EmployeeContractCheckVO
.
class
);
;
// 写法2:
// 匿名内部类 不用额外写一个DemoDataListener
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
try
{
EasyExcel
.
read
(
inputStream
,
EmployeeContractCheckVO
.
class
,
new
ReadListener
<
EmployeeContractCheckVO
>()
{
/**
* 单次缓存的数据量
*/
public
static
final
int
BATCH_COUNT
=
CommonConstants
.
BATCH_COUNT
;
/**
*临时存储
*/
private
List
<
EmployeeContractCheckVO
>
cachedDataList
=
ListUtils
.
newArrayListWithExpectedSize
(
BATCH_COUNT
);
@Override
public
void
invoke
(
EmployeeContractCheckVO
data
,
AnalysisContext
context
)
{
ReadRowHolder
readRowHolder
=
context
.
readRowHolder
();
Integer
rowIndex
=
readRowHolder
.
getRowIndex
();
data
.
setRowIndex
(
rowIndex
+
1
);
ErrorMessage
errorMessage
=
util1
.
checkEntity
(
data
,
data
.
getRowIndex
());
if
(
Common
.
isNotNull
(
errorMessage
))
{
errorMessageList
.
add
(
errorMessage
);
}
else
{
cachedDataList
.
add
(
data
);
}
if
(
cachedDataList
.
size
()
>=
BATCH_COUNT
)
{
saveData
();
// 存储完成清理 list
cachedDataList
=
ListUtils
.
newArrayListWithExpectedSize
(
BATCH_COUNT
);
}
}
@Override
public
void
doAfterAllAnalysed
(
AnalysisContext
context
)
{
saveData
();
}
/**
* 加上存储数据库
*/
private
void
saveData
()
{
log
.
info
(
"{}条数据,开始存储数据库!"
,
cachedDataList
.
size
());
importTCompanyInfo
(
cachedDataList
,
errorMessageList
);
log
.
info
(
"存储数据库成功!"
);
}
}).
sheet
().
doRead
();
}
catch
(
Exception
e
)
{
log
.
error
(
CommonConstants
.
IMPORT_DATA_ANALYSIS_ERROR
,
e
);
return
R
.
failed
(
CommonConstants
.
IMPORT_DATA_ANALYSIS_ERROR
);
}
return
R
.
ok
(
errorMessageList
);
}
private
void
importTCompanyInfo
(
List
<
EmployeeContractCheckVO
>
excelVOList
,
List
<
ErrorMessage
>
errorMessageList
)
{
// 个性化校验逻辑
ErrorMessage
errorMsg
;
// 执行数据插入操作 组装
String
res
;
for
(
int
i
=
0
;
i
<
excelVOList
.
size
();
i
++)
{
EmployeeContractCheckVO
excel
=
excelVOList
.
get
(
i
);
// 业务逻辑实现
res
=
check
(
excel
);
// 插入
errorMessageList
.
add
(
new
ErrorMessage
(
excel
.
getRowIndex
(),
res
,
null
,
excel
.
getEmpIdcard
()));
}
}
private
void
initCheckInfo
(
Map
<
String
,
String
>
map
,
String
mapTemp
,
TEmployeeContractInfo
vo
,
String
errorInfo
)
{
mapTemp
=
(
mapTemp
==
null
?
ArchivesConstants
.
CONTRACT_CHECK_CONSTANTS_IDCARD_1
:
mapTemp
+
ArchivesConstants
.
CONTRACT_CHECK_CONSTANTS_IDCARD_2
)
+
vo
.
getEmpIdcard
()
+
ArchivesConstants
.
CONTRACT_CHECK_CONSTANTS_NO
+
vo
.
getApplyNo
()
+
errorInfo
;
map
.
put
(
vo
.
getEmpIdcard
(),
mapTemp
);
}
/**
* 插入excel bad record
*/
private
String
check
(
EmployeeContractCheckVO
excel
)
{
// 获取合同为在档、员工类型为“0外包”、“1派遣”、最近一次合同审核通过、过期或离过期还有3个月的数据
List
<
TEmployeeContractInfo
>
exitist
=
contractInfoMapper
.
selectList
(
Wrappers
.<
TEmployeeContractInfo
>
query
().
lambda
()
.
eq
(
TEmployeeContractInfo:
:
getEmpIdcard
,
excel
.
getEmpIdcard
())
.
eq
(
TEmployeeContractInfo:
:
getInUse
,
CommonConstants
.
ZERO_STRING
)
.
eq
(
TEmployeeContractInfo:
:
getAuditStatus
,
CommonConstants
.
TWO_STRING
)
.
eq
(
TEmployeeContractInfo:
:
getDeleteFlag
,
CommonConstants
.
ZERO_STRING
));
if
(
Common
.
isEmpty
(
exitist
))
{
return
excel
.
getEmpIdcard
()
+
":未找到审核通过的在用合同信息"
;
}
Map
<
String
,
String
>
map
=
new
HashMap
<>();
String
temp
=
null
;
String
temp2
;
String
mapTemp
=
CommonConstants
.
EMPTY_STRING
;
for
(
TEmployeeContractInfo
vo
:
exitist
)
{
mapTemp
=
map
.
get
(
vo
.
getEmpIdcard
());
if
(
baseMapper
.
selectCount
(
Wrappers
.<
TEmpContractAlert
>
query
().
lambda
()
.
eq
(
TEmpContractAlert:
:
getEmpIdcard
,
vo
.
getEmpIdcard
())
.
eq
(
TEmpContractAlert:
:
getProjectNo
,
vo
.
getDeptNo
()))
>
0
)
{
initCheckInfo
(
map
,
mapTemp
,
vo
,
" 已存在合同续签提醒"
);
continue
;
}
if
(
"续签"
.
equals
(
vo
.
getSituation
())
||
"终止"
.
equals
(
vo
.
getSituation
()))
{
initCheckInfo
(
map
,
mapTemp
,
vo
,
" 续签、终止类型的合同不提示"
);
continue
;
}
if
(
Common
.
isNotNull
(
vo
.
getAuditStatus
())
&&
vo
.
getAuditStatus
().
intValue
()
!=
2
)
{
initCheckInfo
(
map
,
mapTemp
,
vo
,
" 合同审核不通过"
);
continue
;
}
if
(
CommonConstants
.
ONE_STRING
.
equals
(
vo
.
getIsObsolete
()))
{
initCheckInfo
(
map
,
mapTemp
,
vo
,
" 合同已作废---IsObsolete=1 为作废"
);
continue
;
}
if
(!
CommonConstants
.
ONE_STRING
.
equals
(
vo
.
getContractType
()))
{
initCheckInfo
(
map
,
mapTemp
,
vo
,
" 签订期限不为‘固定期限"
);
continue
;
}
if
(!
CommonConstants
.
ZERO_STRING
.
equals
(
vo
.
getWorkFlag
()))
{
initCheckInfo
(
map
,
mapTemp
,
vo
,
" 合同状态 非在职"
);
continue
;
}
if
(!
vo
.
getContractEnd
().
before
(
DateUtil
.
dateIncreaseByDay
(
DateUtil
.
dateIncreaseByMonth
(
DateUtil
.
getCurrentDateTime
(),
CommonConstants
.
dingleDigitIntArray
[
3
]),
CommonConstants
.
dingleDigitIntArray
[
1
])))
{
initCheckInfo
(
map
,
mapTemp
,
vo
,
" 未到期"
);
continue
;
}
temp2
=
check2
(
vo
);
if
(
Common
.
isNotNull
(
temp2
))
{
initCheckInfo
(
map
,
mapTemp
,
vo
,
temp2
);
continue
;
}
else
{
initCheckInfo
(
map
,
mapTemp
,
vo
,
":"
);
continue
;
}
}
if
(!
Common
.
isEmpty
(
mapTemp
))
{
return
mapTemp
;
}
return
excel
.
getEmpIdcard
()
+
":条件符合未生成代码提醒"
;
}
private
String
check2
(
TEmployeeContractInfo
contract
)
{
TEmployeeInfo
employeeInfo
=
employeeInfoMapper
.
selectOne
(
Wrappers
.<
TEmployeeInfo
>
query
().
lambda
()
.
eq
(
TEmployeeInfo:
:
getDeleteFlag
,
CommonConstants
.
ZERO_STRING
)
.
eq
(
TEmployeeInfo:
:
getEmpIdcard
,
contract
.
getEmpIdcard
()).
last
(
CommonConstants
.
LAST_ONE_SQL
));
if
(
Common
.
isNotNull
(
employeeInfo
))
{
TEmployeeProject
project
=
projectMapper
.
selectOne
(
Wrappers
.<
TEmployeeProject
>
query
().
lambda
()
.
eq
(
TEmployeeProject:
:
getEmpIdcard
,
employeeInfo
.
getEmpIdcard
())
.
eq
(
TEmployeeProject:
:
getDeleteFlag
,
CommonConstants
.
ZERO_STRING
)
.
eq
(
TEmployeeProject:
:
getDeptNo
,
contract
.
getDeptNo
())
.
last
(
CommonConstants
.
LAST_ONE_SQL
));
if
(
Common
.
isNotNull
(
project
))
{
if
((
Common
.
isNotNull
(
project
.
getProjectStatus
())
&&
project
.
getProjectStatus
().
intValue
()
==
CommonConstants
.
ONE_INT
))
{
return
"对应身份证的项目档案已减项"
;
}
if
((!
CommonConstants
.
ZERO_STRING
.
equals
(
project
.
getEmpNatrue
())
&&
!
CommonConstants
.
ONE_STRING
.
equals
(
project
.
getEmpNatrue
())
&&
!
CommonConstants
.
THREE_STRING
.
equals
(
project
.
getEmpNatrue
()))
)
{
return
"对应身份证的项目档案员工类型 非外包、派遣、内部员工"
;
}
}
if
(
Common
.
isEmpty
(
project
))
{
return
"无合同对应项目编码的的在用项目档案 或 存在多个在用合同"
;
}
}
else
{
return
"无对应身份证在用档案信息"
;
}
return
null
;
}
}
yifu-permission/yifu-permission-api/src/main/java/com/yifu/cloud/plus/v1/yifu/permission/entity/SysMenu.java
View file @
a1a8e758
...
...
@@ -145,4 +145,16 @@ public class SysMenu extends BaseEntity {
*/
@Schema
(
description
=
"是否开关(0开、1关)"
)
private
String
isOpen
;
/**
* 表名,用来先查结果集
*/
@Schema
(
description
=
"表名,用来先查结果集"
)
private
String
tableName
;
/**
* 查询字段维度,如果fdId超长,则使用本字段
*/
@Schema
(
description
=
"查询字段维度,如果fdId超长,则使用本字段"
)
private
String
queryFields
;
}
yifu-permission/yifu-permission-biz/src/main/resources/mapper/SysMenuMapper.xml
View file @
a1a8e758
...
...
@@ -28,6 +28,8 @@
<result
property=
"createTime"
column=
"CREATE_TIME"
/>
<result
property=
"updateTime"
column=
"UPDATE_TIME"
/>
<result
property=
"isOpen"
column=
"IS_OPEN"
/>
<result
property=
"tableName"
column=
"TABLE_NAME"
/>
<result
property=
"queryFields"
column=
"QUERY_FIELDS"
/>
</resultMap>
<sql
id=
"Base_Column_List"
>
a.ID,
...
...
@@ -49,7 +51,9 @@
a.DEPT_ID,
a.IS_OPEN,
a.VIEW_ID,
a.CREATE_TIME
a.CREATE_TIME,
a.TABLE_NAME,
a.QUERY_FIELDS
</sql>
<sql
id=
"sysMenu_where"
>
<if
test=
"sysMenu != null"
>
...
...
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