|
@@ -181,6 +181,11 @@ public class HBOrderService implements IHBOrderService {
|
|
|
Integer operatorType = bodyJson.getInteger("operatorType");
|
|
Integer operatorType = bodyJson.getInteger("operatorType");
|
|
|
String channelOrderId = bodyJson.getString("channelOrderId");
|
|
String channelOrderId = bodyJson.getString("channelOrderId");
|
|
|
Order order = orderMapper.getOrderAndOrderItemByOrderNumber(channelOrderId);
|
|
Order order = orderMapper.getOrderAndOrderItemByOrderNumber(channelOrderId);
|
|
|
|
|
+ if (order == null) {
|
|
|
|
|
+ log.error("海博订单状态回调-订单不存在,channelOrderId: {}", channelOrderId);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ boolean isSmqjhOrder = Objects.equals(order.getOrderType(), 4);
|
|
|
//如果是已送达直接完成并且通知海博
|
|
//如果是已送达直接完成并且通知海博
|
|
|
order.setHbOrderStatus(operatorType);
|
|
order.setHbOrderStatus(operatorType);
|
|
|
if (operatorType == 70 && order.getDvyType() == 3) {
|
|
if (operatorType == 70 && order.getDvyType() == 3) {
|
|
@@ -192,7 +197,7 @@ public class HBOrderService implements IHBOrderService {
|
|
|
if (operatorType == 60) {
|
|
if (operatorType == 60) {
|
|
|
log.info("取消订单{}", channelOrderId);
|
|
log.info("取消订单{}", channelOrderId);
|
|
|
changeOrderStatus(channelOrderId, 60);
|
|
changeOrderStatus(channelOrderId, 60);
|
|
|
- if (!order.getOrderType().equals(4)) {
|
|
|
|
|
|
|
+ if (!isSmqjhOrder) {
|
|
|
//创建退款单
|
|
//创建退款单
|
|
|
OrderRefundParam orderRefundParam = new OrderRefundParam();
|
|
OrderRefundParam orderRefundParam = new OrderRefundParam();
|
|
|
orderRefundParam.setOrderNumber(order.getOrderNumber());
|
|
orderRefundParam.setOrderNumber(order.getOrderNumber());
|
|
@@ -217,11 +222,8 @@ public class HBOrderService implements IHBOrderService {
|
|
|
.eq(OrderRefund::getOrderItemId, orderItem.getOrderItemId()));
|
|
.eq(OrderRefund::getOrderItemId, orderItem.getOrderItemId()));
|
|
|
|
|
|
|
|
if (ObjectUtil.isNotEmpty(orderRefundList)) {
|
|
if (ObjectUtil.isNotEmpty(orderRefundList)) {
|
|
|
- // 计算该订单项已退款的总数量(通过退款单查询退款商品)
|
|
|
|
|
- List<OrderRefundSkuVo> orderRefundSkuVos = orderRefundSkuMapper.selectByRefundId(orderItem.getOrderItemId());
|
|
|
|
|
- Integer totalRefundedCount = orderRefundSkuVos.stream()
|
|
|
|
|
- .mapToInt(OrderRefundSkuVo::getProductCount)
|
|
|
|
|
- .sum();
|
|
|
|
|
|
|
+ // 计算该订单项已退款的总数量(按退款单ID查询退款商品)
|
|
|
|
|
+ Integer totalRefundedCount = calculateTotalRefundedCount(orderRefundList, orderItem.getOrderItemId());
|
|
|
|
|
|
|
|
// 计算剩余可退款数量
|
|
// 计算剩余可退款数量
|
|
|
Integer remainingCount = orderItem.getProdCount() - totalRefundedCount;
|
|
Integer remainingCount = orderItem.getProdCount() - totalRefundedCount;
|
|
@@ -266,6 +268,85 @@ public class HBOrderService implements IHBOrderService {
|
|
|
}
|
|
}
|
|
|
OrderRefund orderRefund = orderService.applyAgain(orderRefundParam, ReturnMoneyStsType.SUCCESS.value());
|
|
OrderRefund orderRefund = orderService.applyAgain(orderRefundParam, ReturnMoneyStsType.SUCCESS.value());
|
|
|
orderRefundService.createRefundOrder(order.getOrderNumber(), orderRefund.getRefundSn());
|
|
orderRefundService.createRefundOrder(order.getOrderNumber(), orderRefund.getRefundSn());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // ========== 市民请集合订单:商家取消时处理售后单 + 创建退款单通知海博 ==========
|
|
|
|
|
+ try {
|
|
|
|
|
+ log.info("市民请集合订单取消,处理退款单并通知海博,订单号: {}", channelOrderId);
|
|
|
|
|
+
|
|
|
|
|
+ // Issue 4: 有进行中的售后单 → 改为退款完成(70),而非驳回
|
|
|
|
|
+ OrderRefund ongoingRefund = orderRefundService.getOne(new LambdaQueryWrapper<OrderRefund>()
|
|
|
|
|
+ .eq(OrderRefund::getOrderNumber, order.getOrderNumber())
|
|
|
|
|
+ .notIn(OrderRefund::getReturnMoneySts, Arrays.asList(30, 40, 70)));
|
|
|
|
|
+ log.info("市民请集合-进行中售后单数据:{}", JSONObject.toJSONString(ongoingRefund));
|
|
|
|
|
+ if (ObjectUtil.isNotEmpty(ongoingRefund)) {
|
|
|
|
|
+ ongoingRefund.setReturnMoneySts(ReturnMoneyStsType.SUCCESS.value());
|
|
|
|
|
+ orderRefundService.updateById(ongoingRefund);
|
|
|
|
|
+ // 退款单状态同步到海博
|
|
|
|
|
+ orderRefundService.changeStatus(ongoingRefund.getRefundSn(), ReturnMoneyStsType.SUCCESS.value());
|
|
|
|
|
+ // 生成流程记录
|
|
|
|
|
+ orderRefundService.addOrderRefundRecord(ongoingRefund.getRefundId(), 30, 10, "商家取消订单,系统自动完成退款。");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // Issue 3: 计算剩余商品并创建退款单通知海博
|
|
|
|
|
+ OrderRefundParam smqjhRefundParam = new OrderRefundParam();
|
|
|
|
|
+ smqjhRefundParam.setOrderNumber(order.getOrderNumber());
|
|
|
|
|
+ smqjhRefundParam.setApplyType(1);
|
|
|
|
|
+ smqjhRefundParam.setRefundType(1);
|
|
|
|
|
+ smqjhRefundParam.setIsReceiver(false);
|
|
|
|
|
+ smqjhRefundParam.setBuyerReason("17");
|
|
|
|
|
+ smqjhRefundParam.setBuyerDesc(bodyJson.getString("reason"));
|
|
|
|
|
+ smqjhRefundParam.setBuyerMobile(order.getUserMobile());
|
|
|
|
|
+ smqjhRefundParam.setGoodsNum(order.getProductNums());
|
|
|
|
|
+ smqjhRefundParam.setRefundAmount(order.getActualTotal());
|
|
|
|
|
+ smqjhRefundParam.setPhotoFiles("");
|
|
|
|
|
+
|
|
|
|
|
+ List<OrderItem> smqjhOrderItems = orderItemMapper.getListByOrderNumber(order.getOrderNumber());
|
|
|
|
|
+ List<OrderRefundSku> smqjhRefundSkuList = new ArrayList<>();
|
|
|
|
|
+ for (OrderItem orderItem : smqjhOrderItems) {
|
|
|
|
|
+ // 查询该订单项的所有退款记录
|
|
|
|
|
+ List<OrderRefund> orderRefundList = orderRefundService.list(new LambdaQueryWrapper<OrderRefund>()
|
|
|
|
|
+ .eq(OrderRefund::getOrderNumber, order.getOrderNumber())
|
|
|
|
|
+ .eq(OrderRefund::getReturnMoneySts, 70)
|
|
|
|
|
+ .eq(OrderRefund::getOrderItemId, orderItem.getOrderItemId()));
|
|
|
|
|
+
|
|
|
|
|
+ if (ObjectUtil.isNotEmpty(orderRefundList)) {
|
|
|
|
|
+ // 计算该订单项已退款的总数量(按退款单ID查询退款商品)
|
|
|
|
|
+ Integer totalRefundedCount = calculateTotalRefundedCount(orderRefundList, orderItem.getOrderItemId());
|
|
|
|
|
+ Integer remainingCount = orderItem.getProdCount() - totalRefundedCount;
|
|
|
|
|
+ if (remainingCount > 0) {
|
|
|
|
|
+ OrderRefundSku orderRefundSku = new OrderRefundSku();
|
|
|
|
|
+ orderRefundSku.setOrderItemId(orderItem.getOrderItemId());
|
|
|
|
|
+ orderRefundSku.setSkuId(orderItem.getSkuId());
|
|
|
|
|
+ orderRefundSku.setProductCount(remainingCount);
|
|
|
|
|
+ orderRefundSku.setSkuPrice(orderItem.getPrice());
|
|
|
|
|
+ smqjhRefundSkuList.add(orderRefundSku);
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ OrderRefundSku orderRefundSku = new OrderRefundSku();
|
|
|
|
|
+ orderRefundSku.setOrderItemId(orderItem.getOrderItemId());
|
|
|
|
|
+ orderRefundSku.setSkuId(orderItem.getSkuId());
|
|
|
|
|
+ orderRefundSku.setProductCount(orderItem.getProdCount());
|
|
|
|
|
+ orderRefundSku.setSkuPrice(orderItem.getPrice());
|
|
|
|
|
+ smqjhRefundSkuList.add(orderRefundSku);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (ObjectUtil.isNotEmpty(smqjhRefundSkuList)) {
|
|
|
|
|
+ smqjhRefundParam.setOrderRefundSkuList(smqjhRefundSkuList);
|
|
|
|
|
+ // 更新订单退款状态,避免applyAgain检查报错
|
|
|
|
|
+ order.setRefundStatus(4); // DISAGREE
|
|
|
|
|
+ orderMapper.updateById(order);
|
|
|
|
|
+
|
|
|
|
|
+ OrderRefund newRefund = orderService.applyAgain(smqjhRefundParam, ReturnMoneyStsType.SUCCESS.value());
|
|
|
|
|
+ // 标记handler为已处理,避免海博回调details时重复退款(实际退款由smqjh-oms处理)
|
|
|
|
|
+ newRefund.setHandler(true);
|
|
|
|
|
+ orderRefundService.updateById(newRefund);
|
|
|
|
|
+ // 通知海博创建售后单
|
|
|
|
|
+ orderRefundService.createRefundOrder(order.getOrderNumber(), newRefund.getRefundSn());
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("市民请集合订单取消-星闪豹侧处理售后单异常,订单号: {},异常: {}", channelOrderId, e.getMessage(), e);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
//成功直接通知海博
|
|
//成功直接通知海博
|
|
@@ -274,11 +355,18 @@ public class HBOrderService implements IHBOrderService {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//TODO 市民请集合海博状态通知
|
|
//TODO 市民请集合海博状态通知
|
|
|
- if (order.getOrderType().equals(4)) {
|
|
|
|
|
- Map<Object, Object> map = new LinkedTreeMap<>();
|
|
|
|
|
- map.put("orderNumber", channelOrderId);
|
|
|
|
|
- map.put("hbOrderStatus", operatorType);
|
|
|
|
|
- HttpUtil.post(smqjhUtil.getOmsBaseUrl() + "/api/v1/xsb/order/updateHbOrderStatus", map);
|
|
|
|
|
|
|
+ if (isSmqjhOrder) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ Map<Object, Object> map = new LinkedTreeMap<>();
|
|
|
|
|
+ map.put("orderNumber", channelOrderId);
|
|
|
|
|
+ map.put("hbOrderStatus", operatorType);
|
|
|
|
|
+ String syncResult = HttpUtil.post(smqjhUtil.getOmsBaseUrl() + "/api/v1/xsb/order/updateHbOrderStatus", map);
|
|
|
|
|
+ log.info("市民请集合-推送OMS订单状态结果,orderNumber: {}, operatorType: {}, result: {}",
|
|
|
|
|
+ channelOrderId, operatorType, syncResult);
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("市民请集合-推送OMS订单状态失败,orderNumber: {}, operatorType: {}",
|
|
|
|
|
+ channelOrderId, operatorType, e);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -566,4 +654,31 @@ public class HBOrderService implements IHBOrderService {
|
|
|
return HBR.success(createOrderRequest);
|
|
return HBR.success(createOrderRequest);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 统计某个订单项在给定退款单集合中的已退款数量
|
|
|
|
|
+ */
|
|
|
|
|
+ private Integer calculateTotalRefundedCount(List<OrderRefund> orderRefundList, Long orderItemId) {
|
|
|
|
|
+ if (ObjectUtil.isEmpty(orderRefundList)) {
|
|
|
|
|
+ return 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ int totalRefundedCount = 0;
|
|
|
|
|
+ for (OrderRefund refund : orderRefundList) {
|
|
|
|
|
+ if (refund == null || refund.getRefundId() == null) {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ List<OrderRefundSkuVo> orderRefundSkuVos = orderRefundSkuMapper.selectByRefundId(refund.getRefundId());
|
|
|
|
|
+ if (ObjectUtil.isEmpty(orderRefundSkuVos)) {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ totalRefundedCount += orderRefundSkuVos.stream()
|
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
|
|
+ .filter(item -> Objects.equals(item.getOrderItemId(), orderItemId))
|
|
|
|
|
+ .map(OrderRefundSkuVo::getProductCount)
|
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
|
|
+ .mapToInt(Integer::intValue)
|
|
|
|
|
+ .sum();
|
|
|
|
|
+ }
|
|
|
|
|
+ return totalRefundedCount;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
}
|
|
}
|