Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
W
wangxiaolu-export
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
promotion
wangxiaolu-export
Commits
51ca0d23
提交
51ca0d23
authored
1月 13, 2026
作者:
窦馨雨
浏览文件
操作
浏览文件
下载
差异文件
合并分支 'dxy' 到 'qa'
Dxy 查看合并请求
!8
上级
f4fce25f
9ba83d29
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
153 行增加
和
135 行删除
+153
-135
TemporaryActivityReportedDO.java
...olu/export/mapper/entity/TemporaryActivityReportedDO.java
+20
-1
ActivityToFeishuSheetServiceImpl.java
...export/service/impl/ActivityToFeishuSheetServiceImpl.java
+133
-134
没有找到文件。
src/main/java/com/wangxiaolu/export/mapper/entity/TemporaryActivityReportedDO.java
浏览文件 @
51ca0d23
...
...
@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
import
lombok.Data
;
import
java.io.Serializable
;
import
java.math.BigDecimal
;
/**
*
...
...
@@ -53,7 +54,25 @@ public class TemporaryActivityReportedDO implements Serializable {
@TableField
(
exist
=
false
)
private
String
date
;
/**
* 活动品项:老品/黑鸭/散称
* 活动品项:老品/黑鸭/散称
/礼盒
*/
private
String
prdClass
;
// 促销员联系电话
private
String
temporaryPhone
;
// 执行方式
private
String
executeModePlan
;
// 配发试吃品是否有黑鸭口味
private
String
hasBlackDuckFlavor
;
// 配发黑鸭试吃品(根)
private
Integer
blackDuckTastingNum
;
// 配发卤香试吃品(根)
private
Integer
braisedTastingNum
;
// 配发赠品个数
private
Integer
giftNum
;
// 推广活动销额(元)
private
BigDecimal
promotionSales
;
// 黑鸭销售(元)
private
BigDecimal
blackDuckSales
;
// 礼盒销售(元)
private
BigDecimal
giftBoxSales
;
}
src/main/java/com/wangxiaolu/export/service/impl/ActivityToFeishuSheetServiceImpl.java
浏览文件 @
51ca0d23
...
...
@@ -99,48 +99,67 @@ public class ActivityToFeishuSheetServiceImpl implements ActivityToFeishuSheetSe
row
.
add
(
"0"
);
row
.
add
(
rdo
.
getId
());
row
.
add
(
rdo
.
getTemporaryId
()
+
"-"
+
rdo
.
getTemporaryName
());
//2026-1 新增 : 促销员电话列 D
row
.
add
(
ObjectUtil
.
isEmpty
(
rdo
.
getTemporaryPhone
())
?
""
:
rdo
.
getTemporaryPhone
());
// 月份
String
createDate
=
rdo
.
getCreateDate
();
String
[]
dateArr
=
createDate
.
split
(
"-"
);
// 战区
// 战区
E
row
.
add
(
rdo
.
getOrgName
());
// 城市经理
// 城市经理
F
row
.
add
(
rdo
.
getManageName
());
// 执行城市
// 执行城市
G
row
.
add
(
rdo
.
getCity
());
// 执行日期
// 执行日期
H
row
.
add
(
dateArr
[
1
]
+
"月"
+
dateArr
[
2
]
+
"日"
);
// 场次
// 场次
I
row
.
add
(
"1"
);
// 经销商
// 经销商
J
row
.
add
(
rdo
.
getDealerName
());
// 系统名称
// 系统名称
K
row
.
add
(
rdo
.
getLineName
());
// 勤策门店编码
// 勤策门店编码
L
row
.
add
(
clockDo
.
getQinceStoreCode
());
// 门店名称
// 门店名称
M
row
.
add
(
rdo
.
getStoreName
());
// 活动形式
// 活动形式
N
row
.
add
(
rdo
.
getActivityPattern
());
// 活动品类
// 执行方式 O
row
.
add
(
rdo
.
getExecuteModePlan
());
// 活动品类 P
row
.
add
(
rdo
.
getPrdClass
());
// 是否提交审核
// 是否提交审核
Q
row
.
add
(
"APPROVED"
.
equals
(
rdo
.
getApproveStatus
())
?
"已审核"
:
"未提交"
);
// 推广活动销额(元) O
row
.
add
(
"0"
);
//配发试吃品是否有黑鸭口味 R
row
.
add
(
"1"
.
equals
(
rdo
.
getHasBlackDuckFlavor
())
?
"有"
:
"无"
);
// 配发黑鸭试吃品(根) S
row
.
add
(
rdo
.
getBlackDuckTastingNum
());
// 配发苦相试吃品(根) T
row
.
add
(
rdo
.
getBraisedTastingNum
());
// 配发赠品个数 U
row
.
add
(
rdo
.
getGiftNum
());
// 推广活动销额(元) V
row
.
add
(
rdo
.
getPromotionSales
());
// 黑鸭销售 (元)W
row
.
add
(
rdo
.
getBlackDuckSales
());
// 礼盒+礼袋销量(个)X
row
.
add
(
rdo
.
getGiftBoxSales
());
// 上传文本数据
addactivityDataRow
(
row
);
...
...
@@ -153,18 +172,14 @@ public class ActivityToFeishuSheetServiceImpl implements ActivityToFeishuSheetSe
String
rangFormat
=
sheetInfoD
.
getSheetId
()
+
"!%s"
+
rowNumStr
+
":%s"
+
rowNumStr
;
//
T-AB
: 上班打卡时间/地点 午休下班打卡时间/地点 午休上班打卡时间/地点 下班打卡时间/地点
//
Y-AA
: 上班打卡时间/地点 午休下班打卡时间/地点 午休上班打卡时间/地点 下班打卡时间/地点
if
(
Objects
.
nonNull
(
clockDo
))
{
List
<
Object
>
rowClockData
=
new
ArrayList
<>();
if
(
Objects
.
nonNull
(
clockDo
.
getClockInTime
())
&&
Objects
.
nonNull
(
clockDo
.
getClockOutTime
()))
{
long
tl
=
DateUtil
.
between
(
clockDo
.
getClockInTime
(),
clockDo
.
getClockOutTime
(),
DateUnit
.
MINUTE
);
long
hour
=
tl
/
60
;
long
minute
=
tl
%
60
;
rowClockData
.
add
(
hour
+
"."
+
minute
);
}
else
{
rowClockData
.
add
(
"0"
);
}
// 打卡时间
// 调用新的时长计算方法(两段相加,缺卡则按上下班总时长)
String
workDuration
=
calculateWorkDuration
(
clockDo
);
rowClockData
.
add
(
workDuration
);
// 打卡时间(AA列)
StringBuilder
timeSb
=
new
StringBuilder
();
if
(
null
!=
clockDo
.
getClockInTime
())
{
timeSb
.
append
(
"上班卡:"
).
append
(
this
.
formatDateTime
(
clockDo
.
getClockInTime
()));
...
...
@@ -180,7 +195,7 @@ public class ActivityToFeishuSheetServiceImpl implements ActivityToFeishuSheetSe
}
rowClockData
.
add
(
timeSb
.
toString
());
// 打卡地点
// 打卡地点
(AB列)
StringBuilder
addrSb
=
new
StringBuilder
();
if
(
null
!=
clockDo
.
getClockInAddress
())
{
addrSb
.
append
(
clockDo
.
getClockInAddress
());
...
...
@@ -196,10 +211,12 @@ public class ActivityToFeishuSheetServiceImpl implements ActivityToFeishuSheetSe
}
rowClockData
.
add
(
addrSb
.
toString
());
String
range
=
String
.
format
(
rangFormat
,
"U"
,
"W"
);
// 调整range为Z-AB列(对应图二上班时长、打卡时间、打卡定位)
String
range
=
String
.
format
(
rangFormat
,
"Y"
,
"AA"
);
updateClockData
(
range
,
rowClockData
);
}
log
.
info
(
"开始处理上传照片,行号:{}"
,
rowNumStr
);
/**
* 获取推广、POS图片
*/
...
...
@@ -209,33 +226,6 @@ public class ActivityToFeishuSheetServiceImpl implements ActivityToFeishuSheetSe
}
/**
* 推广照>> 真实pos证明反馈
*/
// List<TemporaryActivityPhotoDO> photosType7 = Objects.isNull(photoTypeMap.get(7)) ? new ArrayList<>() : photoTypeMap.get(7);
// int photosType7Size = photosType7.size();
//
// // 真实pos证明反馈1 >>>
// if (!(photosType7Size < 1 || Objects.isNull(photosType7.get(0)))) {
// valuesImageToSheet(String.format(rangFormat, "P", "P"), photosType7.get(0).getPhotoUrl());
// }
//
// // 真实pos证明反馈2 >>>
// if (!(photosType7Size < 2 || Objects.isNull(photosType7.get(1)))) {
// valuesImageToSheetByRobot2(String.format(rangFormat, "Q", "Q"), photosType7.get(1).getPhotoUrl());
// }
//
// // 真实pos证明反馈3 >>>
// if (!(photosType7Size < 3 || Objects.isNull(photosType7.get(2)))) {
// valuesImageToSheet(String.format(rangFormat, "R", "R"), photosType7.get(2).getPhotoUrl());
// }
//
// // 真实pos证明反馈4 >>>
// if (!(photosType7Size < 4 || Objects.isNull(photosType7.get(3)))) {
// valuesImageToSheetByRobot2(String.format(rangFormat, "S", "S"), photosType7.get(3).getPhotoUrl());
// }
log
.
info
(
"上传pos照片完成,行号:{}"
,
rowNumStr
);
/**
* 打卡照片
* 打卡类型小于9 的 类型大于等于4的 照片
...
...
@@ -246,51 +236,24 @@ public class ActivityToFeishuSheetServiceImpl implements ActivityToFeishuSheetSe
.
collect
(
Collectors
.
toMap
(
TemporaryActivityPhotoDO:
:
getType
,
TemporaryActivityPhotoDO:
:
getPhotoUrl
));
// 上班打卡照片 >>>
if
(
clockMap
.
containsKey
(
4
))
{
valuesImageToSheet
(
String
.
format
(
rangFormat
,
"X"
,
"X"
),
clockMap
.
get
(
4
));
}
// 午休下班打卡照片 >>>
if
(
clockMap
.
containsKey
(
5
))
{
valuesImageToSheetByRobot2
(
String
.
format
(
rangFormat
,
"Y"
,
"Y"
),
clockMap
.
get
(
5
));
}
// 午休上班打卡照片 >>>
if
(
clockMap
.
containsKey
(
6
))
{
valuesImageToSheet
(
String
.
format
(
rangFormat
,
"Z"
,
"Z"
),
clockMap
.
get
(
6
));
valuesImageToSheet
(
String
.
format
(
rangFormat
,
"AB"
,
"AB"
),
clockMap
.
get
(
4
));
}
// 下班打卡照片 >>>
if
(
clockMap
.
containsKey
(
7
))
{
valuesImageToSheetByRobot2
(
String
.
format
(
rangFormat
,
"AA"
,
"AA"
),
clockMap
.
get
(
7
));
}
log
.
info
(
"上传打卡照片完成,行号:{}"
,
rowNumStr
);
/**
* 推广试吃照片
*/
StringBuilder
pct
=
new
StringBuilder
();
List
<
TemporaryActivityPhotoDO
>
photosType1
=
Objects
.
isNull
(
photoTypeMap
.
get
(
1
))
?
new
ArrayList
<>()
:
photoTypeMap
.
get
(
1
);
int
photosType1Size
=
photosType1
.
size
();
// 推广试吃照片1 >>>
if
(!(
photosType1Size
<
1
||
Objects
.
isNull
(
photosType1
.
get
(
0
))))
{
valuesImageToSheet
(
String
.
format
(
rangFormat
,
"A
B"
,
"AB
"
),
photosType1
.
get
(
0
).
getPhotoUrl
());
valuesImageToSheet
(
String
.
format
(
rangFormat
,
"A
C"
,
"AC
"
),
photosType1
.
get
(
0
).
getPhotoUrl
());
pct
.
append
(
"试吃1:"
+
DateUtil
.
formatDateTime
(
photosType1
.
get
(
0
).
getCreateTime
()));
}
// 推广试吃照片2 >>>
if
(!(
photosType1Size
<
2
||
Objects
.
isNull
(
photosType1
.
get
(
1
))))
{
valuesImageToSheetByRobot2
(
String
.
format
(
rangFormat
,
"A
C"
,
"AC
"
),
photosType1
.
get
(
1
).
getPhotoUrl
());
valuesImageToSheetByRobot2
(
String
.
format
(
rangFormat
,
"A
D"
,
"AD
"
),
photosType1
.
get
(
1
).
getPhotoUrl
());
pct
.
append
(
"、试吃2:"
+
DateUtil
.
formatDateTime
(
photosType1
.
get
(
1
).
getCreateTime
()));
}
// 推广试吃照片3 >>>
if
(!(
photosType1Size
<
3
||
Objects
.
isNull
(
photosType1
.
get
(
2
))))
{
valuesImageToSheet
(
String
.
format
(
rangFormat
,
"AD"
,
"AD"
),
photosType1
.
get
(
2
).
getPhotoUrl
());
pct
.
append
(
"、试吃3:"
+
DateUtil
.
formatDateTime
(
photosType1
.
get
(
2
).
getCreateTime
()));
}
// 推广试吃照片4 >>>
if
(!(
photosType1Size
<
4
||
Objects
.
isNull
(
photosType1
.
get
(
3
))))
{
valuesImageToSheetByRobot2
(
String
.
format
(
rangFormat
,
"AE"
,
"AE"
),
photosType1
.
get
(
3
).
getPhotoUrl
());
...
...
@@ -298,6 +261,24 @@ public class ActivityToFeishuSheetServiceImpl implements ActivityToFeishuSheetSe
}
log
.
info
(
"上传推广-试吃照片完成,行号:{}"
,
rowNumStr
);
// 午休下班打卡照片 >>>
if
(
clockMap
.
containsKey
(
5
))
{
valuesImageToSheetByRobot2
(
String
.
format
(
rangFormat
,
"AF"
,
"AF"
),
clockMap
.
get
(
5
));
}
// 午休上班打卡照片 >>>
if
(
clockMap
.
containsKey
(
6
))
{
valuesImageToSheet
(
String
.
format
(
rangFormat
,
"AG"
,
"AG"
),
clockMap
.
get
(
6
));
}
/**
* 推广试吃照片
*/
// 推广试吃照片3 >>>
if
(!(
photosType1Size
<
3
||
Objects
.
isNull
(
photosType1
.
get
(
2
))))
{
valuesImageToSheet
(
String
.
format
(
rangFormat
,
"AH"
,
"AH"
),
photosType1
.
get
(
2
).
getPhotoUrl
());
pct
.
append
(
"、试吃3:"
+
DateUtil
.
formatDateTime
(
photosType1
.
get
(
2
).
getCreateTime
()));
}
/**
...
...
@@ -307,28 +288,10 @@ public class ActivityToFeishuSheetServiceImpl implements ActivityToFeishuSheetSe
int
photosType2Size
=
photosType2
.
size
();
// 推广互动照片1 >>>
if
(!(
photosType2Size
<
1
||
Objects
.
isNull
(
photosType2
.
get
(
0
))))
{
valuesImageToSheet
(
String
.
format
(
rangFormat
,
"A
F"
,
"AF
"
),
photosType2
.
get
(
0
).
getPhotoUrl
());
valuesImageToSheet
(
String
.
format
(
rangFormat
,
"A
I"
,
"AI
"
),
photosType2
.
get
(
0
).
getPhotoUrl
());
pct
.
append
(
"、互动1:"
+
DateUtil
.
formatDateTime
(
photosType2
.
get
(
0
).
getCreateTime
()));
}
// 推广互动照片2 >>>
if
(!(
photosType2Size
<
2
||
Objects
.
isNull
(
photosType2
.
get
(
1
))))
{
valuesImageToSheetByRobot2
(
String
.
format
(
rangFormat
,
"AG"
,
"AG"
),
photosType2
.
get
(
1
).
getPhotoUrl
());
pct
.
append
(
"、互动2:"
+
DateUtil
.
formatDateTime
(
photosType2
.
get
(
1
).
getCreateTime
()));
}
// 推广互动照片3 >>>
if
(!(
photosType2Size
<
3
||
Objects
.
isNull
(
photosType2
.
get
(
2
))))
{
valuesImageToSheet
(
String
.
format
(
rangFormat
,
"AH"
,
"AH"
),
photosType2
.
get
(
2
).
getPhotoUrl
());
pct
.
append
(
"、互动3:"
+
DateUtil
.
formatDateTime
(
photosType2
.
get
(
2
).
getCreateTime
()));
}
// 推广互动照片4 >>>
if
(!(
photosType2Size
<
4
||
Objects
.
isNull
(
photosType2
.
get
(
3
))))
{
valuesImageToSheetByRobot2
(
String
.
format
(
rangFormat
,
"AI"
,
"AI"
),
photosType2
.
get
(
3
).
getPhotoUrl
());
pct
.
append
(
"、互动4:"
+
DateUtil
.
formatDateTime
(
photosType2
.
get
(
3
).
getCreateTime
()));
}
log
.
info
(
"上传推广-互动照片完成,行号:{}"
,
rowNumStr
);
/**
* 推广成交照片
...
...
@@ -341,58 +304,53 @@ public class ActivityToFeishuSheetServiceImpl implements ActivityToFeishuSheetSe
pct
.
append
(
"、成交1:"
+
DateUtil
.
formatDateTime
(
photosType3
.
get
(
0
).
getCreateTime
()));
}
// 推广成交照片2 >>>
if
(!(
photosType3Size
<
2
||
Objects
.
isNull
(
photosType3
.
get
(
1
))))
{
valuesImageToSheetByRobot2
(
String
.
format
(
rangFormat
,
"AK"
,
"AK"
),
photosType3
.
get
(
1
).
getPhotoUrl
());
pct
.
append
(
"、成交2:"
+
DateUtil
.
formatDateTime
(
photosType3
.
get
(
1
).
getCreateTime
()));
}
// 推广成交照片3 >>>
if
(!(
photosType3Size
<
3
||
Objects
.
isNull
(
photosType3
.
get
(
2
))))
{
valuesImageToSheet
(
String
.
format
(
rangFormat
,
"AL"
,
"AL"
),
photosType3
.
get
(
2
).
getPhotoUrl
());
pct
.
append
(
"、成交3:"
+
DateUtil
.
formatDateTime
(
photosType3
.
get
(
2
).
getCreateTime
()));
}
// 推广成交照片4 >>>
if
(!(
photosType3Size
<
4
||
Objects
.
isNull
(
photosType3
.
get
(
3
))))
{
valuesImageToSheetByRobot2
(
String
.
format
(
rangFormat
,
"AM"
,
"AM"
),
photosType3
.
get
(
3
).
getPhotoUrl
());
pct
.
append
(
"、成交4:"
+
DateUtil
.
formatDateTime
(
photosType3
.
get
(
3
).
getCreateTime
()));
}
Map
<
Integer
,
List
<
TemporaryActivityPhotoDO
>>
taskMap
=
activityPhotoDOS
.
stream
()
.
filter
(
photo
->
photo
.
getType
()
>=
9
)
.
collect
(
Collectors
.
groupingBy
(
TemporaryActivityPhotoDO:
:
getType
));
// pos任务照片
List
<
TemporaryActivityPhotoDO
>
posTaskPhotos
=
taskMap
.
get
(
9
);
if
(
ObjectUtil
.
isNotEmpty
(
posTaskPhotos
)
&&
posTaskPhotos
.
size
()
>
0
&&
ObjectUtil
.
isNotEmpty
(
posTaskPhotos
.
get
(
0
)))
{
valuesImageToSheetByRobot2
(
String
.
format
(
rangFormat
,
"AO"
,
"AO"
),
posTaskPhotos
.
get
(
0
).
getPhotoUrl
());
pct
.
append
(
"、pos任务1:"
+
DateUtil
.
formatDateTime
(
posTaskPhotos
.
get
(
0
).
getCreateTime
()));
}
if
(
ObjectUtil
.
isNotEmpty
(
posTaskPhotos
)
&&
posTaskPhotos
.
size
()
>
1
&&
ObjectUtil
.
isNotEmpty
(
posTaskPhotos
.
get
(
1
)))
{
valuesImageToSheetByRobot2
(
String
.
format
(
rangFormat
,
"AP"
,
"AP"
),
posTaskPhotos
.
get
(
1
).
getPhotoUrl
());
pct
.
append
(
"、pos任务2:"
+
DateUtil
.
formatDateTime
(
posTaskPhotos
.
get
(
1
).
getCreateTime
()));
}
// 随机任务照片
List
<
TemporaryActivityPhotoDO
>
randTaskPhotos
=
taskMap
.
get
(
10
);
if
(
ObjectUtil
.
isNotEmpty
(
randTaskPhotos
)
&&
randTaskPhotos
.
size
()
>
0
&&
ObjectUtil
.
isNotEmpty
(
randTaskPhotos
.
get
(
0
)))
{
valuesImageToSheetByRobot2
(
String
.
format
(
rangFormat
,
"A
N"
,
"AN
"
),
randTaskPhotos
.
get
(
0
).
getPhotoUrl
());
valuesImageToSheetByRobot2
(
String
.
format
(
rangFormat
,
"A
K"
,
"AK
"
),
randTaskPhotos
.
get
(
0
).
getPhotoUrl
());
pct
.
append
(
"、随机任务:"
+
DateUtil
.
formatDateTime
(
randTaskPhotos
.
get
(
0
).
getCreateTime
()));
}
/**
* 推广照>> 真实pos证明反馈
*/
List
<
TemporaryActivityPhotoDO
>
photosType8
=
Objects
.
isNull
(
photoTypeMap
.
get
(
8
))
?
new
ArrayList
<>()
:
photoTypeMap
.
get
(
8
);
int
photosType8Size
=
photosType8
.
size
();
// 真实pos证明反馈1 >>>
if
(!(
photosType8Size
<
1
||
Objects
.
isNull
(
photosType8
.
get
(
0
))))
{
valuesImageToSheet
(
String
.
format
(
rangFormat
,
"AL"
,
"AL"
),
photosType8
.
get
(
0
).
getPhotoUrl
());
}
// 真实pos证明反馈2 >>>
if
(!(
photosType8Size
<
2
||
Objects
.
isNull
(
photosType8
.
get
(
1
))))
{
valuesImageToSheetByRobot2
(
String
.
format
(
rangFormat
,
"AM"
,
"AM"
),
photosType8
.
get
(
1
).
getPhotoUrl
());
}
// 下班打卡照片 >>>
if
(
clockMap
.
containsKey
(
7
))
{
valuesImageToSheetByRobot2
(
String
.
format
(
rangFormat
,
"AN"
,
"AN"
),
clockMap
.
get
(
7
));
}
log
.
info
(
"上传打卡照片完成,行号:{}"
,
rowNumStr
);
// 推广类照片上传时间
String
range
=
String
.
format
(
rangFormat
,
"A
Q"
,
"AQ
"
);
String
range
=
String
.
format
(
rangFormat
,
"A
O"
,
"AO
"
);
updateClockData
(
range
,
Arrays
.
asList
(
pct
.
toString
()));
log
.
info
(
"
上传推广-成交照片完成,行号:{}"
,
rowNumStr
);
log
.
info
(
"
结束上传推广打卡照片:{}"
,
rowNumStr
);
}
private
void
addactivityDataRow
(
List
<
Object
>
rowData
)
{
String
redisKey
=
getRowNumRedisKey
();
String
rowNumStr
=
redisCache
.
get
(
redisKey
);
Integer
rowNumNext
=
StringUtils
.
isBlank
(
rowNumStr
)
?
2
:
Integer
.
parseInt
(
rowNumStr
)
+
1
;
String
range
=
sheetInfoD
.
getSheetId
()
+
"!A"
+
rowNumNext
+
":
P
"
+
rowNumNext
;
String
range
=
sheetInfoD
.
getSheetId
()
+
"!A"
+
rowNumNext
+
":
X
"
+
rowNumNext
;
Integer
rowNumEnd
=
feishuSheetUtils
.
appendValueToSheet
(
range
,
rowData
,
sheetInfoD
.
getSheetToken
(),
getFeishuTenantToken1
());
if
(
rowNumEnd
<
1
)
{
...
...
@@ -459,4 +417,45 @@ public class ActivityToFeishuSheetServiceImpl implements ActivityToFeishuSheetSe
return
DatePattern
.
NORM_DATETIME_FORMAT
.
format
(
date
);
}
/**
* 计算工时
*/
private
String
calculateWorkDuration
(
TemporaryActivityClockDO
clockDo
)
{
// 基础校验:上班/下班时间为空,直接返回0
if
(
Objects
.
isNull
(
clockDo
.
getClockInTime
())
||
Objects
.
isNull
(
clockDo
.
getClockOutTime
()))
{
return
"0"
;
}
// 上班打卡时间
Date
clockIn
=
clockDo
.
getClockInTime
();
// 午休下班时间
Date
noonClockOut
=
clockDo
.
getNoonClockOutTime
();
// 午休上班时间
Date
noonClockIn
=
clockDo
.
getNoonClockInTime
();
// 下班打卡时间
Date
clockOut
=
clockDo
.
getClockOutTime
();
long
totalMinutes
=
0
;
// 判断是否午休缺卡(午休下班/午休上班任一为空)
boolean
isNoonCardMissing
=
Objects
.
isNull
(
noonClockOut
)
||
Objects
.
isNull
(
noonClockIn
);
if
(
isNoonCardMissing
)
{
// 午休缺卡:直接计算上班→下班的总时长
totalMinutes
=
DateUtil
.
between
(
clockIn
,
clockOut
,
DateUnit
.
MINUTE
);
}
else
{
// 午休不缺卡:两段时长相加(上午段 + 下午段)
// 上班→午休下班
long
morningMinutes
=
DateUtil
.
between
(
clockIn
,
noonClockOut
,
DateUnit
.
MINUTE
);
// 午休上班→下班
long
afternoonMinutes
=
DateUtil
.
between
(
noonClockIn
,
clockOut
,
DateUnit
.
MINUTE
);
totalMinutes
=
morningMinutes
+
afternoonMinutes
;
}
// 分钟转小时(保留1位小数,避免多位小数)
double
hours
=
totalMinutes
/
60.0
;
return
String
.
format
(
"%.1f"
,
hours
);
}
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论