From 8ddab219b7fb9097da85d04f8dc7fe16eb0b9583 Mon Sep 17 00:00:00 2001 From: cst61 Date: Mon, 18 May 2026 14:57:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E9=80=81=E6=B6=88=E6=81=AF=E5=88=B0?= =?UTF-8?q?=E9=92=89=E9=92=89=20=E6=8F=90=E9=86=92=E5=8D=96=E5=AE=B6?= =?UTF-8?q?=E7=A1=AE=E8=AE=A4=E6=94=B6=E6=AC=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rj/controller/LbOrderRowController.java | 21 ++++ .../com/rj/service/ILbOrderRowService.java | 5 + .../service/impl/LbOrderRowServiceImpl.java | 113 +++++++++++++++--- 3 files changed, 125 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/rj/controller/LbOrderRowController.java b/src/main/java/com/rj/controller/LbOrderRowController.java index ded0743..05575e4 100644 --- a/src/main/java/com/rj/controller/LbOrderRowController.java +++ b/src/main/java/com/rj/controller/LbOrderRowController.java @@ -128,4 +128,25 @@ public class LbOrderRowController { } return ResponseEntity.badRequest().body(result); } + + @PostMapping("/send-seller-confirm-to-dingtalk") + @Operation( + summary = "发送卖家确认通知到钉钉", + description = + "按购买时间区间、租户 id 查询 lb_order_row 明细,将卖家姓名以「买家已支付,不要影响 对方寄卖," + + "请如下卖家确认:」为前缀发送至钉钉,每批最多 15 条记录") + public ResponseEntity> sendSellerConfirmToDingTalk( + @Parameter(description = "查询与发送条件", required = true) @RequestBody + LbOrderRowGenerateSumRequest request) { + Map result = + lbOrderRowService.sendSellerConfirmToDingTalk( + request.getBuyTimeStart(), + request.getBuyTimeEnd(), + request.getTenantId()); + Boolean success = (Boolean) result.get("success"); + if (success != null && success) { + return ResponseEntity.ok(result); + } + return ResponseEntity.badRequest().body(result); + } } diff --git a/src/main/java/com/rj/service/ILbOrderRowService.java b/src/main/java/com/rj/service/ILbOrderRowService.java index abd3efb..a3f73b6 100644 --- a/src/main/java/com/rj/service/ILbOrderRowService.java +++ b/src/main/java/com/rj/service/ILbOrderRowService.java @@ -49,4 +49,9 @@ public interface ILbOrderRowService extends IService { * 按购买时间区间与租户查询明细,按天汇总为 {@code sum_data} 写入 {@code lb_order_row}。 */ Map generateDailySumData(String buyTimeStart, String buyTimeEnd, String tenantId); + + /** + * 按购买时间区间与租户查询 {@code lb_order_row} 明细,将卖家姓名分批发送至钉钉(每批最多 15 条记录)。 + */ + Map sendSellerConfirmToDingTalk(String buyTimeStart, String buyTimeEnd, String tenantId); } diff --git a/src/main/java/com/rj/service/impl/LbOrderRowServiceImpl.java b/src/main/java/com/rj/service/impl/LbOrderRowServiceImpl.java index fb56b0d..ffee7c3 100644 --- a/src/main/java/com/rj/service/impl/LbOrderRowServiceImpl.java +++ b/src/main/java/com/rj/service/impl/LbOrderRowServiceImpl.java @@ -8,6 +8,7 @@ import com.rj.dto.hxr.HxrOrderSelectResponse; import com.rj.entity.LbDepartmentUser; import com.rj.entity.LbOrderRow; import com.rj.mapper.LbOrderRowMapper; +import com.rj.service.DingTalkRobotService; import com.rj.service.HxrAdminOrderSelectService; import com.rj.service.ILbDepartmentUserService; import com.rj.service.ILbOrderRowService; @@ -30,6 +31,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.stream.Collectors; @Slf4j @Service @@ -43,6 +45,11 @@ public class LbOrderRowServiceImpl extends ServiceImpl add(LbOrderRow entity) { Map result = new HashMap<>(); @@ -375,17 +385,7 @@ public class LbOrderRowServiceImpl extends ServiceImpl w = new LambdaQueryWrapper<>(); - w.eq(LbOrderRow::getTenantId, tid); - w.eq(LbOrderRow::getDataType, SYNC_DATA_TYPE_DETAIL); - if (buyTimeStart != null && !buyTimeStart.trim().isEmpty()) { - w.ge(LbOrderRow::getBuyTime, buyTimeStart.trim()); - } - if (buyTimeEnd != null && !buyTimeEnd.trim().isEmpty()) { - w.le(LbOrderRow::getBuyTime, buyTimeEnd.trim()); - } - - List details = this.list(w); + List details = listDetailRowsByBuyTimeRange(buyTimeStart, buyTimeEnd, tid); if (details.isEmpty()) { result.put("success", true); result.put("message", "时间范围内无明细数据"); @@ -437,6 +437,92 @@ public class LbOrderRowServiceImpl extends ServiceImpl sendSellerConfirmToDingTalk( + String buyTimeStart, String buyTimeEnd, String tenantId) { + Map result = new HashMap<>(); + try { + if (tenantId == null || tenantId.trim().isEmpty()) { + result.put("success", false); + result.put("message", "tenantId不能为空"); + return result; + } + String tid = tenantId.trim(); + + List details = listDetailRowsByBuyTimeRange(buyTimeStart, buyTimeEnd, tid); + if (details.isEmpty()) { + result.put("success", true); + result.put("message", "时间范围内无订单明细"); + result.put("recordCount", 0); + result.put("messageCount", 0); + return result; + } + + int messageCount = 0; + for (int i = 0; i < details.size(); i += DINGTALK_SELLER_CONFIRM_BATCH_SIZE) { + int end = Math.min(i + DINGTALK_SELLER_CONFIRM_BATCH_SIZE, details.size()); + List batch = details.subList(i, end); + String sellerNames = + batch.stream() + .map(this::resolveSellerDisplayName) + .collect(Collectors.joining(",")); + dingTalkRobotService.sendText(DINGTALK_SELLER_CONFIRM_PREFIX + sellerNames); + messageCount++; + } + + result.put("success", true); + result.put("message", "发送成功"); + result.put("recordCount", details.size()); + result.put("messageCount", messageCount); + return result; + } catch (IllegalArgumentException | IllegalStateException e) { + log.warn( + "发送卖家确认通知到钉钉失败, tenantId={}, buyTime={}~{}, reason={}", + tenantId, + buyTimeStart, + buyTimeEnd, + e.getMessage()); + result.put("success", false); + result.put("message", e.getMessage()); + return result; + } catch (Exception e) { + log.error( + "发送卖家确认通知到钉钉异常, tenantId={}, buyTime={}~{}", + tenantId, + buyTimeStart, + buyTimeEnd, + e); + result.put("success", false); + result.put("message", "发送失败:" + e.getMessage()); + return result; + } + } + + private List listDetailRowsByBuyTimeRange( + String buyTimeStart, String buyTimeEnd, String tenantId) { + LambdaQueryWrapper w = new LambdaQueryWrapper<>(); + w.eq(LbOrderRow::getTenantId, tenantId); + w.eq(LbOrderRow::getDataType, SYNC_DATA_TYPE_DETAIL); + if (buyTimeStart != null && !buyTimeStart.trim().isEmpty()) { + w.ge(LbOrderRow::getBuyTime, buyTimeStart.trim()); + } + if (buyTimeEnd != null && !buyTimeEnd.trim().isEmpty()) { + w.le(LbOrderRow::getBuyTime, buyTimeEnd.trim()); + } + w.orderByAsc(LbOrderRow::getBuyTime).orderByAsc(LbOrderRow::getId); + return this.list(w); + } + + private String resolveSellerDisplayName(LbOrderRow row) { + if (row.getSellerName() != null && !row.getSellerName().trim().isEmpty()) { + return row.getSellerName().trim(); + } + if (row.getSellerId() != null) { + return String.valueOf(row.getSellerId()); + } + return "未知"; + } + private LbOrderRow buildDailySumRow( String tenantId, LocalDate day, List dayRows, String nowStr) { BigDecimal moneySum = BigDecimal.ZERO; @@ -575,11 +661,10 @@ public class LbOrderRowServiceImpl extends ServiceImpl w = new LambdaQueryWrapper<>(); w.eq(LbDepartmentUser::getTenantId, tenantId) - .in(LbDepartmentUser::getUserId, userIdStrs) - .orderByDesc(LbDepartmentUser::getUpdateTime) - .orderByDesc(LbDepartmentUser::getCreateTime); + .in(LbDepartmentUser::getUserId, userIdStrs); List users = lbDepartmentUserService.list(w); Map byUserId = new LinkedHashMap<>(); for (LbDepartmentUser user : users) {