|
@@ -13,6 +13,7 @@ import com.haha.common.enums.PayStatus;
|
|
|
import com.haha.common.enums.PaymentChannel;
|
|
import com.haha.common.enums.PaymentChannel;
|
|
|
import com.haha.common.exception.BusinessException;
|
|
import com.haha.common.exception.BusinessException;
|
|
|
import com.haha.common.utils.EntityLabelUtils;
|
|
import com.haha.common.utils.EntityLabelUtils;
|
|
|
|
|
+import com.haha.common.utils.OrderUtils;
|
|
|
import com.haha.common.vo.OrderItemVO;
|
|
import com.haha.common.vo.OrderItemVO;
|
|
|
import com.haha.common.vo.OrderVO;
|
|
import com.haha.common.vo.OrderVO;
|
|
|
import com.haha.entity.Device;
|
|
import com.haha.entity.Device;
|
|
@@ -52,7 +53,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
|
|
|
|
|
private final DeviceMapper deviceMapper;
|
|
private final DeviceMapper deviceMapper;
|
|
|
private final ShopMapper shopMapper;
|
|
private final ShopMapper shopMapper;
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
@Autowired
|
|
@Autowired
|
|
|
@Lazy
|
|
@Lazy
|
|
|
private PaymentService paymentService;
|
|
private PaymentService paymentService;
|
|
@@ -70,7 +71,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
private InviteActivityService inviteActivityService;
|
|
private InviteActivityService inviteActivityService;
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
- public IPage<Order> getPage(int page, int pageSize, String orderNo, String deviceId,
|
|
|
|
|
|
|
+ public IPage<Order> getPage(int page, int pageSize, String orderNo, String deviceId,
|
|
|
String payStatus, Integer status, String startDate, String endDate) {
|
|
String payStatus, Integer status, String startDate, String endDate) {
|
|
|
// 确保分页参数有效(MyBatis-Plus 要求页码从 1 开始)
|
|
// 确保分页参数有效(MyBatis-Plus 要求页码从 1 开始)
|
|
|
if (page < 1) {
|
|
if (page < 1) {
|
|
@@ -79,11 +80,11 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
if (pageSize < 1 || pageSize > 100) {
|
|
if (pageSize < 1 || pageSize > 100) {
|
|
|
pageSize = 10; // 默认每页 10 条,最大 100 条
|
|
pageSize = 10; // 默认每页 10 条,最大 100 条
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
log.info("订单分页查询:page={}, pageSize={}, orderNo={}, deviceId={}", page, pageSize, orderNo, deviceId);
|
|
log.info("订单分页查询:page={}, pageSize={}, orderNo={}, deviceId={}", page, pageSize, orderNo, deviceId);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
LambdaQueryWrapper<Order> wrapper = new LambdaQueryWrapper<>();
|
|
LambdaQueryWrapper<Order> wrapper = new LambdaQueryWrapper<>();
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// 构建查询条件
|
|
// 构建查询条件
|
|
|
wrapper.like(orderNo != null && !orderNo.isEmpty(), Order::getOrderNo, orderNo)
|
|
wrapper.like(orderNo != null && !orderNo.isEmpty(), Order::getOrderNo, orderNo)
|
|
|
.like(deviceId != null && !deviceId.isEmpty(), Order::getDeviceId, deviceId)
|
|
.like(deviceId != null && !deviceId.isEmpty(), Order::getDeviceId, deviceId)
|
|
@@ -105,10 +106,10 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
|
|
|
|
|
// 分页查询
|
|
// 分页查询
|
|
|
IPage<Order> orderPage = this.page(new Page<>(page, pageSize), wrapper);
|
|
IPage<Order> orderPage = this.page(new Page<>(page, pageSize), wrapper);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// 填充标签字段和关联信息
|
|
// 填充标签字段和关联信息
|
|
|
orderPage.getRecords().forEach(this::fillOrderLabels);
|
|
orderPage.getRecords().forEach(this::fillOrderLabels);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
return orderPage;
|
|
return orderPage;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -128,7 +129,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
if (order == null) {
|
|
if (order == null) {
|
|
|
return null;
|
|
return null;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
OrderVO vo = new OrderVO();
|
|
OrderVO vo = new OrderVO();
|
|
|
vo.setId(order.getId());
|
|
vo.setId(order.getId());
|
|
|
vo.setOrderNo(order.getOrderNo());
|
|
vo.setOrderNo(order.getOrderNo());
|
|
@@ -145,10 +146,10 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
vo.setPayTime(order.getPayTime());
|
|
vo.setPayTime(order.getPayTime());
|
|
|
vo.setVideoUrl(order.getVideoUrl());
|
|
vo.setVideoUrl(order.getVideoUrl());
|
|
|
vo.setConfidence(order.getConfidence());
|
|
vo.setConfidence(order.getConfidence());
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
List<OrderItemVO> products = orderGoodsService.getVOByOrderId(id);
|
|
List<OrderItemVO> products = orderGoodsService.getVOByOrderId(id);
|
|
|
vo.setProducts(products);
|
|
vo.setProducts(products);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
return vo;
|
|
return vo;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -231,8 +232,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
statistics.put("todayAmount", todayAmount != null ? todayAmount.setScale(2, RoundingMode.HALF_UP).toString() : "0.00");
|
|
statistics.put("todayAmount", todayAmount != null ? todayAmount.setScale(2, RoundingMode.HALF_UP).toString() : "0.00");
|
|
|
|
|
|
|
|
// 平均订单金额
|
|
// 平均订单金额
|
|
|
- BigDecimal averageAmount = completedOrders > 0 && totalAmount != null
|
|
|
|
|
- ? totalAmount.divide(BigDecimal.valueOf(completedOrders), 2, RoundingMode.HALF_UP)
|
|
|
|
|
|
|
+ BigDecimal averageAmount = completedOrders > 0 && totalAmount != null
|
|
|
|
|
+ ? totalAmount.divide(BigDecimal.valueOf(completedOrders), 2, RoundingMode.HALF_UP)
|
|
|
: BigDecimal.ZERO;
|
|
: BigDecimal.ZERO;
|
|
|
statistics.put("averageAmount", averageAmount.toString());
|
|
statistics.put("averageAmount", averageAmount.toString());
|
|
|
|
|
|
|
@@ -302,18 +303,18 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 从AI识别结果创建订单
|
|
* 从AI识别结果创建订单
|
|
|
- *
|
|
|
|
|
|
|
+ *
|
|
|
* 业务流程:
|
|
* 业务流程:
|
|
|
* 1. 幂等性检查:防止重复创建订单
|
|
* 1. 幂等性检查:防止重复创建订单
|
|
|
* 2. 保存商品识别信息(此时不计算金额,因为AI识别结果不包含价格)
|
|
* 2. 保存商品识别信息(此时不计算金额,因为AI识别结果不包含价格)
|
|
|
* 3. 解析视频URL等资源信息
|
|
* 3. 解析视频URL等资源信息
|
|
|
* 4. 创建订单记录,状态为待支付,金额为0(等待订单回调时由设备端提供实付金额)
|
|
* 4. 创建订单记录,状态为待支付,金额为0(等待订单回调时由设备端提供实付金额)
|
|
|
- *
|
|
|
|
|
|
|
+ *
|
|
|
* 注意:
|
|
* 注意:
|
|
|
* - AI识别结果(sku_list)只包含商品编码(code)和数量(quantity),不包含价格
|
|
* - AI识别结果(sku_list)只包含商品编码(code)和数量(quantity),不包含价格
|
|
|
* - 商品价格在订单回调时由设备端计算并传来
|
|
* - 商品价格在订单回调时由设备端计算并传来
|
|
|
* - 此方法只创建订单框架,实际金额在handleOrderCallback中更新
|
|
* - 此方法只创建订单框架,实际金额在handleOrderCallback中更新
|
|
|
- *
|
|
|
|
|
|
|
+ *
|
|
|
* @param activityId 活动ID(设备开门会话ID)
|
|
* @param activityId 活动ID(设备开门会话ID)
|
|
|
* @param deviceId 设备ID
|
|
* @param deviceId 设备ID
|
|
|
* @param userId 用户ID
|
|
* @param userId 用户ID
|
|
@@ -334,7 +335,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
return existingOrder;
|
|
return existingOrder;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// 【步骤2】解析视频URL等资源信息
|
|
// 【步骤2】解析视频URL等资源信息
|
|
|
String videoUrl = null;
|
|
String videoUrl = null;
|
|
|
if (resourceInfoStr != null && !resourceInfoStr.isEmpty()) {
|
|
if (resourceInfoStr != null && !resourceInfoStr.isEmpty()) {
|
|
@@ -349,6 +350,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
// 3. 设备端会根据商品编码查询价格,并计算优惠后得到最终实付金额
|
|
// 3. 设备端会根据商品编码查询价格,并计算优惠后得到最终实付金额
|
|
|
if (userId != null && deviceId != null) {
|
|
if (userId != null && deviceId != null) {
|
|
|
Order order = new Order();
|
|
Order order = new Order();
|
|
|
|
|
+ order.setOrderNo(OrderUtils.getOrderNo());
|
|
|
order.setActivityId(activityId); // 开门会话ID
|
|
order.setActivityId(activityId); // 开门会话ID
|
|
|
order.setUserId(Long.parseLong(userId)); // 用户ID
|
|
order.setUserId(Long.parseLong(userId)); // 用户ID
|
|
|
order.setDeviceId(deviceId); // 设备ID
|
|
order.setDeviceId(deviceId); // 设备ID
|
|
@@ -390,7 +392,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
var statusLabel = EntityLabelUtils.getStatusLabel("order", order.getStatus());
|
|
var statusLabel = EntityLabelUtils.getStatusLabel("order", order.getStatus());
|
|
|
order.setStatusLabel(statusLabel.getLabel());
|
|
order.setStatusLabel(statusLabel.getLabel());
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// 如果 payType 为空但 payChannel 有值,从 payChannel 获取描述
|
|
// 如果 payType 为空但 payChannel 有值,从 payChannel 获取描述
|
|
|
if (order.getPayType() == null || order.getPayType().isEmpty()) {
|
|
if (order.getPayType() == null || order.getPayType().isEmpty()) {
|
|
|
if (order.getPayChannel() != null && !order.getPayChannel().isEmpty()) {
|
|
if (order.getPayChannel() != null && !order.getPayChannel().isEmpty()) {
|
|
@@ -404,7 +406,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
order.setPayType("免费");
|
|
order.setPayType("免费");
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// 根据 deviceId 查询设备信息,获取门店名称
|
|
// 根据 deviceId 查询设备信息,获取门店名称
|
|
|
if (order.getDeviceId() != null && !order.getDeviceId().isEmpty()) {
|
|
if (order.getDeviceId() != null && !order.getDeviceId().isEmpty()) {
|
|
|
try {
|
|
try {
|
|
@@ -432,9 +434,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
public Order createOrderWithPayScore(String activityId, String deviceId, String userId,
|
|
public Order createOrderWithPayScore(String activityId, String deviceId, String userId,
|
|
|
String skuListStr, String resourceInfoStr, BigDecimal confidence,
|
|
String skuListStr, String resourceInfoStr, BigDecimal confidence,
|
|
|
String openId) {
|
|
String openId) {
|
|
|
- Order order = createOrderFromRecognition(activityId, deviceId, userId,
|
|
|
|
|
|
|
+ Order order = createOrderFromRecognition(activityId, deviceId, userId,
|
|
|
skuListStr, resourceInfoStr, confidence);
|
|
skuListStr, resourceInfoStr, confidence);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
if (order == null) {
|
|
if (order == null) {
|
|
|
return null;
|
|
return null;
|
|
|
}
|
|
}
|
|
@@ -446,9 +448,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
|
PayScoreResult result = payScoreService.createPayScoreOrder(order.getId(), openId);
|
|
PayScoreResult result = payScoreService.createPayScoreOrder(order.getId(), openId);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
if (result.isSuccess()) {
|
|
if (result.isSuccess()) {
|
|
|
- log.info("[支付分集成] 支付分服务订单创建成功 - orderId: {}, outOrderNo: {}",
|
|
|
|
|
|
|
+ log.info("[支付分集成] 支付分服务订单创建成功 - orderId: {}, outOrderNo: {}",
|
|
|
order.getId(), result.getOutOrderNo());
|
|
order.getId(), result.getOutOrderNo());
|
|
|
order.setPayScoreOrderId(result.getOutOrderNo());
|
|
order.setPayScoreOrderId(result.getOutOrderNo());
|
|
|
order.setPayScoreState(result.getState());
|
|
order.setPayScoreState(result.getState());
|
|
@@ -456,7 +458,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
order.setPayType("微信支付分");
|
|
order.setPayType("微信支付分");
|
|
|
this.updateById(order);
|
|
this.updateById(order);
|
|
|
} else {
|
|
} else {
|
|
|
- log.warn("[支付分集成] 支付分服务订单创建失败 - orderId: {}, errorCode: {}, errorMsg: {}",
|
|
|
|
|
|
|
+ log.warn("[支付分集成] 支付分服务订单创建失败 - orderId: {}, errorCode: {}, errorMsg: {}",
|
|
|
order.getId(), result.getErrorCode(), result.getErrorMsg());
|
|
order.getId(), result.getErrorCode(), result.getErrorMsg());
|
|
|
}
|
|
}
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
@@ -468,17 +470,17 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 使用支付分完结订单(扣费)
|
|
* 使用支付分完结订单(扣费)
|
|
|
- *
|
|
|
|
|
|
|
+ *
|
|
|
* 业务流程:
|
|
* 业务流程:
|
|
|
* 1. 验证订单是否存在
|
|
* 1. 验证订单是否存在
|
|
|
* 2. 检查是否创建了支付分服务订单
|
|
* 2. 检查是否创建了支付分服务订单
|
|
|
* 3. 调用微信支付分完结接口进行扣费
|
|
* 3. 调用微信支付分完结接口进行扣费
|
|
|
* 4. 扣费成功后触发邀请激活逻辑(异步)
|
|
* 4. 扣费成功后触发邀请激活逻辑(异步)
|
|
|
- *
|
|
|
|
|
|
|
+ *
|
|
|
* 注意:
|
|
* 注意:
|
|
|
* - 如果订单未使用支付分,直接更新订单状态
|
|
* - 如果订单未使用支付分,直接更新订单状态
|
|
|
* - 优惠金额已在设备端计算,totalAmount为实付金额
|
|
* - 优惠金额已在设备端计算,totalAmount为实付金额
|
|
|
- *
|
|
|
|
|
|
|
+ *
|
|
|
* @param orderId 订单ID
|
|
* @param orderId 订单ID
|
|
|
* @param totalAmount 订单总金额(设备端已计算优惠后的实付金额)
|
|
* @param totalAmount 订单总金额(设备端已计算优惠后的实付金额)
|
|
|
* @return 是否完结成功
|
|
* @return 是否完结成功
|