Browse Source

对接拼团数据1

master
wangfukang 1 week ago
parent
commit
b2febb04b5
  1. 10
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java
  2. 10
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallOrderController.java
  3. 16
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallRefundRecordController.java
  4. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallDeliveryOrder.java
  5. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrder.java
  6. 29
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallRefundRecord.java
  7. 8
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/MallOrderVO.java
  8. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallDeliveryOrderService.java
  9. 4
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallOrderService.java
  10. 4
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallRefundRecordService.java
  11. 27
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java
  12. 9
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java
  13. 123
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java
  14. 47
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java
  15. 1
      hiver-modules/hiver-mall/src/main/resources/mapper/MallRefundRecordMapper.xml
  16. 14
      hiver-modules/hiver-social/src/main/java/cc/hiver/social/controller/WechatController.java

10
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java

@ -120,8 +120,8 @@ public class MallDeliveryOrderController {
*/
@PostMapping("/accept")
@ApiOperation(value = "配送员接单", notes = "抢单大厅单或指派单均通过此接口接单")
public Result accept(@RequestParam String deliveryId,
@RequestParam String workerId,@RequestParam String workerName,@RequestParam String regionId,@RequestParam String groupId) {
public Result<Worker> accept(@RequestParam String deliveryId,
@RequestParam String workerId,@RequestParam String workerPhone,@RequestParam String workerName,@RequestParam String regionId,@RequestParam String groupId) {
try {
if(StrUtil.isBlank(workerId)){
//当前人没有注册兼职,先赋予兼职身份
@ -137,7 +137,7 @@ public class MallDeliveryOrderController {
worker.setScore(BigDecimal.valueOf(5));
workerService.save(worker);
}
Integer result = mallDeliveryOrderService.workerAccept(deliveryId, workerId,workerName,groupId);
Integer result = mallDeliveryOrderService.workerAccept(user.getMobile(),deliveryId, workerId,workerName,groupId);
if(result == 0){
return ResultUtil.success("配送单不存在");
}else if (result == 1){
@ -145,10 +145,10 @@ public class MallDeliveryOrderController {
}else if(result == 2){
return ResultUtil.success("该单已指定其他配送员,无法抢单");
}else{
return ResultUtil.success("接单成功");
return new ResultUtil<Worker>().setData(worker);
}
}else{
Integer result = mallDeliveryOrderService.workerAccept(deliveryId, workerId,workerName,groupId);
Integer result = mallDeliveryOrderService.workerAccept(workerPhone,deliveryId, workerId,workerName,groupId);
if(result == 0){
return ResultUtil.success("配送单不存在");
}else if (result == 1){

10
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallOrderController.java

@ -17,7 +17,6 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.List;
/**
@ -127,9 +126,10 @@ public class MallOrderController {
@PostMapping("/cancel")
@ApiOperation(value = "用户取消订单")
public Result cancelOrder(@RequestParam String orderId,
@RequestParam String userId) {
@RequestParam String userId,@RequestParam Integer refundType,
@RequestParam Integer refundTypeStatus) {
try {
mallOrderService.cancelOrder(orderId, userId);
mallOrderService.cancelOrder(orderId, userId, refundType, refundTypeStatus);
return ResultUtil.success("已取消");
} catch (Exception e) {
log.error("取消失败: {}", e.getMessage(), e);
@ -139,7 +139,7 @@ public class MallOrderController {
/**
* 申请退款
*/
@PostMapping("/applyRefund")
@ApiOperation("用户申请退款")
public Result applyRefund(@RequestParam String orderId,
@ -154,7 +154,7 @@ public class MallOrderController {
return ResultUtil.error(e.getMessage());
}
}
*/
/**
* 商家同意退款
*/

16
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallRefundRecordController.java

@ -13,6 +13,8 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 订单接口
*/
@ -25,9 +27,6 @@ public class MallRefundRecordController {
@Autowired
private MallRefundRecordService mallRefundRecordService;
/**
* 下单普通购买 / 发起拼团 / 参团
*/
@PostMapping("/create")
@ApiOperation(value = "售后提交接口")
public Result create(@RequestBody MallRefundRecord mallRefundRecord) {
@ -40,4 +39,15 @@ public class MallRefundRecordController {
}
}
@PostMapping("/select")
@ApiOperation(value = "待售后信息查询接口")
public Result<List<MallRefundRecord>> select(@RequestBody MallRefundRecord mallRefundRecord) {
try {
return new ResultUtil<List<MallRefundRecord>>().setData(mallRefundRecordService.selectByLinkId(mallRefundRecord));
} catch (Exception e) {
log.error("下单失败: {}", e.getMessage(), e);
return ResultUtil.error(e.getMessage());
}
}
}

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallDeliveryOrder.java

@ -33,6 +33,8 @@ public class MallDeliveryOrder implements Serializable {
private String groupId;
@ApiModelProperty(value = "配送员ID")
private String workerId;
@ApiModelProperty(value = "配送员电话")
private String workerPhone;
@ApiModelProperty(value = "配送员名称")
private String workerName;
@ApiModelProperty(value = "店铺ID")

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallOrder.java

@ -33,7 +33,7 @@ public class MallOrder implements Serializable {
private Integer orderType;
@ApiModelProperty(value = "配送方式 1:外卖配送 2:到店自取")
private Integer deliveryType;
@ApiModelProperty(value = "订单状态 0:待支付 1:待商家接单 10:待成团 2待配送员接单 3:待取货(配送)/待消费(自取) 4:配送中 5:已完成 6:已取消 7:待商家同意退款 8:已退款 11: 售后中 售后处理后还变成4")
@ApiModelProperty(value = "订单状态 0:待支付 1:待商家接单 10:待成团 2待配送员接单 3:待取货(配送)/待消费(自取) 4:配送中 5:已完成 6:已取消 7:待商家同意退款 8:已退款 11: 售后中 12已售后")
private Integer status;
@ApiModelProperty(value = "结算状态 0 未结算 1已结算")
private Integer settlementStatus;

29
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallRefundRecord.java

@ -1,6 +1,7 @@
package cc.hiver.mall.entity;
import cc.hiver.core.common.utils.SnowFlakeUtil;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
@ -29,6 +30,8 @@ public class MallRefundRecord implements Serializable {
private String orderId;
@ApiModelProperty(value = "用户ID")
private String userId;
@ApiModelProperty(value = "关联的商家或者配送员ID 如果 refundType = 3 && refundTypeStatus == 3 MallRefundRecord存两条记录")
private String linkId;
@ApiModelProperty(value = "退款金额")
private BigDecimal refundAmount;
@ApiModelProperty(value = "退款原因")
@ -47,5 +50,31 @@ public class MallRefundRecord implements Serializable {
private Date successTime;
@ApiModelProperty("售后商品列表")
@Transient
@TableField(exist = false)
private List<MallReturnOrderGoods> items;
@ApiModelProperty("店铺id")
@Transient
@TableField(exist = false)
private String shopId;
@ApiModelProperty("配送员id")
@Transient
@TableField(exist = false)
private String workerId;
@ApiModelProperty("商品总价")
@Transient
@TableField(exist = false)
private BigDecimal goodsAmount;
@ApiModelProperty("餐盒费")
@Transient
@TableField(exist = false)
private BigDecimal packageFee;
@ApiModelProperty("配送费")
@Transient
@TableField(exist = false)
private BigDecimal deliveryFee;
}

8
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/MallOrderVO.java

@ -1,9 +1,6 @@
package cc.hiver.mall.pojo.vo;
import cc.hiver.mall.entity.MallDeliveryOrder;
import cc.hiver.mall.entity.MallOrder;
import cc.hiver.mall.entity.MallOrderGoods;
import cc.hiver.mall.entity.MallOrderGroup;
import cc.hiver.mall.entity.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ -30,4 +27,7 @@ public class MallOrderVO extends MallOrder {
@ApiModelProperty("收货地址详情(冗余展示用)")
private String addressDetail;
@ApiModelProperty("售后信息")
private MallRefundRecord mallRefundRecord;
}

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallDeliveryOrderService.java

@ -26,7 +26,7 @@ public interface MallDeliveryOrderService extends IService<MallDeliveryOrder> {
/**
* 配送员接单抢单大厅或指派单
*/
Integer workerAccept(String deliveryId, String workerId, String workerName,String groupId);
Integer workerAccept(String workerPhone,String deliveryId, String workerId, String workerName,String groupId);
/**
* 配送员取货

4
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallOrderService.java

@ -46,12 +46,12 @@ public interface MallOrderService extends IService<MallOrder> {
/**
* 用户取消订单仅待支付/待成团状态可取消
*/
void cancelOrder(String orderId, String userId);
void cancelOrder(String orderId, String userId,Integer refundType, Integer refundTypeStatus);
/**
* 申请退款
*/
void applyRefund(String orderId, String userId, String reason, java.math.BigDecimal amount);
void applyRefund(String orderId, String userId, String reason, java.math.BigDecimal amount,Integer refundType,Integer refundTypeStatus);
/**
* 商家同意退款

4
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallRefundRecordService.java

@ -3,10 +3,14 @@ package cc.hiver.mall.service.mybatis;
import cc.hiver.mall.entity.MallRefundRecord;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* 退款记录 Service 接口
*/
public interface MallRefundRecordService extends IService<MallRefundRecord> {
void create(MallRefundRecord mallRefundRecord);
List<MallRefundRecord> selectByLinkId(MallRefundRecord mallRefundRecord);
}

27
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java

@ -133,7 +133,7 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Integer workerAccept(String deliveryId, String workerId,String workerName, String groupId) {
public Integer workerAccept(String workerPhone, String deliveryId, String workerId,String workerName, String groupId) {
MallDeliveryOrder delivery = this.getById(deliveryId);
if (delivery == null) return 0;//throw new RuntimeException("配送单不存在");
if (delivery.getStatus() != STATUS_WAIT_ACCEPT) return 1;//throw new RuntimeException("配送单已被接取或已取消");
@ -147,7 +147,7 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
LambdaUpdateWrapper<MallDeliveryOrder> uw = new LambdaUpdateWrapper<>();
uw.eq(MallDeliveryOrder::getId, deliveryId)
.set(MallDeliveryOrder::getStatus, STATUS_WAIT_PICKUP)
.set(MallDeliveryOrder::getWorkerId, workerId).set(MallDeliveryOrder::getWorkerName, workerName)
.set(MallDeliveryOrder::getWorkerId, workerId).set(MallDeliveryOrder::getWorkerName, workerName).set(MallDeliveryOrder::getWorkerPhone, workerPhone)
.set(MallDeliveryOrder::getAcceptTime, new Date());
MallOrder order = mallOrderService.getById(delivery.getOrderId());
@ -249,13 +249,22 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
.set(MallDeliveryOrder::getStatus, STATUS_DONE)
.set(MallDeliveryOrder::getFinishTime, new Date());
this.update(uw);
// 同步订单状态 -> 已完成
if (StringUtils.isNotBlank(delivery.getOrderId())) {
LambdaUpdateWrapper<MallOrder> oUw = new LambdaUpdateWrapper<>();
oUw.eq(MallOrder::getId, delivery.getOrderId())
.set(MallOrder::getStatus, ORDER_STATUS_DONE);
mallOrderService.update(oUw);
//如果是有groupId证明是面对面配送,需要更新所有子订单状态为完成
if(StringUtils.isNotBlank(delivery.getGroupId())){
MallOrderGroup group = mallOrderGroupMapper.selectById(delivery.getGroupId());
List<String> orderIdList = Arrays.asList(group.getGroupOrderIds().split(","));
LambdaUpdateWrapper<MallOrder> oqw = new LambdaUpdateWrapper<>();
oqw.in(MallOrder::getId, orderIdList).set(MallOrder::getStatus,ORDER_STATUS_DONE);
mallOrderService.update(oqw);
}else{
// 同步订单状态 -> 已完成
if (StringUtils.isNotBlank(delivery.getOrderId())) {
LambdaUpdateWrapper<MallOrder> oUw = new LambdaUpdateWrapper<>();
oUw.eq(MallOrder::getId, delivery.getOrderId())
.set(MallOrder::getStatus, ORDER_STATUS_DONE);
mallOrderService.update(oUw);
}
}
}

9
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java

@ -20,6 +20,8 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@ -168,6 +170,13 @@ public class MallOrderGroupServiceImpl extends ServiceImpl<MallOrderGroupMapper,
delivery.setStatus(0);
Date createTime = new Timestamp(System.currentTimeMillis());
delivery.setCreateTime(createTime);
// 1. 获取当前时间 (LocalDateTime)
LocalDateTime now = LocalDateTime.now();
// 2. 加40分钟
LocalDateTime futureTime = now.plusMinutes(40);
// 3. 如果需要转回 java.util.Date (为了兼容旧代码)
Date mustFinishTime = Date.from(futureTime.atZone(ZoneId.systemDefault()).toInstant());
delivery.setMustFinishTime(mustFinishTime);
mallDeliveryOrderMapper.updateById(delivery);
}
}

123
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java

@ -1,5 +1,6 @@
package cc.hiver.mall.serviceimpl.mybatis;
import cc.hiver.core.common.utils.SnowFlakeUtil;
import cc.hiver.mall.dao.mapper.*;
import cc.hiver.mall.entity.*;
import cc.hiver.mall.pojo.dto.CreateOrderDTO;
@ -26,6 +27,8 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.stream.Collectors;
@ -47,6 +50,8 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
private static final int STATUS_CANCELLED = 6;
private static final int STATUS_WAIT_REFUND = 7;
private static final int STATUS_REFUNDED = 8;
private static final int STATUS_WAIT_RETURN = 11;//售后中
private static final int STATUS__RETURNED = 12;//已售后
// 配送方式常量
private static final int DELIVERY_TYPE_EXPRESS = 1; // 外卖
@ -56,6 +61,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
// 订单类型常量
private static final int ORDER_TYPE_NORMAL = 1; // 直接购买
private static final int ORDER_TYPE_GROUP = 2; // 拼团购买
private static final int ORDER_TYPE_FACETOFACE = 3; // 拼团购买
// 拼团状态常量
private static final int GROUP_STATUS_FORMING = 0; // 拼团中
@ -404,9 +410,15 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
updateOrderStatus(orderId, STATUS_WAIT_DELIVERY);
// 激活配送单,状态改为待接单(0)
Date createTime = new Timestamp(System.currentTimeMillis());
// 1. 获取当前时间 (LocalDateTime)
LocalDateTime now = LocalDateTime.now();
// 2. 加40分钟
LocalDateTime futureTime = now.plusMinutes(40);
// 3. 如果需要转回 java.util.Date (为了兼容旧代码)
Date mustFinishTime = Date.from(futureTime.atZone(ZoneId.systemDefault()).toInstant());
LambdaUpdateWrapper<MallDeliveryOrder> duw = new LambdaUpdateWrapper<>();
duw.eq(MallDeliveryOrder::getOrderId, orderId)
.set(MallDeliveryOrder::getStatus, 0).set(MallDeliveryOrder::getCreateTime, createTime);
.set(MallDeliveryOrder::getStatus, 0).set(MallDeliveryOrder::getCreateTime, createTime).set(MallDeliveryOrder::getMustFinishTime, mustFinishTime);
mallDeliveryOrderMapper.update(null, duw);
} else {
String latestSeq = merchantOrderSeqUtil.generateOrderSequence(order.getShopId(), 2);
@ -414,7 +426,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
uw.eq(MallOrder::getId, orderId).set(MallOrder::getStatus, STATUS_WAIT_PICKUP).set(MallOrder::getNumberCode, latestSeq);
this.update(uw);
}
} else if (order.getOrderType() == ORDER_TYPE_GROUP) {
} else if (order.getOrderType() == ORDER_TYPE_GROUP || order.getOrderType() == ORDER_TYPE_FACETOFACE) {
// 拼团订单支付成功 -> 改为待成团
updateOrderStatus(orderId, STATUS_WAIT_GROUP);
@ -469,12 +481,12 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
.set(MallDeliveryOrder::getStatus, 4);
mallDeliveryOrderMapper.update(null, duw);
// 自动生成退款记录
createRefundRecord(order, order.getTotalAmount(), "商家拒单: " + reason);
createRefundRecord(null,order, order.getTotalAmount(), "商家拒单: " + reason,3,1);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void cancelOrder(String orderId, String userId) {
public void cancelOrder(String orderId, String userId,Integer refundType,Integer refundTypeStatus) {
MallOrder order = getById(orderId);
if (order == null) throw new RuntimeException("订单不存在");
if (!userId.equals(order.getUserId())) throw new RuntimeException("无权操作该订单");
@ -487,10 +499,10 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
// 拼团 / 面对面团
if (order.getOrderType() == ORDER_TYPE_GROUP || order.getOrderType() == 3) {
handleGroupCancel(order);
handleGroupCancel(order,refundType,refundTypeStatus);
} else {
// 直接购买
handleDirectCancel(order);
handleDirectCancel(order, refundType,refundTypeStatus);
}
}
@ -501,22 +513,22 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
/**
* 拼团取消总调度判断团长/团员后分流
*/
private void handleGroupCancel(MallOrder order) {
private void handleGroupCancel(MallOrder order,Integer refundType,Integer refundTypeStatus) {
MallOrderGroup group = findGroupByOrderId(order.getId());
if (group == null) throw new RuntimeException("拼团信息不存在");
boolean isHead = order.getId().equals(group.getHeadOrderId());
if (isHead) {
handleGroupHeadCancel(order, group);
handleGroupHeadCancel(order, group,refundType,refundTypeStatus);
} else {
handleGroupMemberCancel(order, group);
handleGroupMemberCancel(order, group,refundType,refundTypeStatus);
}
}
/**
* 团长取消订单
*/
private void handleGroupHeadCancel(MallOrder order, MallOrderGroup group) {
private void handleGroupHeadCancel(MallOrder order, MallOrderGroup group,Integer refundType,Integer refundTypeStatus) {
boolean isFace2Face = (order.getOrderType() == 3);
// ---- 1. 未支付 ----
@ -601,13 +613,13 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
}
// ---- 3. 已成团后 ----
handlePostGroupCancel(order, group);
handlePostGroupCancel(order, group,refundType,refundTypeStatus);
}
/**
* 团员取消订单
*/
private void handleGroupMemberCancel(MallOrder order, MallOrderGroup group) {
private void handleGroupMemberCancel(MallOrder order, MallOrderGroup group,Integer refundType,Integer refundTypeStatus) {
// ---- 1. 未支付 ----
if (order.getStatus() == STATUS_WAIT_PAY) {
updateOrderStatus(order.getId(), STATUS_CANCELLED);
@ -640,21 +652,21 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
}
// ---- 3. 已成团后 ----
handlePostGroupCancel(order, group);
handlePostGroupCancel(order, group,refundType,refundTypeStatus);
}
/**
* 成团后取消逻辑团长和团员共用
*/
private void handlePostGroupCancel(MallOrder order, MallOrderGroup group) {
private void handlePostGroupCancel(MallOrder order, MallOrderGroup group,Integer refundType,Integer refundTypeStatus) {
boolean isFace2Face = (order.getOrderType() == 3);
boolean isHead = order.getId().equals(group.getHeadOrderId());
// 已完成订单 → 申请售后(待商家同意)
if (order.getStatus() == STATUS_DONE) {
applyMerchantRefund(order, "用户申请售后退款");
/*if (order.getStatus() == STATUS_DONE) {
applyMerchantRefund(order, "用户申请售后退款", refundType,refundTypeStatus);
return;
}
}*/
// ---- 面对面团 + 配送 特殊处理 ----
if (isFace2Face && order.getDeliveryType() != null
@ -662,7 +674,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
if (!isHead) {
throw new RuntimeException("面对面配送团只有团长可以取消订单");
}
handleFace2FaceDeliveryCancel(order, group);
handleFace2FaceDeliveryCancel(order, group, refundType,refundTypeStatus);
return;
}
@ -671,7 +683,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
// 配送方式
MallDeliveryOrder delivery = findDeliveryByOrderId(order.getId());
if (delivery != null && delivery.getStatus() != null && delivery.getStatus() >= 1) {
applyMerchantRefund(order, "用户申请取消订单退款");
applyMerchantRefund(delivery.getWorkerId(),order, "用户申请取消订单退款",refundType,refundTypeStatus);
}
// 10分钟冷却期
if (group.getSuccessTime() != null) {
@ -686,14 +698,14 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
restoreStock(order.getId());
} else {
// 自取(待消费)→ 待商家同意退款
applyMerchantRefund(order, "用户申请取消订单退款");
applyMerchantRefund(null,order, "用户申请取消订单退款",refundType,refundTypeStatus);
}
}
/**
* 面对面团 + 配送 成团后团长取消批量操作所有子订单
*/
private void handleFace2FaceDeliveryCancel(MallOrder order, MallOrderGroup group) {
private void handleFace2FaceDeliveryCancel(MallOrder order, MallOrderGroup group,Integer refundType,Integer refundTypeStatus) {
MallDeliveryOrder delivery = findDeliveryByOrderId(order.getId());
if (delivery != null && delivery.getStatus() != null && delivery.getStatus() == 0) {
@ -724,7 +736,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
if (subOrder != null && subOrder.getStatus() != STATUS_CANCELLED
&& subOrder.getStatus() != STATUS_REFUNDED
&& subOrder.getStatus() != STATUS_WAIT_REFUND) {
applyMerchantRefund(subOrder, "面对面团团长申请取消,待商家同意");
applyMerchantRefund(delivery.getWorkerId(),subOrder, "面对面团团长申请取消,待商家同意",refundType,refundTypeStatus);
}
}
}
@ -737,7 +749,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
/**
* 直接购买订单取消
*/
private void handleDirectCancel(MallOrder order) {
private void handleDirectCancel(MallOrder order,Integer refundType,Integer refundTypeStatus) {
// ---- 1. 未支付 ----
if (order.getStatus() == STATUS_WAIT_PAY) {
updateOrderStatus(order.getId(), STATUS_CANCELLED);
@ -748,18 +760,18 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
}
// ---- 2. 已完成 → 申请售后 ----
if (order.getStatus() == STATUS_DONE) {
applyMerchantRefund(order, "用户申请售后退款");
/*if (order.getStatus() == STATUS_DONE) {
applyMerchantRefund(order, "用户申请售后退款",refundType,refundTypeStatus);
return;
}
}*/
// ---- 3. 已支付 ----
if (order.getDeliveryType() != null && order.getDeliveryType() == DELIVERY_TYPE_EXPRESS) {
// 外卖配送
MallDeliveryOrder delivery = findDeliveryByOrderId(order.getId());
if (delivery != null && delivery.getStatus() != null && delivery.getStatus() >= 1) {
// 配送员已接单 → 走商家同意流程
applyMerchantRefund(order, "用户申请取消订单,待商家同意");
// 配送员已接单 → 走商家或者配送员同意流程
applyMerchantRefund(delivery.getWorkerId(),order, "用户申请取消订单,待同意", refundType, refundTypeStatus);
} else {
// 未接单 → 直接取消并退款
cancelDeliveryOrderByOrderId(order.getId());
@ -775,12 +787,12 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
@Override
@Transactional(rollbackFor = Exception.class)
public void applyRefund(String orderId, String userId, String reason, BigDecimal amount) {
public void applyRefund(String orderId, String userId, String reason, BigDecimal amount,Integer refundType,Integer refundTypeStatus) {
MallOrder order = getById(orderId);
if (order == null) throw new RuntimeException("订单不存在");
if (!userId.equals(order.getUserId())) throw new RuntimeException("无权操作该订单");
updateOrderStatus(orderId, STATUS_WAIT_REFUND);
createRefundRecord(order, amount, reason);
createRefundRecord(null,order, amount, reason,refundType,refundTypeStatus);
}
@Override
@ -891,7 +903,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
vo.setDeliveryInfo(mallDeliveryOrderMapper.selectOne(dq));
// 拼团信息(拼团订单才查)
if (ORDER_TYPE_GROUP == order.getOrderType()) {
if (ORDER_TYPE_GROUP == order.getOrderType() || GROUP_STATUS_FACE2FACE == order.getOrderType()) {
// 通过 headOrderId 或 groupUserIds 中包含此 userId 查找拼团
// 参团人:通过 userId + shopId 匹配
LambdaQueryWrapper<MallOrderGroup> gq2 = new LambdaQueryWrapper<>();
@ -901,6 +913,22 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
MallOrderGroup group = mallOrderGroupMapper.selectOne(gq2);
vo.setGroupInfo(group);
}
// 售后信息
if(order.getStatus() == STATUS_WAIT_RETURN || order.getStatus() == STATUS__RETURNED){
LambdaQueryWrapper<MallRefundRecord> rq = new LambdaQueryWrapper<>();
rq.eq(MallRefundRecord::getOrderId, orderId)
.last("LIMIT 1");
MallRefundRecord sallRefundRecord = mallRefundRecordMapper.selectOne(rq);
if(sallRefundRecord != null){
if(sallRefundRecord.getRefundType() == 1){
//售后商品详情
sallRefundRecord.setItems(mallReturnOrderGoodsMapper.selectList(new LambdaQueryWrapper<MallReturnOrderGoods>()
.eq(MallReturnOrderGoods::getOrderId, orderId)));
}
}
vo.setMallRefundRecord(sallRefundRecord);
}
return vo;
}
@ -1122,17 +1150,36 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
/**
* 创建退款记录
*/
private void createRefundRecord(MallOrder order, BigDecimal amount, String reason) {
private void createRefundRecord(String workerId,MallOrder order, BigDecimal amount, String reason,Integer refundType,Integer refundTypeStatus) {
MallRefundRecord record = new MallRefundRecord();
record.setOrderId(order.getId());
record.setUserId(order.getUserId());
record.setRefundAmount(amount);
record.setReason(reason);
record.setStatus(0); // 待商家同意
record.setStatus(0); // 待同意
record.setCreateTime(new Date());
record.setRefundType(3);
record.setRefundTypeStatus(4);
mallRefundRecordMapper.insert(record);
record.setRefundType(refundType);
record.setRefundTypeStatus(refundTypeStatus);
// 全额退款
if(refundType == 3){
if(refundTypeStatus == 1){
record.setLinkId(order.getShopId());
mallRefundRecordMapper.insert(record);
}else if(refundTypeStatus == 2){
record.setLinkId(workerId);
mallRefundRecordMapper.insert(record);
}else if(refundTypeStatus == 3){
//商家、配送员都加一条
record.setLinkId(order.getShopId());
record.setRefundAmount(order.getGoodsAmount().add(order.getPackageFee()));
mallRefundRecordMapper.insert(record);
MallRefundRecord mallRefundRecord1 = record;
mallRefundRecord1.setId(SnowFlakeUtil.nextId().toString());
mallRefundRecord1.setLinkId(workerId);
mallRefundRecord1.setRefundAmount(order.getDeliveryFee());
mallRefundRecordMapper.insert(mallRefundRecord1);
}
}
}
/**
@ -1258,7 +1305,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
/**
* 申请商家同意退款订单状态 待商家同意退款(7)退款记录状态 待商家同意(0)
*/
private void applyMerchantRefund(MallOrder order, String reason) {
private void applyMerchantRefund(String workerId, MallOrder order, String reason,Integer refundType,Integer refundTypeStatus) {
updateOrderStatus(order.getId(), STATUS_WAIT_REFUND);
//如果是外卖,更新配送单状态
if(order.getDeliveryType() == DELIVERY_TYPE_EXPRESS){
@ -1267,7 +1314,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
.set(MallDeliveryOrder::getIsReturn, IS_RETURN_EXPRESS);
mallDeliveryOrderMapper.update(null, duw);
}
createRefundRecord(order, order.getTotalAmount(), reason);
createRefundRecord(workerId,order, order.getTotalAmount(), reason,refundType,refundTypeStatus);
}
/**

47
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java

@ -1,9 +1,11 @@
package cc.hiver.mall.serviceimpl.mybatis;
import cc.hiver.core.common.utils.SnowFlakeUtil;
import cc.hiver.mall.dao.mapper.MallRefundRecordMapper;
import cc.hiver.mall.dao.mapper.MallReturnOrderGoodsMapper;
import cc.hiver.mall.entity.MallOrder;
import cc.hiver.mall.entity.MallRefundRecord;
import cc.hiver.mall.entity.MallReturnOrderGoods;
import cc.hiver.mall.service.mybatis.MallOrderService;
import cc.hiver.mall.service.mybatis.MallRefundRecordService;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@ -12,6 +14,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
* 退款记录 Service 实现
@ -36,15 +39,51 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
oUw.eq(MallOrder::getId, mallRefundRecord.getOrderId())
.set(MallOrder::getStatus, 11);
mallOrderService.update(oUw);
//如果是售后商品 给商家加一条 如果是配送给配送员加一条
//如果是全额退款商家问题给商家加一条如果是配送问题给配送员加一条 如果两者都有给两者都加一条(处理以后需要查一下还有没有没处理的再更新订单状态)
mallRefundRecord.setStatus(3); // 申请售后
mallRefundRecord.setCreateTime(new Date());
mallRefundRecordMapper.insert(mallRefundRecord);
if(mallRefundRecord.getRefundType() == 1){
// 退商品
mallRefundRecord.setLinkId(mallRefundRecord.getShopId());
mallRefundRecordMapper.insert(mallRefundRecord);
}else if(mallRefundRecord.getRefundType() == 2){
// 退配送费
mallRefundRecord.setLinkId(mallRefundRecord.getWorkerId());
mallRefundRecordMapper.insert(mallRefundRecord);
}else if(mallRefundRecord.getRefundType() == 3){
// 全额退款
if(mallRefundRecord.getRefundTypeStatus() == 1){
mallRefundRecord.setLinkId(mallRefundRecord.getShopId());
mallRefundRecordMapper.insert(mallRefundRecord);
}else if(mallRefundRecord.getRefundTypeStatus() == 2){
mallRefundRecord.setLinkId(mallRefundRecord.getWorkerId());
mallRefundRecordMapper.insert(mallRefundRecord);
}else if(mallRefundRecord.getRefundTypeStatus() == 3){
//商家、配送员都加一条
mallRefundRecord.setLinkId(mallRefundRecord.getShopId());
mallRefundRecord.setRefundAmount(mallRefundRecord.getGoodsAmount().add(mallRefundRecord.getPackageFee()));
mallRefundRecordMapper.insert(mallRefundRecord);
MallRefundRecord mallRefundRecord1 = mallRefundRecord;
mallRefundRecord1.setId(SnowFlakeUtil.nextId().toString());
mallRefundRecord1.setLinkId(mallRefundRecord.getWorkerId());
mallRefundRecord1.setRefundAmount(mallRefundRecord.getDeliveryFee());
mallRefundRecordMapper.insert(mallRefundRecord1);
}
}
if(!mallRefundRecord.getItems().isEmpty()){
mallRefundRecord.getItems().forEach(item -> {
for(MallReturnOrderGoods item : mallRefundRecord.getItems()){
mallReturnOrderGoodsMapper.insert(item);
});
}
}
}
@Override
public List<MallRefundRecord> selectByLinkId(MallRefundRecord mallRefundRecord) {
LambdaUpdateWrapper<MallRefundRecord> uw = new LambdaUpdateWrapper<>();
uw.eq(MallRefundRecord::getLinkId, mallRefundRecord.getLinkId()).eq(MallRefundRecord::getStatus, mallRefundRecord.getStatus());
List<MallRefundRecord> mallRefundRecords = this.list(uw);
return mallRefundRecords;
}
}

1
hiver-modules/hiver-mall/src/main/resources/mapper/MallRefundRecordMapper.xml

@ -15,6 +15,7 @@
<result column="pictures" property="pictures"/>
<result column="refund_type" property="refundType"/>
<result column="refund_type_status" property="refundTypeStatus"/>
<result column="link_id" property="linkId"/>
</resultMap>
</mapper>

14
hiver-modules/hiver-social/src/main/java/cc/hiver/social/controller/WechatController.java

@ -8,6 +8,7 @@ import cc.hiver.core.common.redis.RedisTemplateHelper;
import cc.hiver.core.common.utils.ResultUtil;
import cc.hiver.core.common.utils.SecurityUtil;
import cc.hiver.core.common.vo.Result;
import cc.hiver.core.config.properties.HiverTokenProperties;
import cc.hiver.core.entity.User;
import cc.hiver.core.service.UserService;
import cc.hiver.mall.service.mybatis.CustomerService;
@ -20,6 +21,7 @@ import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.http.HttpUtil;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import io.swagger.annotations.Api;
@ -99,9 +101,15 @@ public class WechatController {
@Autowired
private CustomerService customerService;
@Autowired
private HiverTokenProperties tokenProperties;
@Autowired
private WechatPhoneService wechatPhoneService;
@Autowired
private RedisTemplateHelper redisTemplateHelper;
/**
* 微信认证服务器地址
*/
@ -143,7 +151,11 @@ public class WechatController {
u.setUsername(phoneNumber);
userService.update(u);
// 删除缓存
//redisTemplate.delete(USER + u.getUsername());
redisTemplate.delete("username::" + u.getUsername());
final String key = "username::" + u.getUsername();
// 缓存
final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd hh:mm:ss").create();
redisTemplateHelper.set(key, gson.toJson(u), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
return ResultUtil.data(phoneNumber);
} else {
return ResultUtil.error(401,"获取手机号失败");

Loading…
Cancel
Save