Browse Source

对接拼团数据1

master
wangfukang 3 weeks ago
parent
commit
ebfdfcbea7
  1. 16
      hiver-admin/test-output/test-report.html
  2. 12
      hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/UserController.java
  3. 59
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/campus/service/impl/CampusServiceImpl.java
  4. 14
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java
  5. 28
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ShopAreaController.java
  6. 4
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/ShopArea.java
  7. 45
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/fishmarket/service/impl/FishMarketServiceImpl.java
  8. 50
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/service/impl/IeChatServiceImpl.java
  9. 44
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/ShopTakeawayServiceImpl.java
  10. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallAdPositionServiceImpl.java
  11. 2
      hiver-modules/hiver-mall/src/main/resources/db/shop_area_delivery_enabled.sql
  12. 19
      hiver-modules/hiver-mall/src/main/resources/mapper/ShopAreaMapper.xml
  13. 41
      hiver-modules/hiver-social/src/main/java/cc/hiver/social/controller/WechatController.java
  14. 12
      hiver-modules/hiver-social/src/main/java/cc/hiver/social/serviceimpl/WechatPhoneService.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">八月 24, 2026 11:57:28</span></a>
<a href="#"><span class="badge badge-primary">八月 26, 2026 18:43:14</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>11:57:28 上</span> / <span>0.022 secs</span></p>
<p class="text-sm"><span>18:43:15 下</span> / <span>0.04 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'>08.24.2026 11:57:28</span>
<span class='badge badge-danger'>08.24.2026 11:57:28</span>
<span class='badge badge-default'>0.022 secs</span>
<span class='badge badge-success'>08.26.2026 18:43:15</span>
<span class='badge badge-danger'>08.26.2026 18:43:15</span>
<span class='badge badge-default'>0.04 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>11:57:28</td>
<td>18:43:15</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>八月 24, 2026 11:57:28</h3>
<h3>八月 26, 2026 18:43:14</h3>
</div></div>
</div>
<div class="col-md-3">
<div class="card"><div class="card-body">
<p class="m-b-0">Ended</p>
<h3>八月 24, 2026 11:57:28</h3>
<h3>八月 26, 2026 18:43:15</h3>
</div></div>
</div>
<div class="col-md-3">

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

