From b74441a62e2f92de2e19bc6d1112afef4eeaeb12 Mon Sep 17 00:00:00 2001 From: SongZhang <2064194730@qq.com> Date: Sat, 14 Sep 2024 11:49:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=93=E5=8D=B0=E6=95=B4=E5=90=88=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cashierservice/rabbit/PrintConsumer.java | 70 ++++---- .../rabbit/print/FeiPrinter.java | 40 +++++ .../rabbit/print/PrintConfig.java | 35 ++++ .../rabbit/print/PrinterHandler.java | 153 ++++++++++++++++++ .../rabbit/print/YxyPrinter.java | 86 ++++++++++ .../system/cashierservice/util/Utils.java | 131 +++++++++++++++ 6 files changed, 480 insertions(+), 35 deletions(-) create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/FeiPrinter.java create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/PrintConfig.java create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/PrinterHandler.java create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/YxyPrinter.java create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/util/Utils.java diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintConsumer.java b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintConsumer.java index e89d34b..c67dd6e 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintConsumer.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintConsumer.java @@ -12,6 +12,7 @@ import com.chaozhanggui.system.cashierservice.model.CategoryInfo; import com.chaozhanggui.system.cashierservice.model.OrderDetailPO; import com.chaozhanggui.system.cashierservice.mybatis.MPOrderDetailMapper; import com.chaozhanggui.system.cashierservice.mybatis.MpPrintMachineMapper; +import com.chaozhanggui.system.cashierservice.rabbit.print.PrinterHandler; import com.chaozhanggui.system.cashierservice.util.*; import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.rabbit.annotation.RabbitHandler; @@ -21,10 +22,7 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; @@ -63,8 +61,11 @@ public class PrintConsumer { @Autowired private MPOrderDetailMapper mPOrderDetailMapper; - public PrintConsumer(RedisTemplate redisTemplate) { + private final PrinterHandler printerHandler; + + public PrintConsumer(RedisTemplate redisTemplate, PrinterHandler printerHandler) { this.redisTemplate = redisTemplate; + this.printerHandler = printerHandler; } @RabbitListener(queues = {RabbitConstants.QUEUE_PRINT_DISHES}) @@ -76,24 +77,19 @@ public class PrintConsumer { Boolean isReturn = jsonObject.getBoolean("isReturn"); TbOrderInfo orderInfo = tbOrderInfoMapper.selectByPrimaryKey(orderId); - if (ObjectUtil.isEmpty(orderInfo)) { - log.error("没有对应的订单信息"); + Utils.checkValueUnReturn(orderInfo, "订单信息不存在"); + + + List orderDetails = new ArrayList<>(); + for (Object orderDetail : orderDetailIds) { + orderDetails.add(JSONObject.parseObject(orderDetail.toString(), TbOrderDetail.class)); + } + if (orderDetails.isEmpty()) { return; } - List orderDetails = mPOrderDetailMapper.selectList(new LambdaQueryWrapper() - .in(TbOrderDetail::getId, orderDetailIds)); getPrintMachine(Integer.valueOf(orderInfo.getShopId()), "cash").forEach(machine -> { log.info("打印机信息: {}", machine); - JSONObject config = JSONObject.parseObject(machine.getConfig()); - String model = config.getString("model"); - if (!"one".equals(model)) { - return; - } - - List categoryInfos = JSONUtil.parseJSONStr2TList(config.getJSONArray("categoryList").toString(), CategoryInfo.class); - orderDetails.forEach(item -> { - printDishesTicket(isReturn, machine, item, orderInfo, categoryInfos); - }); + printerHandler.handleRequest(machine, isReturn, orderInfo, orderDetails); }); } catch (Exception e) { @@ -110,25 +106,15 @@ public class PrintConsumer { Boolean isReturn = jsonObject.getBoolean("isReturn"); TbOrderInfo orderInfo = tbOrderInfoMapper.selectByPrimaryKey(orderId); - if (ObjectUtil.isEmpty(orderInfo)) { - log.error("没有对应的订单信息"); - return; - } - + Utils.checkValueUnReturn(orderInfo, "订单信息不存在"); TbShopInfo shopInfo = tbShopInfoMapper.selectByPrimaryKey(Integer.valueOf(orderInfo.getShopId())); - if (shopInfo == null) { - log.error("店铺信息不存在"); - return; - } + Utils.checkValueUnReturn(shopInfo, "店铺信息不存在"); getPrintMachine(shopInfo.getId(), "cash").forEach(machine -> { - log.info("打印机信息: {}", machine); - JSONObject config = JSONObject.parseObject(machine.getConfig()); - String model = config.getString("model"); - if (!"normal".equals(model)) { - return; - } - printPlaceTicket(isReturn, machine, orderInfo, shopInfo); + List tbOrderDetails = tbOrderDetailMapper.selectAllByOrderId(orderInfo.getId()); + printerHandler.handleRequest(machine, isReturn, orderInfo, tbOrderDetails); + +// printPlaceTicket(isReturn, machine, orderInfo, shopInfo); }); } catch (Exception e) { @@ -136,6 +122,13 @@ public class PrintConsumer { } } + private boolean checkMachineModel(String type, TbPrintMachine machine) { + Utils.checkValueUnReturn(machine, "打印机为null"); + JSONObject config = JSONObject.parseObject(machine.getConfig()); + String model = config.getString("model"); + return type.equals(model); + } + private List getPrintMachine(Integer shopId, String subType) { TbShopInfo shopInfo = tbShopInfoMapper.selectByPrimaryKey(shopId); @@ -211,6 +204,13 @@ public class PrintConsumer { * 打印结算单 */ private void printPlaceTicket(boolean isReturn, TbPrintMachine printMachine, TbOrderInfo orderInfo, TbShopInfo shopInfo) { + log.info("打印机信息: {}", printMachine); + JSONObject config = JSONObject.parseObject(printMachine.getConfig()); + String model = config.getString("model"); + if (!"normal".equals(model)) { + log.info("当前打印机非小票打印机, {}", printMachine); + return; + } List tbOrderDetails = tbOrderDetailMapper.selectAllByOrderId(orderInfo.getId()); if (!tbOrderDetails.isEmpty()) { diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/FeiPrinter.java b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/FeiPrinter.java new file mode 100644 index 0000000..2af3f0f --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/FeiPrinter.java @@ -0,0 +1,40 @@ +package com.chaozhanggui.system.cashierservice.rabbit.print; + +import com.chaozhanggui.system.cashierservice.dao.TbProductMapper; +import com.chaozhanggui.system.cashierservice.dao.TbProductSkuMapper; +import com.chaozhanggui.system.cashierservice.dao.TbShopUserMapper; +import com.chaozhanggui.system.cashierservice.entity.TbOrderDetail; +import com.chaozhanggui.system.cashierservice.entity.TbOrderInfo; +import com.chaozhanggui.system.cashierservice.entity.TbPrintMachine; +import com.chaozhanggui.system.cashierservice.model.OrderDetailPO; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class FeiPrinter extends PrinterHandler{ + + public FeiPrinter(TbProductMapper productMapper, TbProductSkuMapper tbProductSkuMapper, TbShopUserMapper tbShopUserMapper) { + super("Feie", productMapper, tbProductSkuMapper, tbShopUserMapper); + } + + @Override + protected void returnDishesPrint(TbOrderInfo orderInfo, TbOrderDetail orderDetail, TbPrintMachine machine) { + + } + + @Override + protected void normalDishesPrint(TbOrderInfo orderInfo, TbOrderDetail orderDetail, TbPrintMachine machine) { + + } + + @Override + protected void returnOrderPrint(TbOrderInfo orderInfo, TbPrintMachine machine, String balance, List detailList) { + + } + + @Override + protected void normalOrderPrint(TbOrderInfo orderInfo, TbPrintMachine machine, String balance, List detailList) { + + } +} diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/PrintConfig.java b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/PrintConfig.java new file mode 100644 index 0000000..614aeaf --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/PrintConfig.java @@ -0,0 +1,35 @@ +package com.chaozhanggui.system.cashierservice.rabbit.print; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + +import javax.annotation.PostConstruct; +import java.util.List; + +@Configuration +public class PrintConfig { + + private final YxyPrinter yxyPrinter; + private final FeiPrinter feiPrinter; + + public PrintConfig(YxyPrinter yxyPrinter, FeiPrinter feiPrinter) { + this.yxyPrinter = yxyPrinter; + this.feiPrinter = feiPrinter; + } + + // 初始化责任链 + @PostConstruct + public void initChain() { + yxyPrinter.setNextPrinter(feiPrinter); + feiPrinter.setNextPrinter(null); + } + + @Bean + @Primary + public PrinterHandler printerHandler() { + return yxyPrinter; + } + +} diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/PrinterHandler.java b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/PrinterHandler.java new file mode 100644 index 0000000..9008941 --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/PrinterHandler.java @@ -0,0 +1,153 @@ +package com.chaozhanggui.system.cashierservice.rabbit.print; + +import cn.hutool.core.lang.func.Func0; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.chaozhanggui.system.cashierservice.dao.TbProductMapper; +import com.chaozhanggui.system.cashierservice.dao.TbProductSkuMapper; +import com.chaozhanggui.system.cashierservice.dao.TbShopUserMapper; +import com.chaozhanggui.system.cashierservice.entity.*; +import com.chaozhanggui.system.cashierservice.model.CategoryInfo; +import com.chaozhanggui.system.cashierservice.model.OrderDetailPO; +import com.chaozhanggui.system.cashierservice.util.DateUtils; +import com.chaozhanggui.system.cashierservice.util.JSONUtil; +import com.chaozhanggui.system.cashierservice.util.PrinterUtils; +import com.chaozhanggui.system.cashierservice.util.Utils; +import lombok.Setter; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@Slf4j +@ToString +public abstract class PrinterHandler { + @Setter + protected PrinterHandler nextPrinter; + protected String printerBrand; + + private final TbProductMapper tbProductMapper; + private final TbProductSkuMapper tbProductSkuMapper; + private final TbShopUserMapper tbShopUserMapper; + + public PrinterHandler(String printerBrand, TbProductMapper productMapper, TbProductSkuMapper tbProductSkuMapper, TbShopUserMapper tbShopUserMapper) { + this.printerBrand = printerBrand; + this.tbProductMapper = productMapper; + this.tbProductSkuMapper = tbProductSkuMapper; + this.tbShopUserMapper = tbShopUserMapper; + } + + protected void print(TbPrintMachine machine, boolean isReturn, TbOrderInfo orderInfo, List tbOrderDetailList) { + String configStr = machine.getConfig(); + Utils.checkValueUnReturn(configStr, "打印机配置为空"); + JSONObject config = JSONObject.parseObject(configStr); + String model = JSONObject.parseObject(configStr).getString("model"); + + List categoryInfos = JSONUtil.parseJSONStr2TList(config.getJSONArray("categoryList").toString(), CategoryInfo.class); + + switch (model) { + case "one": + tbOrderDetailList.forEach(item -> { + log.info("开始打印退单菜品,商品名:{}", item.getProductName()); + // 台位费不打印 + if (item.getProductId().equals(-999)) { + log.info("台位费商品,不打印"); + return; + } + String categoryId = tbProductMapper.selectByPrimaryKey(item.getProductId()).getCategoryId(); + TbProductSkuWithBLOBs sku = tbProductSkuMapper.selectByPrimaryKey(item.getProductSkuId()); + if (sku == null) { + log.error("商品不存在, id: {}", item.getProductSkuId()); + return; + } + + long count = categoryInfos.stream().filter(c -> + c.getId().toString().equals(categoryId) + ).count(); + + if (count == 0) { + log.warn("分类未添加菜品: {} : {}", item.getProductName(), sku.getSpecSnap()); + return; + } + + String remark = StrUtil.isNotBlank(sku.getSpecSnap()) ? sku.getSpecSnap() : ""; + item.setRemark(remark); + String data; + String voiceJson; + if (isReturn) { + returnDishesPrint(orderInfo, item, machine); + } else { + normalDishesPrint(orderInfo, item, machine); + } + }); + break; + case "normal": + if (tbOrderDetailList.isEmpty()) { + log.info("待打印列表为空"); + return; + } + List detailList = new ArrayList<>(); + tbOrderDetailList.forEach(it -> { + TbProductSkuWithBLOBs tbProductSkuWithBLOBs = tbProductSkuMapper.selectByPrimaryKey(it.getProductSkuId()); + String remark = ""; + if (ObjectUtil.isNotEmpty(tbProductSkuWithBLOBs) && ObjectUtil.isNotEmpty(tbProductSkuWithBLOBs.getSpecSnap())) { + remark = tbProductSkuWithBLOBs.getSpecSnap(); + } + OrderDetailPO.Detail detail = new OrderDetailPO.Detail(it.getProductName(), it.getNum().toString(), it.getPriceAmount().toPlainString(), remark); + detailList.add(detail); + + }); + String balance = "0"; + + if ("deposit".equals(orderInfo.getPayType())) { + TbShopUser user = tbShopUserMapper.selectByPrimaryKey(Integer.valueOf(orderInfo.getMemberId())); + if (ObjectUtil.isNotEmpty(user) && ObjectUtil.isNotEmpty(user.getAmount())) { + balance = user.getAmount().toPlainString(); + } + } + + if (!detailList.isEmpty()) { + if (isReturn) { + returnOrderPrint(orderInfo, machine, balance, detailList); + + } else { + normalOrderPrint(orderInfo, machine, balance, detailList); + + } + } + default: + log.warn("未知打印类型: {}", model); + } + } + + public void handleRequest(TbPrintMachine machine, boolean isReturn, TbOrderInfo orderInfo, List tbOrderDetailList) { + if (canHandleRequest(machine.getContentType(), machine.getConnectionType())) { + log.info("打印机: {}, 是否退款单: {}, 订单信息: {}, 订单详情信息: {}", machine, isReturn, orderInfo, tbOrderDetailList); + print(machine, isReturn, orderInfo, tbOrderDetailList); + } else if (nextPrinter != null) { + log.info("当前打印机无法处理: {},将请求传递给下一个打印机:{}...", this, nextPrinter); + nextPrinter.handleRequest(machine, isReturn, orderInfo, tbOrderDetailList); + } else { + log.warn("未找到匹配打印机"); + } + } + + protected abstract void returnDishesPrint(TbOrderInfo orderInfo, TbOrderDetail orderDetail, TbPrintMachine machine); + + protected abstract void normalDishesPrint(TbOrderInfo orderInfo, TbOrderDetail orderDetail, TbPrintMachine machine); + + protected abstract void returnOrderPrint(TbOrderInfo orderInfo, TbPrintMachine machine, String balance, List detailList); + + protected abstract void normalOrderPrint(TbOrderInfo orderInfo, TbPrintMachine machine, String balance, List detailList); + + // 抽象方法,子类实现判断能否处理请求 + boolean canHandleRequest(String currentBrand, String connectType) { + log.info("handle判断是否可处理: {}, 连接类型: {}, handler类型: {}", currentBrand, connectType, printerBrand); + Utils.checkValueUnReturn(printerBrand, "打印机品牌未赋值"); + return printerBrand.equals(currentBrand) && "network".equals(connectType); + } +} diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/YxyPrinter.java b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/YxyPrinter.java new file mode 100644 index 0000000..2c317fc --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/YxyPrinter.java @@ -0,0 +1,86 @@ +package com.chaozhanggui.system.cashierservice.rabbit.print; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.chaozhanggui.system.cashierservice.dao.TbProductMapper; +import com.chaozhanggui.system.cashierservice.dao.TbProductSkuMapper; +import com.chaozhanggui.system.cashierservice.dao.TbShopInfoMapper; +import com.chaozhanggui.system.cashierservice.dao.TbShopUserMapper; +import com.chaozhanggui.system.cashierservice.entity.TbOrderDetail; +import com.chaozhanggui.system.cashierservice.entity.TbOrderInfo; +import com.chaozhanggui.system.cashierservice.entity.TbPrintMachine; +import com.chaozhanggui.system.cashierservice.entity.TbShopInfo; +import com.chaozhanggui.system.cashierservice.model.OrderDetailPO; +import com.chaozhanggui.system.cashierservice.util.DateUtils; +import com.chaozhanggui.system.cashierservice.util.PrinterUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.List; + +@Slf4j +@Component +public class YxyPrinter extends PrinterHandler{ + private final TbShopInfoMapper shopInfoMapper; + + public YxyPrinter(TbShopInfoMapper shopInfoMapper, TbProductMapper productMapper, TbProductSkuMapper productSkuMapper, TbShopUserMapper shopUserMapper) { + super("yxyPrinter", productMapper, productSkuMapper, shopUserMapper); + this.shopInfoMapper = shopInfoMapper; + } + + + @Override + protected void returnDishesPrint(TbOrderInfo orderInfo, TbOrderDetail orderDetail, TbPrintMachine machine) { + String data = PrinterUtils.getPrintData("return", + StrUtil.isBlank(orderInfo.getTableName()) ? orderInfo.getMasterId() : orderInfo.getTableName(), + DateUtils.getTime(new Date(orderInfo.getCreatedAt())), orderDetail.getProductName(), Math.abs(orderDetail.getNum()), orderDetail.getRemark()); + String voiceJson = "{\"bizType\":\"2\",\"content\":\"您有一笔退款订单,请及时处理\"}"; + PrinterUtils.printTickets(voiceJson, 3, 1, machine.getAddress(), data); + } + + @Override + protected void normalDishesPrint(TbOrderInfo orderInfo, TbOrderDetail orderDetail, TbPrintMachine machine) { + String data = PrinterUtils.getPrintData("", orderInfo.getMasterId(), + DateUtils.getTime(new Date(orderInfo.getCreatedAt())), orderDetail.getProductName(), + orderDetail.getNum(), orderDetail.getRemark()); + String voiceJson = "{\"bizType\":\"2\",\"content\":\"您有一笔新的订单,请及时处理\"}"; + PrinterUtils.printTickets(voiceJson, 3, 1, machine.getAddress(), data); + } + + @Override + protected void returnOrderPrint(TbOrderInfo orderInfo, TbPrintMachine machine, String balance, List detailList) { + TbShopInfo shopInfo = shopInfoMapper.selectByPrimaryKey(Integer.valueOf(orderInfo.getShopId())); + OrderDetailPO detailPO = new OrderDetailPO(shopInfo.getShopName(), "普通打印", + ObjectUtil.isEmpty(orderInfo.getMasterId()) || + ObjectUtil.isNull(orderInfo.getMasterId()) ? orderInfo.getTableName() : orderInfo.getMasterId(), + orderInfo.getOrderNo(), DateUtils.getTime(new Date(orderInfo.getCreatedAt())), + "【POS-1】001", orderInfo.getPayAmount().toPlainString(), balance, orderInfo.getPayType(), + "0", detailList, orderInfo.getRemark(), null, null); + + String printType = "退款单"; + + String data = PrinterUtils.getCashPrintData(detailPO, printType, "return"); + String voiceJson = "{\"bizType\":\"2\",\"content\":\"您有一笔新的订单,请及时处理\"}"; + PrinterUtils.printTickets(voiceJson, 1, 1, machine.getAddress(), data); + } + + @Override + protected void normalOrderPrint(TbOrderInfo orderInfo, TbPrintMachine machine, String balance, List detailList) { + TbShopInfo shopInfo = shopInfoMapper.selectByPrimaryKey(Integer.valueOf(orderInfo.getShopId())); + + OrderDetailPO detailPO = new OrderDetailPO(shopInfo.getShopName(), "普通打印", + orderInfo.getOrderType().equals("miniapp") ? orderInfo.getTableName() : orderInfo.getMasterId(), + orderInfo.getOrderNo(), DateUtils.getTime(new Date(orderInfo.getCreatedAt())), + "【POS-1】001", orderInfo.getOrderAmount().toPlainString(), balance, + (ObjectUtil.isEmpty(orderInfo.getPayType()) || ObjectUtil.isNull(orderInfo.getPayType()) ? "" : orderInfo.getPayType()), + "0", detailList, orderInfo.getRemark(), orderInfo.getDiscountAmount() != null ? orderInfo.getDiscountAmount().toPlainString() : null, + orderInfo.getDiscountRatio() != null ? orderInfo.getDiscountRatio().toPlainString() : null); + detailPO.setOutNumber(orderInfo.getOutNumber()); + String printType = "结算单"; + String data = PrinterUtils.getCashPrintData(detailPO, printType, orderInfo.getOrderType()); + String voiceJson = "{\"bizType\":\"2\",\"content\":\"您有一笔新的订单,请及时处理\"}"; + PrinterUtils.printTickets(voiceJson, 3, 1, machine.getAddress(), data); + } + +} diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/util/Utils.java b/src/main/java/com/chaozhanggui/system/cashierservice/util/Utils.java new file mode 100644 index 0000000..c15a1d7 --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/util/Utils.java @@ -0,0 +1,131 @@ +package com.chaozhanggui.system.cashierservice.util; + +import cn.hutool.core.lang.func.Func0; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.chaozhanggui.system.cashierservice.exception.MsgException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.redis.core.StringRedisTemplate; + +import java.util.UUID; +import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + +public class Utils { + public static int retryCount = 5; + private static final Logger log = LoggerFactory.getLogger(Utils.class); + + public static void catchErrNoReturn(Supplier supplier) { + try { + supplier.get(); + }catch (Exception e) { + log.error("执行方法出现异常", e); + } + } + + public static void runFunAndRetryNoReturn( + Supplier function, + Function check, Consumer errFun) { + log.info("工具类开始执行函数"); + R result = function.get(); + boolean flag = check.apply(result); + + log.info("执行结果: {}", result); + + while (flag && retryCount-- > 0) { + log.info("执行函数失败, 剩余尝试次数{}", retryCount); + result = function.get(); + log.info("执行结果: {}", result); + flag = check.apply(result); + } + + if (flag) { + errFun.accept(result); + } + } + + public static T runFunAndCheckKey(Supplier supplier, StringRedisTemplate redisTemplate, String lockKey) { + try{ + // 创建线程id, 用作判断 + String clientId = UUID.randomUUID().toString(); + // 设置分布式锁 + boolean lock = Boolean.TRUE.equals(redisTemplate.opsForValue().setIfAbsent(lockKey, clientId, 30, TimeUnit.MILLISECONDS)); + int count = 0; + while (!lock) { + if (count++ > 100) { + throw new MsgException("系统繁忙, 稍后再试"); + } + Thread.sleep(20); + lock = Boolean.TRUE.equals(redisTemplate.opsForValue().setIfAbsent(lockKey, clientId, 30, TimeUnit.MILLISECONDS)); + } + return supplier.get(); + } catch (RuntimeException e){ + log.info("执行出错:{}", e.getMessage()); + throw e; + } catch (InterruptedException e) { + throw new RuntimeException(e); + } finally{ + redisTemplate.delete(lockKey); + } + } + + public static R runFunAndRetry( + Supplier function, + Function check, Consumer errFun) { + log.info("工具类开始执行函数"); + R result = function.get(); + boolean flag = check.apply(result); + + log.info("执行结果: {}", result); + + while (flag && retryCount-- > 0) { + log.info("执行函数失败, 剩余尝试次数{}", retryCount); + result = function.get(); + log.info("执行结果: {}", result); + flag = check.apply(result); + } + + if (flag) { + errFun.accept(result); + } + return result; + } + + public static T checkValue(T data, String msg, Func0... errFunc) { + if (ObjectUtil.isEmpty(data)) { + for (Func0 tFunc0 : errFunc) { + try { + return tFunc0.call(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + throw new MsgException(msg); + } + return data; + } + + public static void checkValueUnReturn(Object data, String msg, Func0... errFunc) { + if(data == null) { + throw new MsgException(msg); + } + + if (data instanceof String && StrUtil.isBlank((String)data)) { + throw new MsgException(msg); + } + if (ObjectUtil.isEmpty(data)) { + for (Func0 tFunc0 : errFunc) { + try { + tFunc0.call(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + throw new MsgException(msg); + } + } +}