Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
韩鹏辉 2024-06-28 18:00:00 +08:00
commit 8f4afed929
4 changed files with 155 additions and 2 deletions

View File

@ -2,6 +2,8 @@ package com.chaozhanggui.system.cashierservice.dao;
import com.chaozhanggui.system.cashierservice.entity.TbUserShopMsg; import com.chaozhanggui.system.cashierservice.entity.TbUserShopMsg;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@Component @Component
@ -18,4 +20,7 @@ public interface TbUserShopMsgMapper {
int updateByPrimaryKeySelective(TbUserShopMsg record); int updateByPrimaryKeySelective(TbUserShopMsg record);
int updateByPrimaryKey(TbUserShopMsg record); int updateByPrimaryKey(TbUserShopMsg record);
}
@Select("select * from tb_user_shop_msg where shop_id=#{shopId}")
TbUserShopMsg selectByShopId(@Param("shopId") String shopId);
}

View File

@ -23,6 +23,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.*; import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
@ -64,10 +65,19 @@ public class OrderService {
@Autowired @Autowired
RabbitProducer producer; RabbitProducer producer;
private final WechatUtil wechatUtil;
private final TbUserShopMsgMapper tbUserShopMsgMapper;
private static ConcurrentHashMap<String, HashSet<Integer>> codeMap = new ConcurrentHashMap<>(); private static ConcurrentHashMap<String, HashSet<Integer>> codeMap = new ConcurrentHashMap<>();
private static ConcurrentHashMap<String, HashSet<String>> userMap = new ConcurrentHashMap<>(); private static ConcurrentHashMap<String, HashSet<String>> userMap = new ConcurrentHashMap<>();
public OrderService(WechatUtil wechatUtil, TbUserShopMsgMapper tbUserShopMsgMapper) {
this.wechatUtil = wechatUtil;
this.tbUserShopMsgMapper = tbUserShopMsgMapper;
}
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Result createCart(String masterId, String productId, String shopId, Integer skuId, Integer number, public Result createCart(String masterId, String productId, String shopId, Integer skuId, Integer number,
String userId, String clientType, Integer cartId, String isGift, String isPack, String uuid, String type) { String userId, String clientType, Integer cartId, String isGift, String isPack, String uuid, String type) {
@ -101,7 +111,11 @@ public class OrderService {
if("1".equals(product.getIsStock().toString())){ if("1".equals(product.getIsStock().toString())){
if(product.getId().intValue()==Integer.valueOf(skuWithBLOBs.getProductId()).intValue()){ if ("1".equals(product.getIsDistribute().toString())) {
if(product.getStockNumber()-number<0){
return Result.fail(CodeEnum.STOCKERROR);
}
} else if (product.getId().intValue()==Integer.valueOf(skuWithBLOBs.getProductId()).intValue()){
if(skuWithBLOBs.getStockNumber()-number<0){ if(skuWithBLOBs.getStockNumber()-number<0){
return Result.fail(CodeEnum.STOCKERROR); return Result.fail(CodeEnum.STOCKERROR);
} }
@ -223,10 +237,39 @@ public class OrderService {
jsonObject.put("cartId",cart.getId()); jsonObject.put("cartId",cart.getId());
jsonObject.put("type","create"); jsonObject.put("type","create");
producer.cons(jsonObject.toString()); producer.cons(jsonObject.toString());
CompletableFuture.runAsync(() -> checkWarnLineAndSendMsg(skuWithBLOBs, product, shopInfo));
return Result.success(CodeEnum.SUCCESS, masterId); return Result.success(CodeEnum.SUCCESS, masterId);
} }
/**
* 校验商品库存警戒线并通知商户
* @param productSku sku
*/
private void checkWarnLineAndSendMsg(TbProductSku productSku, TbProduct product, TbShopInfo shopInfo) {
if (productSku.getWarnLine() == null) {
return;
}
if (productSku.getStockNumber() == null) {
productSku.setStockNumber((double) 0);
}
if (product.getStockNumber() == null) {
product.setStockNumber(0);
}
if (
(product.getIsDistribute() == 1 && productSku.getStockNumber() <= productSku.getWarnLine())
|| (product.getIsDistribute() != 1) && product.getStockNumber() <= productSku.getWarnLine()
) {
TbUserShopMsg tbUserShopMsg = tbUserShopMsgMapper.selectByShopId(productSku.getShopId());
wechatUtil.sendStockWarnMsg(shopInfo.getShopName(), product.getName(),
product.getIsDistribute() == 1 ? productSku.getStockNumber().toString() : product.getStockNumber().toString(),
"耗材库存不足,请及时补充。", tbUserShopMsg.getOpenId());
}
}
public Result queryCart(String masterId, String shopId) { public Result queryCart(String masterId, String shopId) {
if (StringUtils.isEmpty(shopId)) { if (StringUtils.isEmpty(shopId)) {
return Result.fail(CodeEnum.SHOPINFONOEXIST); return Result.fail(CodeEnum.SHOPINFONOEXIST);

View File

@ -0,0 +1,104 @@
package com.chaozhanggui.system.cashierservice.util;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
@Component
@Slf4j
public class WechatUtil {
@Value("${wx.msg.appId}")
private String appId;
@Value("${wx.msg.secrete}")
private String secrete;
@Value("${wx.msg.warnMsgTmpId}")
private String msgTmpId;
static LinkedHashMap<String,String> linkedHashMap=new LinkedHashMap<>();
static {
linkedHashMap.put("40001","获取 access_token 时 AppSecret 错误,或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的公众号调用接口");
linkedHashMap.put("40003","不合法的 OpenID ,请开发者确认 OpenID (该用户)是否已关注公众号,或是否是其他公众号的 OpenID");
linkedHashMap.put("40014","不合法的 access_token ,请开发者认真比对 access_token 的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口");
linkedHashMap.put("40037","不合法的 template_id");
linkedHashMap.put("43101","用户未订阅消息");
linkedHashMap.put("43107","订阅消息能力封禁");
linkedHashMap.put("43108","并发下发消息给同一个粉丝");
linkedHashMap.put("45168","命中敏感词");
linkedHashMap.put("47003","参数错误");
}
public JSONObject getAccessToken(){
String requestUrl = "https://api.weixin.qq.com/cgi-bin/token";
Map<String, String> requestUrlParam = new HashMap<>();
//小程序appId
requestUrlParam.put("appid", appId);
//小程序secret
requestUrlParam.put("secret", secrete);
//默认参数
requestUrlParam.put("grant_type", "client_credential");
JSONObject jsonObject = JSON.parseObject(HttpClientUtil.doGet(requestUrl,requestUrlParam));
return jsonObject;
}
public static void main(String[] args) {
String id ="kSxJL9TR4s_UmOmNLE";
// sendStockWarnMsg("123", "1231", "1231", "23321", id);
}
public JSONObject sendStockWarnMsg(String shopName, String productName, String stock, String note, String toUserOpenId) {
Map<String, Object> data = new HashMap<String, Object>() {{
put("thing1", new HashMap<String, Object>(){{
put("value", shopName);
}});
put("thing6", new HashMap<String, Object>(){{
put("value", productName);
}});
put("number7", new HashMap<String, Object>(){{
put("value", stock);
}});
put("thing5", new HashMap<String, Object>(){{
put("value", note);
}});
}};
log.info("开始发送库存预警消息, 接收用户openId: {}, 消息数据: {}", toUserOpenId, data);
return sendTempMsg(msgTmpId, toUserOpenId, data);
}
public JSONObject sendTempMsg(String tempId, String toUserOpenId, Map<String, Object> data) {
log.info("开始发送微信模板消息, 接收用户openId: {}, 消息数据: {}", toUserOpenId, data);
JSONObject object= getAccessToken();
String accessToken=object.get("access_token")+"";
JSONObject object1=new JSONObject();
object1.put("template_id", tempId);
object1.put("touser", toUserOpenId);
object1.put("data",data);
object1.put("miniprogram_state","trial");
object1.put("lang","zh_CN");
String response= HttpRequest.post("https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=".concat(accessToken)).body(object1.toString()).execute().body();
log.info("微信模板消息发送成功,相应内容:{}",response);
JSONObject resObj=JSONObject.parseObject(response);
if(ObjectUtil.isNotEmpty(resObj)&&ObjectUtil.isNotNull(resObj)&&"0".equals(resObj.get("errcode")+"")){
return resObj;
}
throw new RuntimeException(linkedHashMap.getOrDefault(resObj.get("errcode") + "", "未知错误"));
}
}

View File

@ -48,6 +48,7 @@ wx:
msg: msg:
appId: wxcf0fe8cdba153fd6 appId: wxcf0fe8cdba153fd6
secrete: c33e06467c6879a62af633d50ed6b720 secrete: c33e06467c6879a62af633d50ed6b720
warnMsgTmpId: IZ-l9p9yBgcvhRR0uN6cBQPkWJ5i05zyWMkfeCPaAmY