@ -672,13 +672,21 @@ public class UserController {
User wechatUser = null;
final Map<String, Object> resultMap = new HashMap<>();
if(StringUtils.isEmpty(wechatVo.getUserId())){
wechatUser = userService.findByUnionid(unionid);
if (StringUtils.isNotEmpty(unionid)) {
wechatUser = userService.findByUnionid(unionid);
}
if (wechatUser == null) {
wechatUser = userService.findByMiniProgramOpenid(openId);
}
}else{
wechatUser = userService.findById(wechatVo.getUserId());
if (wechatUser == null) {
if (wechatUser == null && StringUtils.isNotEmpty(unionid)) {
// 如果根据userid没查到,再根据unionid查询一遍
wechatUser = userService.findByUnionid(unionid);
}
if (wechatUser == null) {
wechatUser = userService.findByMiniProgramOpenid(openId);
}
}
if (wechatUser == null) {

59
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/campus/service/impl/CampusServiceImpl.java

@ -15,6 +15,7 @@ import cc.hiver.mall.ie.service.IeContentAuditLogService;
import cc.hiver.mall.ie.service.IeSecurityAuditService;
import cc.hiver.mall.ie.vo.IeAliyunModerationResult;
import cc.hiver.mall.ie.vo.IeAuditResult;
import cc.hiver.mall.utils.WechatSendMessageUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@ -22,6 +23,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@ -31,8 +33,11 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.transaction.support.TransactionTemplate;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
@ -45,6 +50,7 @@ public class CampusServiceImpl implements CampusService {
private static final String IMAGE_AUDIT_REJECT_MESSAGE = "图片审核未通过,请更换后重试";
private static final String CHAT_UNREAD_KEY_PREFIX = "campus:unread:chat:";
private static final String COMMENT_UNREAD_KEY_PREFIX = "campus:unread:comment:";
private static final String CAMPUS_COMMENT_WECHAT_TEMPLATE_ID = "X-lezVQyqm9EUsHCi6ja2cAnjdif5uyA21nhmg0RsuU";
private static final int STATUS_NORMAL = 1;
private static final int STATUS_OFF_SHELF = 2;
private static final int STATUS_DELETED = 3;
@ -84,6 +90,8 @@ public class CampusServiceImpl implements CampusService {
private SimpMessagingTemplate messagingTemplate;
@Autowired
private PlatformTransactionManager transactionManager;
@Autowired
private WechatSendMessageUtil wechatSendMessageUtil;
@Override
public List<CampusCategory> listCategories(String regionId, String parentCode, String categoryType) {
@ -378,6 +386,11 @@ public class CampusServiceImpl implements CampusService {
if (!user.getId().equals(post.getUserId())) {
incrementUnread(commentUnreadKey(post.getUserId()), commentUnreadField(post.getId(), comment.getId()));
}
if (StringUtils.isBlank(comment.getParentId())
&& Integer.valueOf(AUDIT_PASS).equals(comment.getAuditStatus())
&& !user.getId().equals(post.getUserId())) {
sendCampusCommentNotifyAfterCommit(comment, post);
}
return comment;
}
@ -1253,6 +1266,44 @@ public class CampusServiceImpl implements CampusService {
messagingTemplate.convertAndSend("/topic/campus/session/" + message.getSessionId(), message);
}
private void sendCampusCommentNotifyAfterCommit(CampusComment comment, CampusPost post) {
if (comment == null || post == null || StringUtils.isBlank(post.getUserId())) return;
if (TransactionSynchronizationManager.isSynchronizationActive()) {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void afterCommit() {
sendCampusCommentNotify(comment, post);
}
});
return;
}
sendCampusCommentNotify(comment, post);
}
private void sendCampusCommentNotify(CampusComment comment, CampusPost post) {
try {
User receiver = userService.findById(post.getUserId());
if (receiver == null || StringUtils.isBlank(receiver.getOfficialAccountOpenid())) {
return;
}
List<WxMpTemplateData> data = new ArrayList<>();
Date createTime = comment.getCreateTime() == null ? new Date() : comment.getCreateTime();
data.add(new WxMpTemplateData("time5", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(createTime)));
data.add(new WxMpTemplateData("thing10", "校园圈有新的评论啦"));
data.add(new WxMpTemplateData("character_string6", limitCharacterStringValue(defaultString(comment.getId(), post.getId()))));
wechatSendMessageUtil.sendWechatTempMessage(
Collections.singletonList(receiver.getOfficialAccountOpenid()),
CAMPUS_COMMENT_WECHAT_TEMPLATE_ID,
data,
"pages/index/index"
);
log.info("校园圈评论公众号通知已发送,commentId={}, receiverId={}", comment.getId(), post.getUserId());
} catch (Exception e) {
log.warn("校园圈评论公众号通知发送失败,commentId={}, receiverId={}, reason={}",
comment == null ? null : comment.getId(), post == null ? null : post.getUserId(), e.getMessage());
}
}
private void incrementUnread(String key, String field) {
if (stringRedisTemplate == null || StringUtils.isAnyBlank(key, field)) return;
stringRedisTemplate.opsForHash().increment(key, field, 1L);
@ -1324,6 +1375,14 @@ public class CampusServiceImpl implements CampusService {
return postId + ":" + commentId;
}
private String limitCharacterStringValue(String value) {
String text = StringUtils.defaultString(value).replaceAll("[^A-Za-z0-9_-]", "");
if (StringUtils.isBlank(text)) {
return "campus";
}
return text.length() > 32 ? text.substring(0, 32) : text;
}
private CampusPageQuery normalizeQuery(CampusPageQuery query) {
CampusPageQuery q = query == null ? new CampusPageQuery() : query;
q.setPageNum(q.getPageNum() == null || q.getPageNum() < 1 ? 1 : q.getPageNum());

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

@ -38,10 +38,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* 配送订单接口
@ -53,6 +50,7 @@ import java.util.Map;
public class MallDeliveryOrderController {
private static final int STATUS_WAIT = -1;
private static final String HOME_POPUP_POSITION = "home_popup";
@Autowired
private MallDeliveryOrderService mallDeliveryOrderService;
@ -103,11 +101,14 @@ public class MallDeliveryOrderController {
//首先从缓存中查询
Map<String, Object> cacheResult = waitOrderCacheUtil.getAll(q);
List<MallAdPosition> cathList = mallAdPositionService.getAdsByRegionId(q.getRegionId(),q.getPaths());
MallAdPosition homePopupAd = getHomePopupAd(q.getRegionId());
if (cacheResult != null) {
cacheResult.put("mallAds",cathList);
cacheResult.put("homePopupAd", homePopupAd);
}else{
cacheResult = new HashMap<>();
cacheResult.put("mallAds",cathList);
cacheResult.put("homePopupAd", homePopupAd);
if (q.getDeliveryType() == 4 && StrUtil.isNotBlank(q.getWorkerId())) {
//先查当前用户指派单未确认接单数量 不用分页
q.setHallOnly(false);
@ -163,6 +164,11 @@ public class MallDeliveryOrderController {
return new ResultUtil<Object>().setData(cacheResult);
}
private MallAdPosition getHomePopupAd(String regionId) {
List<MallAdPosition> popupAds = mallAdPositionService.getAdsByRegionId(regionId, Collections.singletonList(HOME_POPUP_POSITION));
return popupAds == null || popupAds.isEmpty() ? null : popupAds.get(0);
}
@PostMapping("/admin/page")
@ApiOperation(value = "后台管理端分页查询抢单大厅配送单", notes = "直接查数据库,不走用户端缓存")
public Result<Object> adminPage(@RequestBody MallDeliveryOrderPageQuery q) {

28
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ShopAreaController.java

@ -181,6 +181,34 @@ public class ShopAreaController {
return ResultUtil.success("编辑成功");
}
@RequestMapping(value = "/deliverySwitch/get", method = RequestMethod.GET)
@ApiOperation(value = "根据校区ID查询配送开关")
public Result getDeliverySwitch(@RequestParam String regionId) {
ShopArea shopArea = shopAreaService.get(regionId);
if (shopArea == null) {
return ResultUtil.error("校区不存在");
}
Integer deliveryEnabled = shopArea.getDeliveryEnabled() == null ? 1 : shopArea.getDeliveryEnabled();
return new ResultUtil<Integer>().setData(deliveryEnabled);
}
@RequestMapping(value = "/deliverySwitch/update", method = RequestMethod.POST)
@ApiOperation(value = "根据校区ID更新配送开关")
public Result updateDeliverySwitch(@RequestParam String regionId, @RequestParam Integer deliveryEnabled) {
if (deliveryEnabled == null || (deliveryEnabled != 0 && deliveryEnabled != 1)) {
return ResultUtil.error("配送开关参数错误");
}
ShopArea shopArea = shopAreaService.get(regionId);
if (shopArea == null) {
return ResultUtil.error("校区不存在");
}
shopArea.setDeliveryEnabled(deliveryEnabled);
ShopArea updated = shopAreaService.update(shopArea);
shopAreaService.refreshShopAreaCache(updated.getParentId(), updated.getId());
redisTemplate.deleteByPattern("ShopArea:*");
return ResultUtil.success("保存成功");
}
@RequestMapping(value = "/delByIds", method = RequestMethod.POST)
@ApiOperation(value = "批量通过id删除")
public Result delByIds(@RequestParam String[] ids) {

4
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/ShopArea.java

@ -51,6 +51,10 @@ public class ShopArea extends HiverBaseEntity {
@ApiModelProperty(value = "是否启用 0启用 -1禁用")
private Integer status = CommonConstant.STATUS_NORMAL;
@ApiModelProperty(value = "是否开启配送:1开启,0关闭")
@Column(nullable = false, columnDefinition = "int default 1")
private Integer deliveryEnabled = 1;
@Transient
@TableField(exist = false)
@ApiModelProperty(value = "父节点名称")

45
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/fishmarket/service/impl/FishMarketServiceImpl.java

@ -496,6 +496,11 @@ public class FishMarketServiceImpl implements FishMarketService {
goods.setCommentCount(safeInt(goods.getCommentCount()) + 1);
goodsMapper.updateById(goods);
addCommentUnread(comment, goods, user.getId());
if (StringUtils.isBlank(comment.getParentId())
&& Integer.valueOf(1).equals(comment.getAuditStatus())
&& !user.getId().equals(goods.getUserId())) {
sendWechatCommentNotifyAfterCommit(comment, goods);
}
return comment;
}
@ -1606,6 +1611,44 @@ public class FishMarketServiceImpl implements FishMarketService {
sendWechatChatNotify(message, session, sender);
}
private void sendWechatCommentNotifyAfterCommit(FishComment comment, FishGoods goods) {
if (comment == null || goods == null || StringUtils.isBlank(goods.getUserId())) return;
if (TransactionSynchronizationManager.isSynchronizationActive()) {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void afterCommit() {
sendWechatCommentNotify(comment, goods);
}
});
return;
}
sendWechatCommentNotify(comment, goods);
}
private void sendWechatCommentNotify(FishComment comment, FishGoods goods) {
try {
User receiver = userService.findById(goods.getUserId());
if (receiver == null || StringUtils.isBlank(receiver.getOfficialAccountOpenid())) {
return;
}
List<WxMpTemplateData> data = new ArrayList<>();
Date createTime = comment.getCreateTime() == null ? new Date() : comment.getCreateTime();
data.add(new WxMpTemplateData("time5", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(createTime)));
data.add(new WxMpTemplateData("thing10", "校园二手有新的评论啦"));
data.add(new WxMpTemplateData("character_string6", limitCharacterStringValue(defaultString(comment.getId(), goods.getId()))));
wechatSendMessageUtil.sendWechatTempMessage(
Collections.singletonList(receiver.getOfficialAccountOpenid()),
FISH_CHAT_WECHAT_TEMPLATE_ID,
data,
"pages/index/index"
);
log.info("校园二手评论公众号通知已发送,commentId={}, receiverId={}", comment.getId(), goods.getUserId());
} catch (Exception e) {
log.warn("校园二手评论公众号通知发送失败,commentId={}, receiverId={}, reason={}",
comment == null ? null : comment.getId(), goods == null ? null : goods.getUserId(), e.getMessage());
}
}
private void sendWechatChatNotify(FishChatMessage message, FishChatSession session, User sender) {
try {
User receiver = userService.findById(message.getReceiverId());
@ -1617,7 +1660,7 @@ public class FishMarketServiceImpl implements FishMarketService {
List<WxMpTemplateData> data = new ArrayList<>();
Date createTime = message.getCreateTime() == null ? new Date() : message.getCreateTime();
data.add(new WxMpTemplateData("time5", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(createTime)));
data.add(new WxMpTemplateData("thing10", buildContactTemplateValue("半径咨询", itemTitle)));
data.add(new WxMpTemplateData("thing10", buildContactTemplateValue("二手咨询", itemTitle)));
data.add(new WxMpTemplateData("character_string6", limitCharacterStringValue(itemCode)));
wechatSendMessageUtil.sendWechatTempMessage(
Collections.singletonList(receiver.getOfficialAccountOpenid()),

50
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/ie/service/impl/IeChatServiceImpl.java

@ -16,12 +16,14 @@ import cc.hiver.mall.ie.vo.IeAuditResult;
import cc.hiver.mall.ie.vo.IeChatEvent;
import cc.hiver.mall.ie.vo.IeMessageAckVO;
import cc.hiver.mall.service.HomeReminderService;
import cc.hiver.mall.utils.WechatSendMessageUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.messaging.simp.SimpMessagingTemplate;
@ -30,6 +32,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.TimeUnit;
@ -88,6 +91,9 @@ public class IeChatServiceImpl implements IeChatService {
@Autowired
private IeContentAuditLogService contentAuditLogService;
@Autowired
private WechatSendMessageUtil wechatSendMessageUtil;
private static final String STREAK_REWARD_KEY = "ie:streak:reward:";
private static final int STREAK_LOOKBACK_DAYS = 60;
private static final int STREAK_REWARD_INTERVAL = 7;
@ -101,6 +107,7 @@ public class IeChatServiceImpl implements IeChatService {
private static final long MEDIA_AUDIT_POLL_MILLIS = 10L * 1000;
/** 提交审核失败后的延迟重试间隔 */
private static final long MEDIA_AUDIT_SUBMIT_RETRY_MILLIS = 15L * 1000;
private static final String IE_CHAT_WECHAT_TEMPLATE_ID = "X-lezVQyqm9EUsHCi6ja2cAnjdif5uyA21nhmg0RsuU";
@Override
public IeRoom getRoom(Long roomId) {
@ -194,6 +201,7 @@ public class IeChatServiceImpl implements IeChatService {
if (message.getIsBlocked() == 0 && !needMediaAudit) {
deliverMessage(message, ack);
homeReminderService.incrementIeUnread(receiverId);
sendIeChatNotifyAfterCommit(message);
} else if (message.getIsBlocked() == 0) {
afterCommitOrNow(() -> {
chatEventProducer.sendMediaAudit(message.getId());
@ -302,6 +310,47 @@ public class IeChatServiceImpl implements IeChatService {
publishEvent(IeChatEventType.MESSAGE_DELIVERED, message.getRoomId(), message.getId(), message.getSenderId(), message.getReceiverId(), message.getRiskLevel(), JSONUtil.toJsonStr(ack));
}
private void sendIeChatNotifyAfterCommit(IeRoomMessage message) {
if (message == null || message.getReceiverId() == null
|| !Integer.valueOf(IeConstants.AUDIT_PASS).equals(message.getAuditStatus())
|| !Integer.valueOf(0).equals(message.getIsBlocked())) {
return;
}
afterCommitOrNow(() -> sendIeChatNotify(message));
}
private void sendIeChatNotify(IeRoomMessage message) {
try {
User receiver = userDao.findById(String.valueOf(message.getReceiverId())).orElse(null);
if (receiver == null || CharSequenceUtil.isBlank(receiver.getOfficialAccountOpenid())) {
return;
}
List<WxMpTemplateData> data = new ArrayList<>();
Date createTime = message.getCreateTime() == null ? new Date() : message.getCreateTime();
data.add(new WxMpTemplateData("time5", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(createTime)));
data.add(new WxMpTemplateData("thing10", "ie有新的漂流消息啦"));
data.add(new WxMpTemplateData("character_string6", limitCharacterStringValue(String.valueOf(message.getId()))));
wechatSendMessageUtil.sendWechatTempMessage(
Collections.singletonList(receiver.getOfficialAccountOpenid()),
IE_CHAT_WECHAT_TEMPLATE_ID,
data,
"pages/index/index"
);
log.info("i/e聊天公众号通知已发送,messageId={}, receiverId={}", message.getId(), message.getReceiverId());
} catch (Exception e) {
log.warn("i/e聊天公众号通知发送失败,messageId={}, receiverId={}, reason={}",
message == null ? null : message.getId(), message == null ? null : message.getReceiverId(), e.getMessage());
}
}
private String limitCharacterStringValue(String value) {
String text = value == null ? "" : value.replaceAll("[^A-Za-z0-9_-]", "");
if (CharSequenceUtil.isBlank(text)) {
return "ie";
}
return text.length() > 32 ? text.substring(0, 32) : text;
}
private Boolean roomHasPeerReply(Long roomId) {
IeRoom room = getRoom(roomId);
return room != null && Boolean.TRUE.equals(room.getHasPeerReply());
@ -710,6 +759,7 @@ public class IeChatServiceImpl implements IeChatService {
IeMessageAckVO ack = buildAck(message, null, roomHasPeerReply(message.getRoomId()));
deliverMessage(message, ack);
homeReminderService.incrementIeUnread(message.getReceiverId());
sendIeChatNotifyAfterCommit(message);
messagingTemplate.convertAndSendToUser(String.valueOf(message.getSenderId()), "/queue/ie/ack", ack);
}

44
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/ShopTakeawayServiceImpl.java

@ -20,6 +20,7 @@ import cc.hiver.mall.entity.Shop;
import cc.hiver.mall.entity.ShopTakeaway;
import cc.hiver.mall.service.ShopService;
import cc.hiver.mall.service.ShopTakeawayService;
import cn.hutool.core.text.CharSequenceUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@ -71,22 +72,39 @@ public class ShopTakeawayServiceImpl extends ServiceImpl<ShopTakeawayMapper, Sh
@Override
public void updateByPrimaryKeySelective(ShopTakeaway shopTakeaway) {
shopTakeawayMapper.updateByPrimaryKeySelective(shopTakeaway);
ShopTakeaway old = shopTakeawayMapper.selectByPrimaryKey(shopTakeaway.getShopId());
if(shopTakeaway.getStatus() == 0){
//恢复营业
Shop shop = shopService.get(shopTakeaway.getShopId());
shop.setStatus(1);
shopService.update(shop);
}else if(shopTakeaway.getStatus() == 1){
//暂停营业
Shop shop = shopService.get(shopTakeaway.getShopId());
shop.setStatus(2);
shopService.update(shop);
shopTakeawayMapper.updateByPrimaryKeySelective(shopTakeaway);
Shop shop = shopService.get(shopTakeaway.getShopId());
if(Integer.valueOf(0).equals(shopTakeaway.getStatus())){
// 恢复营业
if (shop != null) {
shop.setStatus(1);
shopService.update(shop);
}
}else if(Integer.valueOf(1).equals(shopTakeaway.getStatus())){
// 暂停营业
if (shop != null) {
shop.setStatus(2);
shopService.update(shop);
}
}
if (old != null && old.getRegionId() != null) {
shopService.refreshShopCache(old.getShopId(), old.getRegionId());
String regionId = resolveRefreshRegionId(shopTakeaway, old, shop);
if (CharSequenceUtil.isNotBlank(regionId)) {
shopService.refreshShopCache(shopTakeaway.getShopId(), regionId);
}
}
private String resolveRefreshRegionId(ShopTakeaway current, ShopTakeaway old, Shop shop) {
if (shop != null && CharSequenceUtil.isNotBlank(shop.getRegionId())) {
return shop.getRegionId();
}
if (current != null && CharSequenceUtil.isNotBlank(current.getRegionId())) {
return current.getRegionId();
}
if (old != null && CharSequenceUtil.isNotBlank(old.getRegionId())) {
return old.getRegionId();
}
return null;
}
@Override

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallAdPositionServiceImpl.java

@ -149,7 +149,7 @@ public class MallAdPositionServiceImpl extends ServiceImpl<MallAdPositionMapper,
@Override
public List<MallAdPosition> getAdsByRegionId(String regionId,List<String> paths) {
if (StringUtils.isBlank(regionId)) {
if (StringUtils.isBlank(regionId) || paths == null || paths.isEmpty()) {
return Collections.emptyList();
}

2
hiver-modules/hiver-mall/src/main/resources/db/shop_area_delivery_enabled.sql

@ -0,0 +1,2 @@
ALTER TABLE `t_shop_area`
ADD COLUMN `delivery_enabled` int(11) NOT NULL DEFAULT 1 COMMENT '是否开启配送:1开启,0关闭';

19
hiver-modules/hiver-mall/src/main/resources/mapper/ShopAreaMapper.xml

@ -14,10 +14,11 @@
<result column="status" property="status" jdbcType="INTEGER" />
<result column="title" property="title" jdbcType="VARCHAR" />
<result column="is_canteen" property="isCanteen" jdbcType="INTEGER" />
<result column="delivery_enabled" property="deliveryEnabled" jdbcType="INTEGER" />
</resultMap>
<sql id="Base_Column_List" >
id, create_by, create_time, del_flag, update_by, update_time, is_parent, parent_id,
sort_order, status, title, isCanteen
sort_order, status, title, is_canteen, delivery_enabled
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" >
select
@ -33,11 +34,11 @@
insert into t_shop_area (id, create_by, create_time,
del_flag, update_by, update_time,
is_parent, parent_id, sort_order,
status, title,is_canteen)
status, title, is_canteen, delivery_enabled)
values (#{id,jdbcType=VARCHAR}, #{createBy,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP},
#{delFlag,jdbcType=INTEGER}, #{updateBy,jdbcType=VARCHAR}, #{updateTime,jdbcType=TIMESTAMP},
#{isParent,jdbcType=BIT}, #{parentId,jdbcType=VARCHAR}, #{sortOrder,jdbcType=DECIMAL},
#{status,jdbcType=INTEGER}, #{title,jdbcType=VARCHAR},#{isCanteen,jdbcType=INTEGER})
#{status,jdbcType=INTEGER}, #{title,jdbcType=VARCHAR}, #{isCanteen,jdbcType=INTEGER}, #{deliveryEnabled,jdbcType=INTEGER})
</insert>
<insert id="insertSelective" parameterType="cc.hiver.mall.entity.ShopArea" >
insert into t_shop_area
@ -78,6 +79,9 @@
<if test="isCanteen != null" >
is_canteen,
</if>
<if test="deliveryEnabled != null" >
delivery_enabled,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides="," >
<if test="id != null" >
@ -116,6 +120,9 @@
<if test="isCanteen != null" >
#{isCanteen,jdbcType=VARCHAR},
</if>
<if test="deliveryEnabled != null" >
#{deliveryEnabled,jdbcType=INTEGER},
</if>
</trim>
</insert>
<update id="updateByPrimaryKeySelective" parameterType="cc.hiver.mall.entity.ShopArea" >
@ -154,6 +161,9 @@
<if test="isCanteen != null" >
is_canteen = #{isCanteen,jdbcType=VARCHAR},
</if>
<if test="deliveryEnabled != null" >
delivery_enabled = #{deliveryEnabled,jdbcType=INTEGER},
</if>
</set>
where id = #{id,jdbcType=VARCHAR}
</update>
@ -169,7 +179,8 @@
sort_order = #{sortOrder,jdbcType=DECIMAL},
status = #{status,jdbcType=INTEGER},
title = #{title,jdbcType=VARCHAR},
is_canteen = #{isCanteen,jdbcType=VARCHAR}
is_canteen = #{isCanteen,jdbcType=VARCHAR},
delivery_enabled = #{deliveryEnabled,jdbcType=INTEGER}
where id = #{id,jdbcType=VARCHAR}
</update>
</mapper>

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

@ -147,25 +147,30 @@ public class WechatController {
public Result getUserPhone(@RequestParam(required = false) String code) {
String phoneNumber = wechatPhoneService.getPhoneNumber(code);
if (phoneNumber != null) {
final User u = securityUtil.getCurrUser();
String key = "username::" + u.getUsername();
u.setMobile(phoneNumber);
userService.update(u);
// 删除缓存
redisTemplate.delete(key);
//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(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);
return ResultUtil.data(map);
if (CharSequenceUtil.isNotBlank(phoneNumber)) {
try {
final User u = securityUtil.getCurrUser();
String key = "username::" + u.getUsername();
u.setMobile(phoneNumber);
userService.update(u);
// 删除缓存
redisTemplate.delete(key);
//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(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);
return ResultUtil.data(map);
} catch (Exception e) {
log.error("绑定微信手机号失败: phoneNumber={}", phoneNumber, e);
return ResultUtil.error("手机号绑定失败,请重新登录后再试");
}
} else {
return ResultUtil.error(401,"获取手机号失败");
return ResultUtil.error("获取手机号失败,请重新授权手机号");
}
}

12
hiver-modules/hiver-social/src/main/java/cc/hiver/social/serviceimpl/WechatPhoneService.java

@ -26,11 +26,10 @@ public class WechatPhoneService {
private final RestTemplate restTemplate;
private final ObjectMapper objectMapper;
// 请替换为你的实际配置,建议放入 application.yml
@Value("${hiver.social.wechat.appId}")
@Value("${app.social.wxMini.appId}")
private String appId;
@Value("${hiver.social.wechat.appSecret}")
@Value("${app.social.wxMini.appSecret}")
private String appSecret;
public WechatPhoneService() {
@ -45,6 +44,10 @@ public class WechatPhoneService {
*/
public String getPhoneNumber(String code) {
try {
if (code == null || code.trim().isEmpty()) {
log.error("微信手机号获取失败: code为空");
return null;
}
// 1. 获取 Access Token (生产环境建议缓存此 Token,有效期2小时)
String accessToken = getAccessToken();
if (accessToken == null) {
@ -83,7 +86,8 @@ public class WechatPhoneService {
return root.path("phone_number").asText(null);
}
return phoneInfo.path("phoneNumber").asText(null);
String phoneNumber = phoneInfo.path("phoneNumber").asText(null);
return phoneNumber == null || phoneNumber.trim().isEmpty() ? null : phoneNumber;
} catch (Exception e) {
log.error("解析手机号异常", e);

Loading…
Cancel
Save