提交 facbd995 authored 作者: 窦馨雨's avatar 窦馨雨

合并分支 'qa' 到 'master'

CP计划小程序改造 查看合并请求 !13
...@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableName; ...@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal;
/** /**
* *
...@@ -53,7 +54,27 @@ public class TemporaryActivityReportedDO implements Serializable { ...@@ -53,7 +54,27 @@ public class TemporaryActivityReportedDO implements Serializable {
@TableField(exist = false) @TableField(exist = false)
private String date; private String date;
/** /**
* 活动品项:老品/黑鸭/散称 * 活动品项:老品/黑鸭/散称/礼盒
*/ */
private String prdClass; 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;
// 手工POS机销额
private String posManualSalesRecord;
} }
...@@ -33,6 +33,32 @@ import java.util.stream.Collectors; ...@@ -33,6 +33,32 @@ import java.util.stream.Collectors;
@Service @Service
public class ActivityToFeishuSheetServiceImpl implements ActivityToFeishuSheetService { public class ActivityToFeishuSheetServiceImpl implements ActivityToFeishuSheetService {
// ========== 新增:照片类型常量定义 ==========
/** 推广试吃照片 */
private static final int PHOTO_TYPE_TGSC = 1;
/** 推广互动照片 */
private static final int PHOTO_TYPE_TGHD = 2;
/** 推广成交照片 */
private static final int PHOTO_TYPE_TGCJ = 3;
/** 上班打卡图片 */
private static final int PHOTO_TYPE_CLOCK_IN = 4;
/** 午休下班打卡图片 */
private static final int PHOTO_TYPE_NOON_CLOCK_OUT = 5;
/** 午休上班打卡图片 */
private static final int PHOTO_TYPE_NOON_CLOCK_IN = 6;
/** 下班打卡图片 */
private static final int PHOTO_TYPE_CLOCK_OUT = 7;
/** 试吃照片 */
private static final int PHOTO_TYPE_TASTY_PHOTO = 8;
/** 当日销量POS机页面凭证 */
private static final int PHOTO_TYPE_POS_SELL_VOUCHER = 9;
/** 高峰期在岗 */
private static final int PHOTO_TYPE_RANDOM_TASK = 10;
/** 配发赠品照片 */
private static final int PHOTO_TYPE_SEND_GIFT_PHOTO = 11;
/** 试吃物料照片 */
private static final int PHOTO_TYPE_TASTY_MATERIALS = 12;
private static FeishuSheetRecordDO sheetInfoD = null; private static FeishuSheetRecordDO sheetInfoD = null;
@Value("${feishu.activity_robot_1.app_id}") @Value("${feishu.activity_robot_1.app_id}")
...@@ -44,6 +70,7 @@ public class ActivityToFeishuSheetServiceImpl implements ActivityToFeishuSheetSe ...@@ -44,6 +70,7 @@ public class ActivityToFeishuSheetServiceImpl implements ActivityToFeishuSheetSe
@Value("${feishu.activity_robot_2.app_secret}") @Value("${feishu.activity_robot_2.app_secret}")
private String appSecret2; private String appSecret2;
@Autowired @Autowired
RedisCache redisCache; RedisCache redisCache;
@Autowired @Autowired
...@@ -99,48 +126,67 @@ public class ActivityToFeishuSheetServiceImpl implements ActivityToFeishuSheetSe ...@@ -99,48 +126,67 @@ public class ActivityToFeishuSheetServiceImpl implements ActivityToFeishuSheetSe
row.add("0"); row.add("0");
row.add(rdo.getId()); row.add(rdo.getId());
row.add(rdo.getTemporaryId() + "-" + rdo.getTemporaryName()); row.add(rdo.getTemporaryId() + "-" + rdo.getTemporaryName());
//2026-1 新增 : 促销员电话列 D
row.add(ObjectUtil.isEmpty(rdo.getTemporaryPhone()) ? "" : rdo.getTemporaryPhone());
// 月份 // 月份
String createDate = rdo.getCreateDate(); String createDate = rdo.getCreateDate();
String[] dateArr = createDate.split("-"); String[] dateArr = createDate.split("-");
// 战区 // 战区 E
row.add(rdo.getOrgName()); row.add(rdo.getOrgName());
// 城市经理 // 城市经理 F
row.add(rdo.getManageName()); row.add(rdo.getManageName());
// 执行城市 // 执行城市 G
row.add(rdo.getCity()); row.add(rdo.getCity());
// 执行日期 // 执行日期 H
row.add(dateArr[1] + "月" + dateArr[2] + "日"); row.add(dateArr[1] + "月" + dateArr[2] + "日");
// 场次 // 场次 I
row.add("1"); row.add("1");
// 经销商 // 经销商 J
row.add(rdo.getDealerName()); row.add(rdo.getDealerName());
// 系统名称 // 系统名称 K
row.add(rdo.getLineName()); row.add(rdo.getLineName());
// 勤策门店编码 // 勤策门店编码 L
row.add(clockDo.getQinceStoreCode()); row.add(clockDo.getQinceStoreCode());
// 门店名称 // 门店名称 M
row.add(rdo.getStoreName()); row.add(rdo.getStoreName());
// 活动形式 // 活动形式 N
row.add(rdo.getActivityPattern()); row.add(rdo.getActivityPattern());
// 活动品类
// 执行方式 O
row.add(rdo.getExecuteModePlan());
// 活动品类 P
row.add(rdo.getPrdClass()); row.add(rdo.getPrdClass());
// 是否提交审核 // 是否提交审核 Q
row.add("APPROVED".equals(rdo.getApproveStatus()) ? "已审核" : "未提交"); row.add("APPROVED".equals(rdo.getApproveStatus()) ? "已审核" : "未提交");
// 推广活动销额(元) O //配发试吃品是否有黑鸭口味 R
row.add("0"); 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); addactivityDataRow(row);
...@@ -153,18 +199,14 @@ public class ActivityToFeishuSheetServiceImpl implements ActivityToFeishuSheetSe ...@@ -153,18 +199,14 @@ public class ActivityToFeishuSheetServiceImpl implements ActivityToFeishuSheetSe
String rangFormat = sheetInfoD.getSheetId() + "!%s" + rowNumStr + ":%s" + rowNumStr; String rangFormat = sheetInfoD.getSheetId() + "!%s" + rowNumStr + ":%s" + rowNumStr;
// T-AB: 上班打卡时间/地点 午休下班打卡时间/地点 午休上班打卡时间/地点 下班打卡时间/地点 // Y-AA: 上班打卡时间/地点 午休下班打卡时间/地点 午休上班打卡时间/地点 下班打卡时间/地点
if (Objects.nonNull(clockDo)) { if (Objects.nonNull(clockDo)) {
List<Object> rowClockData = new ArrayList<>(); List<Object> rowClockData = new ArrayList<>();
if (Objects.nonNull(clockDo.getClockInTime()) && Objects.nonNull(clockDo.getClockOutTime())) { // 调用新的时长计算方法(两段相加,缺卡则按上下班总时长)
long tl = DateUtil.between(clockDo.getClockInTime(), clockDo.getClockOutTime(), DateUnit.MINUTE); String workDuration = calculateWorkDuration(clockDo);
long hour = tl / 60; rowClockData.add(workDuration);
long minute = tl % 60;
rowClockData.add(hour + "." + minute); // 打卡时间(AA列)
} else {
rowClockData.add("0");
}
// 打卡时间
StringBuilder timeSb = new StringBuilder(); StringBuilder timeSb = new StringBuilder();
if (null != clockDo.getClockInTime()) { if (null != clockDo.getClockInTime()) {
timeSb.append("上班卡:").append(this.formatDateTime(clockDo.getClockInTime())); timeSb.append("上班卡:").append(this.formatDateTime(clockDo.getClockInTime()));
...@@ -180,7 +222,7 @@ public class ActivityToFeishuSheetServiceImpl implements ActivityToFeishuSheetSe ...@@ -180,7 +222,7 @@ public class ActivityToFeishuSheetServiceImpl implements ActivityToFeishuSheetSe
} }
rowClockData.add(timeSb.toString()); rowClockData.add(timeSb.toString());
// 打卡地点 // 打卡地点(AB列)
StringBuilder addrSb = new StringBuilder(); StringBuilder addrSb = new StringBuilder();
if (null != clockDo.getClockInAddress()) { if (null != clockDo.getClockInAddress()) {
addrSb.append(clockDo.getClockInAddress()); addrSb.append(clockDo.getClockInAddress());
...@@ -196,10 +238,12 @@ public class ActivityToFeishuSheetServiceImpl implements ActivityToFeishuSheetSe ...@@ -196,10 +238,12 @@ public class ActivityToFeishuSheetServiceImpl implements ActivityToFeishuSheetSe
} }
rowClockData.add(addrSb.toString()); rowClockData.add(addrSb.toString());
String range = String.format(rangFormat, "U", "W"); // 调整range为Z-AB列(对应图二上班时长、打卡时间、打卡定位)
String range = String.format(rangFormat, "Y", "AA");
updateClockData(range, rowClockData); updateClockData(range, rowClockData);
} }
log.info("开始处理上传照片,行号:{}", rowNumStr);
/** /**
* 获取推广、POS图片 * 获取推广、POS图片
*/ */
...@@ -209,190 +253,142 @@ public class ActivityToFeishuSheetServiceImpl implements ActivityToFeishuSheetSe ...@@ -209,190 +253,142 @@ 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的 照片 * 打卡类型小于9 的 类型大于等于4的 照片
* 打卡类型大于等于9 的 单独筛选出处理 * 打卡类型大于等于9 的 单独筛选出处理
*/ */
Map<Integer, String> clockMap = activityPhotoDOS.stream() Map<Integer, String> clockMap = activityPhotoDOS.stream()
.filter(photo -> photo.getType() < 9 && photo.getType() >= 4) .filter(photo -> photo.getType() >= PHOTO_TYPE_CLOCK_IN && photo.getType() <= PHOTO_TYPE_CLOCK_OUT)
.collect(Collectors.toMap(TemporaryActivityPhotoDO::getType, TemporaryActivityPhotoDO::getPhotoUrl)); .collect(Collectors.toMap(TemporaryActivityPhotoDO::getType, TemporaryActivityPhotoDO::getPhotoUrl));
Map<Integer, List<TemporaryActivityPhotoDO>> taskMap = activityPhotoDOS.stream()
.filter(photo -> photo.getType() >= PHOTO_TYPE_POS_SELL_VOUCHER)
.collect(Collectors.groupingBy(TemporaryActivityPhotoDO::getType));
// 上班打卡照片 >>> // 上班打卡照片 >>>
if (clockMap.containsKey(4)) { if (clockMap.containsKey(PHOTO_TYPE_CLOCK_IN)) {
valuesImageToSheet(String.format(rangFormat, "X", "X"), clockMap.get(4)); valuesImageToSheet(String.format(rangFormat, "AB", "AB"), clockMap.get(PHOTO_TYPE_CLOCK_IN));
} }
// 午休下班打卡照片 >>> StringBuilder pct = new StringBuilder();
if (clockMap.containsKey(5)) { List<TemporaryActivityPhotoDO> photosType1 = Objects.isNull(photoTypeMap.get(PHOTO_TYPE_TGSC)) ? new ArrayList<>() : photoTypeMap.get(PHOTO_TYPE_TGSC);
valuesImageToSheetByRobot2(String.format(rangFormat, "Y", "Y"), clockMap.get(5)); List<TemporaryActivityPhotoDO> photosType9 = Objects.isNull(photoTypeMap.get(PHOTO_TYPE_TASTY_PHOTO)) ? new ArrayList<>() : photoTypeMap.get(PHOTO_TYPE_TASTY_PHOTO);
List<TemporaryActivityPhotoDO> photosType12 = Objects.isNull(photoTypeMap.get(PHOTO_TYPE_TASTY_MATERIALS)) ? new ArrayList<>() : photoTypeMap.get(PHOTO_TYPE_TASTY_MATERIALS);
List<TemporaryActivityPhotoDO> photosType10 = Objects.isNull(photoTypeMap.get(PHOTO_TYPE_SEND_GIFT_PHOTO)) ? new ArrayList<>() : photoTypeMap.get(PHOTO_TYPE_SEND_GIFT_PHOTO);
int photosType9Size = photosType9.size();
int photosType1Size = photosType1.size();
int photosType12Size = photosType12.size();
int photosType10Size = photosType10.size();
// 试吃品照片
if (!(photosType9Size < 1 || Objects.isNull(photosType9.get(0)))) {
valuesImageToSheet(String.format(rangFormat, "AC", "AC"), photosType9.get(0).getPhotoUrl());
pct.append("试吃品照片:"+DateUtil.formatDateTime(photosType9.get(0).getCreateTime()));
} }
// 午休上班打卡照片 >>> // 试吃必备物料(试吃台/盘/杯)照片 >>>
if (clockMap.containsKey(6)) { if (!(photosType12Size < 1 || Objects.isNull(photosType12.get(0)))) {
valuesImageToSheet(String.format(rangFormat, "Z", "Z"), clockMap.get(6)); valuesImageToSheetByRobot2(String.format(rangFormat, "AD", "AD"), photosType12.get(0).getPhotoUrl());
pct.append("、试吃必备物料:"+DateUtil.formatDateTime(photosType12.get(0).getCreateTime()));
} }
// 下班打卡照片 >>> // 配发赠品照片 >>>
if (clockMap.containsKey(7)) { if (!(photosType10Size < 1 || Objects.isNull(photosType10.get(0)))) {
valuesImageToSheetByRobot2(String.format(rangFormat, "AA", "AA"), clockMap.get(7)); valuesImageToSheetByRobot2(String.format(rangFormat, "AE", "AE"), photosType10.get(0).getPhotoUrl());
pct.append("、配发赠品照片:"+DateUtil.formatDateTime(photosType10.get(0).getCreateTime()));
} }
log.info("上传推广-试吃照片完成,行号:{}", rowNumStr);
// 午休下班打卡照片 >>>
if (clockMap.containsKey(PHOTO_TYPE_NOON_CLOCK_OUT)) {
valuesImageToSheetByRobot2(String.format(rangFormat, "AF", "AF"), clockMap.get(PHOTO_TYPE_NOON_CLOCK_OUT));
}
log.info("上传打卡照片完成,行号:{}", rowNumStr); // 午休上班打卡照片 >>>
if (clockMap.containsKey(PHOTO_TYPE_NOON_CLOCK_IN)) {
valuesImageToSheet(String.format(rangFormat, "AG", "AG"), clockMap.get(PHOTO_TYPE_NOON_CLOCK_IN));
}
/** /**
* 推广试吃照片 * 推广试吃照片
*/ */
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, "AB", "AB"), 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, "AC", "AC"), 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 >>> // 试吃执行照片 推广试吃照片3 >>>
if (!(photosType1Size < 4 || Objects.isNull(photosType1.get(3)))) { if (!(photosType1Size < 1 || Objects.isNull(photosType1.get(0)))) {
valuesImageToSheetByRobot2(String.format(rangFormat, "AE", "AE"), photosType1.get(3).getPhotoUrl()); valuesImageToSheet(String.format(rangFormat, "AH", "AH"), photosType1.get(0).getPhotoUrl());
pct.append("、试吃4:"+DateUtil.formatDateTime(photosType1.get(3).getCreateTime())); pct.append("、试吃3:"+DateUtil.formatDateTime(photosType1.get(0).getCreateTime()));
} }
log.info("上传推广-试吃照片完成,行号:{}", rowNumStr);
/** /**
* 推广互动照片 * 推广互动照片
*/ */
List<TemporaryActivityPhotoDO> photosType2 = Objects.isNull(photoTypeMap.get(2)) ? new ArrayList<>() : photoTypeMap.get(2); List<TemporaryActivityPhotoDO> photosType2 = Objects.isNull(photoTypeMap.get(PHOTO_TYPE_TGHD)) ? new ArrayList<>() : photoTypeMap.get(PHOTO_TYPE_TGHD);
int photosType2Size = photosType2.size(); int photosType2Size = photosType2.size();
// 推广互动照片1 >>> // 推广互动照片 >>>
if (!(photosType2Size < 1 || Objects.isNull(photosType2.get(0)))) { if (!(photosType2Size < 1 || Objects.isNull(photosType2.get(0)))) {
valuesImageToSheet(String.format(rangFormat, "AF", "AF"), photosType2.get(0).getPhotoUrl()); valuesImageToSheet(String.format(rangFormat, "AI", "AI"), photosType2.get(0).getPhotoUrl());
pct.append("、互动1:"+DateUtil.formatDateTime(photosType2.get(0).getCreateTime())); 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);
/** /**
* 推广成交照片 * 推广成交照片
*/ */
List<TemporaryActivityPhotoDO> photosType3 = Objects.isNull(photoTypeMap.get(3)) ? new ArrayList<>() : photoTypeMap.get(3); List<TemporaryActivityPhotoDO> photosType3 = Objects.isNull(photoTypeMap.get(PHOTO_TYPE_TGCJ)) ? new ArrayList<>() : photoTypeMap.get(PHOTO_TYPE_TGCJ);
int photosType3Size = photosType3.size(); int photosType3Size = photosType3.size();
// 推广成交照片1 >>> // 推广成交照片1 >>>
if (!(photosType3Size < 1 || Objects.isNull(photosType3.get(0)))) { if (!(photosType3Size < 1 || Objects.isNull(photosType3.get(0)))) {
valuesImageToSheet(String.format(rangFormat, "AJ", "AJ"), photosType3.get(0).getPhotoUrl()); valuesImageToSheet(String.format(rangFormat, "AJ", "AJ"), photosType3.get(0).getPhotoUrl());
pct.append("、成交1:"+DateUtil.formatDateTime(photosType3.get(0).getCreateTime())); pct.append("、成交:"+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)))) { List<TemporaryActivityPhotoDO> randTaskPhotos = taskMap.get(PHOTO_TYPE_RANDOM_TASK);
valuesImageToSheetByRobot2(String.format(rangFormat, "AM", "AM"), photosType3.get(3).getPhotoUrl()); if (ObjectUtil.isNotEmpty(randTaskPhotos) && randTaskPhotos.size() > 0 && ObjectUtil.isNotEmpty(randTaskPhotos.get(0))) {
pct.append("、成交4:"+DateUtil.formatDateTime(photosType3.get(3).getCreateTime())); valuesImageToSheetByRobot2(String.format(rangFormat, "AK", "AK"), randTaskPhotos.get(0).getPhotoUrl());
pct.append("、高峰期在岗:"+DateUtil.formatDateTime(randTaskPhotos.get(0).getCreateTime()));
} }
Map<Integer, List<TemporaryActivityPhotoDO>> taskMap = activityPhotoDOS.stream()
.filter(photo -> photo.getType() >= 9) /**
.collect(Collectors.groupingBy(TemporaryActivityPhotoDO::getType )); * 推广照>> 真实pos证明反馈
// pos任务照片 */
List<TemporaryActivityPhotoDO> posTaskPhotos = taskMap.get(9); List<TemporaryActivityPhotoDO> photosType8 = Objects.isNull(photoTypeMap.get(PHOTO_TYPE_POS_SELL_VOUCHER)) ? new ArrayList<>() : photoTypeMap.get(PHOTO_TYPE_POS_SELL_VOUCHER);
if (ObjectUtil.isNotEmpty(posTaskPhotos) && posTaskPhotos.size() >0 && ObjectUtil.isNotEmpty(posTaskPhotos.get(0))) { int photosType8Size = photosType8.size();
valuesImageToSheetByRobot2(String.format(rangFormat, "AO", "AO"), posTaskPhotos.get(0).getPhotoUrl());
pct.append("、pos任务1:"+DateUtil.formatDateTime(posTaskPhotos.get(0).getCreateTime())); // 真实pos证明反馈1 >>>
} if (!(photosType8Size < 1 || Objects.isNull(photosType8.get(0))) ) {
if (ObjectUtil.isNotEmpty(posTaskPhotos) && posTaskPhotos.size() >1 && ObjectUtil.isNotEmpty(posTaskPhotos.get(1))) { valuesImageToSheet(String.format(rangFormat, "AL", "AL"), photosType8.get(0).getPhotoUrl());
valuesImageToSheetByRobot2(String.format(rangFormat, "AP", "AP"), posTaskPhotos.get(1).getPhotoUrl()); pct.append("、销额POS证明:"+DateUtil.formatDateTime(photosType8.get(0).getCreateTime()));
pct.append("、pos任务2:"+DateUtil.formatDateTime(posTaskPhotos.get(1).getCreateTime())); }else if (StringUtils.isNotBlank(rdo.getPosManualSalesRecord() )) {
} row.add(rdo.getPosManualSalesRecord());
// 随机任务照片
List<TemporaryActivityPhotoDO> randTaskPhotos = taskMap.get(10);
if (ObjectUtil.isNotEmpty(randTaskPhotos) && randTaskPhotos.size() > 0 && ObjectUtil.isNotEmpty(randTaskPhotos.get(0))) {
valuesImageToSheetByRobot2(String.format(rangFormat, "AN", "AN"), randTaskPhotos.get(0).getPhotoUrl());
pct.append("、随机任务:"+DateUtil.formatDateTime(randTaskPhotos.get(0).getCreateTime()));
} }
// 真实pos证明反馈2 >>>
if (!(photosType8Size < 2 || Objects.isNull(photosType8.get(1)))) {
valuesImageToSheetByRobot2(String.format(rangFormat, "AM", "AM"), photosType8.get(1).getPhotoUrl());
pct.append("、销额POS证明(补充):"+DateUtil.formatDateTime(photosType8.get(1).getCreateTime()));
}
// 下班打卡照片 >>>
if (clockMap.containsKey(PHOTO_TYPE_CLOCK_OUT)) {
valuesImageToSheetByRobot2(String.format(rangFormat, "AN", "AN"), clockMap.get(PHOTO_TYPE_CLOCK_OUT));
}
log.info("上传打卡照片完成,行号:{}", rowNumStr);
// 推广类照片上传时间 // 推广类照片上传时间
String range =String.format(rangFormat, "AQ", "AQ"); String range =String.format(rangFormat, "AO", "AO");
updateClockData(range,Arrays.asList(pct.toString())); updateClockData(range,Arrays.asList(pct.toString()));
log.info("上传推广-成交照片完成,行号:{}", rowNumStr); log.info("结束上传推广打卡照片:{}",rowNumStr);
} }
private void addactivityDataRow(List<Object> rowData) { private void addactivityDataRow(List<Object> rowData) {
String redisKey = getRowNumRedisKey(); String redisKey = getRowNumRedisKey();
String rowNumStr = redisCache.get(redisKey); String rowNumStr = redisCache.get(redisKey);
Integer rowNumNext = StringUtils.isBlank(rowNumStr) ? 2 : Integer.parseInt(rowNumStr) + 1; 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()); Integer rowNumEnd = feishuSheetUtils.appendValueToSheet(range, rowData, sheetInfoD.getSheetToken(), getFeishuTenantToken1());
if (rowNumEnd < 1) { if (rowNumEnd < 1) {
...@@ -459,4 +455,50 @@ public class ActivityToFeishuSheetServiceImpl implements ActivityToFeishuSheetSe ...@@ -459,4 +455,50 @@ public class ActivityToFeishuSheetServiceImpl implements ActivityToFeishuSheetSe
return DatePattern.NORM_DATETIME_FORMAT.format(date); return DatePattern.NORM_DATETIME_FORMAT.format(date);
} }
/**
* 计算工时
*/
private String calculateWorkDuration(TemporaryActivityClockDO clockDo) {
// 基础校验:上班/下班时间为空,直接返回0
if (Objects.isNull(clockDo.getClockInTime())) {
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;
if (Objects.isNull(clockDo.getClockOutTime())){
afternoonMinutes = 0 ;
}else {
afternoonMinutes = DateUtil.between(noonClockIn, clockOut, DateUnit.MINUTE);
}
totalMinutes = morningMinutes + afternoonMinutes;
}
// 分钟转小时(保留1位小数,避免多位小数)
double hours = totalMinutes / 60.0;
return String.format("%.1f", hours);
}
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论