Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
A
attendance-performance-platform
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
赵啸非
attendance-performance-platform
Commits
85f1e265
Commit
85f1e265
authored
Feb 01, 2024
by
赵啸非
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
添加用户钉钉主动拉取请假记录
parent
c01ca213
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
285 additions
and
62 deletions
+285
-62
attendance-performance-manager/src/main/java/com/mortals/xhx/common/code/ProcessInstanceEnum.java
...java/com/mortals/xhx/common/code/ProcessInstanceEnum.java
+66
-0
attendance-performance-manager/src/main/java/com/mortals/xhx/daemon/task/SyncUserTaskImpl.java
...in/java/com/mortals/xhx/daemon/task/SyncUserTaskImpl.java
+6
-6
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/model/vo/AttendanceLeaveRecordVo.java
...x/module/attendance/model/vo/AttendanceLeaveRecordVo.java
+3
-0
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/service/AttendanceLeaveRecordService.java
...dule/attendance/service/AttendanceLeaveRecordService.java
+6
-0
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/service/impl/AttendanceLeaveRecordServiceImpl.java
...ndance/service/impl/AttendanceLeaveRecordServiceImpl.java
+89
-3
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/web/AttendanceLeaveRecordController.java
...odule/attendance/web/AttendanceLeaveRecordController.java
+60
-12
attendance-performance-manager/src/main/java/com/mortals/xhx/module/dingding/personal/service/IDingPersonService.java
.../module/dingding/personal/service/IDingPersonService.java
+4
-1
attendance-performance-manager/src/main/java/com/mortals/xhx/module/dingding/personal/service/impl/DingPersonServiceImpl.java
...dingding/personal/service/impl/DingPersonServiceImpl.java
+50
-39
attendance-performance-manager/src/test/java/com/mortals/httpclient/system.http
...-manager/src/test/java/com/mortals/httpclient/system.http
+1
-1
No files found.
attendance-performance-manager/src/main/java/com/mortals/xhx/common/code/ProcessInstanceEnum.java
0 → 100644
View file @
85f1e265
package
com.mortals.xhx.common.code
;
import
java.util.LinkedHashMap
;
import
java.util.Map
;
/**
* @author: finegirl
* @date: 2021/7/16 11:50
* @description: 组件枚举类
**/
public
enum
ProcessInstanceEnum
{
请假
(
"PROC-2E5C0DFF-3615-4409-A614-A2011FED5D38"
,
"请假"
),
外出
(
"PROC-56D3ADEE-45A4-47BC-931A-2A0DC067DE32"
,
"外出"
),
出差
(
"PROC-578CBDDF-B768-496D-9918-44A3F1D9CAE7"
,
"出差"
);
private
String
value
;
private
String
desc
;
ProcessInstanceEnum
(
String
value
,
String
desc
)
{
this
.
value
=
value
;
this
.
desc
=
desc
;
}
public
String
getValue
()
{
return
this
.
value
;
}
public
String
getDesc
()
{
return
this
.
desc
;
}
public
static
ProcessInstanceEnum
getByValue
(
String
value
)
{
for
(
ProcessInstanceEnum
componentEnum
:
ProcessInstanceEnum
.
values
())
{
if
(
componentEnum
.
getValue
()
==
value
)
{
return
componentEnum
;
}
}
return
null
;
}
/**
* 获取Map集合
*
* @param eItem 不包含项
* @return
*/
public
static
Map
<
String
,
String
>
getEnumMap
(
String
...
eItem
)
{
Map
<
String
,
String
>
resultMap
=
new
LinkedHashMap
<>();
for
(
ProcessInstanceEnum
item
:
ProcessInstanceEnum
.
values
())
{
try
{
boolean
hasE
=
false
;
for
(
String
e
:
eItem
)
{
if
(
item
.
getValue
()
==
e
)
{
hasE
=
true
;
break
;
}
}
if
(!
hasE
)
{
resultMap
.
put
(
item
.
getValue
()
+
""
,
item
.
getDesc
());
}
}
catch
(
Exception
ex
)
{
}
}
return
resultMap
;
}
}
\ No newline at end of file
attendance-performance-manager/src/main/java/com/mortals/xhx/daemon/task/SyncUserTaskImpl.java
View file @
85f1e265
...
...
@@ -73,15 +73,15 @@ public class SyncUserTaskImpl implements ITaskExcuteService {
UserEntity
userEntity
=
new
UserEntity
();
userEntity
.
setId
(
item
.
getId
());
String
mobile
=
item
.
getMobile
();
if
(
ObjectUtils
.
isEmpty
(
mobile
))
{
//根据customerId查询staff 看是否有
StaffEntity
staffCache
=
staffService
.
getCache
(
item
.
getCustomerId
().
toString
());
if
(!
ObjectUtils
.
isEmpty
(
staffCache
)
&&
!
ObjectUtils
.
isEmpty
(
staffCache
.
getPhoneNumber
()))
{
mobile
=
staffCache
.
getPhoneNumber
();
String
mobile
=
""
;
StaffEntity
staffCache
=
staffService
.
getCache
(
item
.
getCustomerId
().
toString
());
if
(!
ObjectUtils
.
isEmpty
(
staffCache
)
&&
!
ObjectUtils
.
isEmpty
(
staffCache
.
getPhoneNumber
()))
{
mobile
=
staffCache
.
getPhoneNumber
();
if
(
ObjectUtils
.
isEmpty
(
item
.
getMobile
())){
userEntity
.
setMobile
(
mobile
);
}
}
if
(!
ObjectUtils
.
isEmpty
(
mobile
))
{
Rest
<
String
>
personByMobile
=
dingPersonService
.
getPersonByMobile
(
mobile
);
if
(!
ObjectUtils
.
isEmpty
(
personByMobile
)
&&
...
...
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/model/vo/AttendanceLeaveRecordVo.java
View file @
85f1e265
...
...
@@ -33,4 +33,7 @@ public class AttendanceLeaveRecordVo extends BaseEntityLong {
/** 结束 创建时间 */
private
String
createTimeEnd
;
private
Long
staffId
;
}
\ No newline at end of file
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/service/AttendanceLeaveRecordService.java
View file @
85f1e265
package
com.mortals.xhx.module.attendance.service
;
import
com.mortals.framework.common.Rest
;
import
com.mortals.framework.model.Context
;
import
com.mortals.framework.service.ICRUDService
;
import
com.mortals.xhx.module.attendance.model.AttendanceLeaveRecordEntity
;
import
com.mortals.xhx.module.attendance.model.AttendanceLeaveRecordQuery
;
import
org.springframework.web.bind.annotation.RequestBody
;
/**
* AttendanceLeaveRecordService
...
...
@@ -15,4 +18,7 @@ public interface AttendanceLeaveRecordService extends ICRUDService<AttendanceLea
//根据remark(钉钉返回的id)查询对象
AttendanceLeaveRecordEntity
doUpdateRecord
(
String
processInstanceId
,
AttendanceLeaveRecordEntity
leaveRecordEntity
)
throws
Exception
;
Rest
<
String
>
syncLeaveRecord
(
AttendanceLeaveRecordQuery
query
,
Context
context
);
}
\ No newline at end of file
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/service/impl/AttendanceLeaveRecordServiceImpl.java
View file @
85f1e265
package
com.mortals.xhx.module.attendance.service.impl
;
import
cn.hutool.core.date.DateUtil
;
import
com.alibaba.fastjson.JSONObject
;
import
com.aliyun.dingtalkworkflow_1_0.models.ListProcessInstanceIdsResponse
;
import
com.aliyun.dingtalkworkflow_1_0.models.ListProcessInstanceIdsResponseBody
;
import
com.mortals.framework.common.Rest
;
import
com.mortals.framework.service.ICacheService
;
import
com.mortals.framework.util.DataUtil
;
import
com.mortals.framework.util.DateUtils
;
import
com.mortals.framework.util.ThreadPool
;
import
com.mortals.xhx.base.system.user.model.UserEntity
;
import
com.mortals.xhx.base.system.user.service.UserService
;
import
com.mortals.xhx.common.code.AppealResultEnum
;
import
com.mortals.xhx.common.code.AuditStatusEnum
;
import
com.mortals.xhx.common.code.ProcessInstanceEnum
;
import
com.mortals.xhx.common.code.YesNoEnum
;
import
com.mortals.xhx.common.utils.AddAttendThread
;
import
com.mortals.xhx.common.utils.AttendSummaryThread
;
import
com.mortals.xhx.module.attendance.model.AttendanceLeaveRecordQuery
;
...
...
@@ -14,6 +23,8 @@ import com.mortals.xhx.module.attendance.model.AttendanceRecordHikQuery;
import
com.mortals.xhx.module.attendance.model.vo.AttendanceSummaryQuery
;
import
com.mortals.xhx.module.attendance.service.AttendanceRecordHikService
;
import
com.mortals.xhx.module.attendance.service.AttendanceStatService
;
import
com.mortals.xhx.module.dingding.personal.service.IDingPersonService
;
import
com.mortals.xhx.module.staff.service.StaffService
;
import
org.apache.commons.lang3.ObjectUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
...
...
@@ -24,7 +35,11 @@ import com.mortals.xhx.module.attendance.dao.AttendanceLeaveRecordDao;
import
com.mortals.xhx.module.attendance.model.AttendanceLeaveRecordEntity
;
import
com.mortals.xhx.module.attendance.service.AttendanceLeaveRecordService
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.stream.Collectors
;
import
static
com
.
mortals
.
xhx
.
common
.
key
.
RedisKey
.
KEY_ATTENDANCE_STAT_CACHE
;
...
...
@@ -42,9 +57,14 @@ public class AttendanceLeaveRecordServiceImpl extends AbstractCRUDServiceImpl<At
private
AttendanceStatService
attendanceStatService
;
@Autowired
private
ICacheService
cacheService
;
@Autowired
private
StaffService
staffService
;
@Autowired
private
UserService
userService
;
@Autowired
private
AttendanceRecordHikService
hikService
;
@Autowired
private
IDingPersonService
dingPersonService
;
@Override
protected
void
updateAfter
(
AttendanceLeaveRecordEntity
entity
,
Context
context
)
throws
AppException
{
...
...
@@ -91,6 +111,7 @@ public class AttendanceLeaveRecordServiceImpl extends AbstractCRUDServiceImpl<At
/**
* 更新汇总信息
*
* @param entity
* @param context
*/
...
...
@@ -102,7 +123,7 @@ public class AttendanceLeaveRecordServiceImpl extends AbstractCRUDServiceImpl<At
return
;
}
//更新考勤记录与异常记录
if
(
AppealResultEnum
.
通过
.
getValue
()
==
entity
.
getAuditResult
()
||
AppealResultEnum
.
撤销审批通过
.
getValue
()
==
entity
.
getAuditResult
())
{
if
(
AppealResultEnum
.
通过
.
getValue
()
==
entity
.
getAuditResult
()
||
AppealResultEnum
.
撤销审批通过
.
getValue
()
==
entity
.
getAuditResult
())
{
AttendanceRecordHikQuery
attendanceRecordHikQuery
=
new
AttendanceRecordHikQuery
();
attendanceRecordHikQuery
.
setStaffId
(
entity
.
getLeavePersonId
());
//判断请假的开始日期与结束日期
...
...
@@ -111,7 +132,7 @@ public class AttendanceLeaveRecordServiceImpl extends AbstractCRUDServiceImpl<At
//当前日期在请假期间,计算考勤结束时间为当前时间;
attendanceRecordHikQuery
.
setAttendanceDateStart
(
DateUtil
.
formatDate
(
entity
.
getStartTime
()));
attendanceRecordHikQuery
.
setAttendanceDateEnd
(
DateUtil
.
today
());
}
else
{
}
else
{
attendanceRecordHikQuery
.
setAttendanceDateStart
(
DateUtil
.
formatDate
(
entity
.
getStartTime
()));
attendanceRecordHikQuery
.
setAttendanceDateEnd
(
DateUtil
.
formatDate
(
entity
.
getEndTime
()));
}
...
...
@@ -119,4 +140,69 @@ public class AttendanceLeaveRecordServiceImpl extends AbstractCRUDServiceImpl<At
ThreadPool
.
getInstance
().
execute
(
addAttendThread
);
}
}
@Override
public
Rest
<
String
>
syncLeaveRecord
(
AttendanceLeaveRecordQuery
query
,
Context
context
)
{
List
<
AttendanceLeaveRecordEntity
>
waitSyncLeaveRecords
=
new
ArrayList
<>();
Long
staffId
=
query
.
getStaffId
();
List
<
UserEntity
>
userCacheList
=
userService
.
getCacheList
();
if
(
ObjectUtils
.
isEmpty
(
staffId
))
{
//同步所有用户
List
<
UserEntity
>
userEntityList
=
userCacheList
.
stream
()
.
filter
(
f
->
ObjectUtils
.
isEmpty
(
f
.
getDingUserId
())).
collect
(
Collectors
.
toList
());
getLeaveRecordByUserList
(
query
,
userEntityList
,
waitSyncLeaveRecords
);
}
else
{
//同步指定用户
List
<
UserEntity
>
userEntityList
=
userCacheList
.
stream
()
.
filter
(
f
->
ObjectUtils
.
isEmpty
(
f
.
getDingUserId
()))
.
filter
(
f
->
staffId
==
f
.
getCustomerId
())
.
collect
(
Collectors
.
toList
());
getLeaveRecordByUserList
(
query
,
userEntityList
,
waitSyncLeaveRecords
);
}
if
(!
ObjectUtils
.
isEmpty
(
waitSyncLeaveRecords
))
{
//todo 同步查询详细记录 并更新
for
(
AttendanceLeaveRecordEntity
waitSyncLeaveRecord
:
waitSyncLeaveRecords
)
{
dingPersonService
.
handleByProcessInstanceId
(
waitSyncLeaveRecord
.
getRemark
());
}
}
return
Rest
.
ok
();
}
private
void
getLeaveRecordByUserList
(
AttendanceLeaveRecordQuery
query
,
List
<
UserEntity
>
userEntityList
,
List
<
AttendanceLeaveRecordEntity
>
waitSyncLeaveRecords
)
{
for
(
UserEntity
item
:
userEntityList
)
{
String
dingUserId
=
item
.
getDingUserId
();
long
startTime
=
DateUtil
.
parseDateTime
(
query
.
getStartTimeStart
()
+
" 00:00:00"
).
getTime
();
long
endTime
=
DateUtil
.
parseDateTime
(
query
.
getEndTimeEnd
()
+
" 23:59:59"
).
getTime
();
Long
nextToken
=
null
;
long
maxResults
=
20L
;
for
(
ProcessInstanceEnum
processInstanceEnum
:
ProcessInstanceEnum
.
values
())
{
try
{
getRecords
(
waitSyncLeaveRecords
,
item
,
processInstanceEnum
,
startTime
,
endTime
,
nextToken
,
maxResults
,
dingUserId
);
}
catch
(
Exception
e
)
{
log
.
error
(
"同步请假记录异常"
,
e
);
}
}
}
}
private
void
getRecords
(
List
<
AttendanceLeaveRecordEntity
>
waitSyncLeaveRecords
,
UserEntity
item
,
ProcessInstanceEnum
processInstanceEnum
,
long
startTime
,
long
endTime
,
long
nextToken
,
long
maxResults
,
String
dingUserId
)
throws
Exception
{
Rest
<
ListProcessInstanceIdsResponseBody
.
ListProcessInstanceIdsResponseBodyResult
>
rest
=
dingPersonService
.
getProcessInstanceIdByUserIds
(
processInstanceEnum
.
getValue
(),
startTime
,
endTime
,
nextToken
,
maxResults
,
dingUserId
);
if
(
YesNoEnum
.
YES
.
getValue
()
==
rest
.
getCode
())
{
if
(
ObjectUtils
.
isEmpty
(
rest
.
getData
().
getNextToken
()))
{
List
<
String
>
processInstanceList
=
rest
.
getData
().
getList
();
for
(
String
process
:
processInstanceList
)
{
AttendanceLeaveRecordEntity
leaveRecord
=
new
AttendanceLeaveRecordEntity
();
leaveRecord
.
setRemark
(
process
);
leaveRecord
.
setStaffId
(
item
.
getCustomerId
());
waitSyncLeaveRecords
.
add
(
leaveRecord
);
}
}
else
{
nextToken
=
DataUtil
.
converStr2Long
(
rest
.
getData
().
getNextToken
(),
0L
);
getRecords
(
waitSyncLeaveRecords
,
item
,
processInstanceEnum
,
startTime
,
endTime
,
nextToken
,
maxResults
,
dingUserId
);
}
}
}
}
\ No newline at end of file
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/web/AttendanceLeaveRecordController.java
View file @
85f1e265
package
com.mortals.xhx.module.attendance.web
;
import
cn.hutool.core.date.DateUnit
;
import
cn.hutool.core.date.DateUtil
;
import
cn.hutool.core.io.unit.DataUnit
;
import
com.alibaba.fastjson.JSONObject
;
import
com.mortals.framework.exception.AppException
;
import
com.mortals.framework.model.Context
;
import
com.mortals.framework.util.DateUtils
;
import
com.mortals.framework.util.ThreadPool
;
import
com.mortals.framework.web.BaseCRUDJsonBodyMappingController
;
import
com.mortals.xhx.base.system.param.service.ParamService
;
import
com.mortals.xhx.base.system.user.model.UserQuery
;
...
...
@@ -9,12 +17,16 @@ import com.mortals.xhx.common.code.ProcessStatusEnum;
import
com.mortals.xhx.common.pdu.user.UserPdu
;
import
com.mortals.xhx.feign.user.IUserFeign
;
import
com.mortals.xhx.module.attendance.model.AttendanceLeaveRecordEntity
;
import
com.mortals.xhx.module.attendance.model.AttendanceLeaveRecordQuery
;
import
com.mortals.xhx.module.attendance.service.AttendanceLeaveRecordService
;
import
com.mortals.xhx.module.dept.model.DeptQuery
;
import
com.mortals.xhx.module.dept.service.DeptService
;
import
com.mortals.xhx.module.workman.model.WorkmanQuery
;
import
com.mortals.xhx.module.workman.service.WorkmanService
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.util.ObjectUtils
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
...
...
@@ -27,15 +39,14 @@ import java.util.stream.Collectors;
import
static
java
.
util
.
stream
.
Collectors
.
toMap
;
/**
*
* 请假记录信息
*
* @author zxfei
* @date 2023-04-07
*/
* 请假记录信息
*
* @author zxfei
* @date 2023-04-07
*/
@RestController
@RequestMapping
(
"attendance/leave/record"
)
public
class
AttendanceLeaveRecordController
extends
BaseCRUDJsonBodyMappingController
<
AttendanceLeaveRecordService
,
AttendanceLeaveRecordEntity
,
Long
>
{
public
class
AttendanceLeaveRecordController
extends
BaseCRUDJsonBodyMappingController
<
AttendanceLeaveRecordService
,
AttendanceLeaveRecordEntity
,
Long
>
{
@Autowired
private
ParamService
paramService
;
...
...
@@ -48,15 +59,15 @@ public class AttendanceLeaveRecordController extends BaseCRUDJsonBodyMappingCont
// @Autowired
// private IUserFeign iUserFeign;
public
AttendanceLeaveRecordController
(){
super
.
setModuleDesc
(
"请假记录信息"
);
public
AttendanceLeaveRecordController
()
{
super
.
setModuleDesc
(
"请假记录信息"
);
}
@Override
protected
void
init
(
Map
<
String
,
Object
>
model
,
Context
context
)
{
this
.
addDict
(
model
,
"deptId"
,
deptService
.
find
(
new
DeptQuery
()).
stream
().
collect
(
toMap
(
x
->
x
.
getId
().
toString
(),
y
->
y
.
getDeptName
(),(
o
,
n
)->
n
)));
this
.
addDict
(
model
,
"approverId"
,
workmanService
.
find
(
new
WorkmanQuery
()).
stream
().
collect
(
toMap
(
x
->
x
.
getId
().
toString
(),
y
->
y
.
getName
(),(
o
,
n
)->
n
)));
this
.
addDict
(
model
,
"leaveType"
,
paramService
.
getParamBySecondOrganize
(
"AttendanceLeaveRecord"
,
"leaveType"
));
this
.
addDict
(
model
,
"deptId"
,
deptService
.
find
(
new
DeptQuery
()).
stream
().
collect
(
toMap
(
x
->
x
.
getId
().
toString
(),
y
->
y
.
getDeptName
(),
(
o
,
n
)
->
n
)));
this
.
addDict
(
model
,
"approverId"
,
workmanService
.
find
(
new
WorkmanQuery
()).
stream
().
collect
(
toMap
(
x
->
x
.
getId
().
toString
(),
y
->
y
.
getName
(),
(
o
,
n
)
->
n
)));
this
.
addDict
(
model
,
"leaveType"
,
paramService
.
getParamBySecondOrganize
(
"AttendanceLeaveRecord"
,
"leaveType"
));
this
.
addDict
(
model
,
"auditResult"
,
AppealResultEnum
.
getEnumMap
());
this
.
addDict
(
model
,
"processStatus"
,
ProcessStatusEnum
.
getEnumMap
());
this
.
addDict
(
model
,
"createUserId"
,
userService
.
find
(
new
UserQuery
()).
stream
().
collect
(
toMap
(
x
->
x
.
getId
().
toString
(),
y
->
y
.
getRealName
(),
(
o
,
n
)
->
n
)));
...
...
@@ -79,4 +90,41 @@ public class AttendanceLeaveRecordController extends BaseCRUDJsonBodyMappingCont
}
/**
* 主动同步拉取请假考勤记录
*/
@PostMapping
(
value
=
"syncLeaveRecord"
)
public
String
syncLeaveRecord
(
@RequestBody
AttendanceLeaveRecordQuery
query
)
{
JSONObject
jsonObject
=
new
JSONObject
();
String
busiDesc
=
this
.
getModuleDesc
()
+
"主动同步拉取请假考勤记录"
;
try
{
if
(
ObjectUtils
.
isEmpty
(
query
.
getStartTimeStart
()))
throw
new
AppException
(
"开始时间不能为空"
);
if
(
ObjectUtils
.
isEmpty
(
query
.
getStartTimeEnd
()))
throw
new
AppException
(
"结束时间不能为空"
);
long
between
=
DateUtil
.
between
(
DateUtil
.
parseDate
(
query
.
getStartTimeStart
()),
DateUtil
.
parseDate
(
query
.
getStartTimeEnd
()),
DateUnit
.
DAY
,
true
);
if
(
between
>
120
){
throw
new
AppException
(
"时间范围不能超过120天"
);
}
Context
context
=
this
.
getContext
();
Thread
thread
=
new
Thread
(
new
Runnable
()
{
@Override
public
void
run
()
{
service
.
syncLeaveRecord
(
query
,
context
);
}
});
ThreadPool
.
getInstance
().
execute
(
thread
);
recordSysLog
(
request
,
busiDesc
+
" 【成功】"
);
jsonObject
.
put
(
KEY_RESULT_CODE
,
VALUE_RESULT_SUCCESS
);
}
catch
(
Exception
e
)
{
log
.
error
(
"主动同步拉取请假考勤记录"
,
e
);
jsonObject
.
put
(
KEY_RESULT_CODE
,
VALUE_RESULT_FAILURE
);
jsonObject
.
put
(
KEY_RESULT_MSG
,
super
.
convertException
(
e
));
}
return
jsonObject
.
toJSONString
();
}
}
\ No newline at end of file
attendance-performance-manager/src/main/java/com/mortals/xhx/module/dingding/personal/service/IDingPersonService.java
View file @
85f1e265
...
...
@@ -4,6 +4,7 @@ package com.mortals.xhx.module.dingding.personal.service;
import
com.aliyun.dingtalkattendance_1_0.models.GetLeaveRecordsResponseBody
;
import
com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceResponseBody
;
import
com.aliyun.dingtalkworkflow_1_0.models.ListProcessInstanceIdsResponse
;
import
com.aliyun.dingtalkworkflow_1_0.models.ListProcessInstanceIdsResponseBody
;
import
com.dingtalk.api.response.OapiAttendanceVacationQuotaListResponse
;
import
com.dingtalk.api.response.OapiV2UserGetResponse
;
import
com.mortals.framework.common.Rest
;
...
...
@@ -88,6 +89,8 @@ public interface IDingPersonService extends IDingTalkService {
* @param maxResults 分页参数,每页大小,最多传20。
* @param userIds 发起人id列表 最大列表长度为10
*/
Rest
<
ListProcessInstanceIdsResponse
>
getProcessInstanceIdByUserIds
(
String
processCode
,
long
startTime
,
long
endTime
,
long
nextToken
,
long
maxResults
,
String
userIds
)
throws
Exception
;
Rest
<
ListProcessInstanceIdsResponseBody
.
ListProcessInstanceIdsResponseBodyResult
>
getProcessInstanceIdByUserIds
(
String
processCode
,
long
startTime
,
long
endTime
,
Long
nextToken
,
long
maxResults
,
String
userIds
)
throws
Exception
;
}
attendance-performance-manager/src/main/java/com/mortals/xhx/module/dingding/personal/service/impl/DingPersonServiceImpl.java
View file @
85f1e265
...
...
@@ -7,9 +7,7 @@ import com.aliyun.dingtalkattendance_1_0.Client;
import
com.aliyun.dingtalkattendance_1_0.models.GetLeaveRecordsHeaders
;
import
com.aliyun.dingtalkattendance_1_0.models.GetLeaveRecordsResponse
;
import
com.aliyun.dingtalkattendance_1_0.models.GetLeaveRecordsResponseBody
;
import
com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceResponse
;
import
com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceResponseBody
;
import
com.aliyun.dingtalkworkflow_1_0.models.ListProcessInstanceIdsResponse
;
import
com.aliyun.dingtalkworkflow_1_0.models.*
;
import
com.aliyun.tea.TeaException
;
import
com.aliyun.teautil.models.RuntimeOptions
;
import
com.dingtalk.api.DefaultDingTalkClient
;
...
...
@@ -65,6 +63,7 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
/**
* 钉钉根据电话查询钉钉用户 id
*
* @param mobile
* @return
*/
...
...
@@ -90,6 +89,7 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
/**
* 钉钉根据id查询员工信息
*
* @param id
* @return
*/
...
...
@@ -99,7 +99,7 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
DingTalkClient
client
=
getDingTalkClient
(
"/topapi/v2/user/get"
);
OapiV2UserGetRequest
req
=
new
OapiV2UserGetRequest
();
req
.
setUserid
(
id
);
//用户id
log
.
info
(
"getPersonByID:{}"
,
id
);
log
.
info
(
"getPersonByID:{}"
,
id
);
OapiV2UserGetResponse
rsp
=
client
.
execute
(
req
,
getToken
());
log
.
info
(
"钉钉返回用户信息:{}"
,
rsp
.
getBody
());
if
(
rsp
.
getErrcode
()
==
0
)
{
...
...
@@ -115,6 +115,7 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
/**
* 根据code查询用户id
*
* @param code
* @return
*/
...
...
@@ -182,6 +183,7 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
/**
* 设置client的config参数
*
* @return Client
* @throws Exception
*/
...
...
@@ -195,25 +197,25 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
/**
* 根据系统电话查询指定时间的审批表单
*
* @param processCode 审批流的唯一码(详见doc下 审批表单列表.txt)。
* 请假:PROC-2E5C0DFF-3615-4409-A614-A2011FED5D38
* 外出:PROC-56D3ADEE-45A4-47BC-931A-2A0DC067DE32
* 出差:PROC-578CBDDF-B768-496D-9918-44A3F1D9CAE7
* @param startTime 审批实例开始时间,Unix时间戳,单位毫秒
* @param endTime 审批实例结束时间,Unix时间戳,单位毫秒。 查询时间范围不能超过120天
* @param nextToken 分页游标。如果是非首次调用,该参数传上次调用时返回的nextToken。
* @param maxResults 分页参数,每页大小,最多传20。
* @param userIds 发起人id列表 最大列表长度为10
*
* @param startTime 审批实例开始时间,Unix时间戳,单位毫秒
* @param endTime 审批实例结束时间,Unix时间戳,单位毫秒。 查询时间范围不能超过120天
* @param nextToken 分页游标。如果是非首次调用,该参数传上次调用时返回的nextToken。
* @param maxResults 分页参数,每页大小,最多传20。
* @param userIds 发起人id列表 最大列表长度为10
* @return 返回示例 {
*
"result" : {
*
"list" : [ "123" ],
*
"nextToken" : "10"
*
},
*
"success" : true
* "result" : {
* "list" : [ "123" ],
* "nextToken" : "10"
* },
* "success" : true
* }
*/
public
Rest
<
ListProcessInstanceIdsResponse
>
getProcessInstanceIdByUserIds
(
String
processCode
,
long
startTime
,
long
endTime
,
long
nextToken
,
long
maxResults
,
String
userIds
)
throws
Exception
{
public
Rest
<
ListProcessInstanceIdsResponse
Body
.
ListProcessInstanceIdsResponseBodyResult
>
getProcessInstanceIdByUserIds
(
String
processCode
,
long
startTime
,
long
endTime
,
Long
nextToken
,
long
maxResults
,
String
userIds
)
throws
Exception
{
if
(!
userIds
.
equals
(
""
))
{
com
.
aliyun
.
dingtalkworkflow_1_0
.
Client
client
=
new
com
.
aliyun
.
dingtalkworkflow_1_0
.
Client
(
setConfig
());
com
.
aliyun
.
dingtalkworkflow_1_0
.
models
.
ListProcessInstanceIdsHeaders
listProcessInstanceIdsHeaders
=
new
com
.
aliyun
.
dingtalkworkflow_1_0
.
models
.
ListProcessInstanceIdsHeaders
();
...
...
@@ -221,35 +223,43 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
HashMap
<
String
,
String
>
map
=
new
HashMap
<>();
listProcessInstanceIdsHeaders
.
setCommonHeaders
(
map
);
listProcessInstanceIdsHeaders
.
getCommonHeaders
().
put
(
"host"
,
"172.15.28.113:8919"
);
com
.
aliyun
.
dingtalkworkflow_1_0
.
models
.
ListProcessInstanceIdsRequest
listProcessInstanceIdsRequest
=
new
com
.
aliyun
.
dingtalkworkflow_1_0
.
models
.
ListProcessInstanceIdsRequest
()
com
.
aliyun
.
dingtalkworkflow_1_0
.
models
.
ListProcessInstanceIdsRequest
listProcessInstanceIdsRequest
=
new
ListProcessInstanceIdsRequest
()
.
setProcessCode
(
processCode
)
.
setStartTime
(
startTime
)
.
setEndTime
(
endTime
)
.
setNextToken
(
nextToken
)
.
setMaxResults
(
maxResults
)
.
setStatuses
(
Arrays
.
asList
(
"COMPLETED"
))
.
setUserIds
(
java
.
util
.
Arrays
.
asList
(
userIds
));
try
{
ListProcessInstanceIdsResponse
rsp
=
client
.
listProcessInstanceIdsWithOptions
(
listProcessInstanceIdsRequest
,
listProcessInstanceIdsHeaders
,
new
RuntimeOptions
());
return
Rest
.
ok
(
"成功"
,
rsp
);
if
(
rsp
.
getBody
().
getSuccess
())
{
return
Rest
.
ok
(
rsp
.
getBody
().
getResult
());
}
else
{
log
.
info
(
"获取审批实例列表失败->"
+
JSONObject
.
toJSONString
(
rsp
));
return
Rest
.
fail
(
"查询失败:"
+
rsp
.
getBody
().
getSuccess
());
}
}
catch
(
Exception
_err
)
{
TeaException
err
=
new
TeaException
(
_err
.
getMessage
(),
_err
);
log
.
error
(
"获取审批实例列表失败->"
);
if
(!
com
.
aliyun
.
teautil
.
Common
.
empty
(
err
.
code
)
&&
!
com
.
aliyun
.
teautil
.
Common
.
empty
(
err
.
message
))
{
// err 中含有 code 和 message 属性,可帮助开发定位问题
log
.
error
(
"code = "
+
com
.
aliyun
.
teautil
.
Common
.
empty
(
err
.
code
)+
" message = "
+
com
.
aliyun
.
teautil
.
Common
.
empty
(
err
.
message
));
log
.
error
(
"code = "
+
com
.
aliyun
.
teautil
.
Common
.
empty
(
err
.
code
)
+
" message = "
+
com
.
aliyun
.
teautil
.
Common
.
empty
(
err
.
message
));
}
return
Rest
.
fail
(
"获取审批实例列表失败:"
+
com
.
aliyun
.
teautil
.
Common
.
empty
(
err
.
message
));
return
Rest
.
fail
(
"获取审批实例列表失败:"
+
com
.
aliyun
.
teautil
.
Common
.
empty
(
err
.
message
));
}
}
else
{
}
else
{
return
Rest
.
fail
(
"userid为空"
);
}
}
/**
* 根据审批实例id查询审批详情
*
* @param processInstanceId 审批实例ID。
* @return
*/
...
...
@@ -278,7 +288,8 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
/**
* 查询假期余额
* @param user_id 被查询员工的id集合 多个用,分隔
*
* @param user_id 被查询员工的id集合 多个用,分隔
* @param leave_code 假期类型编码
* @return
*/
...
...
@@ -309,9 +320,10 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
/**
* 根据审批详情处理审批(插入请假数据)
*
* @param processInstanceId 实例id
*/
public
void
handleByProcessInstanceId
(
String
processInstanceId
){
public
void
handleByProcessInstanceId
(
String
processInstanceId
)
{
try
{
if
(
processInstanceId
!=
null
)
{
Rest
<
GetProcessInstanceResponseBody
.
GetProcessInstanceResponseBodyResult
>
rest
=
getOaRecordsById
(
processInstanceId
);
...
...
@@ -341,7 +353,7 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
String
leave_code
=
LeaveRulesEnum
.
事假
.
getLeave_code
();
String
leave_name
=
"事假"
;
if
(
result
.
getTitle
().
contains
(
"请假"
))
{
if
(
result
.
getTitle
().
contains
(
"请假"
))
{
leave_name
=
"事假"
;
if
(
result
.
getFormComponentValues
().
size
()
>
0
)
{
JSONArray
jsonArray
=
JSONArray
.
parseArray
(
result
.
getFormComponentValues
().
get
(
0
).
getValue
());
...
...
@@ -466,13 +478,13 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
leaveRecordEntity
.
setAttachmentPath
(
picEntity
.
getValue
());
}
}
}
else
if
(
result
.
getTitle
().
contains
(
"外出"
))
{
}
else
if
(
result
.
getTitle
().
contains
(
"外出"
))
{
leave_name
=
"因公外出"
;
leaveRecordEntity
.
setLeaveType
(
17
);
List
<
GetProcessInstanceResponseBody
.
GetProcessInstanceResponseBodyResultFormComponentValues
>
comList
=
result
.
getFormComponentValues
();
if
(!
comList
.
isEmpty
())
{
for
(
GetProcessInstanceResponseBody
.
GetProcessInstanceResponseBodyResultFormComponentValues
componentValues
:
comList
){
switch
(
componentValues
.
name
){
if
(!
comList
.
isEmpty
())
{
for
(
GetProcessInstanceResponseBody
.
GetProcessInstanceResponseBodyResultFormComponentValues
componentValues
:
comList
)
{
switch
(
componentValues
.
name
)
{
case
"开始时间"
:
Date
startTime1
=
dateFormat
(
componentValues
.
getValue
(),
"yyyy-MM-dd HH:mm"
,
true
);
leaveRecordEntity
.
setStartTime
(
startTime1
);
...
...
@@ -494,13 +506,13 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
}
}
}
}
else
if
(
result
.
getTitle
().
contains
(
"出差"
))
{
}
else
if
(
result
.
getTitle
().
contains
(
"出差"
))
{
leave_name
=
"因公外出"
;
leaveRecordEntity
.
setLeaveType
(
17
);
List
<
GetProcessInstanceResponseBody
.
GetProcessInstanceResponseBodyResultFormComponentValues
>
comList
=
result
.
getFormComponentValues
();
if
(!
comList
.
isEmpty
())
{
for
(
GetProcessInstanceResponseBody
.
GetProcessInstanceResponseBodyResultFormComponentValues
componentValues
:
comList
){
switch
(
componentValues
.
name
){
if
(!
comList
.
isEmpty
())
{
for
(
GetProcessInstanceResponseBody
.
GetProcessInstanceResponseBodyResultFormComponentValues
componentValues
:
comList
)
{
switch
(
componentValues
.
name
)
{
case
"行程"
:
Gson
gson
=
new
Gson
();
JsonArray
jsonArray
=
gson
.
fromJson
(
componentValues
.
getValue
(),
JsonArray
.
class
);
...
...
@@ -511,11 +523,11 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
JsonObject
jsonObject1
=
element
.
getAsJsonObject
();
// 获取每个元素作为对象
String
label
=
jsonObject1
.
get
(
"label"
).
getAsString
();
// 获取label字段的值
String
value
=
jsonObject1
.
get
(
"value"
).
getAsString
();
if
(
label
.
contains
(
"开始时间"
))
{
if
(
label
.
contains
(
"开始时间"
))
{
Date
startTime1
=
dateFormat
(
value
,
"yyyy-MM-dd HH:mm"
,
true
);
leaveRecordEntity
.
setStartTime
(
startTime1
);
}
if
(
label
.
contains
(
"结束时间"
))
{
if
(
label
.
contains
(
"结束时间"
))
{
Date
endTime1
=
dateFormat
(
value
,
"yyyy-MM-dd HH:mm"
,
false
);
leaveRecordEntity
.
setEndTime
(
endTime1
);
}
...
...
@@ -886,7 +898,7 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
}
}
}
catch
(
DingCallbackCrypto
.
DingTalkEncryptException
e
)
{
}
catch
(
DingCallbackCrypto
.
DingTalkEncryptException
e
)
{
e
.
printStackTrace
();
}
catch
(
Exception
e
)
{
log
.
info
(
"请假记录表操作异常->"
+
e
.
toString
());
...
...
@@ -894,7 +906,6 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
}
}
/**
...
...
@@ -934,9 +945,9 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
try
{
sdf
.
parse
(
dateString
);
if
(
tag
)
{
if
(
tag
)
{
dateString
+=
" 09:00"
;
}
else
{
}
else
{
dateString
+=
" 18:00"
;
}
...
...
attendance-performance-manager/src/test/java/com/mortals/httpclient/system.http
View file @
85f1e265
...
...
@@ -82,7 +82,7 @@ POST {{baseUrl}}//attendance/stat/summary
Authorization: {{authToken}}
Content-Type: application/json
{"summaryTimeStart":"202
3-12-01","summaryTimeEnd":"2023-12-31
"}
{"summaryTimeStart":"202
4-01-01","summaryTimeEnd":"2024-12-30
"}
###短信设置编辑
...
...
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