diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/order/controller/OrderController.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/order/controller/OrderController.java index 2742c9c..b45a95a 100644 --- a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/order/controller/OrderController.java +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/order/controller/OrderController.java @@ -273,7 +273,9 @@ public class OrderController extends BaseController { String text = run.getText(0); if (text != null) { for (Map.Entry entry : replacements.entrySet()) { - text = text.replace(entry.getKey(), entry.getValue()); + String entryValue = entry.getValue(); + if (entryValue == null) {continue;} + text = text.replace(entry.getKey(), entryValue); } run.setText(text, 0); } @@ -491,22 +493,30 @@ public class OrderController extends BaseController { } private static void fillOrderTable(XWPFDocument document, List orderDetails, String cost) { - // 获取第一个表格(假设模板中只有一个表格) - XWPFTable table = document.getTables().get(1); - - // 保留第一行(表头)和最后一行(合计行),仅在中间插入数据行 + XWPFTable table = null; int headerRowIndex = 0; // 表头行索引 - int footerRowIndex = table.getRows().size(); // 合计行索引 + int footerRowIndex = 0; // 合计行索引 + int cellCount = 0; + try { + // 获取第一个表格(假设模板中只有一个表格) + table = document.getTables().get(1); - // 删除中间的所有行(如果有的话) - for (int i = table.getRows().size() - 2; i > headerRowIndex; i--) { - table.removeRow(i); + // 保留第一行(表头)和最后一行(合计行),仅在中间插入数据行 + headerRowIndex = 0; + footerRowIndex = table.getRows().size(); + + // 删除中间的所有行(如果有的话) + for (int i = table.getRows().size() - 2; i > headerRowIndex; i--) { + table.removeRow(i); + } + // 获取表头行的单元格数量 + cellCount = table.getRow(headerRowIndex).getTableCells().size(); + + // 遍历订单详情并动态插入数据行 + SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + } catch (IndexOutOfBoundsException e) { + throw new RuntimeException("模板表处理异常,请检查合同信息"); } - // 获取表头行的单元格数量 - int cellCount = table.getRow(headerRowIndex).getTableCells().size(); - - // 遍历订单详情并动态插入数据行 - SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); int num = orderDetails.size(); for (OrderDetailDto detail : orderDetails) { XWPFTableRow newRow = table.insertNewTableRow(headerRowIndex + 1); diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/order/domain/OrderDetailDto.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/order/domain/OrderDetailDto.java index 4868681..23193a8 100644 --- a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/order/domain/OrderDetailDto.java +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/order/domain/OrderDetailDto.java @@ -165,12 +165,18 @@ public class OrderDetailDto { @ApiModelProperty(value = "买方承租方公司名称") private String buyerCompanyName; + @ApiModelProperty(value = "买方承租方电话") + private String buyerPhoneNumber; + @ApiModelProperty(value = "卖方出租方公司id") private Integer sellerCompany; @ApiModelProperty(value = "卖方出租方公司名称") private String sellerCompanyName; + @ApiModelProperty(value = "卖方出租方电话") + private String sellerPhoneNumber; + @ApiModelProperty(value = "单位") private String unitName; diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/order/service/impl/OrderServiceImpl.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/order/service/impl/OrderServiceImpl.java index 026e850..8340fe1 100644 --- a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/order/service/impl/OrderServiceImpl.java +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/order/service/impl/OrderServiceImpl.java @@ -43,6 +43,7 @@ import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; /** * @Author:liang.chao @@ -320,7 +321,7 @@ public class OrderServiceImpl implements OrderService { } // 退租 if (orderInfoDto.getOrderStatus().equals(OrderStatusEnum.ORDER_UNDER_LEASE.getStatus().toString())) { - if (dtos.size() > 0 && CollectionUtil.isNotEmpty(dtos)) { + if (!dtos.isEmpty() && CollectionUtil.isNotEmpty(dtos)) { if (CollectionUtil.isNotEmpty(orderInfoDto.getMaIds())) { for (OrderDetailDto dto : dtos) { if (orderInfoDto.getMaIds().contains(dto.getMaId())) { @@ -334,6 +335,13 @@ public class OrderServiceImpl implements OrderService { orderMapper.updateDeviceStatus(dto); } } + String sendMessage = sendMsgToSms(Arrays.asList(dtos.get(0).getBuyerPhoneNumber(), dtos.get(0).getSellerPhoneNumber()), orderInfoDto.getOrderCode() + "订单,退租成功"); + if (StringUtils.isBlank(sendMessage)) { + System.err.println("短信发送失败"); + } else { + System.out.println("短信发送消息:" + sendMessage); + } + } } // 取消 @@ -344,10 +352,11 @@ public class OrderServiceImpl implements OrderService { orderMapper.updateDeviceStatus(dto); } } + sendMsgToSms(Arrays.asList(dtos.get(0).getBuyerPhoneNumber(), dtos.get(0).getSellerPhoneNumber()), orderInfoDto.getOrderCode() + "订单已被取消"); } // 订单完成,修改装备为下架状态 if (orderInfoDto.getOrderStatus().equals(OrderStatusEnum.ORDER_FINISHED.getStatus().toString())) { - if (dtos.size() > 0 && CollectionUtil.isNotEmpty(dtos)) { + if (!dtos.isEmpty() && CollectionUtil.isNotEmpty(dtos)) { if (CollectionUtil.isNotEmpty(orderInfoDto.getMaIds())) { for (OrderDetailDto dto : dtos) { if (orderInfoDto.getMaIds().contains(dto.getMaId())) { @@ -361,6 +370,7 @@ public class OrderServiceImpl implements OrderService { orderMapper.updateDeviceStatus(dto); } } + sendMsgToSms(Arrays.asList(dtos.get(0).getBuyerPhoneNumber(), dtos.get(0).getSellerPhoneNumber()), orderInfoDto.getOrderCode() + "订单已完成。"); } } String userName = SecurityUtils.getLoginUser().getUsername(); @@ -375,11 +385,14 @@ public class OrderServiceImpl implements OrderService { if (orderInfoDto.getOrderStatus().equals(OrderStatusEnum.ORDER_PENDING_SHIPMENT.getStatus().toString()) || orderInfoDto.getOrderStatus().equals(OrderStatusEnum.ORDER_TERMINATED.getStatus().toString())) { tmTask.setNoticeCompanyId(tmTask.getBuyerCompanyId()); + sendMsgToSms(Collections.singletonList(dtos.get(0).getBuyerPhoneNumber()), dtos.get(0).getOrderCode() + "订单已出库,请注意查收。"); } else if (orderInfoDto.getOrderStatus().equals(OrderStatusEnum.ORDER_RECEIVE.getStatus().toString()) || orderInfoDto.getOrderStatus().equals(OrderStatusEnum.ORDER_AWAITING_RECEIPT.getStatus().toString()) || orderInfoDto.getOrderStatus().equals(OrderStatusEnum.ORDER_UNDER_LEASE.getStatus().toString()) || orderInfoDto.getOrderStatus().equals(OrderStatusEnum.ORDER_REPAIRED.getStatus().toString())) { tmTask.setNoticeCompanyId(tmTask.getSellerCompanyId()); + sendMsgToSms(Collections.singletonList(dtos.get(0).getBuyerPhoneNumber()), dtos.get(0).getOrderCode() + "订单已接单,待出库。"); + } tmTaskMapper.updateTaskStatus(tmTask); } @@ -424,6 +437,46 @@ public class OrderServiceImpl implements OrderService { return i; } + /** + * 发送消息到短信 + * + * @param phoneNumbers 电话号码列表,可能包含无效或重复的号码 + * @param msg 要发送的短信消息内容 + * @return 发送短信的结果,具体形式依赖于SmsUtils.smsToken的实现 + * 此方法首先检查电话号码列表是否为空如果为空,则直接返回空字符串接下来,它会移除列表中所有为空的电话号码, + * 然后对列表中超过11位的电话号码进行解密处理 + * 确保只有有效的电话号码被用来发送短信 + */ + private String sendMsgToSms(List phoneNumbers, String msg) { + // 检查电话号码列表是否为空 + if (CollectionUtils.isEmpty(phoneNumbers)) { + return ""; + } + + // 先用迭代器 + Iterator iterator = phoneNumbers.iterator(); + while (iterator.hasNext()) { + String phoneNumber = iterator.next(); + if (StringUtils.isEmpty(phoneNumber)) { + iterator.remove(); + } + } + + // 遍历电话号码列表 + for (String phoneNumber : phoneNumbers) { + if (StringUtils.isEmpty(phoneNumber)) { + continue; + } + // 对超过11位的电话号码进行解密处理 + if (phoneNumber.length() > 11) { + Sm4Utils.decrypt(phoneNumber); + } + } + + // 使用处理后的电话号码列表发送短信 + return SmsUtils.smsToken(String.join(",", phoneNumbers), msg, ""); + } + /** * 生成六位随机数取件码 * @return diff --git a/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/order/OrderInfoMapper.xml b/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/order/OrderInfoMapper.xml index b4b1f24..165a9b8 100644 --- a/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/order/OrderInfoMapper.xml +++ b/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/order/OrderInfoMapper.xml @@ -314,6 +314,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"