Browse Source

对接拼团数据1

master
wangfukang 3 weeks ago
parent
commit
9ee2e493ad
  1. 16
      hiver-admin/test-output/test-report.html
  2. 3
      hiver-core/src/main/java/cc/hiver/core/entity/User.java
  3. 4
      hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/UserController.java
  4. 110
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java
  5. 6
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WechatPayController.java
  6. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java
  7. 3
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/dto/CreateOrderDTO.java
  8. 28
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java
  9. 33
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java
  10. 45
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java
  11. 38
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java
  12. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/WaitOrderCacheUtil.java
  13. 8
      hiver-modules/hiver-mall/src/main/resources/mapper/MallDeliveryOrderMapper.xml
  14. 9
      hiver-modules/hiver-social/src/main/java/cc/hiver/social/controller/WechatController.java

16
hiver-admin/test-output/test-report.html

@ -35,7 +35,7 @@
<a href="#"><span class="badge badge-primary">Hiver</span></a>
</li>
<li class="m-r-10">
<a href="#"><span class="badge badge-primary">五月 09, 2026 15:14:17</span></a>
<a href="#"><span class="badge badge-primary">五月 13, 2026 18:10:53</span></a>
</li>
</ul>
</div>
@ -84,7 +84,7 @@
<div class="test-detail">
<span class="meta text-white badge badge-sm"></span>
<p class="name">passTest</p>
<p class="text-sm"><span>15:14:17 下午</span> / <span>0.016 secs</span></p>
<p class="text-sm"><span>18:10:53 下午</span> / <span>0.017 secs</span></p>
</div>
<div class="test-contents d-none">
<div class="detail-head">
@ -92,9 +92,9 @@
<div class="info">
<div class='float-right'><span class='badge badge-default'>#test-id=1</span></div>
<h5 class="test-status text-pass">passTest</h5>
<span class='badge badge-success'>05.09.2026 15:14:17</span>
<span class='badge badge-danger'>05.09.2026 15:14:17</span>
<span class='badge badge-default'>0.016 secs</span>
<span class='badge badge-success'>05.13.2026 18:10:53</span>
<span class='badge badge-danger'>05.13.2026 18:10:53</span>
<span class='badge badge-default'>0.017 secs</span>
</div>
<div class="m-t-10 m-l-5"></div>
</div>
@ -104,7 +104,7 @@
<tbody>
<tr class="event-row">
<td><span class="badge log pass-bg">Pass</span></td>
<td>15:14:17</td>
<td>18:10:53</td>
<td>
Test passed
</td>
@ -128,13 +128,13 @@
<div class="col-md-3">
<div class="card"><div class="card-body">
<p class="m-b-0">Started</p>
<h3>五月 09, 2026 15:14:17</h3>
<h3>五月 13, 2026 18:10:53</h3>
</div></div>
</div>
<div class="col-md-3">
<div class="card"><div class="card-body">
<p class="m-b-0">Ended</p>
<h3>五月 09, 2026 15:14:17</h3>
<h3>五月 13, 2026 18:10:53</h3>
</div></div>
</div>
<div class="col-md-3">

3
hiver-core/src/main/java/cc/hiver/core/entity/User.java

