Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
W
wangxiaolu-sfa-module-job
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
sfa
wangxiaolu-sfa-module-job
Commits
dba77f4d
提交
dba77f4d
authored
6月 24, 2025
作者:
000516
浏览文件
操作
浏览文件
下载
差异文件
1、飞书部门、人员同步T100;2、飞书回调事件;3、CP活动审核功能
上级
ec23277d
52a05e9d
隐藏空白字符变更
内嵌
并排
正在显示
25 个修改的文件
包含
1111 行增加
和
194 行删除
+1111
-194
pom.xml
pom.xml
+0
-4
SfaJobApplication.java
src/main/java/com/sfa/job/SfaJobApplication.java
+2
-0
ControllerResponseAdvice.java
...a/com/sfa/job/config/advice/ControllerResponseAdvice.java
+1
-1
Constants.java
src/main/java/com/sfa/job/constants/Constants.java
+11
-0
RedisKeyJob.java
src/main/java/com/sfa/job/constants/RedisKeyJob.java
+10
-0
EventCallbackLuzx.java
...n/java/com/sfa/job/consumer/feishu/EventCallbackLuzx.java
+155
-0
ActivityPlanDaoImpl.java
...com/sfa/job/domain/promotion/dao/ActivityPlanDaoImpl.java
+39
-0
IActivityPlanDao.java
...va/com/sfa/job/domain/promotion/dao/IActivityPlanDao.java
+16
-0
ActivityPlanApproval.java
...sfa/job/domain/promotion/entity/ActivityPlanApproval.java
+82
-0
ActivityPlanInfo.java
...com/sfa/job/domain/promotion/entity/ActivityPlanInfo.java
+198
-0
ActivityPlanApprovalMapper.java
...b/domain/promotion/mapper/ActivityPlanApprovalMapper.java
+24
-0
ActivityPlanInfoMapper.java
...a/job/domain/promotion/mapper/ActivityPlanInfoMapper.java
+22
-0
EventCallBackDto.java
.../java/com/sfa/job/pojo/feishu/event/EventCallBackDto.java
+71
-0
ActivityPlanApprovalDto.java
.../job/pojo/promotion/response/ActivityPlanApprovalDto.java
+73
-0
ErpAxmr005ServiceImpl.java
...a/com/sfa/job/service/erp/impl/ErpAxmr005ServiceImpl.java
+2
-3
EventCallbackServiceImpl.java
.../com/sfa/job/service/feishu/EventCallbackServiceImpl.java
+229
-0
IEventCallbackService.java
...ava/com/sfa/job/service/feishu/IEventCallbackService.java
+20
-0
PullSheetServiceImpl.java
...java/com/sfa/job/service/feishu/PullSheetServiceImpl.java
+1
-3
DeptAndUserServiceImpl.java
...va/com/sfa/job/service/system/DeptAndUserServiceImpl.java
+1
-1
FeiShuUtil.java
src/main/java/com/sfa/job/util/FeiShuUtil.java
+0
-182
T100Util.java
src/main/java/com/sfa/job/util/T100Util.java
+47
-0
bootstrap-dev.yml
src/main/resources/bootstrap-dev.yml
+3
-0
logback-spring.xml
src/main/resources/logback-spring.xml
+2
-0
ActivityPlanApprovalMapper.xml
...resources/mapper/promotion/ActivityPlanApprovalMapper.xml
+39
-0
ActivityPlanInfoMapper.xml
...ain/resources/mapper/promotion/ActivityPlanInfoMapper.xml
+63
-0
没有找到文件。
pom.xml
浏览文件 @
dba77f4d
...
...
@@ -108,10 +108,6 @@
<scope>
test
</scope>
</dependency>
<dependency>
<groupId>
com.larksuite.oapi
</groupId>
<artifactId>
oapi-sdk
</artifactId>
</dependency>
<dependency>
<groupId>
junit
</groupId>
<artifactId>
junit
</artifactId>
...
...
src/main/java/com/sfa/job/SfaJobApplication.java
浏览文件 @
dba77f4d
...
...
@@ -5,12 +5,14 @@ import com.sfa.common.security.annotation.EnableRyFeignClients;
import
org.mybatis.spring.annotation.MapperScan
;
import
org.springframework.boot.SpringApplication
;
import
org.springframework.boot.autoconfigure.SpringBootApplication
;
import
org.springframework.context.annotation.ComponentScan
;
/**
* 定时任务
*
* @author ruoyi
*/
@ComponentScan
(
basePackages
=
{
"com.sfa.common.core.utils.sdk"
,
"com.sfa.job"
})
@EnableCustomConfig
@EnableRyFeignClients
@SpringBootApplication
...
...
src/main/java/com/sfa/job/config/advice/ControllerResponseAdvice.java
浏览文件 @
dba77f4d
...
...
@@ -16,7 +16,7 @@ import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
* @date : 2024-10-28 17
* @describe :自动封装
*/
@RestControllerAdvice
@RestControllerAdvice
(
basePackages
=
{
"com.sfa.job.controller"
})
public
class
ControllerResponseAdvice
implements
ResponseBodyAdvice
<
Object
>{
/**
...
...
src/main/java/com/sfa/job/constants/Constants.java
浏览文件 @
dba77f4d
...
...
@@ -5,4 +5,15 @@ public class Constants {
* 采集数据方式
*/
public
static
final
String
SYNC_TYPE_XXL_JOB
=
"xxl-job"
;
public
static
final
String
ENCRYPT
=
"encrypt"
;
public
static
final
String
FEISHU_EVENT_CALLBACK
=
"event_callback"
;
public
static
final
String
FEISHU_APPROVAL_INSTANCE
=
"approval_instance"
;
public
static
final
String
FEISHU_EVENT_DEPT_CREATE
=
"corehr.department.created_v1"
;
public
static
final
String
FEISHU_EVENT_DEPT_PUT
=
"corehr.department.updated_v1"
;
public
static
final
String
FEISHU_EVENT_USER_CREATE
=
"corehr.job_data.employed_v1"
;
public
static
final
String
FEISHU_EVENT_USER_PUT
=
"corehr.job_data.changed_v1"
;
}
src/main/java/com/sfa/job/constants/RedisKeyJob.java
0 → 100644
浏览文件 @
dba77f4d
package
com
.
sfa
.
job
.
constants
;
/**
* @author : liqiulin
* @date : 2024-11-22 11
* @describe :
*/
public
interface
RedisKeyJob
{
String
FEISHU_EVENT_CREATE_DEPT
=
"job:feishu_event:create_dept_"
;
}
src/main/java/com/sfa/job/consumer/feishu/EventCallbackLuzx.java
0 → 100644
浏览文件 @
dba77f4d
package
com
.
sfa
.
job
.
consumer
.
feishu
;
import
com.alibaba.fastjson2.JSONObject
;
import
com.lark.oapi.ws.Constant
;
import
com.sfa.common.core.enums.ECode
;
import
com.sfa.common.core.enums.promotion.PlanStatus
;
import
com.sfa.common.core.exception.ServiceException
;
import
com.sfa.common.redis.service.RedisService
;
import
com.sfa.job.constants.Constants
;
import
com.sfa.job.constants.RedisKeyJob
;
import
com.sfa.job.pojo.feishu.event.EventCallBackDto
;
import
com.sfa.job.service.feishu.IEventCallbackService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestMethod
;
import
org.springframework.web.bind.annotation.RestController
;
import
javax.crypto.Cipher
;
import
javax.crypto.spec.IvParameterSpec
;
import
javax.crypto.spec.SecretKeySpec
;
import
java.nio.charset.StandardCharsets
;
import
java.security.MessageDigest
;
import
java.util.Base64
;
import
java.util.Objects
;
import
java.util.concurrent.TimeUnit
;
/**
* @author : liqiulin
* @date : 2025-06-04 13
* @describe : 飞书事件订阅 - 来自应用【王小卤链路中心】
* 订阅方式:https://open.feishu.cn/api-explorer/cli_a7dbe3ec7d9e5013?apiName=subscribe&from=op_doc_tab&project=approval&resource=approval&version=v4
*/
@Slf4j
@RestController
@RequestMapping
(
"/event_callback/fs/luzx"
)
public
class
EventCallbackLuzx
{
@Value
(
"${feishu.luzx.encrypt_key}"
)
private
String
encryptKeyP
;
@Value
(
"${feishu.approval.scfy}"
)
private
String
scfyCode
;
@Autowired
private
IEventCallbackService
eventCallbackService
;
@Autowired
private
RedisService
redisService
;
@RequestMapping
(
method
=
RequestMethod
.
POST
)
public
JSONObject
handleEvent
(
@RequestBody
JSONObject
eventObj
)
{
String
encrypt
=
eventObj
.
getString
(
Constants
.
ENCRYPT
);
try
{
MessageDigest
digest
=
MessageDigest
.
getInstance
(
"SHA-256"
);
byte
[]
keyBs
=
digest
.
digest
(
encryptKeyP
.
getBytes
(
StandardCharsets
.
UTF_8
));
String
decrypt
=
decrypt
(
encrypt
,
keyBs
);
JSONObject
req
=
JSONObject
.
parseObject
(
decrypt
);
log
.
info
(
"飞书事件回调数据:{}\n解析:{}"
,
eventObj
,
req
);
/**
* 审批实例 状态变更 事件处理
*/
String
type
=
req
.
getString
(
"type"
);
if
(
Objects
.
nonNull
(
type
)
&&
Constants
.
FEISHU_EVENT_CALLBACK
.
equals
(
type
)){
eventCallback
(
decrypt
);
}
/**
* 组织(部门/人员)变更 事件处理
*/
if
(
req
.
containsKey
(
"header"
)){
deptOrUserEvent
(
req
);
}
return
req
;
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
throw
new
ServiceException
(
ECode
.
DB_TABLE_UPDATE_ERROR
.
getMsg
(),
ECode
.
DB_TABLE_UPDATE_ERROR
.
getCode
());
}
}
/**
* 部门、人员变更事件
*/
private
void
deptOrUserEvent
(
JSONObject
req
)
{
if
(!
req
.
containsKey
(
"event"
)){
return
;
}
String
eventType
=
req
.
getJSONObject
(
"header"
).
getString
(
"event_type"
);
String
departmentId
=
req
.
getJSONObject
(
"event"
).
getString
(
"department_id"
);
String
rk
=
RedisKeyJob
.
FEISHU_EVENT_CREATE_DEPT
+
(
Objects
.
isNull
(
departmentId
)
?
"departmentId"
:
departmentId
);
// 部门新建
if
(
Constants
.
FEISHU_EVENT_DEPT_CREATE
.
equals
(
eventType
)
&&
!
redisService
.
hasKey
(
rk
)){
redisService
.
setCacheObject
(
rk
,
departmentId
,
1L
,
TimeUnit
.
HOURS
);
eventCallbackService
.
deptCreate
(
departmentId
);
}
// 部门更新/停用
if
(
Constants
.
FEISHU_EVENT_DEPT_PUT
.
equals
(
eventType
)){
eventCallbackService
.
deptUpdate
(
departmentId
);
}
// 员工入职
if
(
Constants
.
FEISHU_EVENT_USER_CREATE
.
equals
(
eventType
)){
eventCallbackService
.
userCreate
(
req
.
getJSONObject
(
"event"
).
getString
(
"employment_id"
));
}
// 员工信息修改
if
(
Constants
.
FEISHU_EVENT_USER_PUT
.
equals
(
eventType
)){
eventCallbackService
.
userUpdate
(
req
.
getJSONObject
(
"event"
).
getString
(
"employment_id"
));
}
}
/**
* 订阅审批
*/
private
void
eventCallback
(
String
decrypt
){
EventCallBackDto
eventCallBackDto
=
JSONObject
.
parseObject
(
decrypt
,
EventCallBackDto
.
class
);
EventCallBackDto
.
Event
event
=
eventCallBackDto
.
getEvent
();
// 市场推广费用申请(审批实例CODE:258B4D93-96D4-49E4-B9E1-DA6AB45740B0)
if
(
Constants
.
FEISHU_APPROVAL_INSTANCE
.
equals
(
event
.
getType
())
&&
scfyCode
.
equals
(
event
.
getApprovalCode
())){
if
(!
event
.
getStatus
().
equals
(
PlanStatus
.
PENDING
.
name
())){
eventCallbackService
.
planCP
(
event
);
}
}
}
/**
* 解析encrypt_key加密数据
*/
private
String
decrypt
(
String
base64
,
byte
[]
keyBs
)
throws
Exception
{
byte
[]
decode
=
Base64
.
getDecoder
().
decode
(
base64
);
Cipher
cipher
=
Cipher
.
getInstance
(
"AES/CBC/NOPADDING"
);
byte
[]
iv
=
new
byte
[
16
];
System
.
arraycopy
(
decode
,
0
,
iv
,
0
,
16
);
byte
[]
data
=
new
byte
[
decode
.
length
-
16
];
System
.
arraycopy
(
decode
,
16
,
data
,
0
,
data
.
length
);
cipher
.
init
(
Cipher
.
DECRYPT_MODE
,
new
SecretKeySpec
(
keyBs
,
"AES"
),
new
IvParameterSpec
(
iv
));
byte
[]
r
=
cipher
.
doFinal
(
data
);
if
(
r
.
length
>
0
)
{
int
p
=
r
.
length
-
1
;
for
(;
p
>=
0
&&
r
[
p
]
<=
16
;
p
--)
{
}
if
(
p
!=
r
.
length
-
1
)
{
byte
[]
rr
=
new
byte
[
p
+
1
];
System
.
arraycopy
(
r
,
0
,
rr
,
0
,
p
+
1
);
r
=
rr
;
}
}
return
new
String
(
r
,
StandardCharsets
.
UTF_8
);
}
}
src/main/java/com/sfa/job/domain/promotion/dao/ActivityPlanDaoImpl.java
0 → 100644
浏览文件 @
dba77f4d
package
com
.
sfa
.
job
.
domain
.
promotion
.
dao
;
import
com.baomidou.dynamic.datasource.annotation.DS
;
import
com.sfa.common.core.utils.bean.BeanUtils
;
import
com.sfa.job.domain.promotion.entity.ActivityPlanApproval
;
import
com.sfa.job.domain.promotion.mapper.ActivityPlanApprovalMapper
;
import
com.sfa.job.domain.promotion.mapper.ActivityPlanInfoMapper
;
import
com.sfa.job.pojo.promotion.response.ActivityPlanApprovalDto
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
/**
* @author : liqiulin
* @date : 2025-06-04 19
* @describe :
*/
@DS
(
"promotion"
)
@Service
public
class
ActivityPlanDaoImpl
implements
IActivityPlanDao
{
@Autowired
private
ActivityPlanApprovalMapper
activityPlanApprovalMapper
;
@Autowired
private
ActivityPlanInfoMapper
activityPlanInfoMapper
;
@Override
public
ActivityPlanApprovalDto
findPlanApproval
(
String
instanceId
)
{
ActivityPlanApproval
planApproval
=
activityPlanApprovalMapper
.
findPlanApproval
(
instanceId
);
return
BeanUtils
.
transitionDto
(
planApproval
,
ActivityPlanApprovalDto
.
class
);
}
@Override
public
void
updateApprovalStatusById
(
Long
id
,
String
status
)
{
activityPlanApprovalMapper
.
updateApprovalStatusById
(
id
,
status
);
}
@Override
public
void
updateActivityPlanStatusByInstanceId
(
String
instanceId
,
Integer
planStatusCode
)
{
activityPlanInfoMapper
.
updateStatusByInstanceId
(
instanceId
,
planStatusCode
);
}
}
src/main/java/com/sfa/job/domain/promotion/dao/IActivityPlanDao.java
0 → 100644
浏览文件 @
dba77f4d
package
com
.
sfa
.
job
.
domain
.
promotion
.
dao
;
import
com.sfa.job.pojo.promotion.response.ActivityPlanApprovalDto
;
/**
* @author : liqiulin
* @date : 2025-06-04 19
* @describe :
*/
public
interface
IActivityPlanDao
{
ActivityPlanApprovalDto
findPlanApproval
(
String
instanceId
);
void
updateApprovalStatusById
(
Long
id
,
String
status
);
void
updateActivityPlanStatusByInstanceId
(
String
instanceId
,
Integer
planStatusCode
);
}
src/main/java/com/sfa/job/domain/promotion/entity/ActivityPlanApproval.java
0 → 100644
浏览文件 @
dba77f4d
package
com
.
sfa
.
job
.
domain
.
promotion
.
entity
;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
com.baomidou.mybatisplus.annotation.TableField
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
java.io.Serializable
;
import
java.util.Date
;
import
lombok.Data
;
/**
*
* @TableName activity_plan_approval
*/
@TableName
(
value
=
"activity_plan_approval"
)
@Data
public
class
ActivityPlanApproval
implements
Serializable
{
/**
* 主键id
*/
@TableId
(
type
=
IdType
.
AUTO
)
private
Long
id
;
/**
* 活动计划表上传记录id
*/
private
Long
planFileId
;
/**
* 姓名
*/
private
String
employeeName
;
/**
* 员工工号
*/
private
String
employeeNo
;
/**
* 计划月份
*/
private
String
planMonth
;
/**
* 飞书审批实例ID
*/
private
String
fsInstanceId
;
/**
* 审批单号
*/
private
String
serialNumber
;
/**
* 审批状态
*/
private
String
approvalStatus
;
/**
* 审批内容
*/
private
String
form
;
/**
* 创建人
*/
private
String
createBy
;
/**
*
*/
private
Date
createTime
;
/**
*
*/
private
Date
modifyTime
;
@TableField
(
exist
=
false
)
private
static
final
long
serialVersionUID
=
1L
;
}
\ No newline at end of file
src/main/java/com/sfa/job/domain/promotion/entity/ActivityPlanInfo.java
0 → 100644
浏览文件 @
dba77f4d
package
com
.
sfa
.
job
.
domain
.
promotion
.
entity
;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
com.baomidou.mybatisplus.annotation.TableField
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
java.io.Serializable
;
import
java.math.BigDecimal
;
import
java.util.Date
;
import
lombok.Data
;
/**
* 活动计划列表
* @TableName activity_plan_info
*/
@TableName
(
value
=
"activity_plan_info"
)
@Data
public
class
ActivityPlanInfo
implements
Serializable
{
/**
* 主键id
*/
@TableId
(
type
=
IdType
.
AUTO
)
private
Long
id
;
/**
* 活动计划表上传记录id
*/
private
Long
planFileId
;
/**
* promotion_manage_employee表id
*/
private
Integer
employeeId
;
/**
* 姓名
*/
private
String
employeeName
;
/**
* 员工工号
*/
private
String
employeeNo
;
/**
* 年份
*/
private
Integer
year
;
/**
* 月份
*/
private
Integer
month
;
/**
* 日期
*/
private
Date
date
;
/**
* 系统名称
*/
private
String
lineName
;
/**
* 门店名称
*/
private
String
storeName
;
/**
* 门店编码
*/
private
String
storeCode
;
/**
* 战区-勤策ID
*/
private
String
orgQcId
;
/**
* 战区名称
*/
private
String
orgName
;
/**
* 活动模式id
*/
private
Integer
patternId
;
/**
* 活动模式
*/
private
String
pattern
;
/**
* 经销商编码
*/
private
String
dealerId
;
/**
* 经销商名称
*/
private
String
dealerName
;
/**
* 是否双T门店
*/
private
String
bothT
;
/**
* 门店所属行政区域-省份名称,如:北京市、江苏省
*/
private
String
province
;
/**
* 门店所属行政区域-城市名称,如:南京市
*/
private
String
city
;
/**
* 门店所属行政区域-区县名称,如:鼓楼区
*/
private
String
area
;
/**
* 门店所在地址
*/
private
String
addr
;
/**
* 上班时间
*/
private
Date
clockInTime
;
/**
* 下班时间
*/
private
Date
clockOutTime
;
/**
* 工资
*/
private
BigDecimal
salary
;
/**
* 杂费
*/
private
BigDecimal
incidentals
;
/**
* 是否执行:1:执行;0:未执行;2:审批中;3:审批拒绝;4:未审批;
*/
private
Integer
planStatus
;
/**
* 飞书审批实例Code
*/
private
String
fsInstanceId
;
/**
* 飞书审批单编号
*/
private
String
serialNumber
;
/**
* 审批人
*/
private
String
approvalEmpName
;
/**
*
*/
private
Date
createTime
;
/**
*
*/
private
Date
modifyTime
;
/**
* 1:有效;0:删除;
*/
private
Integer
isDelete
;
/**
* 创建人
*/
private
String
createBy
;
/**
* 修改人
*/
private
String
modifyBy
;
@TableField
(
exist
=
false
)
private
static
final
long
serialVersionUID
=
1L
;
}
\ No newline at end of file
src/main/java/com/sfa/job/domain/promotion/mapper/ActivityPlanApprovalMapper.java
0 → 100644
浏览文件 @
dba77f4d
package
com
.
sfa
.
job
.
domain
.
promotion
.
mapper
;
import
com.sfa.job.domain.promotion.entity.ActivityPlanApproval
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
org.apache.ibatis.annotations.Param
;
import
org.springframework.stereotype.Repository
;
/**
* @author a02200059
* @description 针对表【activity_plan_approval】的数据库操作Mapper
* @createDate 2025-06-04 19:01:10
* @Entity com.sfa.job.domain.promotion.entity.ActivityPlanApproval
*/
@Repository
public
interface
ActivityPlanApprovalMapper
extends
BaseMapper
<
ActivityPlanApproval
>
{
ActivityPlanApproval
findPlanApproval
(
String
instanceId
);
void
updateApprovalStatusById
(
@Param
(
"id"
)
Long
id
,
@Param
(
"status"
)
String
status
);
}
src/main/java/com/sfa/job/domain/promotion/mapper/ActivityPlanInfoMapper.java
0 → 100644
浏览文件 @
dba77f4d
package
com
.
sfa
.
job
.
domain
.
promotion
.
mapper
;
import
com.sfa.job.domain.promotion.entity.ActivityPlanInfo
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
org.apache.ibatis.annotations.Param
;
import
org.springframework.stereotype.Repository
;
/**
* @author a02200059
* @description 针对表【activity_plan_info(活动计划列表)】的数据库操作Mapper
* @createDate 2025-06-04 19:01:10
* @Entity com.sfa.job.domain.promotion.entity.ActivityPlanInfo
*/
@Repository
public
interface
ActivityPlanInfoMapper
extends
BaseMapper
<
ActivityPlanInfo
>
{
void
updateStatusByInstanceId
(
@Param
(
"fsInstanceId"
)
String
instanceId
,
@Param
(
"planStatus"
)
Integer
planStatusCode
);
}
src/main/java/com/sfa/job/pojo/feishu/event/EventCallBackDto.java
0 → 100644
浏览文件 @
dba77f4d
package
com
.
sfa
.
job
.
pojo
.
feishu
.
event
;
import
com.alibaba.fastjson.annotation.JSONField
;
import
lombok.Data
;
/**
* @author : liqiulin
* @date : 2025-06-04 18
* @describe :
*/
@Data
public
class
EventCallBackDto
{
// 事件的唯一标识。
@JSONField
(
name
=
"uuid"
)
private
String
uuid
;
// 事件 Token,即应用的 Verification Token。
@JSONField
(
name
=
"token"
)
private
String
token
;
// 事件发送时间。包含小数的秒级时间戳。
@JSONField
(
name
=
"ts"
)
private
String
ts
;
// 固定取值 event_callback。
@JSONField
(
name
=
"type"
)
private
String
type
;
@JSONField
(
name
=
"event"
)
private
Event
event
;
@Data
public
class
Event
{
// 应用的 App ID。可调用获取应用信息接口查询应用详细信息。
@JSONField
(
name
=
"app_id"
)
private
String
appId
;
// 审批定义 Code
@JSONField
(
name
=
"approval_code"
)
private
String
approvalCode
;
// 审批实例 Code
@JSONField
(
name
=
"instance_code"
)
private
String
fsInstanceId
;
// 事件发生事件,毫秒级时间戳。
@JSONField
(
name
=
"instance_operate_time"
)
private
String
instanceOperateTime
;
// 事件发生时间,毫秒级时间戳。
@JSONField
(
name
=
"operate_time"
)
private
String
operateTime
;
/**
* 审批实例状态。可能值有:
* PENDING:审批中
* APPROVED:已通过
* REJECTED:已拒绝
* CANCELED:已撤回
* DELETED:已删除
* REVERTED:已撤销
* OVERTIME_CLOSE:超时被关闭
* OVERTIME_RECOVER:超时实例被恢复
*/
@JSONField
(
name
=
"status"
)
private
String
status
;
// 企业唯一标识。
@JSONField
(
name
=
"tenant_key"
)
private
String
tenantKey
;
// 事件类型。固定取值
@JSONField
(
name
=
"type"
)
private
String
type
;
// 如果创建审批实例时传入了 uuid,则此处返回该实例的 uuid。
@JSONField
(
name
=
"uuid"
)
private
String
uuid
;
}
}
src/main/java/com/sfa/job/pojo/promotion/response/ActivityPlanApprovalDto.java
0 → 100644
浏览文件 @
dba77f4d
package
com
.
sfa
.
job
.
pojo
.
promotion
.
response
;
import
lombok.Data
;
import
java.util.Date
;
/**
* @author : liqiulin
* @date : 2025-06-04 19
* @describe :
*/
@Data
public
class
ActivityPlanApprovalDto
{
/**
* 主键id
*/
private
Long
id
;
/**
* 活动计划表上传记录id
*/
private
Long
planFileId
;
/**
* 姓名
*/
private
String
employeeName
;
/**
* 员工工号
*/
private
String
employeeNo
;
/**
* 计划月份
*/
private
String
planMonth
;
/**
* 飞书审批实例ID
*/
private
String
fsInstanceId
;
/**
* 审批单号
*/
private
String
serialNumber
;
/**
* 审批状态
*/
private
String
approvalStatus
;
/**
* 审批内容
*/
private
String
form
;
/**
* 创建人
*/
private
String
createBy
;
/**
*
*/
private
Date
createTime
;
/**
*
*/
private
Date
modifyTime
;
}
src/main/java/com/sfa/job/service/erp/impl/ErpAxmr005ServiceImpl.java
浏览文件 @
dba77f4d
package
com
.
sfa
.
job
.
service
.
erp
.
impl
;
import
com.
alibaba.fastjson2.JSONObject
;
import
com.
sfa.common.core.utils.sdk.FeiShuUtil
;
import
com.sfa.job.domain.erp.dao.ErpAxmr005ShippingDetailsDao
;
import
com.sfa.job.domain.use.dao.IFeishuSheetRecordDao
;
import
com.sfa.job.pojo.response.FeishuSheetRecordDto
;
import
com.sfa.job.service.erp.ErpAxmr005Service
;
import
com.sfa.job.util.FeiShuUtil
;
import
com.sfa.job.domain.use.dao.IFeishuSheetRecordDao
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
...
...
src/main/java/com/sfa/job/service/feishu/EventCallbackServiceImpl.java
0 → 100644
浏览文件 @
dba77f4d
package
com
.
sfa
.
job
.
service
.
feishu
;
import
cn.hutool.core.date.DatePattern
;
import
cn.hutool.core.date.DateUtil
;
import
com.alibaba.fastjson2.JSONObject
;
import
com.lark.oapi.service.corehr.v2.model.*
;
import
com.sfa.common.core.enums.promotion.PlanStatus
;
import
com.sfa.common.core.utils.DateUtils
;
import
com.sfa.common.core.utils.sdk.FeiShuUtil
;
import
com.sfa.job.domain.promotion.dao.IActivityPlanDao
;
import
com.sfa.job.pojo.feishu.event.EventCallBackDto
;
import
com.sfa.job.pojo.promotion.response.ActivityPlanApprovalDto
;
import
com.sfa.job.util.T100Util
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.Date
;
import
java.util.Objects
;
/**
* @author : liqiulin
* @date : 2025-06-04 17
* @describe :
*/
@Slf4j
@Service
public
class
EventCallbackServiceImpl
implements
IEventCallbackService
{
@Autowired
private
IActivityPlanDao
activityPlanDao
;
@Autowired
private
FeiShuUtil
feiShuUtil
;
@Autowired
private
T100Util
t100Util
;
@Override
public
void
planCP
(
EventCallBackDto
.
Event
event
)
{
String
status
=
event
.
getStatus
();
String
instanceId
=
event
.
getFsInstanceId
();
ActivityPlanApprovalDto
planApproval
=
activityPlanDao
.
findPlanApproval
(
instanceId
);
if
(
planApproval
==
null
){
log
.
error
(
"审批实例不存在:{}"
,
event
);
}
activityPlanDao
.
updateApprovalStatusById
(
planApproval
.
getId
(),
status
);
// 校验状态:已通过=已通过;非已通过=审批未通过
PlanStatus
planStatus
=
PlanStatus
.
APPROVED
.
name
().
equals
(
status
)
?
PlanStatus
.
NOT_EXECUTION
:
PlanStatus
.
REJECTED
;
Integer
planStatusCode
=
planStatus
.
getCode
();
activityPlanDao
.
updateActivityPlanStatusByInstanceId
(
instanceId
,
planStatusCode
);
}
@Override
public
void
deptCreate
(
String
departmentId
)
{
JSONObject
deptT100
=
new
JSONObject
();
Department
dept
=
feiShuUtil
.
getDepartmentCorehr
(
departmentId
);
String
deptCode
=
dept
.
getCode
();
I18n
[]
departmentName
=
dept
.
getDepartmentName
();
String
deptName
=
departmentName
[
0
].
getValue
();
customFields
(
dept
.
getCustomFields
(),
deptT100
);
String
parentDepartmentId
=
dept
.
getParentDepartmentId
();
Department
parentdept
=
feiShuUtil
.
getDepartmentCorehr
(
parentDepartmentId
);
deptT100
.
put
(
"data_status"
,
"A"
);
deptT100
.
put
(
"enterprise_no"
,
"80"
);
deptT100
.
put
(
"status"
,
"Y"
);
deptT100
.
put
(
"department_no"
,
deptCode
);
deptT100
.
put
(
"top_level_department_no"
,
Objects
.
nonNull
(
parentdept
.
getIsRoot
())
&&
parentdept
.
getIsRoot
()
?
"BJHQ"
:
parentdept
.
getCode
());
deptT100
.
put
(
"effective_date"
,
DateUtils
.
datePath
());
deptT100
.
put
(
"expiration_date"
,
null
);
deptT100
.
put
(
"corporation"
,
"ALL"
);
deptT100
.
put
(
"department_name_name"
,
deptName
);
deptT100
.
put
(
"department_shortname"
,
deptName
);
deptT100
.
put
(
"top_organization_no"
,
"ALL"
);
deptT100
.
put
(
"department_heads_employee_no"
,
""
);
deptT100
.
put
(
"ooeg005"
,
"Y"
);
createOrUpdateDept
(
deptT100
);
}
@Override
public
void
deptUpdate
(
String
departmentId
)
{
JSONObject
deptT100
=
new
JSONObject
();
Department
dept
=
feiShuUtil
.
getDepartmentCorehr
(
departmentId
);
// 部门启用状态,true为启用,false为停用
Boolean
active
=
dept
.
getActive
();
String
deptCode
=
dept
.
getCode
();
I18n
[]
departmentName
=
dept
.
getDepartmentName
();
String
deptName
=
active
?
departmentName
[
0
].
getValue
()
:
"(失效)"
+
departmentName
[
0
].
getValue
();
customFields
(
dept
.
getCustomFields
(),
deptT100
);
String
parentDepartmentId
=
dept
.
getParentDepartmentId
();
Department
parentdept
=
feiShuUtil
.
getDepartmentCorehr
(
parentDepartmentId
);
deptT100
.
put
(
"data_status"
,
"AU"
);
deptT100
.
put
(
"enterprise_no"
,
"80"
);
deptT100
.
put
(
"status"
,
"Y"
);
deptT100
.
put
(
"department_no"
,
deptCode
);
deptT100
.
put
(
"top_level_department_no"
,
Objects
.
nonNull
(
parentdept
.
getIsRoot
())
&&
parentdept
.
getIsRoot
()
?
"BJHQ"
:
parentdept
.
getCode
());
deptT100
.
put
(
"effective_date"
,
DateUtils
.
datePath
());
deptT100
.
put
(
"expiration_date"
,
null
);
deptT100
.
put
(
"corporation"
,
"ALL"
);
deptT100
.
put
(
"department_name_name"
,
deptName
);
deptT100
.
put
(
"department_shortname"
,
deptName
);
deptT100
.
put
(
"top_organization_no"
,
"ALL"
);
deptT100
.
put
(
"department_heads_employee_no"
,
""
);
deptT100
.
put
(
"ooeg005"
,
"Y"
);
createOrUpdateDept
(
deptT100
);
}
/**
* 员工入职
*/
@Override
public
void
userCreate
(
String
employmentId
)
{
Employee
emp
=
feiShuUtil
.
getEmployeeReq
(
employmentId
);
String
departmentIdV2
=
emp
.
getDepartmentIdV2
();
Department
dept
=
feiShuUtil
.
getDepartmentCorehr
(
departmentIdV2
);
String
employeeNumber
=
emp
.
getEmployeeNumber
();
String
deptCode
=
dept
.
getCode
();
BankAccount
bankAccount
=
emp
.
getPersonInfo
().
getBankAccountList
()[
0
];
String
branchIdV2
=
bankAccount
.
getBranchIdV2
();
String
bankAccountNumber
=
bankAccount
.
getBankAccountNumber
();
String
preferredName
=
emp
.
getPersonInfo
().
getPreferredName
();
JSONObject
userT100
=
new
JSONObject
();
userT100
.
put
(
"data_status"
,
"AU"
);
userT100
.
put
(
"status"
,
"Y"
);
userT100
.
put
(
"employee_no"
,
employeeNumber
);
userT100
.
put
(
"department_no"
,
deptCode
);
userT100
.
put
(
"site_no"
,
"ALL"
);
userT100
.
put
(
"title"
,
""
);
userT100
.
put
(
"bank_no"
,
branchIdV2
);
userT100
.
put
(
"account"
,
bankAccountNumber
);
userT100
.
put
(
"employee_name"
,
preferredName
);
userT100
.
put
(
"employee_nickname"
,
preferredName
);
userT100
.
put
(
"phone"
,
""
);
userT100
.
put
(
"mobilephone"
,
"ALL"
);
userT100
.
put
(
"email"
,
""
);
createOrUpdateUser
(
userT100
);
}
@Override
public
void
userUpdate
(
String
employmentId
)
{
userCreate
(
employmentId
);
}
private
void
customFields
(
CustomFieldData
[]
customFields
,
JSONObject
deptT100
){
for
(
CustomFieldData
customField
:
customFields
)
{
String
customName
=
customField
.
getName
().
getZhCn
();
String
customValue
=
JSONObject
.
parse
(
customField
.
getValue
()).
getString
(
"zh-CN"
);
switch
(
customName
)
{
case
"责任中心"
:
deptT100
.
put
(
"responsibility_center_type"
,
customValue
.
substring
(
0
,
1
));
break
;
case
"费用类别"
:
deptT100
.
put
(
"fee_type"
,
customValue
.
substring
(
0
,
1
));
break
;
default
:
break
;
}
}
}
private
void
createOrUpdateDept
(
JSONObject
deptT100
){
JSONObject
service
=
new
JSONObject
();
service
.
put
(
"name"
,
"department.create"
);
JSONObject
datakey
=
new
JSONObject
();
datakey
.
put
(
"CompanyId"
,
"BJHQ"
);
datakey
.
put
(
"EntId"
,
"80"
);
JSONObject
host
=
new
JSONObject
();
host
.
put
(
"acct"
,
"tiptop"
);
host
.
put
(
"ip"
,
"192.168.100.20"
);
host
.
put
(
"lang"
,
"zh_CN"
);
host
.
put
(
"prod"
,
"CRM"
);
host
.
put
(
"timestamp"
,
DateUtil
.
format
(
new
Date
(),
DatePattern
.
NORM_DATETIME_MS_PATTERN
));
JSONObject
payload
=
new
JSONObject
();
payload
.
putObject
(
"std_data"
).
putObject
(
"parameter"
).
putArray
(
"master_data"
).
add
(
deptT100
);
JSONObject
deptJson
=
new
JSONObject
();
deptJson
.
put
(
"service"
,
service
);
deptJson
.
put
(
"datakey"
,
datakey
);
deptJson
.
put
(
"host"
,
host
);
deptJson
.
put
(
"payload"
,
payload
);
t100Util
.
createOrUpdateDept
(
deptJson
);
}
private
void
createOrUpdateUser
(
JSONObject
userT100
){
JSONObject
service
=
new
JSONObject
();
service
.
put
(
"name"
,
"employee.create"
);
JSONObject
datakey
=
new
JSONObject
();
datakey
.
put
(
"CompanyId"
,
"BJHQ"
);
datakey
.
put
(
"EntId"
,
"80"
);
JSONObject
host
=
new
JSONObject
();
host
.
put
(
"acct"
,
"tiptop"
);
host
.
put
(
"ip"
,
"192.168.100.20"
);
host
.
put
(
"lang"
,
"zh_CN"
);
host
.
put
(
"prod"
,
"CRM"
);
host
.
put
(
"timestamp"
,
DateUtil
.
format
(
new
Date
(),
DatePattern
.
NORM_DATETIME_MS_PATTERN
));
JSONObject
payload
=
new
JSONObject
();
payload
.
putObject
(
"std_data"
).
putObject
(
"parameter"
).
putArray
(
"master_data"
).
add
(
userT100
);
JSONObject
userJson
=
new
JSONObject
();
userJson
.
put
(
"service"
,
service
);
userJson
.
put
(
"datakey"
,
datakey
);
userJson
.
put
(
"host"
,
host
);
userJson
.
put
(
"payload"
,
payload
);
t100Util
.
createOrUpdateUser
(
userJson
);
}
}
src/main/java/com/sfa/job/service/feishu/IEventCallbackService.java
0 → 100644
浏览文件 @
dba77f4d
package
com
.
sfa
.
job
.
service
.
feishu
;
import
com.sfa.job.pojo.feishu.event.EventCallBackDto
;
/**
* @author : liqiulin
* @date : 2025-06-04 17
* @describe :
*/
public
interface
IEventCallbackService
{
void
planCP
(
EventCallBackDto
.
Event
event
);
void
deptCreate
(
String
departmentId
);
void
deptUpdate
(
String
departmentId
);
void
userCreate
(
String
employmentId
);
void
userUpdate
(
String
employmentId
);
}
src/main/java/com/sfa/job/service/feishu/PullSheetServiceImpl.java
浏览文件 @
dba77f4d
...
...
@@ -2,16 +2,14 @@ package com.sfa.job.service.feishu;
import
com.alibaba.fastjson2.JSONArray
;
import
com.alibaba.fastjson2.JSONObject
;
import
com.sfa.common.core.utils.sdk.FeiShuUtil
;
import
com.sfa.job.domain.feishu.dao.IQinceMarketEmployeeDao
;
import
com.sfa.job.domain.use.dao.IFeishuSheetRecordDao
;
import
com.sfa.job.enums.FSRecordEnum
;
import
com.sfa.job.pojo.response.FeishuSheetRecordDto
;
import
com.sfa.job.util.FeiShuUtil
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.stream.DoubleStream
;
/**
* @author : liqiulin
* @date : 2025-05-09 16
...
...
src/main/java/com/sfa/job/service/system/DeptAndUserServiceImpl.java
浏览文件 @
dba77f4d
...
...
@@ -2,10 +2,10 @@ package com.sfa.job.service.system;
import
com.alibaba.fastjson2.JSONArray
;
import
com.alibaba.fastjson2.JSONObject
;
import
com.sfa.common.core.utils.sdk.FeiShuUtil
;
import
com.sfa.job.domain.system.dao.ISysDeptDao
;
import
com.sfa.job.domain.system.dao.ISysUserDao
;
import
com.sfa.job.domain.system.entity.SysDept
;
import
com.sfa.job.util.FeiShuUtil
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
...
...
src/main/java/com/sfa/job/util/FeiShuUtil.java
deleted
100644 → 0
浏览文件 @
ec23277d
package
com
.
sfa
.
job
.
util
;
import
cn.hutool.http.HttpUtil
;
import
cn.hutool.http.Method
;
import
com.alibaba.fastjson2.JSONArray
;
import
com.alibaba.fastjson2.JSONObject
;
import
com.google.gson.JsonParser
;
import
com.lark.oapi.Client
;
import
com.lark.oapi.core.utils.Jsons
;
import
com.lark.oapi.service.contact.v3.enums.ChildrenDepartmentDepartmentIdTypeEnum
;
import
com.lark.oapi.service.contact.v3.enums.FindByDepartmentUserDepartmentIdTypeEnum
;
import
com.lark.oapi.service.contact.v3.enums.FindByDepartmentUserUserIdTypeEnum
;
import
com.lark.oapi.service.contact.v3.model.ChildrenDepartmentReq
;
import
com.lark.oapi.service.contact.v3.model.ChildrenDepartmentResp
;
import
com.lark.oapi.service.contact.v3.model.FindByDepartmentUserReq
;
import
com.lark.oapi.service.contact.v3.model.FindByDepartmentUserResp
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.stereotype.Component
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
/**
* @author : liqiulin
* @date : 2024-12-06 16
* @describe :
*/
@Slf4j
@Component
public
class
FeiShuUtil
{
@Value
(
"${feishu.luzx.app_id}"
)
private
String
appId
;
@Value
(
"${feishu.luzx.app_secret}"
)
private
String
appSecret
;
@Value
(
"${feishu.bot_1.app_id}"
)
private
String
botAppId1
;
@Value
(
"${feishu.bot_1.app_secret}"
)
private
String
botAppSecret1
;
private
static
final
String
CONTENT_TYPE
=
"application/json; charset=utf-8"
;
private
static
final
String
SHEET_URL
=
"https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/"
;
private
static
final
String
TENANT_ACCESS_TOKEN_URL
=
"https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal"
;
private
static
final
String
VALUES_APPEND
=
"/values_append"
;
private
static
final
String
VALUES_IMAGE
=
"/values_image"
;
private
static
final
String
VALUES_BATCH_GET
=
"/values_batch_get"
;
private
static
final
String
VALUES
=
"/values"
;
private
static
final
String
STYLE
=
"/style"
;
/**
* 根据部门父编码获取子部门
* 公司编码:"0"
*/
public
JSONArray
getDeptByParentId
(
String
parentId
)
{
try
{
Client
client
=
getClient
();
ChildrenDepartmentReq
req
=
ChildrenDepartmentReq
.
newBuilder
()
.
departmentId
(
parentId
)
.
departmentIdType
(
ChildrenDepartmentDepartmentIdTypeEnum
.
DEPARTMENT_ID
)
.
pageSize
(
50
)
.
build
();
ChildrenDepartmentResp
resp
=
client
.
contact
().
department
().
children
(
req
);
if
(!
resp
.
success
())
{
log
.
error
(
String
.
format
(
"code:%s,msg:%s,reqId:%s, resp:%s"
,
resp
.
getCode
(),
resp
.
getMsg
(),
resp
.
getRequestId
(),
Jsons
.
createGSON
(
true
,
false
).
toJson
(
JsonParser
.
parseString
(
new
String
(
resp
.
getRawResponse
().
getBody
(),
"UTF-8"
)))));
return
null
;
}
JSONArray
items
=
JSONObject
.
parse
(
Jsons
.
DEFAULT
.
toJson
(
resp
.
getData
())).
getJSONArray
(
"items"
);
return
items
;
}
catch
(
Exception
e
)
{
log
.
error
(
"获取子部门列表失败,停止执行!"
);
}
return
null
;
}
/**
* 获取部门用户
*/
public
JSONArray
getUsersByDeptId
(
String
deptCode
)
{
try
{
Client
client
=
getClient
();
FindByDepartmentUserReq
req
=
FindByDepartmentUserReq
.
newBuilder
()
.
userIdType
(
FindByDepartmentUserUserIdTypeEnum
.
OPEN_ID
)
.
departmentIdType
(
FindByDepartmentUserDepartmentIdTypeEnum
.
DEPARTMENT_ID
)
.
departmentId
(
deptCode
)
.
pageSize
(
50
)
.
build
();
FindByDepartmentUserResp
resp
=
client
.
contact
().
user
().
findByDepartment
(
req
);
if
(!
resp
.
success
())
{
log
.
warn
(
String
.
format
(
"code:%s,msg:%s,reqId:%s, resp:%s"
,
resp
.
getCode
(),
resp
.
getMsg
(),
resp
.
getRequestId
(),
Jsons
.
createGSON
(
true
,
false
).
toJson
(
JsonParser
.
parseString
(
new
String
(
resp
.
getRawResponse
().
getBody
(),
"UTF-8"
)))));
return
null
;
}
JSONArray
items
=
JSONObject
.
parse
(
Jsons
.
DEFAULT
.
toJson
(
resp
.
getData
())).
getJSONArray
(
"items"
);
return
items
;
}
catch
(
Exception
e
)
{
log
.
error
(
"获取部门用户失败,停止执行!部门id:{}"
,
deptCode
);
}
return
null
;
}
/**
* 获取表格数据
*/
public
JSONArray
pullSheet
(
String
sheetToken
,
String
autoToken
,
String
ranges
)
{
try
{
Map
<
String
,
Object
>
params
=
new
HashMap
<>();
params
.
put
(
"ranges"
,
ranges
);
String
result
=
HttpUtil
.
createGet
(
SHEET_URL
+
sheetToken
+
VALUES_BATCH_GET
).
form
(
params
).
auth
(
"Bearer "
+
autoToken
).
contentType
(
CONTENT_TYPE
).
execute
().
body
();
JSONObject
resultJson
=
JSONObject
.
parseObject
(
result
);
int
code
=
resultJson
.
getInteger
(
"code"
);
if
(
code
!=
0
)
{
throw
new
RuntimeException
(
"获取飞书表格范围数据错误:"
+
resultJson
.
getString
(
"msg"
));
}
return
resultJson
.
getJSONObject
(
"data"
).
getJSONArray
(
"valueRanges"
);
}
catch
(
Exception
e
)
{
log
.
error
(
"拉取表格数据失败,停止执行!"
,
e
);
}
return
new
JSONArray
();
}
private
Client
getClient
()
{
return
Client
.
newBuilder
(
appId
,
appSecret
).
build
();
}
public
Integer
pushSetToSheet
(
String
range
,
List
<
Object
>
datas
,
String
sheetToken
,
String
autoToken
)
{
// 组装参数
Map
<
String
,
Map
<
String
,
Object
>>
bodyMap
=
new
HashMap
<>();
Map
<
String
,
Object
>
valueRange
=
new
HashMap
<>();
valueRange
.
put
(
"range"
,
range
);
valueRange
.
put
(
"values"
,
datas
);
bodyMap
.
put
(
"valueRange"
,
valueRange
);
String
bodyJson
=
JSONObject
.
toJSONString
(
bodyMap
);
// body上传
String
result
=
HttpUtil
.
createPost
(
SHEET_URL
+
sheetToken
+
VALUES_APPEND
)
.
auth
(
"Bearer "
+
autoToken
).
contentType
(
CONTENT_TYPE
)
.
body
(
bodyJson
)
.
execute
().
body
();
// 上传结果判断
JSONObject
resultJson
=
JSONObject
.
parseObject
(
result
);
return
resultJson
.
getInteger
(
"code"
);
}
public
String
getBotToken1
()
{
Map
<
String
,
Object
>
bodyMap
=
new
HashMap
<>();
bodyMap
.
put
(
"app_id"
,
botAppId1
);
bodyMap
.
put
(
"app_secret"
,
botAppSecret1
);
String
bodyJson
=
JSONObject
.
toJSONString
(
bodyMap
);
String
result
=
HttpUtil
.
createPost
(
TENANT_ACCESS_TOKEN_URL
)
.
contentType
(
CONTENT_TYPE
)
.
body
(
bodyJson
)
.
execute
().
body
();
JSONObject
resultJson
=
JSONObject
.
parseObject
(
result
);
int
code
=
resultJson
.
getInteger
(
"code"
);
if
(
code
!=
0
)
{
throw
new
RuntimeException
(
"获取tenant_access_token错误"
);
}
return
resultJson
.
getString
(
"tenant_access_token"
);
}
public
void
appendStyle
(
String
sheetToken
,
Map
<
String
,
Object
>
body
,
String
autoToken
)
{
// body上传
String
result
=
HttpUtil
.
createRequest
(
Method
.
PUT
,
SHEET_URL
+
sheetToken
+
STYLE
)
.
auth
(
"Bearer "
+
autoToken
).
contentType
(
CONTENT_TYPE
)
.
body
(
JSONObject
.
toJSONString
(
body
))
.
execute
().
body
();
}
public
JSONObject
pullSheetOneRange
(
String
sheetToken
,
String
botToken1
,
String
ranges
)
{
return
pullSheet
(
sheetToken
,
botToken1
,
ranges
).
getJSONObject
(
0
);
}
}
src/main/java/com/sfa/job/util/T100Util.java
0 → 100644
浏览文件 @
dba77f4d
package
com
.
sfa
.
job
.
util
;
import
cn.hutool.http.HttpUtil
;
import
com.alibaba.fastjson2.JSONObject
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.stereotype.Component
;
import
java.util.HashMap
;
/**
* @author : liqiulin
* @date : 2025-06-19 17
* @describe : T100接口对接
*/
@Slf4j
@Component
public
class
T100Util
{
@Value
(
"${t100.url}"
)
private
String
url
;
public
void
createOrUpdateDept
(
JSONObject
deptJson
){
HashMap
<
String
,
String
>
header
=
new
HashMap
<>();
header
.
put
(
"Content-Type"
,
"application/json;charset=utf-8"
);
header
.
put
(
"digi-protocol"
,
"raw"
);
header
.
put
(
"digi-srvver"
,
"1.0"
);
header
.
put
(
"digi-srvcode"
,
"000"
);
header
.
put
(
"digi-type"
,
"sync"
);
header
.
put
(
"digi-key"
,
"f63b06af224e90ea3f9f08e0226fc91e"
);
String
body
=
HttpUtil
.
createPost
(
url
).
addHeaders
(
header
).
body
(
deptJson
.
toString
()).
execute
().
body
();
log
.
info
(
"\nT100-创建/修改部门\n参数:{}\n结果:{}"
,
deptJson
,
body
);
}
public
void
createOrUpdateUser
(
JSONObject
userJson
)
{
HashMap
<
String
,
String
>
header
=
new
HashMap
<>();
header
.
put
(
"Content-Type"
,
"application/json;charset=utf-8"
);
header
.
put
(
"digi-protocol"
,
"raw"
);
header
.
put
(
"digi-srvver"
,
"1.0"
);
header
.
put
(
"digi-srvcode"
,
"000"
);
header
.
put
(
"digi-type"
,
"sync"
);
header
.
put
(
"digi-key"
,
"f63b06af224e90ea3f9f08e0226fc91e"
);
String
body
=
HttpUtil
.
createPost
(
url
).
addHeaders
(
header
).
body
(
userJson
.
toString
()).
execute
().
body
();
log
.
info
(
"\nT100-创建/修改人员\n参数:{}\n结果:{}"
,
userJson
,
body
);
}
}
src/main/resources/bootstrap-dev.yml
浏览文件 @
dba77f4d
...
...
@@ -13,3 +13,5 @@ spring:
file-extension
:
yaml
group
:
sfa
namespace
:
9fb64726-e415-43e4-9e79-9be8d2666671
shared-configs
:
-
data-id
:
wangxiaolu-sfa-shared.yaml
\ No newline at end of file
src/main/resources/logback-spring.xml
浏览文件 @
dba77f4d
...
...
@@ -40,6 +40,7 @@
class=
"ch.qos.logback.core.rolling.RollingFileAppender"
>
<encoder>
<pattern>
${FILE_LOG_PATTERN}
</pattern>
<charset>
UTF-8
</charset>
</encoder>
<file>
${LOG_PATH}/${MODEL_NAME}-today.log
</file>
<rollingPolicy
class=
"ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"
>
...
...
@@ -56,6 +57,7 @@
class=
"ch.qos.logback.core.rolling.RollingFileAppender"
>
<encoder>
<pattern>
${FILE_LOG_PATTERN}
</pattern>
<charset>
UTF-8
</charset>
</encoder>
<file>
${LOG_PATH}/${MODEL_NAME}-error-today.log
</file>
<rollingPolicy
class=
"ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"
>
...
...
src/main/resources/mapper/promotion/ActivityPlanApprovalMapper.xml
0 → 100644
浏览文件 @
dba77f4d
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace=
"com.sfa.job.domain.promotion.mapper.ActivityPlanApprovalMapper"
>
<resultMap
id=
"BaseResultMap"
type=
"com.sfa.job.domain.promotion.entity.ActivityPlanApproval"
>
<id
property=
"id"
column=
"id"
jdbcType=
"BIGINT"
/>
<result
property=
"planFileId"
column=
"plan_file_id"
jdbcType=
"BIGINT"
/>
<result
property=
"employeeName"
column=
"employee_name"
jdbcType=
"VARCHAR"
/>
<result
property=
"employeeNo"
column=
"employee_no"
jdbcType=
"VARCHAR"
/>
<result
property=
"planMonth"
column=
"plan_month"
jdbcType=
"VARCHAR"
/>
<result
property=
"fsInstanceId"
column=
"fs_instance_id"
jdbcType=
"VARCHAR"
/>
<result
property=
"serialNumber"
column=
"serial_number"
jdbcType=
"VARCHAR"
/>
<result
property=
"approvalStatus"
column=
"approval_status"
jdbcType=
"VARCHAR"
/>
<result
property=
"form"
column=
"form"
jdbcType=
"VARCHAR"
/>
<result
property=
"createBy"
column=
"create_by"
jdbcType=
"VARCHAR"
/>
<result
property=
"createTime"
column=
"create_time"
jdbcType=
"TIMESTAMP"
/>
<result
property=
"modifyTime"
column=
"modify_time"
jdbcType=
"TIMESTAMP"
/>
</resultMap>
<sql
id=
"Base_Column_List"
>
id,plan_file_id,employee_name,
employee_no,plan_month,fs_instance_id,
serial_number,approval_status,form,
create_by,create_time,modify_time
</sql>
<select
id=
"findPlanApproval"
resultMap=
"BaseResultMap"
>
select *
from activity_plan_approval where fs_instance_id = #{instanceId};
</select>
<update
id=
"updateApprovalStatusById"
>
update activity_plan_approval
set approval_status = #{status}
where id = #{id}
</update>
</mapper>
src/main/resources/mapper/promotion/ActivityPlanInfoMapper.xml
0 → 100644
浏览文件 @
dba77f4d
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace=
"com.sfa.job.domain.promotion.mapper.ActivityPlanInfoMapper"
>
<resultMap
id=
"BaseResultMap"
type=
"com.sfa.job.domain.promotion.entity.ActivityPlanInfo"
>
<id
property=
"id"
column=
"id"
jdbcType=
"BIGINT"
/>
<result
property=
"planFileId"
column=
"plan_file_id"
jdbcType=
"BIGINT"
/>
<result
property=
"employeeId"
column=
"employee_id"
jdbcType=
"INTEGER"
/>
<result
property=
"employeeName"
column=
"employee_name"
jdbcType=
"VARCHAR"
/>
<result
property=
"employeeNo"
column=
"employee_no"
jdbcType=
"VARCHAR"
/>
<result
property=
"year"
column=
"year"
jdbcType=
"INTEGER"
/>
<result
property=
"month"
column=
"month"
jdbcType=
"INTEGER"
/>
<result
property=
"date"
column=
"date"
jdbcType=
"DATE"
/>
<result
property=
"lineName"
column=
"line_name"
jdbcType=
"VARCHAR"
/>
<result
property=
"storeName"
column=
"store_name"
jdbcType=
"VARCHAR"
/>
<result
property=
"storeCode"
column=
"store_code"
jdbcType=
"VARCHAR"
/>
<result
property=
"orgQcId"
column=
"org_qc_id"
jdbcType=
"VARCHAR"
/>
<result
property=
"orgName"
column=
"org_name"
jdbcType=
"VARCHAR"
/>
<result
property=
"patternId"
column=
"pattern_id"
jdbcType=
"INTEGER"
/>
<result
property=
"pattern"
column=
"pattern"
jdbcType=
"VARCHAR"
/>
<result
property=
"dealerId"
column=
"dealer_id"
jdbcType=
"VARCHAR"
/>
<result
property=
"dealerName"
column=
"dealer_name"
jdbcType=
"VARCHAR"
/>
<result
property=
"bothT"
column=
"both_t"
jdbcType=
"VARCHAR"
/>
<result
property=
"province"
column=
"province"
jdbcType=
"VARCHAR"
/>
<result
property=
"city"
column=
"city"
jdbcType=
"VARCHAR"
/>
<result
property=
"area"
column=
"area"
jdbcType=
"VARCHAR"
/>
<result
property=
"addr"
column=
"addr"
jdbcType=
"VARCHAR"
/>
<result
property=
"clockInTime"
column=
"clock_in_time"
jdbcType=
"TIMESTAMP"
/>
<result
property=
"clockOutTime"
column=
"clock_out_time"
jdbcType=
"TIMESTAMP"
/>
<result
property=
"salary"
column=
"salary"
jdbcType=
"DECIMAL"
/>
<result
property=
"incidentals"
column=
"incidentals"
jdbcType=
"DECIMAL"
/>
<result
property=
"planStatus"
column=
"plan_status"
jdbcType=
"INTEGER"
/>
<result
property=
"fsInstanceId"
column=
"fs_instance_id"
jdbcType=
"VARCHAR"
/>
<result
property=
"serialNumber"
column=
"serial_number"
jdbcType=
"VARCHAR"
/>
<result
property=
"approvalEmpName"
column=
"approval_emp_name"
jdbcType=
"VARCHAR"
/>
<result
property=
"createTime"
column=
"create_time"
jdbcType=
"TIMESTAMP"
/>
<result
property=
"modifyTime"
column=
"modify_time"
jdbcType=
"TIMESTAMP"
/>
<result
property=
"isDelete"
column=
"is_delete"
jdbcType=
"INTEGER"
/>
<result
property=
"createBy"
column=
"create_by"
jdbcType=
"VARCHAR"
/>
<result
property=
"modifyBy"
column=
"modify_by"
jdbcType=
"VARCHAR"
/>
</resultMap>
<sql
id=
"Base_Column_List"
>
id,plan_file_id,employee_id,
employee_name,employee_no,year,
month,date,line_name,
store_name,store_code,org_qc_id,
org_name,pattern_id,pattern,
dealer_id,dealer_name,both_t,
province,city,area,
addr,clock_in_time,clock_out_time,
salary,incidentals,plan_status,
instance_code,serial_number,approval_emp_name,
create_time,modify_time,is_delete,
create_by,modify_by
</sql>
<update
id=
"updateStatusByInstanceId"
>
update activity_plan_info set plan_status = #{planStatus} where fs_instance_id = #{fsInstanceId}
</update>
</mapper>
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论