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
a29790bb
You need to sign in or sign up before continuing.
Commit
a29790bb
authored
Oct 16, 2025
by
huyuchen
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
huych-社保自动化相关提交
parent
77dd2305
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
723 additions
and
59 deletions
+723
-59
CustomerExpiringStatistics.java
.../plus/v1/yifu/archives/vo/CustomerExpiringStatistics.java
+12
-0
CustomerRevokeStatistics.java
...ud/plus/v1/yifu/archives/vo/CustomerRevokeStatistics.java
+12
-0
CustomerStatistics.java
...fu/cloud/plus/v1/yifu/archives/vo/CustomerStatistics.java
+16
-0
TDispatchInfoPreVo.java
...fu/cloud/plus/v1/yifu/archives/vo/TDispatchInfoPreVo.java
+9
-0
TEmployeeContractPreController.java
...u/archives/controller/TEmployeeContractPreController.java
+36
-0
TEmployeeContractPreService.java
...v1/yifu/archives/service/TEmployeeContractPreService.java
+18
-0
FascServiceImpl.java
...d/plus/v1/yifu/archives/service/impl/FascServiceImpl.java
+8
-7
TEmployeeContractPreServiceImpl.java
...rchives/service/impl/TEmployeeContractPreServiceImpl.java
+530
-3
FascUtil.java
.../com/yifu/cloud/plus/v1/yifu/archives/utils/FascUtil.java
+13
-13
EmployeeRegistrationServiceImpl.java
.../v1/csp/service/impl/EmployeeRegistrationServiceImpl.java
+1
-0
ArchiveTask.java
.../java/com/yifu/cloud/plus/v1/job/compont/ArchiveTask.java
+45
-0
TDispatchInfoPre.java
...fu/cloud/plus/v1/yifu/social/entity/TDispatchInfoPre.java
+9
-0
TDispatchInfoPreController.java
...v1/yifu/social/controller/TDispatchInfoPreController.java
+2
-2
TDispatchInfoPreServiceImpl.java
...yifu/social/service/impl/TDispatchInfoPreServiceImpl.java
+1
-1
TDispatchInfoPreMapper.xml
...-biz/src/main/resources/mapper/TDispatchInfoPreMapper.xml
+11
-33
No files found.
yifu-archives/yifu-archives-api/src/main/java/com/yifu/cloud/plus/v1/yifu/archives/vo/CustomerExpiringStatistics.java
0 → 100644
View file @
a29790bb
package
com
.
yifu
.
cloud
.
plus
.
v1
.
yifu
.
archives
.
vo
;
import
lombok.Data
;
import
java.io.Serializable
;
@Data
public
class
CustomerExpiringStatistics
implements
Serializable
{
private
String
customerUserLoginname
;
private
int
expiringCount
=
0
;
}
yifu-archives/yifu-archives-api/src/main/java/com/yifu/cloud/plus/v1/yifu/archives/vo/CustomerRevokeStatistics.java
0 → 100644
View file @
a29790bb
package
com
.
yifu
.
cloud
.
plus
.
v1
.
yifu
.
archives
.
vo
;
import
lombok.Data
;
import
java.io.Serializable
;
@Data
public
class
CustomerRevokeStatistics
implements
Serializable
{
private
String
customerUserLoginname
;
private
int
revokedCount
=
0
;
}
yifu-archives/yifu-archives-api/src/main/java/com/yifu/cloud/plus/v1/yifu/archives/vo/CustomerStatistics.java
0 → 100644
View file @
a29790bb
package
com
.
yifu
.
cloud
.
plus
.
v1
.
yifu
.
archives
.
vo
;
import
lombok.Data
;
import
java.io.Serializable
;
@Data
public
class
CustomerStatistics
implements
Serializable
{
private
String
customerUserLoginname
;
private
String
customerUsername
;
private
int
initiatedCount
=
0
;
private
int
failedCount
=
0
;
private
int
electronicSignFailedCount
=
0
;
private
int
offlineSignFailedCount
=
0
;
}
yifu-archives/yifu-archives-api/src/main/java/com/yifu/cloud/plus/v1/yifu/archives/vo/TDispatchInfoPreVo.java
View file @
a29790bb
...
...
@@ -5,6 +5,7 @@ import com.yifu.cloud.plus.v1.yifu.common.core.constant.ExcelAttribute;
import
com.yifu.cloud.plus.v1.yifu.common.core.vo.RowIndex
;
import
io.swagger.v3.oas.annotations.media.Schema
;
import
lombok.Data
;
import
org.hibernate.validator.constraints.Length
;
import
java.io.Serializable
;
import
java.math.BigDecimal
;
...
...
@@ -344,6 +345,14 @@ public class TDispatchInfoPreVo extends RowIndex implements Serializable {
@Schema
(
description
=
"合同签署状态 0已签署 1未签署"
)
@ExcelProperty
(
"合同签署状态"
)
private
String
contractStatus
;
/**
* 就职岗位
*/
@Length
(
max
=
50
,
message
=
"就职岗位 不能超过50 个字符"
)
@ExcelAttribute
(
name
=
"就职岗位"
,
maxLength
=
50
)
@Schema
(
description
=
"就职岗位"
)
@ExcelProperty
(
"就职岗位"
)
private
String
position
;
/**
* 合同id
*/
...
...
yifu-archives/yifu-archives-biz/src/main/java/com/yifu/cloud/plus/v1/yifu/archives/controller/TEmployeeContractPreController.java
View file @
a29790bb
...
...
@@ -248,4 +248,40 @@ public class TEmployeeContractPreController {
public
Boolean
checkContractPreIsExit
(
@RequestBody
EmpProjectStatusVo
vo
)
{
return
tEmployeeContractPreService
.
checkContractPreIsExit
(
vo
);
}
/**
* @Description: 每日晚23:00自动撤销超时电子签署任务
* @Author: huych
* @Date: 2025-10-15
* @return: R
**/
@Inner
@PostMapping
(
"/inner/autoRevokeElectronicSign"
)
public
R
autoRevokeElectronicSign
()
{
return
tEmployeeContractPreService
.
autoRevokeElectronicSign
();
}
/**
* @Description: 每日早9点通知前端客服前一日撤销电子签署情况
* @Author: huych
* @Date: 2025-10-15
* @return: R
**/
@Inner
@PostMapping
(
"/inner/notifyRevokedElectronicSign"
)
public
R
notifyRevokedElectronicSign
()
{
return
tEmployeeContractPreService
.
notifyRevokedElectronicSign
();
}
/**
* @Description: 每日早9点电子签合同即将超期提醒
* @Author: huych
* @Date: 2025-10-15
* @return: R
**/
@Inner
@PostMapping
(
"/inner/electronicSignExpiringReminder"
)
public
R
electronicSignExpiringReminder
()
{
return
tEmployeeContractPreService
.
electronicSignExpiringReminder
();
}
}
yifu-archives/yifu-archives-biz/src/main/java/com/yifu/cloud/plus/v1/yifu/archives/service/TEmployeeContractPreService.java
View file @
a29790bb
...
...
@@ -79,4 +79,22 @@ public interface TEmployeeContractPreService extends IService<TEmployeeContractP
Boolean
checkContractPreIsExit
(
EmpProjectStatusVo
vo
);
/**
* 每日晚23:00自动撤销超时电子签署任务
* @return R
*/
R
autoRevokeElectronicSign
();
/**
* 每日早9点通知前端客服前一日撤销电子签署情况
* @return R
*/
R
notifyRevokedElectronicSign
();
/**
* 每日早9点电子签合同即将超期提醒
* @return R
*/
R
electronicSignExpiringReminder
();
}
yifu-archives/yifu-archives-biz/src/main/java/com/yifu/cloud/plus/v1/yifu/archives/service/impl/FascServiceImpl.java
View file @
a29790bb
...
...
@@ -21,6 +21,7 @@ import com.fasc.open.api.exception.ApiException;
import
com.fasc.open.api.v5_1.res.template.SignTemplateListInfo
;
import
com.yifu.cloud.plus.v1.yifu.archives.entity.*
;
import
com.yifu.cloud.plus.v1.yifu.archives.mapper.FddContractInfoMapper
;
import
com.yifu.cloud.plus.v1.yifu.archives.mapper.TEmployeeContractPreMapper
;
import
com.yifu.cloud.plus.v1.yifu.archives.service.*
;
import
com.yifu.cloud.plus.v1.yifu.archives.utils.FascUtil
;
import
com.yifu.cloud.plus.v1.yifu.common.core.constant.CommonConstants
;
...
...
@@ -49,7 +50,7 @@ public class FascServiceImpl extends ServiceImpl<FddContractInfoMapper, FddContr
private
final
TFascPushLogService
tFascPushLogService
;
private
final
TFascTemplateService
tFascTemplateService
;
private
final
TFascTemplateDetailService
tFascTemplateDetailService
;
private
final
TEmployeeContractPre
Service
tEmployeeContractPreService
;
private
final
TEmployeeContractPre
Mapper
tEmployeeContractPreMapper
;
@Override
public
R
<
String
>
getTemplate
(
String
templateName
)
throws
ApiException
{
...
...
@@ -170,7 +171,7 @@ public class FascServiceImpl extends ServiceImpl<FddContractInfoMapper, FddContr
@Override
public
R
<
String
>
submitContract
(
String
id
)
throws
ApiException
{
// templateName 签署任务模板名称
TEmployeeContractPre
contract
=
tEmployeeContractPre
Service
.
ge
tById
(
id
);
TEmployeeContractPre
contract
=
tEmployeeContractPre
Mapper
.
selec
tById
(
id
);
if
(
contract
==
null
)
{
return
R
.
failed
(
"未找到合同"
);
}
...
...
@@ -194,7 +195,7 @@ public class FascServiceImpl extends ServiceImpl<FddContractInfoMapper, FddContr
}
// TODO - 判断是否入职超过1个月
R
<
String
>
requestInfo
=
fascUtil
.
submitContract
(
contract
,
tFascPushLogService
,
tEmployeeContractPre
Service
);
R
<
String
>
requestInfo
=
fascUtil
.
submitContract
(
contract
,
tFascPushLogService
,
tEmployeeContractPre
Mapper
);
return
requestInfo
;
}
...
...
@@ -209,7 +210,7 @@ public class FascServiceImpl extends ServiceImpl<FddContractInfoMapper, FddContr
@Override
public
R
<
String
>
cancelTask
(
String
id
)
throws
ApiException
{
// templateName 签署任务模板名称
TEmployeeContractPre
contract
=
tEmployeeContractPre
Service
.
ge
tById
(
id
);
TEmployeeContractPre
contract
=
tEmployeeContractPre
Mapper
.
selec
tById
(
id
);
if
(
contract
==
null
)
{
return
R
.
failed
(
"未找到合同"
);
}
...
...
@@ -218,7 +219,7 @@ public class FascServiceImpl extends ServiceImpl<FddContractInfoMapper, FddContr
}
// TODO - 判断什么状态撤销等,需要产品定
return
fascUtil
.
cancelTask
(
contract
,
tFascPushLogService
,
tEmployeeContractPre
Service
);
return
fascUtil
.
cancelTask
(
contract
,
tFascPushLogService
,
tEmployeeContractPre
Mapper
);
}
...
...
@@ -232,7 +233,7 @@ public class FascServiceImpl extends ServiceImpl<FddContractInfoMapper, FddContr
@Override
public
R
<
String
>
urgeTask
(
String
id
)
throws
ApiException
{
// templateName 签署任务模板名称
TEmployeeContractPre
contract
=
tEmployeeContractPre
Service
.
ge
tById
(
id
);
TEmployeeContractPre
contract
=
tEmployeeContractPre
Mapper
.
selec
tById
(
id
);
if
(
contract
==
null
)
{
return
R
.
failed
(
"未找到合同"
);
}
...
...
@@ -241,7 +242,7 @@ public class FascServiceImpl extends ServiceImpl<FddContractInfoMapper, FddContr
}
// TODO - 判断什么状态催办等,需要产品定
return
fascUtil
.
urgeTask
(
contract
,
tFascPushLogService
,
tEmployeeContractPre
Service
);
return
fascUtil
.
urgeTask
(
contract
,
tFascPushLogService
,
tEmployeeContractPre
Mapper
);
}
...
...
yifu-archives/yifu-archives-biz/src/main/java/com/yifu/cloud/plus/v1/yifu/archives/service/impl/TEmployeeContractPreServiceImpl.java
View file @
a29790bb
...
...
@@ -22,8 +22,10 @@ import com.yifu.cloud.plus.v1.yifu.common.core.constant.CommonConstants;
import
com.yifu.cloud.plus.v1.yifu.common.core.constant.SecurityConstants
;
import
com.yifu.cloud.plus.v1.yifu.common.core.util.*
;
import
com.yifu.cloud.plus.v1.yifu.common.core.vo.YifuUser
;
import
com.yifu.cloud.plus.v1.yifu.common.dapr.util.SocialDaprUtils
;
import
com.yifu.cloud.plus.v1.yifu.common.dapr.util.UpmsDaprUtils
;
import
com.yifu.cloud.plus.v1.yifu.common.security.util.SecurityUtils
;
import
com.yifu.cloud.plus.v1.yifu.social.vo.TEmployeeInsuranceWorkDayVo
;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.log4j.Log4j2
;
import
org.springframework.beans.BeanUtils
;
...
...
@@ -55,6 +57,8 @@ public class TEmployeeContractPreServiceImpl extends ServiceImpl<TEmployeeContra
private
final
TEmployeeContractAuditService
tEmployeeContractAuditService
;
private
final
FascService
fascService
;
@Autowired
private
final
TEmployeeContractInfoService
contractInfoService
;
...
...
@@ -66,6 +70,9 @@ public class TEmployeeContractPreServiceImpl extends ServiceImpl<TEmployeeContra
@Lazy
private
final
TAttaInfoService
attaInfoService
;
@Autowired
private
SocialDaprUtils
socialDaprUtils
;
/**
* 合同待签订任务记录表简单分页查询
...
...
@@ -277,18 +284,129 @@ public class TEmployeeContractPreServiceImpl extends ServiceImpl<TEmployeeContra
if
(
Common
.
isEmpty
(
contractPreList
))
{
return
R
.
failed
(
CommonConstants
.
NO_DATA_TO_HANDLE
);
}
// 创建一个Map映射preId到TEmployeeContractPre对象
Map
<
String
,
TEmployeeContractPre
>
preContractMap
=
contractPreList
.
stream
()
.
collect
(
Collectors
.
toMap
(
TEmployeeContractPre:
:
getId
,
pre
->
pre
));
//发起派单
List
<
ErrorMessage
>
errorMessageListAll
=
new
ArrayList
<>();
List
<
EmployeeContractVO
>
excelVOList
=
baseMapper
.
getDisPatcherContractList
(
idList
,
CommonConstants
.
socialInfoStatus
,
type
);
// 拆分电子签和线下签
List
<
EmployeeContractVO
>
electronicSignList
=
new
ArrayList
<>();
List
<
EmployeeContractVO
>
offlineSignList
=
new
ArrayList
<>();
if
(
Common
.
isNotNull
(
excelVOList
)
&&
!
excelVOList
.
isEmpty
())
{
for
(
EmployeeContractVO
contractVO
:
excelVOList
)
{
TEmployeeContractPre
contractPre
=
preContractMap
.
get
(
contractVO
.
getPreId
());
if
(
contractPre
!=
null
&&
"0"
.
equals
(
contractPre
.
getSignType
()))
{
// 电子签
electronicSignList
.
add
(
contractVO
);
}
else
{
// 线下签
offlineSignList
.
add
(
contractVO
);
}
}
}
// 按前端客服分组统计
Map
<
String
,
CustomerStatistics
>
customerStatisticsMap
=
new
HashMap
<>();
// 处理电子签合同
if
(!
electronicSignList
.
isEmpty
())
{
LocalDate
currentDate
=
LocalDate
.
now
();
for
(
EmployeeContractVO
contractVO
:
electronicSignList
)
{
TEmployeeContractPre
contractPre
=
preContractMap
.
get
(
contractVO
.
getPreId
());
if
(
contractPre
!=
null
&&
contractPre
.
getJoinLeaveDate
()
!=
null
)
{
// 获取或创建客服统计信息
String
customerLoginName
=
contractPre
.
getCustomerUserLoginname
();
CustomerStatistics
customerStats
=
customerStatisticsMap
.
computeIfAbsent
(
customerLoginName
,
k
->
{
CustomerStatistics
stats
=
new
CustomerStatistics
();
stats
.
setCustomerUserLoginname
(
customerLoginName
);
stats
.
setCustomerUsername
(
contractPre
.
getCustomerUsername
());
return
stats
;
});
customerStats
.
setInitiatedCount
(
customerStats
.
getInitiatedCount
()
+
1
);
LocalDate
joinDate
=
LocalDateTimeUtils
.
convertDateToLDT
(
contractPre
.
getJoinLeaveDate
()).
toLocalDate
();
// 判断是否超过入职日期一个月
if
(
currentDate
.
isAfter
(
joinDate
.
plusMonths
(
1
)))
{
// 超过一个月,算电子签发起失败
customerStats
.
setFailedCount
(
customerStats
.
getFailedCount
()
+
1
);
customerStats
.
setElectronicSignFailedCount
(
customerStats
.
getElectronicSignFailedCount
()
+
1
);
// 更新processStatus为电子签发起失败
LambdaUpdateWrapper
<
TEmployeeContractPre
>
updateWrapper
=
new
LambdaUpdateWrapper
<>();
updateWrapper
.
eq
(
TEmployeeContractPre:
:
getId
,
contractPre
.
getId
())
.
set
(
TEmployeeContractPre:
:
getProcessStatus
,
CommonConstants
.
FIVE_STRING
)
.
set
(
TEmployeeContractPre:
:
getErrorInfo
,
"电子签发起失败:已超过入职日期一个月"
)
.
set
(
TEmployeeContractPre:
:
getSignType
,
CommonConstants
.
ONE_STRING
)
.
set
(
TEmployeeContractPre:
:
getErrorTime
,
LocalDateTimeUtils
.
convertLDToDate
(
LocalDate
.
now
()));
this
.
update
(
updateWrapper
);
// 添加错误信息
ErrorMessage
<
EmployeeContractVO
>
errorMessage
=
new
ErrorMessage
<>(
contractVO
.
getRowIndex
(),
"电子签发起失败:已超过入职日期一个月"
);
errorMessage
.
setData
(
contractVO
);
errorMessageListAll
.
add
(
errorMessage
);
}
else
{
// 未超过一个月,调用FascService的submitContract方法
R
<
String
>
result
=
null
;
try
{
result
=
fascService
.
submitContract
(
contractPre
.
getId
());
}
catch
(
Exception
e
)
{
log
.
error
(
"法大大推送执行异常"
,
e
);
}
if
(
result
==
null
||
result
.
getCode
()
!=
CommonConstants
.
SUCCESS
)
{
customerStats
.
setFailedCount
(
customerStats
.
getFailedCount
()
+
1
);
customerStats
.
setElectronicSignFailedCount
(
customerStats
.
getElectronicSignFailedCount
()
+
1
);
String
errorMsg
=
result
!=
null
?
result
.
getMsg
()
:
"电子签发起失败"
;
// 更新processStatus为电子签发起失败
LambdaUpdateWrapper
<
TEmployeeContractPre
>
updateWrapper
=
new
LambdaUpdateWrapper
<>();
updateWrapper
.
eq
(
TEmployeeContractPre:
:
getId
,
contractPre
.
getId
())
.
set
(
TEmployeeContractPre:
:
getProcessStatus
,
CommonConstants
.
SIX_STRING
)
.
set
(
TEmployeeContractPre:
:
getErrorInfo
,
errorMsg
)
.
set
(
TEmployeeContractPre:
:
getErrorTime
,
LocalDateTimeUtils
.
convertLDToDate
(
LocalDate
.
now
()));
this
.
update
(
updateWrapper
);
// 添加错误信息
ErrorMessage
<
EmployeeContractVO
>
errorMessage
=
new
ErrorMessage
<>(
contractVO
.
getRowIndex
(),
errorMsg
);
errorMessage
.
setData
(
contractVO
);
errorMessageListAll
.
add
(
errorMessage
);
}
}
}
}
}
// 处理线下签合同(走原逻辑)
if
(!
offlineSignList
.
isEmpty
())
{
// 统计线下签的发起数量
for
(
EmployeeContractVO
contractVO
:
offlineSignList
)
{
TEmployeeContractPre
contractPre
=
preContractMap
.
get
(
contractVO
.
getPreId
());
if
(
contractPre
!=
null
)
{
String
customerLoginName
=
contractPre
.
getCustomerUserLoginname
();
CustomerStatistics
customerStats
=
customerStatisticsMap
.
computeIfAbsent
(
customerLoginName
,
k
->
{
CustomerStatistics
stats
=
new
CustomerStatistics
();
stats
.
setCustomerUserLoginname
(
customerLoginName
);
stats
.
setCustomerUsername
(
contractPre
.
getCustomerUsername
());
return
stats
;
});
customerStats
.
setInitiatedCount
(
customerStats
.
getInitiatedCount
()
+
1
);
}
}
List
<
EmployeeContractVO
>
disList
;
int
k
=
0
;
int
i
=
(
int
)
Math
.
ceil
((
double
)
excelVO
List
.
size
()
/
CommonConstants
.
INTEGER_HUNDRED
);
int
i
=
(
int
)
Math
.
ceil
((
double
)
offlineSign
List
.
size
()
/
CommonConstants
.
INTEGER_HUNDRED
);
for
(
int
j
=
0
;
j
<
i
;
j
++)
{
if
(
j
==
i
-
1
)
{
disList
=
excelVOList
.
subList
(
k
,
excelVO
List
.
size
());
disList
=
offlineSignList
.
subList
(
k
,
offlineSign
List
.
size
());
}
else
{
disList
=
excelVO
List
.
subList
(
k
,
k
+
100
);
disList
=
offlineSign
List
.
subList
(
k
,
k
+
100
);
}
k
=
k
+
100
;
if
(
Common
.
isNotNull
(
disList
))
{
...
...
@@ -301,6 +419,21 @@ public class TEmployeeContractPreServiceImpl extends ServiceImpl<TEmployeeContra
for
(
ErrorMessage
errorMessage
:
errorMessageList
)
{
if
(!
errorMessage
.
getMessage
().
equals
(
CommonConstants
.
SAVE_SUCCESS
))
{
EmployeeContractVO
contractVO
=
disList
.
stream
().
filter
(
vo
->
Objects
.
equals
(
vo
.
getRowIndex
(),
errorMessage
.
getLineNum
())).
collect
(
Collectors
.
toList
()).
get
(
0
);
// 获取合同预签订信息以便统计
TEmployeeContractPre
contractPre
=
preContractMap
.
get
(
contractVO
.
getPreId
());
if
(
contractPre
!=
null
)
{
String
customerLoginName
=
contractPre
.
getCustomerUserLoginname
();
CustomerStatistics
customerStats
=
customerStatisticsMap
.
computeIfAbsent
(
customerLoginName
,
key
->
{
CustomerStatistics
stats
=
new
CustomerStatistics
();
stats
.
setCustomerUserLoginname
(
customerLoginName
);
stats
.
setCustomerUsername
(
contractPre
.
getCustomerUsername
());
return
stats
;
});
customerStats
.
setFailedCount
(
customerStats
.
getFailedCount
()
+
1
);
customerStats
.
setOfflineSignFailedCount
(
customerStats
.
getOfflineSignFailedCount
()
+
1
);
}
LambdaUpdateWrapper
<
TEmployeeContractPre
>
updateWrapper
=
new
LambdaUpdateWrapper
<>();
updateWrapper
.
in
(
TEmployeeContractPre:
:
getId
,
contractVO
.
getPreId
())
.
in
(
TEmployeeContractPre:
:
getProcessStatus
,
CommonConstants
.
socialInfoStatus
)
...
...
@@ -316,6 +449,25 @@ public class TEmployeeContractPreServiceImpl extends ServiceImpl<TEmployeeContra
}
}
}
if
(
"2"
.
equals
(
type
))
{
// 为每个前端客服发送企微消息
for
(
Map
.
Entry
<
String
,
CustomerStatistics
>
entry
:
customerStatisticsMap
.
entrySet
())
{
CustomerStatistics
stats
=
entry
.
getValue
();
if
(
stats
.
getFailedCount
()
>
0
&&
Common
.
isNotNull
(
stats
.
getCustomerUserLoginname
()))
{
// 生成客服个人的汇总信息
String
customerSummaryInfo
=
String
.
format
(
"合同签署发起总数:%d份,失败总数:%d份;\n"
+
"电子签失败份数:%d份,线下签失败份数:%d份"
,
stats
.
getInitiatedCount
(),
stats
.
getFailedCount
(),
stats
.
getElectronicSignFailedCount
(),
stats
.
getOfflineSignFailedCount
());
// 发送企微消息
sendFailueMessageToWx
(
stats
.
getCustomerUserLoginname
(),
customerSummaryInfo
);
}
}
}
return
R
.
ok
(
errorMessageListAll
);
}
...
...
@@ -489,6 +641,47 @@ public class TEmployeeContractPreServiceImpl extends ServiceImpl<TEmployeeContra
}
}
//发送企业微信待办
private
void
sendFailueMessageToWx
(
String
loginName
,
String
summary
)
{
//获取前端客服
SysUser
user
;
if
(
Common
.
isEmpty
(
loginName
))
{
return
;
}
R
<
SysUser
>
res
=
upmsDaprUtils
.
getSimpleUserByLoginName
(
loginName
);
if
(
Common
.
isNotNull
(
res
)
&&
Common
.
isNotNull
(
res
.
getData
()))
{
user
=
res
.
getData
();
}
else
{
return
;
}
StringBuilder
sendUser
=
null
;
if
(
Common
.
isNotKong
(
user
.
getWxMessage
()))
{
sendUser
=
new
StringBuilder
(
user
.
getWxMessage
());
}
if
(
sendUser
!=
null
)
{
RestTemplate
restTemplate
=
new
RestTemplate
();
Map
<
String
,
Object
>
requestMap
=
new
HashMap
<>();
Map
<
String
,
Object
>
textcard
=
new
HashMap
<>();
String
authUrl
=
String
.
format
(
SecurityConstants
.
WX_GET_MESSAGE_AUTH_URL
,
wxConfig
.
getCorpid
(),
wxConfig
.
getDomainName
()
+
"/auth/oauth/wxLogin"
,
"69"
+
loginName
);
StringBuilder
description
=
new
StringBuilder
();
String
title
=
"作业自动化——合同签署发起失败提醒"
;
description
.
append
(
summary
).
append
(
"<br>"
);
description
.
append
(
"请及时至HRO系统处理,以免耽误签署进度!"
).
append
(
"<br>"
);
textcard
.
put
(
"title"
,
title
);
textcard
.
put
(
"url"
,
authUrl
);
textcard
.
put
(
"description"
,
description
.
toString
());
requestMap
.
put
(
"touser"
,
sendUser
);
requestMap
.
put
(
"agentid"
,
wxConfig
.
getAgentid
());
requestMap
.
put
(
"msgtype"
,
"textcard"
);
requestMap
.
put
(
"textcard"
,
textcard
);
// 必须加上header说明
if
(!
wxConfig
.
sendTextCard
(
restTemplate
,
requestMap
))
{
wxConfig
.
sendTextCard
(
restTemplate
,
requestMap
);
}
}
}
public
boolean
haveRole
(
YifuUser
user
,
long
roleId
)
{
List
<
Long
>
roleList
=
user
.
getClientRoleMap
().
get
(
ClientNameConstants
.
CLIENT_MVP
);
for
(
Long
role
:
roleList
)
{
...
...
@@ -498,4 +691,338 @@ public class TEmployeeContractPreServiceImpl extends ServiceImpl<TEmployeeContra
}
return
false
;
}
@Override
public
R
autoRevokeElectronicSign
()
{
try
{
// 查询符合条件的合同:状态为"签署中"(6) 且 为电子签任务(signType=0) 且 入职日期到当日正好一个月
LocalDate
currentDate
=
LocalDate
.
now
();
LocalDate
oneMonthAgo
=
currentDate
.
minusMonths
(
1
);
List
<
TEmployeeContractPre
>
contractsToRevoke
=
baseMapper
.
selectList
(
Wrappers
.<
TEmployeeContractPre
>
query
()
.
lambda
()
.
eq
(
TEmployeeContractPre:
:
getProcessStatus
,
CommonConstants
.
SIX_STRING
)
// 签署中
.
eq
(
TEmployeeContractPre:
:
getSignType
,
CommonConstants
.
ZERO_STRING
)
// 电子签
.
eq
(
TEmployeeContractPre:
:
getJoinLeaveDate
,
LocalDateTimeUtils
.
convertLDToDate
(
oneMonthAgo
))
// 入职日期正好一个月前
);
if
(
Common
.
isEmpty
(
contractsToRevoke
))
{
return
R
.
ok
(
"未找到需要撤销的超时电子签署任务"
);
}
for
(
TEmployeeContractPre
contractPre
:
contractsToRevoke
)
{
try
{
// 调用法大大撤销签署接口
R
<
String
>
revokeResult
=
fascService
.
cancelTask
(
contractPre
.
getId
());
if
(
revokeResult
.
getCode
()
==
200
)
{
// 撤销成功:状态更新为"待发起"(1) 且 签署方式变更为"线下签"(1)
LambdaUpdateWrapper
<
TEmployeeContractPre
>
updateWrapper
=
new
LambdaUpdateWrapper
<>();
updateWrapper
.
eq
(
TEmployeeContractPre:
:
getId
,
contractPre
.
getId
())
.
set
(
TEmployeeContractPre:
:
getProcessStatus
,
CommonConstants
.
ONE_STRING
)
// 待发起
.
set
(
TEmployeeContractPre:
:
getSignType
,
CommonConstants
.
ONE_STRING
)
// 线下签
.
set
(
TEmployeeContractPre:
:
getRevokeReason
,
"超时未签署自行变更为线下签"
);
this
.
update
(
updateWrapper
);
TEmployeeContractAudit
audit
=
new
TEmployeeContractAudit
();
audit
.
setRootName
(
"撤销签署"
);
audit
.
setLinkId
(
contractPre
.
getContractId
());
audit
.
setLinkType
(
CommonConstants
.
ONE_INT
);
tEmployeeContractAuditService
.
save
(
audit
);
}
else
if
(
"已完成签署"
.
equals
(
revokeResult
.
getMsg
()))
{
// 撤销失败原因为已完成签署:更新为签署完成的"待归档"状态(8)
LambdaUpdateWrapper
<
TEmployeeContractPre
>
updateWrapper
=
new
LambdaUpdateWrapper
<>();
updateWrapper
.
eq
(
TEmployeeContractPre:
:
getId
,
contractPre
.
getId
())
.
set
(
TEmployeeContractPre:
:
getProcessStatus
,
CommonConstants
.
EIGHT_STRING
);
// 电子待归档
this
.
update
(
updateWrapper
);
}
else
{
// 其他撤销失败原因
log
.
error
(
"合同ID:{},撤销失败,原因:{}"
,
contractPre
.
getId
(),
revokeResult
.
getMsg
());
}
}
catch
(
Exception
e
)
{
log
.
error
(
"处理合同ID:{}时发生异常"
,
contractPre
.
getId
(),
e
);
}
}
return
R
.
ok
();
}
catch
(
Exception
e
)
{
log
.
error
(
"执行自动撤销超时电子签署任务时发生异常"
,
e
);
return
R
.
failed
(
"执行自动撤销超时电子签署任务时发生异常:"
+
e
.
getMessage
());
}
}
@Override
public
R
notifyRevokedElectronicSign
()
{
try
{
// 通过审计表查询前一日的撤销记录
LocalDate
yesterday
=
LocalDate
.
now
().
minusDays
(
1
);
Date
yesterdayStart
=
LocalDateTimeUtils
.
convertLDToDate
(
yesterday
);
Date
yesterdayEnd
=
LocalDateTimeUtils
.
convertLDToDate
(
yesterday
.
plusDays
(
1
));
// 查询前一日的撤销审计记录
List
<
TEmployeeContractAudit
>
yesterdayAudits
=
tEmployeeContractAuditService
.
list
(
Wrappers
.<
TEmployeeContractAudit
>
query
()
.
lambda
()
.
eq
(
TEmployeeContractAudit:
:
getRootName
,
"撤销签署"
)
.
eq
(
TEmployeeContractAudit:
:
getLinkType
,
CommonConstants
.
ONE_INT
)
.
ge
(
TEmployeeContractAudit:
:
getCreateTime
,
yesterdayStart
)
.
lt
(
TEmployeeContractAudit:
:
getCreateTime
,
yesterdayEnd
)
);
if
(
Common
.
isEmpty
(
yesterdayAudits
))
{
return
R
.
ok
(
"前一日未发现撤销的电子签署任务"
);
}
// 根据审计记录获取对应的合同ID列表
List
<
String
>
contractIds
=
yesterdayAudits
.
stream
()
.
map
(
TEmployeeContractAudit:
:
getLinkId
)
.
filter
(
Objects:
:
nonNull
)
.
collect
(
Collectors
.
toList
());
if
(
Common
.
isEmpty
(
contractIds
))
{
return
R
.
ok
(
"前一日撤销记录中未找到有效的合同ID"
);
}
// 根据合同ID查询对应的合同预签订记录
List
<
TEmployeeContractPre
>
revokedContracts
=
baseMapper
.
selectList
(
Wrappers
.<
TEmployeeContractPre
>
query
()
.
lambda
()
.
in
(
TEmployeeContractPre:
:
getContractId
,
contractIds
)
.
eq
(
TEmployeeContractPre:
:
getProcessStatus
,
CommonConstants
.
ONE_STRING
)
// 待发起
.
eq
(
TEmployeeContractPre:
:
getSignType
,
CommonConstants
.
ONE_STRING
)
// 线下签
.
eq
(
TEmployeeContractPre:
:
getRevokeReason
,
"超时未签署自行变更为线下签"
)
);
if
(
Common
.
isEmpty
(
revokedContracts
))
{
return
R
.
ok
(
"前一日未发现撤销的电子签署任务"
);
}
// 按前端客服分组统计
Map
<
String
,
CustomerRevokeStatistics
>
customerStatsMap
=
new
HashMap
<>();
for
(
TEmployeeContractPre
contract
:
revokedContracts
)
{
String
customerLoginName
=
contract
.
getCustomerUserLoginname
();
if
(
Common
.
isNotNull
(
customerLoginName
))
{
CustomerRevokeStatistics
stats
=
customerStatsMap
.
computeIfAbsent
(
customerLoginName
,
k
->
{
CustomerRevokeStatistics
newStats
=
new
CustomerRevokeStatistics
();
newStats
.
setCustomerUserLoginname
(
customerLoginName
);
return
newStats
;
});
stats
.
setRevokedCount
(
stats
.
getRevokedCount
()
+
1
);
}
}
// 为每个前端客服发送通知
for
(
Map
.
Entry
<
String
,
CustomerRevokeStatistics
>
entry
:
customerStatsMap
.
entrySet
())
{
CustomerRevokeStatistics
stats
=
entry
.
getValue
();
if
(
stats
.
getRevokedCount
()
>
0
&&
Common
.
isNotNull
(
stats
.
getCustomerUserLoginname
()))
{
// 生成通知内容
String
notificationContent
=
String
.
format
(
"距离入职日期已超过1个月,仍未完成合同签署(%d人),系统已自动撤回签署任务,点击可查看具体撤回清单"
,
stats
.
getRevokedCount
());
// 发送企微通知
sendRevokeNotificationToWx
(
stats
.
getCustomerUserLoginname
(),
notificationContent
);
}
}
return
R
.
ok
();
}
catch
(
Exception
e
)
{
log
.
error
(
"执行通知前端客服撤销电子签署情况任务时发生异常"
,
e
);
return
R
.
failed
(
"执行通知前端客服撤销电子签署情况任务时发生异常:"
+
e
.
getMessage
());
}
}
/**
* 发送撤销通知到企微
* @param loginName 客服登录名
* @param content 通知内容
*/
private
void
sendRevokeNotificationToWx
(
String
loginName
,
String
content
)
{
//获取前端客服
SysUser
user
;
if
(
Common
.
isEmpty
(
loginName
))
{
return
;
}
R
<
SysUser
>
res
=
upmsDaprUtils
.
getSimpleUserByLoginName
(
loginName
);
if
(
Common
.
isNotNull
(
res
)
&&
Common
.
isNotNull
(
res
.
getData
()))
{
user
=
res
.
getData
();
}
else
{
return
;
}
StringBuilder
sendUser
=
null
;
if
(
Common
.
isNotKong
(
user
.
getWxMessage
()))
{
sendUser
=
new
StringBuilder
(
user
.
getWxMessage
());
}
if
(
sendUser
!=
null
)
{
RestTemplate
restTemplate
=
new
RestTemplate
();
Map
<
String
,
Object
>
requestMap
=
new
HashMap
<>();
Map
<
String
,
Object
>
textcard
=
new
HashMap
<>();
String
authUrl
=
String
.
format
(
SecurityConstants
.
WX_GET_MESSAGE_AUTH_URL
,
wxConfig
.
getCorpid
(),
wxConfig
.
getDomainName
()
+
"/auth/oauth/wxLogin"
,
"71"
+
loginName
);
StringBuilder
description
=
new
StringBuilder
();
String
title
=
"作业自动化——电子合同签署超期自动撤回提醒"
;
description
.
append
(
content
).
append
(
"<br>"
);
description
.
append
(
"请及时进行线下签署,以免产生用工风险!"
).
append
(
"<br>"
);
textcard
.
put
(
"title"
,
title
);
textcard
.
put
(
"url"
,
authUrl
);
textcard
.
put
(
"description"
,
description
.
toString
());
requestMap
.
put
(
"touser"
,
sendUser
);
requestMap
.
put
(
"agentid"
,
wxConfig
.
getAgentid
());
requestMap
.
put
(
"msgtype"
,
"textcard"
);
requestMap
.
put
(
"textcard"
,
textcard
);
// 必须加上header说明
if
(!
wxConfig
.
sendTextCard
(
restTemplate
,
requestMap
))
{
wxConfig
.
sendTextCard
(
restTemplate
,
requestMap
);
}
}
}
@Override
public
R
electronicSignExpiringReminder
()
{
try
{
LocalDate
today
=
LocalDate
.
now
();
// 查询所有状态为"签署中"(6)且为电子签(signType=0)的合同
List
<
TEmployeeContractPre
>
signingContracts
=
baseMapper
.
selectList
(
Wrappers
.<
TEmployeeContractPre
>
query
()
.
lambda
()
.
eq
(
TEmployeeContractPre:
:
getProcessStatus
,
CommonConstants
.
SIX_STRING
)
// 签署中
.
eq
(
TEmployeeContractPre:
:
getSignType
,
CommonConstants
.
ZERO_STRING
)
// 电子签
);
if
(
Common
.
isEmpty
(
signingContracts
))
{
return
R
.
ok
(
"未找到签署中的电子签合同"
);
}
// 按前端客服分组统计需要提醒的合同
Map
<
String
,
CustomerExpiringStatistics
>
customerStatsMap
=
new
HashMap
<>();
for
(
TEmployeeContractPre
contract
:
signingContracts
)
{
if
(
contract
.
getJoinLeaveDate
()
!=
null
)
{
// 计算入职一个月的最后一天
LocalDate
joinDate
=
LocalDateTimeUtils
.
convertDateToLDT
(
contract
.
getJoinLeaveDate
()).
toLocalDate
();
LocalDate
lastDayOfMonth
=
joinDate
.
plusMonths
(
1
);
// 计算往前3个工作日
List
<
LocalDate
>
reminderDates
=
calculateReminderWorkDays
(
lastDayOfMonth
);
// 判断今天是否是提醒日期之一
if
(
reminderDates
.
contains
(
today
))
{
String
customerLoginName
=
contract
.
getCustomerUserLoginname
();
if
(
Common
.
isNotNull
(
customerLoginName
))
{
CustomerExpiringStatistics
stats
=
customerStatsMap
.
computeIfAbsent
(
customerLoginName
,
k
->
{
CustomerExpiringStatistics
newStats
=
new
CustomerExpiringStatistics
();
newStats
.
setCustomerUserLoginname
(
customerLoginName
);
return
newStats
;
});
stats
.
setExpiringCount
(
stats
.
getExpiringCount
()
+
1
);
}
}
}
}
// 为每个前端客服发送提醒
for
(
Map
.
Entry
<
String
,
CustomerExpiringStatistics
>
entry
:
customerStatsMap
.
entrySet
())
{
CustomerExpiringStatistics
stats
=
entry
.
getValue
();
if
(
stats
.
getExpiringCount
()
>
0
&&
Common
.
isNotNull
(
stats
.
getCustomerUserLoginname
()))
{
// 生成提醒内容
String
reminderContent
=
String
.
format
(
"距离入职1个月还剩3天,仍未签署合同的员工数:%d人"
,
stats
.
getExpiringCount
());
// 发送企微提醒
sendExpiringReminderToWx
(
stats
.
getCustomerUserLoginname
(),
reminderContent
);
}
}
return
R
.
ok
();
}
catch
(
Exception
e
)
{
log
.
error
(
"执行电子签合同即将超期提醒任务时发生异常"
,
e
);
return
R
.
failed
(
"执行电子签合同即将超期提醒任务时发生异常:"
+
e
.
getMessage
());
}
}
/**
* 计算入职一个月最后一天往前3个工作日的日期列表
* @param lastDay 入职一个月的最后一天
* @return 3个工作日的日期列表
*/
private
List
<
LocalDate
>
calculateReminderWorkDays
(
LocalDate
lastDay
)
{
List
<
LocalDate
>
reminderDates
=
new
ArrayList
<>();
LocalDate
currentDate
=
lastDay
;
int
workDayCount
=
0
;
// 往前找3个工作日
while
(
workDayCount
<
3
)
{
// 检查当前日期是否为工作日
if
(
isWorkDay
(
currentDate
))
{
reminderDates
.
add
(
currentDate
);
workDayCount
++;
}
// 往前一天
currentDate
=
currentDate
.
minusDays
(
1
);
}
// 按日期正序排列(最早的日期在前)
Collections
.
reverse
(
reminderDates
);
return
reminderDates
;
}
/**
* 判断指定日期是否为工作日
* @param date 要检查的日期
* @return true-工作日,false-非工作日
*/
private
boolean
isWorkDay
(
LocalDate
date
)
{
TEmployeeInsuranceWorkDayVo
workDayVo
=
new
TEmployeeInsuranceWorkDayVo
();
workDayVo
.
setRegistDate
(
LocalDateTimeUtils
.
convertLDToDate
(
date
));
// 使用THolidayInfoService的checkIsWorkDay方法判断是否为假期
// 如果是假期则不是工作日,否则是工作日
R
<
Boolean
>
res
=
socialDaprUtils
.
checkIsWorkDay
(
workDayVo
);
return
!
res
.
getData
();
}
/**
* 发送即将超期提醒到企微
* @param loginName 客服登录名
* @param content 提醒内容
*/
private
void
sendExpiringReminderToWx
(
String
loginName
,
String
content
)
{
//获取前端客服
SysUser
user
;
if
(
Common
.
isEmpty
(
loginName
))
{
return
;
}
R
<
SysUser
>
res
=
upmsDaprUtils
.
getSimpleUserByLoginName
(
loginName
);
if
(
Common
.
isNotNull
(
res
)
&&
Common
.
isNotNull
(
res
.
getData
()))
{
user
=
res
.
getData
();
}
else
{
return
;
}
StringBuilder
sendUser
=
null
;
if
(
Common
.
isNotKong
(
user
.
getWxMessage
()))
{
sendUser
=
new
StringBuilder
(
user
.
getWxMessage
());
}
if
(
sendUser
!=
null
)
{
RestTemplate
restTemplate
=
new
RestTemplate
();
Map
<
String
,
Object
>
requestMap
=
new
HashMap
<>();
Map
<
String
,
Object
>
textcard
=
new
HashMap
<>();
String
authUrl
=
String
.
format
(
SecurityConstants
.
WX_GET_MESSAGE_AUTH_URL
,
wxConfig
.
getCorpid
(),
wxConfig
.
getDomainName
()
+
"/auth/oauth/wxLogin"
,
"70"
+
loginName
);
StringBuilder
description
=
new
StringBuilder
();
String
title
=
"作业自动化——合同签署超期提醒"
;
description
.
append
(
content
).
append
(
"<br>"
);
description
.
append
(
"请及时提醒员工,尽快完成法大大签署任务!"
).
append
(
"<br>"
);
textcard
.
put
(
"title"
,
title
);
textcard
.
put
(
"url"
,
authUrl
);
textcard
.
put
(
"description"
,
description
.
toString
());
requestMap
.
put
(
"touser"
,
sendUser
);
requestMap
.
put
(
"agentid"
,
wxConfig
.
getAgentid
());
requestMap
.
put
(
"msgtype"
,
"textcard"
);
requestMap
.
put
(
"textcard"
,
textcard
);
// 必须加上header说明
if
(!
wxConfig
.
sendTextCard
(
restTemplate
,
requestMap
))
{
wxConfig
.
sendTextCard
(
restTemplate
,
requestMap
);
}
}
}
}
yifu-archives/yifu-archives-biz/src/main/java/com/yifu/cloud/plus/v1/yifu/archives/utils/FascUtil.java
View file @
a29790bb
...
...
@@ -26,7 +26,7 @@ import com.yifu.cloud.plus.v1.yifu.archives.entity.TEmployeeContractPre;
import
com.yifu.cloud.plus.v1.yifu.archives.entity.TFascPushLog
;
import
com.yifu.cloud.plus.v1.yifu.archives.entity.TFascTemplate
;
import
com.yifu.cloud.plus.v1.yifu.archives.entity.TFascTemplateDetail
;
import
com.yifu.cloud.plus.v1.yifu.archives.
service.TEmployeeContractPreService
;
import
com.yifu.cloud.plus.v1.yifu.archives.
mapper.TEmployeeContractPreMapper
;
import
com.yifu.cloud.plus.v1.yifu.archives.service.TFascPushLogService
;
import
com.yifu.cloud.plus.v1.yifu.common.core.constant.CacheConstants
;
import
com.yifu.cloud.plus.v1.yifu.common.core.constant.CommonConstants
;
...
...
@@ -313,7 +313,7 @@ public class FascUtil {
}
public
R
<
String
>
submitContract
(
TEmployeeContractPre
contract
,
TFascPushLogService
tFascPushLogService
,
TEmployeeContractPre
Service
tEmployeeContractPreService
)
throws
ApiException
{
,
TEmployeeContractPre
Mapper
tEmployeeContractPreMapper
)
throws
ApiException
{
OpenApiClient
openApiClient
=
new
OpenApiClient
(
fascConfig
.
getAppId
(),
fascConfig
.
getAppSecret
(),
fascConfig
.
getAppUrl
());
String
accessToken
=
this
.
getFascToken
(
openApiClient
);
OpenId
openId
=
new
OpenId
();
...
...
@@ -364,7 +364,7 @@ public class FascUtil {
sendValue
=
submitTask
(
requestId
,
openApiClient
,
accessToken
);
if
(
R
.
isSuccess
(
sendValue
))
{
// 电子签签署中
this
.
doSuccessContract
(
contract
,
tEmployeeContractPre
Service
,
requestId
);
this
.
doSuccessContract
(
contract
,
tEmployeeContractPre
Mapper
,
requestId
);
return
R
.
ok
();
}
else
{
msg
=
"第三步失败:提交任务失败:"
+
sendValue
.
getMsg
();
...
...
@@ -376,24 +376,24 @@ public class FascUtil {
msg
=
"第一步失败:"
+
res
.
getMsg
();
}
}
this
.
doFailContract
(
contract
,
tEmployeeContractPre
Service
,
msg
);
this
.
doFailContract
(
contract
,
tEmployeeContractPre
Mapper
,
msg
);
return
R
.
failed
(
msg
);
}
// 发起失败,更新合同状态
private
void
doFailContract
(
TEmployeeContractPre
contract
,
TEmployeeContractPre
Service
tEmployeeContractPreService
,
String
msg
)
{
private
void
doFailContract
(
TEmployeeContractPre
contract
,
TEmployeeContractPre
Mapper
tEmployeeContractPreMapper
,
String
msg
)
{
contract
.
setProcessStatus
(
CommonConstants
.
dingleDigitStrArray
[
7
]);
contract
.
setRequestMsg
(
msg
);
tEmployeeContractPre
Service
.
updateById
(
contract
);
tEmployeeContractPre
Mapper
.
updateById
(
contract
);
}
// 发起成功,更新合同状态
private
void
doSuccessContract
(
TEmployeeContractPre
contract
,
TEmployeeContractPre
Service
tEmployeeContractPreService
,
String
requestId
)
{
private
void
doSuccessContract
(
TEmployeeContractPre
contract
,
TEmployeeContractPre
Mapper
tEmployeeContractPreMapper
,
String
requestId
)
{
// 电子签签署中
contract
.
setProcessStatus
(
CommonConstants
.
dingleDigitStrArray
[
6
]);
contract
.
setRequestId
(
requestId
);
contract
.
setRequestMsg
(
""
);
tEmployeeContractPre
Service
.
updateById
(
contract
);
tEmployeeContractPre
Mapper
.
updateById
(
contract
);
}
// 第二步:填写控件
...
...
@@ -524,7 +524,7 @@ public class FascUtil {
// 撤销签署
public
R
<
String
>
cancelTask
(
TEmployeeContractPre
contract
,
TFascPushLogService
tFascPushLogService
,
TEmployeeContractPre
Service
tEmployeeContractPreService
)
throws
ApiException
{
,
TEmployeeContractPre
Mapper
tEmployeeContractPreMapper
)
throws
ApiException
{
OpenApiClient
openApiClient
=
new
OpenApiClient
(
fascConfig
.
getAppId
(),
fascConfig
.
getAppSecret
(),
fascConfig
.
getAppUrl
());
String
accessToken
=
this
.
getFascToken
(
openApiClient
);
...
...
@@ -551,7 +551,7 @@ public class FascUtil {
contract
.
setProcessStatus
(
CommonConstants
.
dingleDigitStrArray
[
1
]);
contract
.
setSignType
(
CommonConstants
.
dingleDigitStrArray
[
1
]);
contract
.
setRequestMsg
(
""
);
tEmployeeContractPre
Service
.
updateById
(
contract
);
tEmployeeContractPre
Mapper
.
updateById
(
contract
);
return
R
.
ok
();
}
else
{
// 撤销签署失败原因为 已完成签署(处理的同时员工完成签署公司免验证签完成),则更新为签署完成的“待归档”状态。
...
...
@@ -560,7 +560,7 @@ public class FascUtil {
contract
.
setRevokeReason
(
FascConstants
.
TIME_OUT_REASON
);
}
contract
.
setRequestMsg
(
res
.
getMsg
());
tEmployeeContractPre
Service
.
updateById
(
contract
);
tEmployeeContractPre
Mapper
.
updateById
(
contract
);
return
R
.
failed
(
res
.
getMsg
());
}
}
...
...
@@ -570,7 +570,7 @@ public class FascUtil {
// 催办
public
R
<
String
>
urgeTask
(
TEmployeeContractPre
contract
,
TFascPushLogService
tFascPushLogService
,
TEmployeeContractPre
Service
tEmployeeContractPreService
)
throws
ApiException
{
,
TEmployeeContractPre
Mapper
tEmployeeContractPreMapper
)
throws
ApiException
{
OpenApiClient
openApiClient
=
new
OpenApiClient
(
fascConfig
.
getAppId
(),
fascConfig
.
getAppSecret
(),
fascConfig
.
getAppUrl
());
String
accessToken
=
this
.
getFascToken
(
openApiClient
);
...
...
@@ -599,7 +599,7 @@ public class FascUtil {
return
R
.
ok
();
}
else
{
contract
.
setRequestMsg
(
res
.
getMsg
());
tEmployeeContractPre
Service
.
updateById
(
contract
);
tEmployeeContractPre
Mapper
.
updateById
(
contract
);
return
R
.
failed
(
res
.
getMsg
());
}
}
...
...
yifu-csp/yifu-csp-biz/src/main/java/com/yifu/cloud/plus/v1/csp/service/impl/EmployeeRegistrationServiceImpl.java
View file @
a29790bb
...
...
@@ -1713,6 +1713,7 @@ public class EmployeeRegistrationServiceImpl extends ServiceImpl<EmployeeRegistr
preVo
.
setJoinLeaveDate
(
registration
.
getJoinLeaveDate
());
preVo
.
setDeptNo
(
registration
.
getDeptNo
());
preVo
.
setEmpName
(
registration
.
getEmployeeName
());
preVo
.
setPosition
(
registration
.
getPosition
());
preVo
.
setEmpIdcard
(
registration
.
getEmpIdcard
());
preVo
.
setCreateBy
(
user
.
getId
());
preVo
.
setCreateName
(
user
.
getNickname
());
...
...
yifu-job/yifu-job-api/src/main/java/com/yifu/cloud/plus/v1/job/compont/ArchiveTask.java
View file @
a29790bb
...
...
@@ -123,4 +123,49 @@ public class ArchiveTask {
log
.
info
(
"-------------每天刷新合同续签待待办信息到微信-定时任务结束------------"
);
}
/**
* @Author huych
* @Description 每日晚23:00自动撤销超时电子签署任务
* @Date 2025-10-15
* @Param
* @return
**/
public
void
autoRevokeElectronicSignTask
()
{
log
.
info
(
"-------------每日晚23:00自动撤销超时电子签署任务-定时任务开始------------"
);
HttpDaprUtil
.
invokeMethodPost
(
daprArchivesProperties
.
getAppUrl
(),
daprArchivesProperties
.
getAppId
(),
"/temployeecontractpre/inner/autoRevokeElectronicSign"
,
""
,
Object
.
class
,
SecurityConstants
.
FROM_IN
);
log
.
info
(
"-------------每日晚23:00自动撤销超时电子签署任务-定时任务结束------------"
);
}
/**
* @Author huych
* @Description 每日早9点通知前端客服前一日撤销电子签署情况
* @Date 2025-10-15
* @Param
* @return
**/
public
void
notifyRevokedElectronicSignTask
()
{
log
.
info
(
"-------------每日早9点通知前端客服前一日撤销电子签署情况-定时任务开始------------"
);
HttpDaprUtil
.
invokeMethodPost
(
daprArchivesProperties
.
getAppUrl
(),
daprArchivesProperties
.
getAppId
(),
"/temployeecontractpre/inner/notifyRevokedElectronicSign"
,
""
,
Object
.
class
,
SecurityConstants
.
FROM_IN
);
log
.
info
(
"-------------每日早9点通知前端客服前一日撤销电子签署情况-定时任务结束------------"
);
}
/**
* @Author huych
* @Description 每日早9点电子签合同即将超期提醒
* @Date 2025-10-15
* @Param
* @return
**/
public
void
electronicSignExpiringReminderTask
()
{
log
.
info
(
"-------------每日早9点电子签合同即将超期提醒-定时任务开始------------"
);
HttpDaprUtil
.
invokeMethodPost
(
daprArchivesProperties
.
getAppUrl
(),
daprArchivesProperties
.
getAppId
(),
"/temployeecontractpre/inner/electronicSignExpiringReminder"
,
""
,
Object
.
class
,
SecurityConstants
.
FROM_IN
);
log
.
info
(
"-------------每日早9点电子签合同即将超期提醒-定时任务结束------------"
);
}
}
\ No newline at end of file
yifu-social/yifu-social-api/src/main/java/com/yifu/cloud/plus/v1/yifu/social/entity/TDispatchInfoPre.java
View file @
a29790bb
...
...
@@ -404,4 +404,13 @@ public class TDispatchInfoPre extends BaseEntity {
@Schema
(
description
=
"0未删除1删除"
)
private
String
deleteFlag
;
/**
* 就职岗位
*/
@Length
(
max
=
50
,
message
=
"就职岗位 不能超过50 个字符"
)
@ExcelAttribute
(
name
=
"就职岗位"
,
maxLength
=
50
)
@Schema
(
description
=
"就职岗位"
)
@ExcelProperty
(
"就职岗位"
)
private
String
position
;
}
yifu-social/yifu-social-biz/src/main/java/com/yifu/cloud/plus/v1/yifu/social/controller/TDispatchInfoPreController.java
View file @
a29790bb
...
...
@@ -148,8 +148,8 @@ public class TDispatchInfoPreController {
* @return
*/
@Operation
(
description
=
"社保待购买数量查询"
)
@
Ge
tMapping
(
"/getListCount"
)
public
R
getListCount
(
TDispatchInfoPreSearchVo
searchVo
)
{
@
Pos
tMapping
(
"/getListCount"
)
public
R
getListCount
(
@RequestBody
TDispatchInfoPreSearchVo
searchVo
)
{
YifuUser
user
=
SecurityUtils
.
getUser
();
menuUtil
.
setAuthSql
(
user
,
searchVo
);
return
R
.
ok
(
tDispatchInfoPreService
.
getDispatchInfoCount
(
searchVo
));
...
...
yifu-social/yifu-social-biz/src/main/java/com/yifu/cloud/plus/v1/yifu/social/service/impl/TDispatchInfoPreServiceImpl.java
View file @
a29790bb
...
...
@@ -466,7 +466,7 @@ public class TDispatchInfoPreServiceImpl extends ServiceImpl<TDispatchInfoPreMap
RestTemplate
restTemplate
=
new
RestTemplate
();
Map
<
String
,
Object
>
requestMap
=
new
HashMap
<>();
Map
<
String
,
Object
>
textcard
=
new
HashMap
<>();
String
authUrl
=
String
.
format
(
SecurityConstants
.
WX_GET_MESSAGE_AUTH_URL
,
wxConfig
.
getCorpid
(),
wxConfig
.
getDomainName
()
+
"/auth/oauth/wxLogin"
,
"
05
"
+
LoginName
);
String
authUrl
=
String
.
format
(
SecurityConstants
.
WX_GET_MESSAGE_AUTH_URL
,
wxConfig
.
getCorpid
(),
wxConfig
.
getDomainName
()
+
"/auth/oauth/wxLogin"
,
"
67
"
+
LoginName
);
StringBuilder
description
=
new
StringBuilder
();
String
title
=
"作业自动化——社保派单发起失败提醒"
;
description
.
append
(
"社保派单数:"
).
append
(
sum
).
append
(
"份,失败份数:"
).
append
(
falureNum
).
append
(
"份;"
).
append
(
"<br>"
);
...
...
yifu-social/yifu-social-biz/src/main/resources/mapper/TDispatchInfoPreMapper.xml
View file @
a29790bb
...
...
@@ -62,6 +62,7 @@
<result
property=
"errorInfo"
column=
"error_info"
/>
<result
property=
"errorBackInfo"
column=
"error_back_info"
/>
<result
property=
"errorTime"
column=
"error_time"
/>
<result
property=
"position"
column=
"position"
/>
</resultMap>
<resultMap
id=
"tDispatchInfoPreExportMap"
type=
"com.yifu.cloud.plus.v1.yifu.social.vo.TDispatchInfoPreExportVo"
>
...
...
@@ -82,7 +83,7 @@
a.EMP_NAME,
a.EMP_IDCARD,
a.PROCESS_STATUS,
a.
SETTLE_DOMAIN
,
a.
DEPT_ID
,
a.SOCIAL_PROVINCE,
a.SOCIAL_CITY,
a.SOCIAL_TOWN,
...
...
@@ -130,24 +131,24 @@
a.CREATE_NAME,
a.UPDATE_TIME,
a.CREATE_TIME,
a.DELETE_FLAG,error_info,error_time,a.DISPATCHER_ID,a.error_back_info
a.DELETE_FLAG,error_info,error_time,a.DISPATCHER_ID,a.error_back_info
,a.position
</sql>
<sql
id=
"tDispatchInfoPre_where"
>
<if
test=
"tDispatchInfoPre != null"
>
<if
test=
"tDispatchInfoPre.id != null and tDispatchInfoPre.id.trim() != ''"
>
AND a.ID = #{tDispatchInfoPre.id}
</if>
`
<if
test=
"tDispatchInfoPre.idList != null and tDispatchInfoPre.idList.size() > 0"
>
<if
test=
"tDispatchInfoPre.idList != null and tDispatchInfoPre.idList.size() > 0"
>
and a.id in
<foreach
collection=
"tDispatchInfoPre.idList"
item=
"param"
index=
"index"
open=
"("
close=
")"
separator=
","
>
#{param}
</foreach>
</if>
`
</if>
<if
test=
"tDispatchInfoPre.statusList != null and tDispatchInfoPre.statusList.size() > 0"
>
AND a.process_status in
<foreach
item=
"item"
index=
"index"
collection=
"tDispatchInfoPre.statusList"
open=
"("
separator=
","
close=
")"
>
'${item}'
#{item}
</foreach>
</if>
<if
test=
"tDispatchInfoPre.empName != null and tDispatchInfoPre.empName.trim() != ''"
>
...
...
@@ -159,27 +160,7 @@
<if
test=
"tDispatchInfoPre.processStatus != null and tDispatchInfoPre.processStatus.trim() != ''"
>
AND a.PROCESS_STATUS = #{tDispatchInfoPre.processStatus}
</if>
<if
test=
"tDispatchInfoPre.settleDomain != null and tDispatchInfoPre.settleDomain.trim() != ''"
>
AND a.SETTLE_DOMAIN = #{tDispatchInfoPre.settleDomain}
</if>
<if
test=
"tDispatchInfoPre.socialProvince != null and tDispatchInfoPre.socialProvince.trim() != ''"
>
AND a.SOCIAL_PROVINCE = #{tDispatchInfoPre.socialProvince}
</if>
<if
test=
"tDispatchInfoPre.socialCity != null and tDispatchInfoPre.socialCity.trim() != ''"
>
AND a.SOCIAL_CITY = #{tDispatchInfoPre.socialCity}
</if>
<if
test=
"tDispatchInfoPre.socialTown != null and tDispatchInfoPre.socialTown.trim() != ''"
>
AND a.SOCIAL_TOWN = #{tDispatchInfoPre.socialTown}
</if>
<if
test=
"tDispatchInfoPre.fundProvince != null and tDispatchInfoPre.fundProvince.trim() != ''"
>
AND a.FUND_PROVINCE = #{tDispatchInfoPre.fundProvince}
</if>
<if
test=
"tDispatchInfoPre.fundCity != null and tDispatchInfoPre.fundCity.trim() != ''"
>
AND a.FUND_CITY = #{tDispatchInfoPre.fundCity}
</if>
<if
test=
"tDispatchInfoPre.fundTown != null and tDispatchInfoPre.fundTown.trim() != ''"
>
AND a.FUND_TOWN = #{tDispatchInfoPre.fundTown}
</if>
<if
test=
"tDispatchInfoPre.deptName != null and tDispatchInfoPre.deptName.trim() != ''"
>
AND a.DEPT_NAME like CONCAT('%',#{tDispatchInfoPre.deptName},'%')
</if>
...
...
@@ -204,11 +185,11 @@
<if
test=
"tDispatchInfoPre.expectedCollectionTime != null"
>
AND DATE_FORMAT(a.EXPECTED_COLLECTION_TIME,'%Y-%m-%d') = CURDATE()
</if>
<if
test=
"tDispatchInfoPre.dispatcherTimeStart != null
and tDispatchInfoPre.dispatcherTimeStart.trim() != ''
"
>
AND DATE_FORMAT(a.EXPECTED_COLLECTION_TIME,'%Y-%m-%d')
<![CDATA[ >= ]]>
#{t
EmployeeInsurance
Pre.dispatcherTimeStart}
<if
test=
"tDispatchInfoPre.dispatcherTimeStart != null"
>
AND DATE_FORMAT(a.EXPECTED_COLLECTION_TIME,'%Y-%m-%d')
<![CDATA[ >= ]]>
#{t
DispatchInfo
Pre.dispatcherTimeStart}
</if>
<if
test=
"tDispatchInfoPre.dispatcherTimeEnd != null
and tDispatchInfoPre.dispatcherTimeEnd.trim() != ''
"
>
and DATE_FORMAT(a.EXPECTED_COLLECTION_TIME,'%Y-%m-%d')
<![CDATA[ <= ]]>
#{t
EmployeeInsurance
Pre.dispatcherTimeEnd}
<if
test=
"tDispatchInfoPre.dispatcherTimeEnd != null"
>
and DATE_FORMAT(a.EXPECTED_COLLECTION_TIME,'%Y-%m-%d')
<![CDATA[ <= ]]>
#{t
DispatchInfo
Pre.dispatcherTimeEnd}
</if>
<if
test=
"tDispatchInfoPre.expectedConfirmTime != null"
>
AND a.EXPECTED_CONFIRM_TIME = #{tDispatchInfoPre.expectedConfirmTime}
...
...
@@ -222,9 +203,6 @@
<if
test=
"tDispatchInfoPre.contractStatus != null and tDispatchInfoPre.contractStatus.trim() != ''"
>
AND a.CONTRACT_STATUS = #{tDispatchInfoPre.contractStatus}
</if>
<if
test=
"tDispatchInfoPre.failType != null and tDispatchInfoPre.failType.trim() != ''"
>
AND a.error_info is not null
</if>
<if
test=
"tDispatchInfoPre.authSql != null and tDispatchInfoPre.authSql.trim() != ''"
>
${tDispatchInfoPre.authSql}
</if>
...
...
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