@ -44,14 +44,13 @@ public class User extends HiverBaseEntity {
@ApiModelProperty(value = "登录名")
@Column(unique = true, nullable = false)
@Pattern(regexp = NameUtil.regUsername, message = "登录账号不能包含中文、特殊字符 长度不能>16")
private String username;
@ApiModelProperty(value = "密码")
private String password;
@ApiModelProperty(value = "用户名/昵称/姓名")
@Size(max = 20, message = "昵称长度不能超过20")
@Size(max = 50, message = "昵称长度不能超过20")
private String nickname;
@ApiModelProperty(value = "手机")

4
hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/UserController.java

@ -637,8 +637,8 @@ public class UserController {
// 去掉特殊符号(只保留字母和数字)
String cleanedOpenid = openId.replaceAll("[^a-zA-Z0-9]", "");
// 截取前 10 位,作为username
String username = cleanedOpenid.length() > 10 ? cleanedOpenid.substring(0, 10) : cleanedOpenid;
wechatUser.setUsername(username);
//String username = cleanedOpenid.length() > 10 ? cleanedOpenid.substring(0, 10) : cleanedOpenid;
wechatUser.setUsername(cleanedOpenid);
final String encryptPass = new BCryptPasswordEncoder().encode("123456");
wechatUser.setPassword(encryptPass);
wechatUser.setType(UserConstant.USER_TYPE_NORMAL);

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

@ -8,6 +8,7 @@ import cc.hiver.core.entity.User;
import cc.hiver.core.entity.Worker;
import cc.hiver.core.service.WorkerService;
import cc.hiver.core.serviceimpl.JPushServiceImpl;
import cc.hiver.mall.entity.MallAdPosition;
import cc.hiver.mall.entity.MallDeliveryOrder;
import cc.hiver.mall.entity.MallOrder;
import cc.hiver.mall.pojo.query.MallDeliveryOrderPageQuery;
@ -85,67 +86,64 @@ public class MallDeliveryOrderController {
//首先从缓存中查询
Map<String, Object> cacheResult = waitOrderCacheUtil.getAll(q);
cacheResult.put("mallAds",mallAdPositionService.getAdsByRegionId(q.getRegionId(),q.getPaths()));
List<MallAdPosition> cathList = mallAdPositionService.getAdsByRegionId(q.getRegionId(),q.getPaths());
if (cacheResult != null) {
return new ResultUtil<Object>().setData(cacheResult);
}
//缓存未命中,查询数据库
Map<String, Object> result = new HashMap<>();
result.put("mallAds",mallAdPositionService.getAdsByRegionId(q.getRegionId(),q.getPaths()));
if (q.getDeliveryType() == 4 && StrUtil.isNotBlank(q.getWorkerId())) {
//先查当前用户指派单未确认接单数量 不用分页
q.setHallOnly(false);
q.setGetAreaId(null);
q.setPutAreaId(null);
q.setPageSize(100);
//随便给个值,指派单不区分类型
q.setDeliveryType(null);
IPage<MallDeliveryOrder> page = mallDeliveryOrderService.pageDelivery(q);
result.put("records", page.getRecords());
result.put("total", page.getTotal());
result.put("size", page.getSize());
result.put("current", page.getCurrent());
result.put("pages", page.getPages());
result.put("zhipaiCount", page.getTotal());
//再查外卖、快递、跑腿待接数
result.put("orderCount", mallDeliveryOrderService.countOrdersByType(q.getRegionId()));
return new ResultUtil<Object>().setData(result);
cacheResult.put("mallAds",cathList);
}else{
if (Boolean.TRUE.equals(q.getHallOnly())) {
Integer deliveryType = q.getDeliveryType();
String getAreaId = q.getGetAreaId();
String putAreaId = q.getPutAreaId();
if(StrUtil.isNotBlank(q.getWorkerId())){
//先查当前用户指派单未确认接单数量
q.setHallOnly(false);
q.setGetAreaId(null);
q.setPutAreaId(null);
//随便给个值,指派单不区分类型
q.setDeliveryType(null);
//不分页
q.setPageSize(100);
IPage<MallDeliveryOrder> page = mallDeliveryOrderService.pageDelivery(q);
result.put("zhipaiCount", page.getTotal());
cacheResult = new HashMap<>();
cacheResult.put("mallAds",cathList);
if (q.getDeliveryType() == 4 && StrUtil.isNotBlank(q.getWorkerId())) {
//先查当前用户指派单未确认接单数量 不用分页
q.setHallOnly(false);
q.setGetAreaId(null);
q.setPutAreaId(null);
q.setPageSize(100);
//随便给个值,指派单不区分类型
q.setDeliveryType(null);
IPage<MallDeliveryOrder> page = mallDeliveryOrderService.pageDelivery(q);
cacheResult.put("records", page.getRecords());
cacheResult.put("total", page.getTotal());
cacheResult.put("size", page.getSize());
cacheResult.put("current", page.getCurrent());
cacheResult.put("pages", page.getPages());
cacheResult.put("zhipaiCount", page.getTotal());
//再查外卖、快递、跑腿待接数
cacheResult.put("orderCount", mallDeliveryOrderService.countOrdersByType(q.getRegionId()));
}else{
if (Boolean.TRUE.equals(q.getHallOnly())) {
Integer deliveryType = q.getDeliveryType();
String getAreaId = q.getGetAreaId();
String putAreaId = q.getPutAreaId();
if(StrUtil.isNotBlank(q.getWorkerId())){
//先查当前用户指派单未确认接单数量
q.setHallOnly(false);
q.setGetAreaId(null);
q.setPutAreaId(null);
//随便给个值,指派单不区分类型
q.setDeliveryType(null);
//不分页
q.setPageSize(100);
IPage<MallDeliveryOrder> page = mallDeliveryOrderService.pageDelivery(q);
cacheResult.put("zhipaiCount", page.getTotal());
}
//其他类型外卖、快递、跑腿待接单数据
q.setHallOnly(true);
q.setGetAreaId(getAreaId);
q.setPutAreaId(putAreaId);
q.setDeliveryType(deliveryType);
q.setWorkerId(null);
IPage<MallDeliveryOrder> page1 = mallDeliveryOrderService.pageDelivery(q);
cacheResult.put("records", page1.getRecords());
cacheResult.put("total", page1.getTotal());
cacheResult.put("size", page1.getSize());
cacheResult.put("current", page1.getCurrent());
cacheResult.put("pages", page1.getPages());
//外卖、快递、跑腿待接数
cacheResult.put("orderCount", mallDeliveryOrderService.countOrdersByType(q.getRegionId()));
}
//其他类型外卖、快递、跑腿待接单数据
q.setHallOnly(true);
q.setGetAreaId(getAreaId);
q.setPutAreaId(putAreaId);
q.setDeliveryType(deliveryType);
q.setWorkerId(null);
IPage<MallDeliveryOrder> page1 = mallDeliveryOrderService.pageDelivery(q);
result.put("records", page1.getRecords());
result.put("total", page1.getTotal());
result.put("size", page1.getSize());
result.put("current", page1.getCurrent());
result.put("pages", page1.getPages());
//外卖、快递、跑腿待接数
result.put("orderCount", mallDeliveryOrderService.countOrdersByType(q.getRegionId()));
return new ResultUtil<Object>().setData(result);
}
}
return new ResultUtil<Object>().setData(result);
return new ResultUtil<Object>().setData(cacheResult);
}
@PostMapping("/countOrderByStatus")

6
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WechatPayController.java

@ -98,6 +98,12 @@ public class WechatPayController {
String description = request.get("description");
String outTradeNo = request.get("outTradeNo");
String userRequireMake = request.get("userRequireMake");
if(userRequireMake != null && userRequireMake.equals("1")){
MallOrder order = mallOrderService.getById(outTradeNo);
order.setUserRequireMake(1);
mallOrderService.updateById(order);
}
if(description.equals("增加配送佣金")){
outTradeNo = "ORDERDE_" + outTradeNo;
}else{

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java

@ -379,7 +379,7 @@ public class WorkerController {
// ---- 从订单缓存获取该配送员的待完成订单,统计各状态数量 ----
List<MallDeliveryOrder> workerOrders = workerOrderCacheUtil.getAllAsList(w.getWorkerId());
int orderWaitCount = waitOrderCacheUtil.getAllByWorkerId(w.getWorkerId(),dto.getRegionId()); // status=0 待接单
int orderWaitCount = waitOrderCacheUtil.getAllByWorkerId(w.getWorkerId(),dto.getRegionId()) == null ? 0 : waitOrderCacheUtil.getAllByWorkerId(w.getWorkerId(),dto.getRegionId()); // status=0 待接单
int orderGetCount = 0; // status=1 待取货
int orderPutCount = 0; // status=2 待送达
boolean hasSamePutArea = false;

3
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/dto/CreateOrderDTO.java

@ -36,6 +36,9 @@ public class CreateOrderDTO {
@ApiModelProperty(value = "取货区域ID(商户)")
private String getAreaId;
@ApiModelProperty(value = "自取订单用户要求出餐 默认mull 1为用户要求")
private Integer userRequireMake;
@ApiModelProperty(value = "送货区域ID(用户收货地址关联区域id)")
private String putAreaId;

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

@ -141,9 +141,9 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
@Override
public IPage<MallDeliveryOrder> pageDelivery(MallDeliveryOrderPageQuery q) {
if (Boolean.TRUE.equals(q.getHallOnly())) {
/*if (Boolean.TRUE.equals(q.getHallOnly())) {
q.setPageSize(PAGE_SIZE_TWENTY);
}
}*/
IPage<MallDeliveryOrder> page = new Page<>(q.getPageNum(), q.getPageSize());
page = this.baseMapper.selectPageVO(page, q);
@ -515,6 +515,20 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
oqwCoupon.in(MallUserCoupon::getOrderId, orderIdList).set(MallUserCoupon::getStatus,2);
mallUserCouponService.update(oqwCoupon);
// 面对面拼团:每个子订单单独计数(Key 按 regionId 隔离),避免多单只计 1 次
if(freeOrderCacheUtil.exists(delivery.getRegionId())){
String regionId = delivery.getRegionId();
String orderNumber = String.valueOf(freeOrderCacheUtil.get(regionId).getOrderNumber());
for (int i = 0; i < orderIdList.size(); i++) {
stringRedisTemplate.execute(
redisLuaScripts.getIncrementScript(),
Arrays.asList("free_order:count:" + regionId, "free_order:flag:" + regionId),
orderNumber
);
}
}
isFantuan = false; // 已在上方逐单计数,跳过底部统一计数
}else{
// 同步订单状态 -> 已完成
if (StringUtils.isNotBlank(delivery.getOrderId())) {
@ -579,13 +593,13 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
workerRedisVo.setWorker(worker);
workerRedisCacheUtil.update(worker.getRegion(), workerRedisVo);
}
//是否开启了免单活动
//是否开启了免单活动(Key 按 regionId 隔离,避免多区域计数混乱)
if(isFantuan){
if(freeOrderCacheUtil.exists(delivery.getRegionId())){
stringRedisTemplate.execute(
redisLuaScripts.getIncrementScript(),
Arrays.asList("free_order:count", "free_order:flag"), // 两个 key:计数器和免单开关
String.valueOf(freeOrderCacheUtil.get(delivery.getRegionId()).getOrderNumber())// N = 100
Arrays.asList("free_order:count:" + delivery.getRegionId(), "free_order:flag:" + delivery.getRegionId()),
String.valueOf(freeOrderCacheUtil.get(delivery.getRegionId()).getOrderNumber())
);
}
}
@ -748,7 +762,7 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
// ---- 从订单缓存获取该配送员的待完成订单,统计各状态数量 ----
List<MallDeliveryOrder> workerOrders = workerOrderCacheUtil.getAllAsList(workerId);
if(workerOrders != null){
int orderWaitCount = waitOrderCacheUtil.getAllByWorkerId(workerId,regionId); // status=0 待接单
int orderWaitCount = waitOrderCacheUtil.getAllByWorkerId(workerId,regionId) == null ? 0 : waitOrderCacheUtil.getAllByWorkerId(workerId,regionId); // status=0 待接单
int orderGetCount = 0; // status=1 待取货
int orderPutCount = 0; // status=2 待送达
@ -816,7 +830,7 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
// ---- 从订单缓存获取该配送员的待完成订单,统计各状态数量 ----
List<MallDeliveryOrder> workerOrders = workerOrderCacheUtil.getAllAsList(workerId);
if(workerOrders != null){
int orderWaitCount = waitOrderCacheUtil.getAllByWorkerId(workerId,regionId); // status=0 待接单
int orderWaitCount = waitOrderCacheUtil.getAllByWorkerId(workerId,regionId) == null ? 0 : waitOrderCacheUtil.getAllByWorkerId(workerId,regionId); // status=0 待接单
int orderGetCount = 0; // status=1 待取货
int orderPutCount = 0; // status=2 待送达

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

@ -4,9 +4,11 @@ import cc.hiver.core.common.constant.SettingConstant;
import cc.hiver.core.common.sms.SmsUtil;
import cc.hiver.core.entity.Worker;
import cc.hiver.core.service.WorkerService;
import cc.hiver.core.serviceimpl.JPushServiceImpl;
import cc.hiver.mall.dao.mapper.*;
import cc.hiver.mall.entity.*;
import cc.hiver.mall.pojo.vo.MallOrderVO;
import cc.hiver.mall.service.ShopService;
import cc.hiver.mall.service.mybatis.MallOrderGroupService;
import cc.hiver.mall.service.mybatis.MallOrderService;
import cc.hiver.mall.service.mybatis.MallUserCouponService;
@ -54,9 +56,18 @@ public class MallOrderGroupServiceImpl extends ServiceImpl<MallOrderGroupMapper,
@Lazy
private MallOrderService mallOrderService;
@Autowired
private ShopService shopService;
@Autowired
private ShopGroupOrderCacheUtil shopGroupOrderCacheUtil;
@Autowired
private ShopTakeawayMapper shopTakeawayMapper;
@Autowired
JPushServiceImpl jPushService;
@Autowired
private cc.hiver.mall.mq.OrderAsyncProducer orderAsyncProducer;
@ -147,6 +158,11 @@ public class MallOrderGroupServiceImpl extends ServiceImpl<MallOrderGroupMapper,
ouw.eq(MallOrder::getId, order.getId())
.set(MallOrder::getStatus, targetStatus)
.set(MallOrder::getNumberCode, latestSeq);
if(order.getUserRequireMake() != null && order.getUserRequireMake() == 1){
jPushService.sendPushNotification(shopService.findById(order.getShopId()).getClientId(), "您有一笔新的到店订单",order.getId());
// 触发商家出餐超时监听
triggerShopCookTimeoutEvent(order);
}
}else{
ouw.eq(MallOrder::getId, order.getId())
.set(MallOrder::getStatus, targetStatus);
@ -226,6 +242,23 @@ public class MallOrderGroupServiceImpl extends ServiceImpl<MallOrderGroupMapper,
log.info("拼团 {} 成团成功,激活 {} 条子订单", groupId, waitingOrders.size());
}
private void triggerShopCookTimeoutEvent(MallOrder order) {
if (order != null) {
long cookTimeMins = 15; // default
try {
LambdaQueryWrapper<cc.hiver.mall.entity.ShopTakeaway> qw = new LambdaQueryWrapper<>();
qw.eq(cc.hiver.mall.entity.ShopTakeaway::getShopId, order.getShopId());
List<cc.hiver.mall.entity.ShopTakeaway> list = shopTakeawayMapper.selectList(qw);
if (list != null && !list.isEmpty() && list.get(0).getCookingTime() != null) {
cookTimeMins = list.get(0).getCookingTime();
}
} catch (Exception e) {
log.error("获取 ShopTakeaway cookingTime 异常: {}", e.getMessage());
}
orderAsyncProducer.sendDelayMessage(order.getId(), "Shop_Cook_Timeout", cookTimeMins * 60 * 1000L);
}
}
/**
* 构建返回 VO
*/

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

@ -287,10 +287,10 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
order.setStatus(STATUS_WAIT_PAY);
order.setRegionId(dto.getRegionId());
// 1. 【核心】调用判断脚本,看能不能免单
// 1. 【核心】调用判断脚本,看能不能免单(Key 按 regionId 隔离,避免多区域计数混乱)
String canFree = stringRedisTemplate.execute(
redisLuaScripts.getCheckScript(),
Collections.singletonList("free_order:flag"), // 检查免单开关
Collections.singletonList("free_order:flag:" + order.getRegionId()), // 检查免单开关
"" // 不需要额外参数
);
boolean isFreeOrder = "true".equals(canFree);
@ -378,10 +378,10 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
MallOrder order = buildBaseOrder(dto, orderType, goodsAmount, deliveryFee, packageFee);
order.setStatus(STATUS_WAIT_PAY);
order.setRegionId(dto.getRegionId());
// 1. 【核心】调用判断脚本,看能不能免单
// 1. 【核心】调用判断脚本,看能不能免单(Key 按 regionId 隔离,避免多区域计数混乱)
String canFree = stringRedisTemplate.execute(
redisLuaScripts.getCheckScript(),
Collections.singletonList("free_order:flag"), // 检查免单开关
Collections.singletonList("free_order:flag:" + order.getRegionId()), // 检查免单开关
"" // 不需要额外参数
);
boolean isFreeOrder = "true".equals(canFree);
@ -516,10 +516,10 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
order.setStatus(STATUS_WAIT_PAY);
order.setRegionId(dto.getRegionId());
// 1. 【核心】调用判断脚本,看能不能免单
// 1. 【核心】调用判断脚本,看能不能免单(Key 按 regionId 隔离,避免多区域计数混乱)
String canFree = stringRedisTemplate.execute(
redisLuaScripts.getCheckScript(),
Collections.singletonList("free_order:flag"), // 检查免单开关
Collections.singletonList("free_order:flag:" + order.getRegionId()), // 检查免单开关
"" // 不需要额外参数
);
boolean isFreeOrder = "true".equals(canFree);
@ -632,6 +632,11 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
MallOrderVO orderVO = buildVO(order, null, null, null);
orderVO.setStatus(STATUS_WAIT_PICKUP);
userPendingOrderCacheUtil.update(order.getUserId(), orderVO);
if(order.getUserRequireMake() != null && order.getUserRequireMake() == 1){
jPushService.sendPushNotification(shopService.findById(order.getShopId()).getClientId(), "您有一笔新的到店订单",orderId);
// 触发商家出餐超时监听
triggerShopCookTimeoutEvent(orderId);
}
}
} else if (order.getOrderType() == ORDER_TYPE_GROUP || order.getOrderType() == ORDER_TYPE_FACETOFACE) {
// 拼团订单支付成功 -> 改为待成团
@ -976,9 +981,6 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
if (order.getDeliveryType() != null && order.getDeliveryType() == DELIVERY_TYPE_EXPRESS) {
// 配送方式
MallDeliveryOrder delivery = findDeliveryByOrderId(order.getId());
if (delivery != null && delivery.getStatus() != null && delivery.getStatus() >= 1) {
applyMerchantRefund(delivery.getWorkerId(),order, "用户申请取消订单退款",refundType,refundTypeStatus);
}
// 10分钟冷却期
if (group.getSuccessTime() != null) {
long diffMs = System.currentTimeMillis() - group.getSuccessTime().getTime();
@ -986,12 +988,16 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
throw new RuntimeException("拼团订单10分钟内无法退款");
}
}
// 允许取消
cancelDeliveryOrderByOrderId(order.getId());
autoRefund(order, "成团后用户取消订单,系统退款");
restoreStock(order.getId());
//抢单大厅缓存去掉
waitOrderCacheUtil.remove(delivery.getRegionId(), delivery.getId());
if (delivery != null && delivery.getStatus() != null && delivery.getStatus() >= 1) {
applyMerchantRefund(delivery.getWorkerId(),order, "用户申请取消订单退款",refundType,refundTypeStatus);
}else{
// 允许取消
cancelDeliveryOrderByOrderId(order.getId());
autoRefund(order, "成团后用户取消订单,系统退款");
restoreStock(order.getId());
//抢单大厅缓存去掉
waitOrderCacheUtil.remove(delivery.getRegionId(), delivery.getId());
}
} else {
// 自取(待消费)→ 待商家同意退款
applyMerchantRefund(null,order, "用户申请取消订单退款",refundType,refundTypeStatus);
@ -1173,12 +1179,12 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
updateOrderStatus(orderId, STATUS_DONE);
//更新缓存
userPendingOrderCacheUtil.remove(order.getUserId(),order.getId());
//免单计数
//免单计数(Key 按 regionId 隔离,避免多区域计数混乱)
if(freeOrderCacheUtil.exists(order.getRegionId())){
stringRedisTemplate.execute(
redisLuaScripts.getIncrementScript(),
Arrays.asList("free_order:count", "free_order:flag"), // 两个 key:计数器和免单开关
String.valueOf(freeOrderCacheUtil.get(order.getRegionId()).getOrderNumber())// N = 100
Arrays.asList("free_order:count:" + order.getRegionId(), "free_order:flag:" + order.getRegionId()), // 两个 key:计数器和免单开关
String.valueOf(freeOrderCacheUtil.get(order.getRegionId()).getOrderNumber())
);
}
}
@ -1482,6 +1488,9 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
order.setGoodsAmount(goodsAmount);
order.setDeliveryFee(deliveryFee);
order.setPackageFee(packageFee);
if(dto.getUserRequireMake() != null && dto.getUserRequireMake() == 1){
order.setUserRequireMake(dto.getUserRequireMake());
}
java.math.BigDecimal finalTotal = goodsAmount.add(deliveryFee).add(packageFee);
java.math.BigDecimal discount = java.math.BigDecimal.ZERO;

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

@ -526,17 +526,35 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
userPendingOrderCacheUtil.remove(order.getUserId(), order.getId());
//回退优惠券
mallUserCouponService.refundCoupon(mallRefundRecord.getOrderId());
if(mallRefundRecord.getDeliveryType() == DELIVERY_TYPE_PEISONG){
//更新配送单
LambdaUpdateWrapper<MallDeliveryOrder> duw = new LambdaUpdateWrapper<>();
duw.eq(MallDeliveryOrder::getOrderId, mallRefundRecord.getOrderId())
.set(MallDeliveryOrder::getStatus, 4);
mallDeliveryOrderMapper.update(null, duw);
//更新缓存
LambdaQueryWrapper<MallDeliveryOrder> qw = new LambdaQueryWrapper<>();
qw.eq(MallDeliveryOrder::getOrderId, mallRefundRecord.getOrderId());
MallDeliveryOrder deliveryOrder = mallDeliveryOrderMapper.selectOne(qw);
workerOrderCacheUtil.remove(deliveryOrder.getWorkerId(),deliveryOrder.getId());
//面对面拼团
if(mallRefundRecord.getOrderType() == STATUS_WAIT_PICKUP){
MallDeliveryOrder delivery = mallDeliveryOrderMapper.selectByGroupId(mallRefundRecord.getOrderId());
//更新配送单
if(delivery.getStatus() != 4){
LambdaUpdateWrapper<MallDeliveryOrder> duw = new LambdaUpdateWrapper<>();
duw.eq(MallDeliveryOrder::getOrderId, delivery.getOrderId())
.set(MallDeliveryOrder::getStatus, 4);
mallDeliveryOrderMapper.update(null, duw);
//更新缓存
LambdaQueryWrapper<MallDeliveryOrder> qw = new LambdaQueryWrapper<>();
qw.eq(MallDeliveryOrder::getOrderId, delivery.getOrderId());
MallDeliveryOrder deliveryOrder = mallDeliveryOrderMapper.selectOne(qw);
workerOrderCacheUtil.remove(delivery.getWorkerId(),delivery.getId());
}
}else{
//更新配送单
LambdaUpdateWrapper<MallDeliveryOrder> duw = new LambdaUpdateWrapper<>();
duw.eq(MallDeliveryOrder::getOrderId, mallRefundRecord.getOrderId())
.set(MallDeliveryOrder::getStatus, 4);
mallDeliveryOrderMapper.update(null, duw);
//更新缓存
LambdaQueryWrapper<MallDeliveryOrder> qw = new LambdaQueryWrapper<>();
qw.eq(MallDeliveryOrder::getOrderId, mallRefundRecord.getOrderId());
MallDeliveryOrder deliveryOrder = mallDeliveryOrderMapper.selectOne(qw);
workerOrderCacheUtil.remove(deliveryOrder.getWorkerId(),deliveryOrder.getId());
}
}
wechatPayUtil.refund(mallRefundRecord.getOrderId(), mallRefundRecord.getRefundAmount().multiply(new BigDecimal(100)).longValue(), mallRefundRecord.getRefundAmount().multiply(new BigDecimal(100)).longValue());
if(mallRefundRecord.getLinkId().toUpperCase().startsWith("W")){

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/WaitOrderCacheUtil.java

@ -318,7 +318,7 @@ public class WaitOrderCacheUtil {
filteredList.sort(buildComparator(q));
// 分页(抢单大厅每页20条)
int pageSize = 20;
int pageSize = q.getPageSize();
int pageNum = q.getPageNum();
long total = filteredList.size();
long pages = total > 0 ? (total + pageSize - 1) / pageSize : 0;

8
hiver-modules/hiver-mall/src/main/resources/mapper/MallDeliveryOrderMapper.xml

@ -39,6 +39,7 @@
<result column="arrive_time" property="arriveTime"/>
<result column="arrive_time" property="arriveTime"/>
<result column="new_worker" property="newWorker"/>
<result column="worker_phone" property="workerPhone"/>
</resultMap>
<!-- 分页查询配送单,支持多条件过滤(抢单大厅:hallOnly=true时只查workerId为空的) -->
@ -50,7 +51,7 @@
d.receiver_name, d.receiver_phone, d.receiver_address,
d.shop_name, d.shop_phone, d.shop_address, d.delivery_type, d.number_code,
d.region_id,d.remark, d.all_count, d.phone_number, d.get_codes, d.get_pictures, d.is_big,
d.is_return,d.worker_name, d.arrive_time,d.new_worker
d.is_return,d.worker_name, d.arrive_time,d.new_worker,d.worker_phone
FROM mall_delivery_order d
<where>
<if test="q.regionId != null and q.regionId != ''">
@ -124,7 +125,7 @@
d.receiver_name, d.receiver_phone, d.receiver_address,
d.shop_name, d.shop_phone, d.shop_address, d.delivery_type, d.number_code,
d.region_id,d.remark, d.all_count, d.phone_number, d.get_codes, d.get_pictures,
d.is_big,d.is_return,d.worker_name,d.arrive_time,d.new_worker
d.is_big,d.is_return,d.worker_name,d.arrive_time,d.new_worker,d.worker_phone
FROM mall_delivery_order d
<where>
d.status not in (-1,4)
@ -173,7 +174,8 @@
d.status, d.create_time, d.accept_time, d.get_time, d.must_finish_time, d.finish_time,
d.receiver_name, d.receiver_phone, d.receiver_address,
d.shop_name, d.shop_phone, d.shop_address, d.delivery_type, d.number_code,
d.region_id,d.remark, d.all_count, d.phone_number, d.get_codes, d.get_pictures, d.is_big,d.is_return,d.worker_name,d.arrive_time,d.new_worker
d.region_id,d.remark, d.all_count, d.phone_number, d.get_codes, d.get_pictures,
d.is_big,d.is_return,d.worker_name,d.arrive_time,d.new_worker,d.worker_phone
FROM mall_delivery_order d
where d.group_id = (select id from mall_order_group where 1 = 1
<if test='orderId != null and orderId.trim() neq ""'>

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

@ -151,16 +151,15 @@ public class WechatController {
final User u = securityUtil.getCurrUser();
String key = "username::" + u.getUsername();
u.setMobile(phoneNumber);
u.setUsername(phoneNumber);
userService.update(u);
// 删除缓存
redisTemplate.delete(key);
User newUser = userService.findByMobile(phoneNumber);
final String keyNew = "username::" + newUser.getUsername();
//User newUser = userService.findByMobile(phoneNumber);
final String keyNew = "username::" + u.getUsername();
// 缓存
final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd hh:mm:ss").create();
redisTemplateHelper.set(keyNew, gson.toJson(newUser), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
final String accessToken = securityUtil.getToken(userService.userToDTO(newUser), true);
redisTemplateHelper.set(keyNew, gson.toJson(u), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS);
final String accessToken = securityUtil.getToken(userService.userToDTO(u), true);
Map<String,String> map = new HashMap<>();
map.put("mobile",phoneNumber);
map.put("accessToken",accessToken);

Loading…
Cancel
Save