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

合并分支 'dxy' 到 'qa'

Dxy 查看合并请求 !8
......@@ -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;
}
......@@ -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));
}
// 下班打卡照片 >>>
if (clockMap.containsKey(7)) {
valuesImageToSheetByRobot2(String.format(rangFormat, "AA", "AA"), clockMap.get(7));
valuesImageToSheet(String.format(rangFormat, "AB", "AB"), clockMap.get(4));
}
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, "AB", "AB"), photosType1.get(0).getPhotoUrl());
valuesImageToSheet(String.format(rangFormat, "AC", "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, "AC", "AC"), photosType1.get(1).getPhotoUrl());
valuesImageToSheetByRobot2(String.format(rangFormat, "AD", "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, "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()));
}
// 推广互动照片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, "AN", "AN"), randTaskPhotos.get(0).getPhotoUrl());
valuesImageToSheetByRobot2(String.format(rangFormat, "AK", "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, "AQ", "AQ");
String range =String.format(rangFormat, "AO", "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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论