From 77fa9ac80fe5c60a196e437699d8b2bb7ed23546 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=89=9B=E5=8F=89=E9=97=AA=E9=97=AA?= <18322780655@163.com> Date: Mon, 9 Sep 2024 09:50:31 +0800 Subject: [PATCH 01/19] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=80=80=E6=AC=BE?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chaozhanggui/system/cashierservice/service/PayService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/service/PayService.java b/src/main/java/com/chaozhanggui/system/cashierservice/service/PayService.java index f4bc8a3..ad9071f 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/service/PayService.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/service/PayService.java @@ -1092,7 +1092,7 @@ public class PayService { TbShopInfo shopInfo = tbShopInfoMapper.selectByPrimaryKey(Integer.valueOf(orderInfo.getShopId())); - if ("0".equals(shopInfo.getIsReturn())) { + if ("1".equals(shopInfo.getIsReturn())) { if (ObjectUtil.isEmpty(pwd)) { return Result.fail(CodeEnum.PARAM); } From 668edeb23c89c3b39dac4b177535398e2da9f19f Mon Sep 17 00:00:00 2001 From: SongZhang <2064194730@qq.com> Date: Thu, 12 Sep 2024 11:20:31 +0800 Subject: [PATCH 02/19] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8D=95=E7=8B=AC?= =?UTF-8?q?=E6=89=93=E7=A5=A8=E7=9B=B8=E5=85=B3mq=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cashierservice/entity/TbOrderDetail.java | 4 +- .../cashierservice/entity/TbPrintMachine.java | 3 + .../entity/TbPrintMachineWithBLOBs.java | 5 +- .../mybatis/MPOrderDetailMapper.java | 8 + .../cashierservice/rabbit/PrintConsumer.java | 459 ++++++++++++++++++ .../cashierservice/rabbit/RabbitConfig.java | 41 +- .../rabbit/RabbitConstants.java | 9 + 7 files changed, 517 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/mybatis/MPOrderDetailMapper.java create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintConsumer.java diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbOrderDetail.java b/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbOrderDetail.java index f190219..deacaf4 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbOrderDetail.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbOrderDetail.java @@ -1,5 +1,6 @@ package com.chaozhanggui.system.cashierservice.entity; +import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; import java.io.Serializable; @@ -37,7 +38,8 @@ public class TbOrderDetail implements Serializable { private BigDecimal priceAmount; private BigDecimal packAmount; + @TableField(exist = false) private String remark; private static final long serialVersionUID = 1L; -} \ No newline at end of file +} diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbPrintMachine.java b/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbPrintMachine.java index e07c140..47111fb 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbPrintMachine.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbPrintMachine.java @@ -1,7 +1,10 @@ package com.chaozhanggui.system.cashierservice.entity; +import lombok.ToString; + import java.io.Serializable; +@ToString public class TbPrintMachine implements Serializable { private Integer id; diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbPrintMachineWithBLOBs.java b/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbPrintMachineWithBLOBs.java index c13b47f..3f61c1f 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbPrintMachineWithBLOBs.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbPrintMachineWithBLOBs.java @@ -1,7 +1,10 @@ package com.chaozhanggui.system.cashierservice.entity; +import lombok.ToString; + import java.io.Serializable; +@ToString public class TbPrintMachineWithBLOBs extends TbPrintMachine implements Serializable { private String config; @@ -24,4 +27,4 @@ public class TbPrintMachineWithBLOBs extends TbPrintMachine implements Serializa public void setCategoryList(String categoryList) { this.categoryList = categoryList == null ? null : categoryList.trim(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/mybatis/MPOrderDetailMapper.java b/src/main/java/com/chaozhanggui/system/cashierservice/mybatis/MPOrderDetailMapper.java new file mode 100644 index 0000000..695611b --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/mybatis/MPOrderDetailMapper.java @@ -0,0 +1,8 @@ +package com.chaozhanggui.system.cashierservice.mybatis; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.chaozhanggui.system.cashierservice.entity.TbCashierCart; +import com.chaozhanggui.system.cashierservice.entity.TbOrderDetail; + +public interface MPOrderDetailMapper extends BaseMapper { +} diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintConsumer.java b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintConsumer.java new file mode 100644 index 0000000..e89d34b --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintConsumer.java @@ -0,0 +1,459 @@ +package com.chaozhanggui.system.cashierservice.rabbit; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.chaozhanggui.system.cashierservice.dao.*; +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.mybatis.MPOrderDetailMapper; +import com.chaozhanggui.system.cashierservice.mybatis.MpPrintMachineMapper; +import com.chaozhanggui.system.cashierservice.util.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.rabbit.annotation.RabbitHandler; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.beans.factory.annotation.Autowired; +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.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; + +@Slf4j +@Component +@Service +public class PrintConsumer { + + + @Autowired + TbShopUserMapper tbShopUserMapper; + @Autowired + private TbOrderInfoMapper tbOrderInfoMapper; + @Autowired + private TbPrintMachineMapper tbPrintMachineMapper; + @Autowired + private TbCashierCartMapper tbCashierCartMapper; + @Autowired + private TbProductSkuMapper tbProductSkuMapper; + @Autowired + private TbShopInfoMapper tbShopInfoMapper; + + @Autowired + private TbProductMapper tbProductMapper; + + @Autowired + private TbOrderDetailMapper tbOrderDetailMapper; + @Autowired + + private RedisUtil redisUtils; + + private final RedisTemplate redisTemplate; + @Autowired + private MpPrintMachineMapper mpPrintMachineMapper; + @Autowired + private MPOrderDetailMapper mPOrderDetailMapper; + + public PrintConsumer(RedisTemplate redisTemplate) { + this.redisTemplate = redisTemplate; + } + + @RabbitListener(queues = {RabbitConstants.QUEUE_PRINT_DISHES}) + public void printDishesListener(JSONObject jsonObject) { + try { + log.info("打印消息mq 接收到打印菜品消息,消息内容: {}", jsonObject); + Integer orderId = jsonObject.getInteger("orderId"); + JSONArray orderDetailIds = jsonObject.getJSONArray("orderDetailIds"); + Boolean isReturn = jsonObject.getBoolean("isReturn"); + + TbOrderInfo orderInfo = tbOrderInfoMapper.selectByPrimaryKey(orderId); + if (ObjectUtil.isEmpty(orderInfo)) { + log.error("没有对应的订单信息"); + 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); + }); + }); + + } catch (Exception e) { + log.warn("打印菜品失败", e); + } + + } + + @RabbitListener(queues = {RabbitConstants.QUEUE_PRINT_PLACE}) + public void printPlaceListener(JSONObject jsonObject) { + try { + log.info("打印消息mq 接收到打印结算单消息,消息内容: {}", jsonObject); + Integer orderId = jsonObject.getInteger("orderId"); + Boolean isReturn = jsonObject.getBoolean("isReturn"); + + TbOrderInfo orderInfo = tbOrderInfoMapper.selectByPrimaryKey(orderId); + if (ObjectUtil.isEmpty(orderInfo)) { + log.error("没有对应的订单信息"); + return; + } + + TbShopInfo shopInfo = tbShopInfoMapper.selectByPrimaryKey(Integer.valueOf(orderInfo.getShopId())); + if (shopInfo == null) { + log.error("店铺信息不存在"); + return; + } + + 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); + }); + + } catch (Exception e) { + log.warn("打印菜品失败", e); + } + } + + + private List getPrintMachine(Integer shopId, String subType) { + TbShopInfo shopInfo = tbShopInfoMapper.selectByPrimaryKey(shopId); + if (ObjectUtil.isEmpty(shopInfo)) { + log.error("店铺信息不存在"); + return new ArrayList<>(); + } + + List list = mpPrintMachineMapper.selectList(new LambdaQueryWrapper() + .eq(TbPrintMachine::getStatus, 1) + .eq(TbPrintMachine::getShopId, shopId) + .eq(TbPrintMachine::getSubType, subType) + .eq(TbPrintMachine::getConnectionType, "network")); + if (list.isEmpty()) { + log.error("店铺未配置打印机,店铺id: {}", shopId); + return list; + } + log.info("打印机列表: {}", list); + return list; + + } + + + /** + * 打印菜品单 + * + * @param isReturn 是否退款单 + */ + private void printDishesTicket(boolean isReturn, TbPrintMachine tbPrintMachineWithBLOBs, TbOrderDetail item, TbOrderInfo orderInfo, List categoryInfos) { + log.info("开始打印一菜一品票据,商品名:{}", item.getProductName()); + if (item.getProductId().equals(-999)) { + 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) { + + data = PrinterUtils.getPrintData("return", + StrUtil.isBlank(orderInfo.getTableName()) ? orderInfo.getMasterId() : orderInfo.getTableName(), + DateUtils.getTime(new Date(orderInfo.getCreatedAt())), item.getProductName(), Math.abs(item.getNum()), remark); + voiceJson = "{\"bizType\":\"2\",\"content\":\"您有一笔退款订单,请及时处理\"}"; + PrinterUtils.printTickets(voiceJson, 3, 1, tbPrintMachineWithBLOBs.getAddress(), data); + + } else { + data = PrinterUtils.getPrintData("", orderInfo.getMasterId(), + DateUtils.getTime(new Date(orderInfo.getCreatedAt())), item.getProductName(), + item.getNum(), remark); + voiceJson = "{\"bizType\":\"2\",\"content\":\"您有一笔新的订单,请及时处理\"}"; + PrinterUtils.printTickets(voiceJson, 3, 1, tbPrintMachineWithBLOBs.getAddress(), data); + } + } + + /** + * 打印结算单 + */ + private void printPlaceTicket(boolean isReturn, TbPrintMachine printMachine, TbOrderInfo orderInfo, TbShopInfo shopInfo) { + + List tbOrderDetails = tbOrderDetailMapper.selectAllByOrderId(orderInfo.getId()); + if (!tbOrderDetails.isEmpty()) { + List detailList = new ArrayList<>(); + tbOrderDetails.parallelStream().forEach(it -> { + + TbProductSkuWithBLOBs tbProductSkuWithBLOBs = tbProductSkuMapper.selectByPrimaryKey(Integer.valueOf(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) { + 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, printMachine.getAddress(), data); + } else { + 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, printMachine.getAddress(), data); + } + } + } + } + + + private void fePrinter(TbPrintMachine tbPrintMachineWithBLOBs, String model, TbOrderInfo orderInfo, TbShopInfo shopInfo, String printerNum, List categoryInfos) { + String orderId = orderInfo.getId().toString(); + switch (tbPrintMachineWithBLOBs.getSubType()) { + case "label": //标签打印机 + List cashierCarts = tbCashierCartMapper.selectByOrderId(orderInfo.getId().toString(), "final"); + if (ObjectUtil.isNotEmpty(cashierCarts) && cashierCarts.size() > 0) { + cashierCarts.parallelStream().forEach(it -> { + + String categoryId; + if (ObjectUtil.isEmpty(it.getCategoryId())) { + categoryId = tbProductMapper.selectByPrimaryKey(Integer.valueOf(it.getProductId())).getCategoryId(); + } else { + categoryId = it.getCategoryId(); + } + + + Long count = categoryInfos.stream().filter(c -> + c.getId().toString().equals(categoryId) + ).count(); + + log.info("获取当前类别是否未打印类别:{}", count); + + + if (count > 0) { + TbProductSkuWithBLOBs tbProductSkuWithBLOBs = tbProductSkuMapper.selectByPrimaryKey(Integer.valueOf(it.getSkuId())); + String remark = ""; + if (ObjectUtil.isNotEmpty(tbProductSkuWithBLOBs) && ObjectUtil.isNotEmpty(tbProductSkuWithBLOBs.getSpecSnap())) { + remark = tbProductSkuWithBLOBs.getSpecSnap(); + } + for (int i = 0; i < it.getNumber(); i++) { + FeieyunPrintUtil.printLabelMsg(tbPrintMachineWithBLOBs.getAddress(), orderInfo.getTableName(), it.getName(), 1, DateUtils.getTimes(new Date(orderInfo.getCreatedAt())), it.getSalePrice().toPlainString(), remark); + } + } + }); + } + + break; + case "cash": //小票打印机 + switch (model) { + case "normal": //普通出单 + + if ("return".equals(orderInfo.getOrderType())) { + List tbOrderDetails = tbOrderDetailMapper.selectAllByOrderId(Integer.valueOf(orderId)); + if (ObjectUtil.isNotEmpty(tbOrderDetails) && tbOrderDetails.size() > 0) { + List detailList = new ArrayList<>(); + tbOrderDetails.parallelStream().forEach(it -> { + String categoryId = tbProductMapper.selectByPrimaryKey(Integer.valueOf(it.getProductId())).getCategoryId(); + + Long count = categoryInfos.stream().filter(c -> + c.getId().toString().equals(categoryId) + ).count(); + log.info("获取当前类别是否未打印类别:{}", count); + + + TbProductSkuWithBLOBs tbProductSkuWithBLOBs = tbProductSkuMapper.selectByPrimaryKey(Integer.valueOf(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 (ObjectUtil.isNotEmpty(detailList) && detailList.size() > 0) { +// OrderDetailPO detailPO = new OrderDetailPO(shopInfo.getShopName(), "普通打印", orderInfo.getMasterId(), orderInfo.getOrderNo(), DateUtils.getTime(new Date(orderInfo.getCreatedAt())), "【POS-1】001", orderInfo.getOrderAmount().toPlainString(), balance, orderInfo.getPayType(), "0", detailList); + 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.getOrderAmount().toPlainString(), balance, orderInfo.getPayType(), "0", detailList, orderInfo.getRemark(), orderInfo.getDiscountAmount().toPlainString(), orderInfo.getDiscountRatio().toPlainString()); + + String printType = "退款单"; + + String data = PrinterUtils.getCashPrintData(detailPO, printType, "return"); +// String voiceJson = "{\"bizType\":\"2\",\"content\":\"您有一笔新的订单,请及时处理\"}"; +// PrinterUtils.printTickets(voiceJson,1, Integer.valueOf(printerNum), tbPrintMachineWithBLOBs.getAddress(), data); + } + } + + + } else { + cashierCarts = cashierCarts = tbCashierCartMapper.selectByOrderId(orderInfo.getId().toString(), "final"); + + if (ObjectUtil.isNotEmpty(cashierCarts) && cashierCarts.size() > 0) { + List detailList = new ArrayList<>(); + cashierCarts.parallelStream().forEach(it -> { + String categoryId; + if (ObjectUtil.isEmpty(it.getCategoryId())) { + categoryId = tbProductMapper.selectByPrimaryKey(Integer.valueOf(it.getProductId())).getCategoryId(); + } else { + categoryId = it.getCategoryId(); + } + + + Long count = categoryInfos.stream().filter(c -> + c.getId().toString().equals(categoryId) + ).count(); + + if (count > 0) { + TbProductSkuWithBLOBs tbProductSkuWithBLOBs = tbProductSkuMapper.selectByPrimaryKey(Integer.valueOf(it.getSkuId())); + String remark = ""; + if (ObjectUtil.isNotEmpty(tbProductSkuWithBLOBs) && ObjectUtil.isNotEmpty(tbProductSkuWithBLOBs.getSpecSnap())) { + remark = tbProductSkuWithBLOBs.getSpecSnap(); + } + OrderDetailPO.Detail detail = new OrderDetailPO.Detail(it.getName(), it.getNumber().toString(), it.getTotalAmount().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 (ObjectUtil.isNotEmpty(detailList) && detailList.size() > 0) { + 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(), null, null); + String printType = "结算单"; + + if ("return".equals(orderInfo.getOrderType())) { + printType = "退款单"; + } + + + FeieyunPrintUtil.getCashPrintData(detailPO, tbPrintMachineWithBLOBs.getAddress(), printType, printType); + } + + } + } + + break; + case "one": //一菜一品 + + if (!orderInfo.getStatus().equals("unpaid")) { + return; + } + + cashierCarts = tbCashierCartMapper.selectByOrderId(orderId, "final"); + if (ObjectUtil.isNotEmpty(cashierCarts) && cashierCarts.size() > 0) { + + cashierCarts.parallelStream().forEach(it -> { + + String categoryId; + if (ObjectUtil.isEmpty(it.getCategoryId())) { + categoryId = tbProductMapper.selectByPrimaryKey(Integer.valueOf(it.getProductId())).getCategoryId(); + } else { + categoryId = it.getCategoryId(); + } + + + Long count = categoryInfos.stream().filter(c -> + c.getId().toString().equals(categoryId) + ).count(); + + if (count > 0) { + TbProductSkuWithBLOBs tbProductSkuWithBLOBs = tbProductSkuMapper.selectByPrimaryKey(Integer.valueOf(it.getSkuId())); + String remark = ""; + if (ObjectUtil.isNotEmpty(tbProductSkuWithBLOBs) && ObjectUtil.isNotEmpty(tbProductSkuWithBLOBs.getSpecSnap())) { + remark = tbProductSkuWithBLOBs.getSpecSnap(); + } + + + FeieyunPrintUtil.getPrintData(tbPrintMachineWithBLOBs.getAddress(), orderInfo.getMasterId(), DateUtils.getTime(new Date(orderInfo.getCreatedAt())), it.getName(), it.getNumber(), remark); + } + }); + } + break; + case "category": //分类出单 + break; + } + + break; + case "kitchen": //出品打印机 + break; + } + } + + +} diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/RabbitConfig.java b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/RabbitConfig.java index b5e93f3..25a4ef5 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/RabbitConfig.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/RabbitConfig.java @@ -15,20 +15,20 @@ import org.springframework.context.annotation.Scope; @Configuration public class RabbitConfig { - + @Value("${spring.rabbitmq.host}") private String host; - + @Value("${spring.rabbitmq.port}") private int port; - + @Value("${spring.rabbitmq.username}") private String username; - + @Value("${spring.rabbitmq.password}") private String password; - - + + @Bean public ConnectionFactory connectionFactory() { @@ -39,7 +39,7 @@ public class RabbitConfig { connectionFactory.setPublisherConfirms(true); return connectionFactory; } - + @Bean @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) //必须是prototype类型 @@ -51,12 +51,12 @@ public class RabbitConfig { public DirectExchange defaultExchange_Register() { return new DirectExchange(RabbitConstants.CART_ORDER_COLLECT_PUT); } - + @Bean public Queue queuePut_Register() { return new Queue(RabbitConstants.CART_ORDER_COLLECT_QUEUE_PUT, true); //队列持久 } - + @Bean public Binding bindingPut_Register() { return BindingBuilder.bind(queuePut_Register()).to(defaultExchange_Register()).with(RabbitConstants.CART_ORDER_COLLECT_ROUTINGKEY_PUT); @@ -142,7 +142,28 @@ public class RabbitConfig { } + // 打印出票 + @Bean + DirectExchange printExchange() { + return new DirectExchange(RabbitConstants.EXCHANGE_PRINT); + } + @Bean + Queue printDishesQueue() { + return new Queue(RabbitConstants.QUEUE_PRINT_DISHES); + } + @Bean + Binding bindingDishedPrint(Queue printDishesQueue, DirectExchange printExchange) { + return BindingBuilder.bind(printDishesQueue).to(printExchange).with(RabbitConstants.ROUTING_KEY_PRINT_DISHES); + } + @Bean + Queue printPlaceQueue() { + return new Queue(RabbitConstants.QUEUE_PRINT_PLACE); + } + @Bean + Binding bindingPlacePrint(Queue printPlaceQueue, DirectExchange printExchange) { + return BindingBuilder.bind(printPlaceQueue).to(printExchange).with(RabbitConstants.ROUTING_KEY_PRINT_PLACE); + } -} \ No newline at end of file +} diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/RabbitConstants.java b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/RabbitConstants.java index e0e1a0f..c506f13 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/RabbitConstants.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/RabbitConstants.java @@ -58,4 +58,13 @@ public interface RabbitConstants { public static final String BALANCE_QUEUE_PUT="balance_queue_put"; public static final String BALANCE_ROUTINGKEY_PUT="balance_routingkey_put"; + + // 打印出票 + String EXCHANGE_PRINT = "exchange.print"; + // 菜品打印 + String QUEUE_PRINT_DISHES = "queue.dishes.print"; + String ROUTING_KEY_PRINT_DISHES = "routing.dishes.print"; + // 下单打印 + String QUEUE_PRINT_PLACE = "queue.place.order.print"; + String ROUTING_KEY_PRINT_PLACE = "routing.place.order.print"; } From 2695748ab7c0dfe46309b26c932be648c33e753a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=89=9B=E5=8F=89=E9=97=AA=E9=97=AA?= <18322780655@163.com> Date: Thu, 12 Sep 2024 14:08:03 +0800 Subject: [PATCH 03/19] =?UTF-8?q?=E6=B7=BB=E5=8A=A0pcpay=20=E6=94=AF?= =?UTF-8?q?=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/PayController.java | 106 +++++++ .../system/cashierservice/entity/OrderVo.java | 2 + .../interceptor/LimitSubmitAspect.java | 14 +- .../interceptor/WebAppConfigurer.java | 3 + .../cashierservice/model/PaymentReq.java | 7 + .../cashierservice/service/OrderService.java | 20 +- .../cashierservice/service/PayService.java | 280 ++++++++++++++++++ .../thirdpay/req/ApppayReq.java | 48 +++ .../cashierservice/thirdpay/req/H5payReq.java | 47 +++ .../cashierservice/thirdpay/req/JspayReq.java | 53 ++++ .../thirdpay/req/ScanpayReq.java | 35 +++ .../thirdpay/resp/ApppayResp.java | 51 ++++ .../thirdpay/resp/H5payResp.java | 50 ++++ .../thirdpay/resp/JspayResp.java | 50 ++++ .../thirdpay/resp/ScanpayResp.java | 49 +++ .../thirdpay/service/ThirdPayService.java | 208 ++++++++++++- .../cashierservice/util/WechatUtil.java | 18 ++ 17 files changed, 1015 insertions(+), 26 deletions(-) create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/req/ApppayReq.java create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/req/H5payReq.java create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/req/JspayReq.java create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/req/ScanpayReq.java create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/resp/ApppayResp.java create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/resp/H5payResp.java create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/resp/JspayResp.java create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/resp/ScanpayResp.java diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/controller/PayController.java b/src/main/java/com/chaozhanggui/system/cashierservice/controller/PayController.java index aed11ff..9104fda 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/controller/PayController.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/controller/PayController.java @@ -1,5 +1,13 @@ package com.chaozhanggui.system.cashierservice.controller; +import com.alibaba.fastjson.JSONObject; +import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayClient; +import com.alipay.api.DefaultAlipayClient; +import com.alipay.api.request.AlipaySystemOauthTokenRequest; +import com.alipay.api.request.AlipayUserInfoShareRequest; +import com.alipay.api.response.AlipaySystemOauthTokenResponse; +import com.alipay.api.response.AlipayUserInfoShareResponse; import com.chaozhanggui.system.cashierservice.annotation.LimitSubmit; import com.chaozhanggui.system.cashierservice.entity.TbOrderDetail; import com.chaozhanggui.system.cashierservice.entity.dto.ReturnGroupOrderDto; @@ -10,14 +18,18 @@ import com.chaozhanggui.system.cashierservice.sign.CodeEnum; import com.chaozhanggui.system.cashierservice.sign.Result; import com.chaozhanggui.system.cashierservice.util.IpUtil; import com.chaozhanggui.system.cashierservice.util.RedisCst; +import com.chaozhanggui.system.cashierservice.util.WechatUtil; +import com.fasterxml.jackson.core.JsonProcessingException; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.annotations.Param; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; import java.util.List; +import java.util.Objects; @CrossOrigin(origins = "*") @RestController @@ -278,4 +290,98 @@ public class PayController { ){ return payService.getOrderDiscount(staffId, orderId, token); } + + + @RequestMapping("pcscanpay") + @LimitSubmit(key = "pcscanpay:%s") + public Result pcscanpay(HttpServletRequest request,@RequestBody PaymentReq paymentReq){ + try { + return payService.pcscanpay(paymentReq.getOrderId(),IpUtil.getIpAddr(request),paymentReq.getUserId(),paymentReq.getPayType()); + } catch (Exception e) { + e.printStackTrace(); + } + return Result.fail(CodeEnum.FAIL); + } + + + @RequestMapping("createOrder") + public Result createOrder(HttpServletRequest request,@RequestBody PaymentReq paymentReq){ + try { + return payService.createOrder(IpUtil.getIpAddr(request),paymentReq.getUserId(),paymentReq.getPayType(),paymentReq.getShopId(),paymentReq.getPayAmount()); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + return Result.fail(CodeEnum.FAIL); + + } + + + + + + + + + + + @Value("${wx.ysk.appId}") + private String appId; + + @Value("${wx.ysk.secrete}") + private String secrete; + + + + @Value("${ali.appId}") + private String aliAppId; + + @Value("${ali.privateKey}") + private String privateKey; + + @Value("${ali.publicKey}") + private String publicKey; + + + + /** + * 获取支付宝或微信openId + * @param code + * @return + */ + @GetMapping("/openId") + public Result getOpenId( + @RequestParam String code, + @RequestParam String payType + ) throws AlipayApiException { + + if("WECHAT".equals(payType)){ + JSONObject SessionKeyOpenId = WechatUtil.getSessionKeyOrOpenId(code, appId, secrete); + log.info("SessionKeyOpenId:{}",SessionKeyOpenId.toString()); + String openid = SessionKeyOpenId.getString("openid"); + if(Objects.isNull(openid)){ + return Result.fail("获取微信id失败"); + } + + return Result.success(CodeEnum.SUCCESS,openid); + }else if("ALIPAY".equals(payType)){ + + AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",aliAppId,privateKey,"json","GBK",publicKey,"RSA2"); + AlipayUserInfoShareRequest request = new AlipayUserInfoShareRequest(); + AlipayUserInfoShareResponse response = alipayClient.execute(request,code); + log.info("AlipayUserInfoShareResponse:{}",JSONObject.toJSONString(response)); + if(!response.isSuccess()){ + return Result.fail("获取支付宝userId失败"); + } + + return Result.success(CodeEnum.SUCCESS,response.getUserId()); + } + + return Result.fail(CodeEnum.FAIL); + } + + + + + + } diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/entity/OrderVo.java b/src/main/java/com/chaozhanggui/system/cashierservice/entity/OrderVo.java index 6eafc7b..8a0b924 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/entity/OrderVo.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/entity/OrderVo.java @@ -15,4 +15,6 @@ public class OrderVo { private String tableId; private Integer vipUserId; private Integer type; + + private String sendType; } diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/LimitSubmitAspect.java b/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/LimitSubmitAspect.java index f0fae54..3b6fe93 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/LimitSubmitAspect.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/LimitSubmitAspect.java @@ -86,13 +86,6 @@ public class LimitSubmitAspect { Object[] args= joinPoint.getArgs(); String orderId=orderId(method,args); - - - - - - - LimitSubmit limitSubmit = method.getAnnotation(LimitSubmit.class); String redisKey = limitSubmit.key(); String key = getRedisKey1(joinPoint, redisKey,orderId); @@ -205,6 +198,13 @@ public class LimitSubmitAspect { if(o instanceof List){ orderId= ((List)o).get(0).getOrderId().toString(); } + }else if("pcscanpay".equals(method.getName())){ + Object o=args[1]; + + if(o instanceof PaymentReq){ + orderId=((PaymentReq)o).getOrderId(); + } + } return orderId; diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/WebAppConfigurer.java b/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/WebAppConfigurer.java index ff4c376..2aa9cb5 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/WebAppConfigurer.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/WebAppConfigurer.java @@ -28,6 +28,9 @@ public class WebAppConfigurer implements WebMvcConfigurer { .excludePathPatterns("/order/sendMessage") .excludePathPatterns("/order/getOrderById") .excludePathPatterns("/data/handoverprint") + .excludePathPatterns("/pay/pcscanpay") + .excludePathPatterns("/pay/openId") + .excludePathPatterns("/pay/createOrder") ; diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/model/PaymentReq.java b/src/main/java/com/chaozhanggui/system/cashierservice/model/PaymentReq.java index e04a67b..dc8b2df 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/model/PaymentReq.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/model/PaymentReq.java @@ -22,5 +22,12 @@ public class PaymentReq implements Serializable { private String memberCode; + private String payType; + + private String userId; + + private String shopId; + + } diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/service/OrderService.java b/src/main/java/com/chaozhanggui/system/cashierservice/service/OrderService.java index 8e13866..178ca2a 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/service/OrderService.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/service/OrderService.java @@ -717,15 +717,27 @@ public class OrderService { for (TbCashierCart cashierCart : list) { + + TbOrderDetail orderDetail = new TbOrderDetail(); + TbProductWithBLOBs product=tbProductMapper.selectByPrimaryKey(Integer.valueOf(cashierCart.getProductId())); + if("takeaway".equals(orderVo.getSendType())||"takeself".equals(orderVo.getSendType())){ + if(Objects.nonNull(product.getPackFee())){ + packAMount = packAMount.add(product.getPackFee()); + orderDetail.setPackAmount(product.getPackFee()); + } + } + + + TbProductSkuWithBLOBs tbProduct = tbProductSkuMapper.selectByPrimaryKey(Integer.valueOf(cashierCart.getSkuId())); totalAmount = totalAmount.add(cashierCart.getTotalAmount()); - packAMount = packAMount.add(cashierCart.getPackFee()); + feeAmount = cashierCart.getPackFee(); if (Objects.nonNull(tbProduct)) { saleAmount = saleAmount.add(tbProduct.getSalePrice()); } skuMap.put(tbProduct.getId(), tbProduct); - TbOrderDetail orderDetail = new TbOrderDetail(); + orderDetail.setCreateTime(new Date()); orderDetail.setNum(cashierCart.getNumber()); orderDetail.setPrice(cashierCart.getSalePrice()); @@ -739,7 +751,6 @@ public class OrderService { orderDetail.setProductSkuName(tbProduct.getSpecSnap()); orderDetail.setProductName(cashierCart.getName()); orderDetail.setShopId(orderVo.getShopId()); - orderDetail.setPackAmount(cashierCart.getPackFee()); orderDetail.setStatus("unpaid"); orderDetail.setProductImg(cashierCart.getCoverImg()); masterId = cashierCart.getMasterId(); @@ -774,10 +785,11 @@ public class OrderService { orderInfo.setTradeDay(DateUtils.getDay()); orderInfo.setUserId(orderVo.getUserId()); orderInfo.setUseType(StrUtil.isNotBlank(orderVo.getTableId()) ? "postPay" : "afterPay"); + orderInfo.setPackFee(packAMount); tbOrderInfoMapper.updateByPrimaryKeySelective(orderInfo); } else { orderInfo = new TbOrderInfo(orderNo, totalAmount, packAMount, totalAmount, saleAmount, totalAmount, feeAmount, "", - "table", "cash", orderVo.getMerchantId().toString(), orderVo.getShopId().toString(), + orderVo.getSendType(), "cash", orderVo.getMerchantId().toString(), orderVo.getShopId().toString(), "", (byte) 1, day, masterId); orderInfo.setMasterId(orderVo.getMasterId()); orderInfo.setRemark(orderVo.getRemark()); diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/service/PayService.java b/src/main/java/com/chaozhanggui/system/cashierservice/service/PayService.java index 1dedc66..b146960 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/service/PayService.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/service/PayService.java @@ -24,6 +24,8 @@ import com.chaozhanggui.system.cashierservice.sign.Result; import com.chaozhanggui.system.cashierservice.thirdpay.resp.*; import com.chaozhanggui.system.cashierservice.thirdpay.service.ThirdPayService; import com.chaozhanggui.system.cashierservice.util.*; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import com.github.pagehelper.PageInfo; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -1738,6 +1740,284 @@ public class PayService { } + public Result pcscanpay(String orderId,String ip,String userId,String payType) throws JsonProcessingException { + if (ObjectUtil.isEmpty(orderId) || ObjectUtil.isEmpty(ip)) { + return Result.fail(CodeEnum.PARAM); + } + + TbOrderInfo orderInfo = tbOrderInfoMapper.selectByPrimaryKey(Integer.valueOf(orderId)); + + if (ObjectUtil.isEmpty(orderInfo)) { + return Result.fail(CodeEnum.ORDERNOEXIST); + } + + + if (!"unpaid".equals(orderInfo.getStatus()) && !"paying".equals(orderInfo.getStatus())) { + return Result.fail(CodeEnum.ORDERSTATUSERROR); + } + + + + List cashierCarts = tbCashierCartMapper.selectByOrderId(orderId, null); + if (ObjectUtil.isEmpty(cashierCarts) || ObjectUtil.isNull(cashierCarts)) { + return Result.fail(CodeEnum.CARTEXIST); + } + + StringBuffer body = new StringBuffer(); + for (TbCashierCart cashierCart : cashierCarts) { + body.append(cashierCart.getName()); + } + if (ObjectUtil.isNull(orderInfo.getMerchantId()) || ObjectUtil.isEmpty(orderInfo.getMerchantId())) { + return Result.fail(CodeEnum.NOCUSTOMER); + } + + + TbMerchantThirdApply thirdApply = tbMerchantThirdApplyMapper.selectByPrimaryKey(Integer.valueOf(orderInfo.getMerchantId())); + if (ObjectUtil.isEmpty(thirdApply) || ObjectUtil.isNull(thirdApply)) { + return Result.fail(CodeEnum.NOCUSTOMER); + } + + + + TbOrderPayment payment = tbOrderPaymentMapper.selectByOrderId(orderId); + if (ObjectUtil.isEmpty(payment) || payment == null) { + payment = new TbOrderPayment(); + payment.setPayTypeId("ysk"); + payment.setAmount(orderInfo.getOrderAmount()); + payment.setPaidAmount(orderInfo.getPayAmount()); + payment.setHasRefundAmount(BigDecimal.ZERO); + payment.setReceived(payment.getAmount()); + payment.setChangeFee(BigDecimal.ZERO); + payment.setMemberId(orderInfo.getMemberId()); + payment.setShopId(orderInfo.getShopId()); + payment.setOrderId(orderInfo.getId().toString()); + payment.setCreatedAt(System.currentTimeMillis()); + payment.setAuthCode(""); + tbOrderPaymentMapper.insert(payment); + } else { + payment.setAuthCode(""); + payment.setUpdatedAt(System.currentTimeMillis()); + tbOrderPaymentMapper.updateByPrimaryKey(payment); + } + + + orderInfo.setPayAmount(orderInfo.getOrderAmount()); + orderInfo.setUpdatedAt(System.currentTimeMillis()); + tbOrderInfoMapper.updateByPrimaryKeySelective(orderInfo); + + + String reqbody = ""; + + if (body.length() > 15) { + reqbody = body.substring(0, 6).concat("....").concat(body.substring(body.length() - 6, body.length())); + } else { + reqbody = body.toString(); + } + + PublicResp publicResp = thirdPayService.jspay(url,thirdApply.getAppId(),thirdApply.getAppToken(),reqbody,reqbody,orderInfo.getOrderAmount().multiply(new BigDecimal(100)).longValue(),payType,"WECHAT".equals(payType)?thirdApply.getSmallAppid():null,userId,ip,DateUtils.getSsdfTimes(),thirdApply.getStoreId(),backUrl,backUrl); + + + if (ObjectUtil.isNotNull(publicResp) && ObjectUtil.isNotEmpty(publicResp)) { + if ("000000".equals(publicResp.getCode())) { + JspayResp scanpayResp = publicResp.getObjData(); + if ("TRADE_SUCCESS".equals(scanpayResp.getState())) { + + payment.setTradeNumber(scanpayResp.getPayOrderId()); + payment.setUpdatedAt(System.currentTimeMillis()); + tbOrderPaymentMapper.updateByPrimaryKeySelective(payment); + + //处理支付成功的订单 + orderInfo.setStatus("closed"); + orderInfo.setPayOrderNo(scanpayResp.getPayOrderId()); + tbOrderInfoMapper.updateByPrimaryKeySelective(orderInfo); + + //更新购物车状态 + int cartCount = tbCashierCartMapper.updateByOrderId(orderId, "final"); + log.info("更新购物车:{}", cartCount); + + if(ObjectUtil.isNotNull(orderInfo.getDiscountRatio())&&ObjectUtil.isNotEmpty(orderInfo.getDiscountRatio())){ + tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed",orderInfo.getDiscountRatio()); + }else { + tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed",null); + } + +// JSONObject jsonObject = new JSONObject(); +// jsonObject.put("token", token); +// jsonObject.put("type", "create"); +// jsonObject.put("orderId", orderId); +// +// producer.putOrderCollect(jsonObject.toJSONString()); +// +// producer.printMechine(orderId); + + + ObjectMapper mapper = new ObjectMapper(); + return Result.success(CodeEnum.SUCCESS, mapper.readTree(scanpayResp.getPayInfo())); + + }else if("TRADE_AWAIT".equals(scanpayResp.getState())){ + orderInfo.setStatus("paying"); + orderInfo.setPayOrderNo(payment.getTradeNumber()); + tbOrderInfoMapper.updateByPrimaryKeySelective(orderInfo); + + payment.setTradeNumber(scanpayResp.getPayOrderId()); + payment.setUpdatedAt(System.currentTimeMillis()); + tbOrderPaymentMapper.updateByPrimaryKeySelective(payment); + + + if("WECHAT".equals(scanpayResp.getPayType())){ + orderInfo.setPayType("WECHAT"); + }else if("ALIPAY".equals(scanpayResp.getPayType())){ + orderInfo.setPayType("ALIPAY"); + }else if("UNIONPAY".equals(scanpayResp.getPayType())){ + orderInfo.setPayType("UNIONPAY"); + } + + + tbOrderInfoMapper.updateByPrimaryKey(orderInfo); + + + ObjectMapper mapper = new ObjectMapper(); + return Result.success(CodeEnum.PAYING,mapper.readTree(scanpayResp.getPayInfo())); + } + } + } + + return Result.fail(CodeEnum.FAIL); + + } + + + public String generateOrderNumber() { + String date = DateUtils.getSdfTimes(); + Random random = new Random(); + int randomNum = random.nextInt(900) + 100; + return "QR" + date + randomNum; + } + + + public Result createOrder(String ip,String userId,String payType,String shopId,BigDecimal amount) throws JsonProcessingException { + + TbShopInfo shopInfo= tbShopInfoMapper.selectByPrimaryKey(Integer.valueOf(shopId)); + + if(ObjectUtil.isNull(shopInfo)){ + return Result.fail(CodeEnum.SHOPINFONOEXIST); + } + + + + TbOrderInfo orderInfo=new TbOrderInfo(); + + String orderNo = generateOrderNumber(); + orderInfo.setOrderNo(orderNo); + orderInfo.setSettlementAmount(amount); + orderInfo.setPackFee(BigDecimal.ZERO); + orderInfo.setOriginAmount(amount); + orderInfo.setPayAmount(amount); + orderInfo.setAmount(amount); + orderInfo.setRefundAmount(BigDecimal.ZERO); + orderInfo.setPayType(payType); + orderInfo.setPayAmount(amount); + orderInfo.setOrderAmount(amount); + orderInfo.setSendType("QR"); + orderInfo.setStatus("WAIT_PAY"); + orderInfo.setMerchantId(shopInfo.getMerchantId()); + orderInfo.setShopId(shopId); + orderInfo.setRefundAble(Byte.valueOf("1")); + orderInfo.setSystemTime(System.currentTimeMillis()); + orderInfo.setCreatedAt(System.currentTimeMillis()); + orderInfo.setIsAccepted(Byte.valueOf("1")); + orderInfo.setTradeDay(DateUtils.getDay()); + + tbOrderInfoMapper.insert(orderInfo); + + + TbOrderPayment payment = tbOrderPaymentMapper.selectByOrderId(orderInfo.getId().toString()); + if (ObjectUtil.isEmpty(payment) || payment == null) { + payment = new TbOrderPayment(); + payment.setPayTypeId("ysk"); + payment.setAmount(orderInfo.getOrderAmount()); + payment.setPaidAmount(orderInfo.getPayAmount()); + payment.setHasRefundAmount(BigDecimal.ZERO); + payment.setReceived(payment.getAmount()); + payment.setChangeFee(BigDecimal.ZERO); + payment.setMemberId(orderInfo.getMemberId()); + payment.setShopId(orderInfo.getShopId()); + payment.setOrderId(orderInfo.getId().toString()); + payment.setCreatedAt(System.currentTimeMillis()); + payment.setAuthCode(""); + tbOrderPaymentMapper.insert(payment); + } else { + payment.setAuthCode(""); + payment.setUpdatedAt(System.currentTimeMillis()); + tbOrderPaymentMapper.updateByPrimaryKey(payment); + } + + + + + TbMerchantThirdApply thirdApply = tbMerchantThirdApplyMapper.selectByPrimaryKey(Integer.valueOf(orderInfo.getMerchantId())); + if (ObjectUtil.isEmpty(thirdApply) || ObjectUtil.isNull(thirdApply)) { + return Result.fail(CodeEnum.NOCUSTOMER); + } + + String reqbody = "店铺收款码"; + + + PublicResp publicResp = thirdPayService.jspay(url,thirdApply.getAppId(),thirdApply.getAppToken(),reqbody,reqbody,orderInfo.getOrderAmount().multiply(new BigDecimal(100)).longValue(),payType,"WECHAT".equals(payType)?thirdApply.getSmallAppid():null,userId,ip,DateUtils.getSsdfTimes(),thirdApply.getStoreId(),backUrl,backUrl); + + + if (ObjectUtil.isNotNull(publicResp) && ObjectUtil.isNotEmpty(publicResp)) { + if ("000000".equals(publicResp.getCode())) { + JspayResp scanpayResp = publicResp.getObjData(); + if ("TRADE_SUCCESS".equals(scanpayResp.getState())) { + + payment.setTradeNumber(scanpayResp.getPayOrderId()); + payment.setUpdatedAt(System.currentTimeMillis()); + tbOrderPaymentMapper.updateByPrimaryKeySelective(payment); + + //处理支付成功的订单 + orderInfo.setStatus("closed"); + orderInfo.setPayOrderNo(scanpayResp.getPayOrderId()); + tbOrderInfoMapper.updateByPrimaryKeySelective(orderInfo); + + + ObjectMapper mapper = new ObjectMapper(); + return Result.success(CodeEnum.SUCCESS, mapper.readTree(scanpayResp.getPayInfo())); + + } else if ("TRADE_AWAIT".equals(scanpayResp.getState())) { + orderInfo.setStatus("paying"); + orderInfo.setPayOrderNo(payment.getTradeNumber()); + tbOrderInfoMapper.updateByPrimaryKeySelective(orderInfo); + + payment.setTradeNumber(scanpayResp.getPayOrderId()); + payment.setUpdatedAt(System.currentTimeMillis()); + tbOrderPaymentMapper.updateByPrimaryKeySelective(payment); + + + if ("WECHAT".equals(scanpayResp.getPayType())) { + orderInfo.setPayType("WECHAT"); + } else if ("ALIPAY".equals(scanpayResp.getPayType())) { + orderInfo.setPayType("ALIPAY"); + } else if ("UNIONPAY".equals(scanpayResp.getPayType())) { + orderInfo.setPayType("UNIONPAY"); + } + + + ObjectMapper mapper = new ObjectMapper(); + return Result.success(CodeEnum.PAYING, mapper.readTree(scanpayResp.getPayInfo())); + } + } + } + return Result.fail(CodeEnum.FAIL); + } + + + + + + + + public static void main(String[] args) { System.out.println(MD5Util.encrypt("123456".concat("13718478323").concat("10"))); } diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/req/ApppayReq.java b/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/req/ApppayReq.java new file mode 100644 index 0000000..663dca6 --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/req/ApppayReq.java @@ -0,0 +1,48 @@ +package com.chaozhanggui.system.cashierservice.thirdpay.req; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class ApppayReq implements Serializable { + + + private String subject; + + private String body; + + private Long amount; + + private String currency="cny"; + + /** + * 微信 WECHAT; + * 支付宝 ALIPAY + */ + private String payType; + + private String clientIp; + + private String mchOrderNo; + + private String storeId; + + private String notifyUrl; + + private String returnUrl; + + + public ApppayReq(String subject, String body, Long amount, String currency, String payType, String clientIp, String mchOrderNo, String storeId, String notifyUrl, String returnUrl) { + this.subject = subject; + this.body = body; + this.amount = amount; + this.currency = currency; + this.payType = payType; + this.clientIp = clientIp; + this.mchOrderNo = mchOrderNo; + this.storeId = storeId; + this.notifyUrl = notifyUrl; + this.returnUrl = returnUrl; + } +} diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/req/H5payReq.java b/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/req/H5payReq.java new file mode 100644 index 0000000..3d0e7bd --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/req/H5payReq.java @@ -0,0 +1,47 @@ +package com.chaozhanggui.system.cashierservice.thirdpay.req; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class H5payReq implements Serializable { + + private String subject; + + private String body; + + private Long amount; + + private String currency="cny"; + + /** + * 微信 WECHAT; + * 支付宝 ALIPAY + */ + private String payType; + + private String clientIp; + + private String mchOrderNo; + + private String storeId; + + private String notifyUrl; + + private String returnUrl; + + + public H5payReq(String subject, String body, Long amount, String currency, String payType, String clientIp, String mchOrderNo, String storeId, String notifyUrl, String returnUrl) { + this.subject = subject; + this.body = body; + this.amount = amount; + this.currency = currency; + this.payType = payType; + this.clientIp = clientIp; + this.mchOrderNo = mchOrderNo; + this.storeId = storeId; + this.notifyUrl = notifyUrl; + this.returnUrl = returnUrl; + } +} diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/req/JspayReq.java b/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/req/JspayReq.java new file mode 100644 index 0000000..fa23350 --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/req/JspayReq.java @@ -0,0 +1,53 @@ +package com.chaozhanggui.system.cashierservice.thirdpay.req; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class JspayReq implements Serializable { + + private String subject; + + private String body; + + private Long amount; + + private String currency="cny"; + + /** + * 微信 WECHAT; + * 支付宝 ALIPAY + */ + private String payType; + + + private String subAppid; + + private String userId; + + private String clientIp; + + private String mchOrderNo; + + private String storeId; + + private String notifyUrl; + + private String returnUrl; + + public JspayReq(String subject, String body, Long amount, String currency, String payType, String subAppid, String userId, String clientIp, String mchOrderNo, String storeId, String notifyUrl, String returnUrl) { + this.subject = subject; + this.body = body; + this.amount = amount; + this.currency = currency; + this.payType = payType; + this.subAppid = subAppid; + this.userId = userId; + this.clientIp = clientIp; + this.mchOrderNo = mchOrderNo; + this.storeId = storeId; + this.notifyUrl = notifyUrl; + this.returnUrl = returnUrl; + } +} diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/req/ScanpayReq.java b/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/req/ScanpayReq.java new file mode 100644 index 0000000..a2d1c4b --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/req/ScanpayReq.java @@ -0,0 +1,35 @@ +package com.chaozhanggui.system.cashierservice.thirdpay.req; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class ScanpayReq implements Serializable { + + private String subject; + + private String body; + + private Long amount; + + private String currency="cny"; + + private String clientIp; + + private String mchOrderNo; + + private String storeId; + + + + public ScanpayReq(String subject, String body, Long amount, String currency, String clientIp, String mchOrderNo, String storeId) { + this.subject = subject; + this.body = body; + this.amount = amount; + this.currency = currency; + this.clientIp = clientIp; + this.mchOrderNo = mchOrderNo; + this.storeId = storeId; + } +} diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/resp/ApppayResp.java b/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/resp/ApppayResp.java new file mode 100644 index 0000000..6ce4f11 --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/resp/ApppayResp.java @@ -0,0 +1,51 @@ +package com.chaozhanggui.system.cashierservice.thirdpay.resp; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class ApppayResp implements Serializable { + + private Long amount; + + private String mchOrderNo; + + private String payOrderId; + + private String mercNo; + + private String channelSendNo; + + private String channelTradeNo; + + private String state; + + private String payType; + + private String ifCode; + + private String extParam; + + private String payInfo; + + private String liteInfo; + + private String note; + + private String tradeFee; + + private String storeId; + + private String subject; + + private String drType; + + private String refundAmt; + + private String refundState; + + private String cashFee; + + private String settlementType; +} diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/resp/H5payResp.java b/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/resp/H5payResp.java new file mode 100644 index 0000000..b825b91 --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/resp/H5payResp.java @@ -0,0 +1,50 @@ +package com.chaozhanggui.system.cashierservice.thirdpay.resp; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class H5payResp implements Serializable { + + + private Long amount; + + private String mchOrderNo; + + private String payOrderId; + + private String mercNo; + + private String channelSendNo; + + private String channelTradeNo; + + private String state; + + private String payType; + + private String ifCode; + + private String extParam; + + private String payInfo; + + private String note; + + private String tradeFee; + + private String storeId; + + private String subject; + + private String drType; + + private String refundAmt; + + private String refundState; + + private String cashFee; + + private String settlementType; +} diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/resp/JspayResp.java b/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/resp/JspayResp.java new file mode 100644 index 0000000..1627d68 --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/resp/JspayResp.java @@ -0,0 +1,50 @@ +package com.chaozhanggui.system.cashierservice.thirdpay.resp; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class JspayResp implements Serializable { + + + private Long amount; + + private String mchOrderNo; + + private String payOrderId; + + private String mercNo; + + private String channelSendNo; + + private String channelTradeNo; + + private String state; + + private String payType; + + private String ifCode; + + private String extParam; + + private String payInfo; + + private String note; + + private String tradeFee; + + private String storeId; + + private String subject; + + private String drType; + + private String refundAmt; + + private String refundState; + + private String cashFee; + + private String settlementType; +} diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/resp/ScanpayResp.java b/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/resp/ScanpayResp.java new file mode 100644 index 0000000..a7aac73 --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/resp/ScanpayResp.java @@ -0,0 +1,49 @@ +package com.chaozhanggui.system.cashierservice.thirdpay.resp; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class ScanpayResp implements Serializable { + + private Long amount; + + private String mchOrderNo; + + private String payOrderId; + + private String mercNo; + + private String channelSendNo; + + private String channelTradeNo; + + private String state; + + private String payType; + + private String ifCode; + + private String extParam; + + private String payInfo; + + private String note; + + private String tradeFee; + + private String storeId; + + private String subject; + + private String drType; + + private String refundAmt; + + private String refundState; + + private String cashFee; + + private String settlementType; +} diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/service/ThirdPayService.java b/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/service/ThirdPayService.java index d65d07e..63083eb 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/service/ThirdPayService.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/service/ThirdPayService.java @@ -29,6 +29,13 @@ public class ThirdPayService { private static String refund="/api/open/order/refund"; + private static String scanpay="/api/open/payment/scanpay"; + + private static String h5pay="/api/open/payment/h5pay"; + + private static String jspay="/api/open/payment/jspay"; + + private static String apppay="/api/open/payment/apppay"; /** * 被扫接口 * @param url @@ -47,14 +54,14 @@ public class ThirdPayService { public PublicResp mainScan(String url,String appId, String subject, String body, Long amount, String subAppId, String authCode, String orderNo, String storeId, String notifyUrl, String key ) { - MainScanReq mainScanReq=null; - if("66bab943ae82f63b50ae3cff".equals(appId)){ - - mainScanReq = new MainScanReq(subject, body, amount, subAppId, "cny", authCode, orderNo, storeId, notifyUrl,1,"TA1824003985261588482",null); - url="https://paymentweb.sxczgkj.cn"; - }else { - mainScanReq = new MainScanReq(subject, body, amount, subAppId, "cny", authCode, orderNo, storeId, notifyUrl,0,null,null); - } + MainScanReq mainScanReq= new MainScanReq(subject, body, amount, subAppId, "cny", authCode, orderNo, storeId, notifyUrl,0,null,null);; +// if("66bab943ae82f63b50ae3cff".equals(appId)){ +// +// mainScanReq = new MainScanReq(subject, body, amount, subAppId, "cny", authCode, orderNo, storeId, notifyUrl,1,"TA1824003985261588482",null); +// url="https://paymentweb.sxczgkj.cn"; +// }else { +// mainScanReq = new MainScanReq(subject, body, amount, subAppId, "cny", authCode, orderNo, storeId, notifyUrl,0,null,null); +// } @@ -108,13 +115,13 @@ public class ThirdPayService { String clinetIp,String orderNo, String storeId, String notifyUrl,String returnUrl, String key){ - WxScanPayReq scanPayReq=null; - if("66bab943ae82f63b50ae3cff".equals(appId)){ - scanPayReq=new WxScanPayReq(subject,body,amount,"cny",payType,subAppId,userId,clinetIp,orderNo,storeId,1,null,"TA1824003985261588482",notifyUrl,returnUrl); - url="https://paymentweb.sxczgkj.cn"; - }else { - scanPayReq=new WxScanPayReq(subject,body,amount,"cny",payType,subAppId,userId,clinetIp,orderNo,storeId,0,null,null,notifyUrl,returnUrl); - } + WxScanPayReq scanPayReq=new WxScanPayReq(subject,body,amount,"cny",payType,subAppId,userId,clinetIp,orderNo,storeId,0,null,null,notifyUrl,returnUrl); +// if("66bab943ae82f63b50ae3cff".equals(appId)){ +// scanPayReq=new WxScanPayReq(subject,body,amount,"cny",payType,subAppId,userId,clinetIp,orderNo,storeId,1,null,"TA1824003985261588482",notifyUrl,returnUrl); +// url="https://paymentweb.sxczgkj.cn"; +// }else { +// scanPayReq=new WxScanPayReq(subject,body,amount,"cny",payType,subAppId,userId,clinetIp,orderNo,storeId,0,null,null,notifyUrl,returnUrl); +// } PublicParam param=new PublicParam(appId,null,SignTypeEnum.MD5.getValue(),null,DateUtils.getSdfTimes(), "1.0", String.valueOf(System.currentTimeMillis())); @@ -247,6 +254,177 @@ public class ThirdPayService { } + /** + * Pc 扫码支付 + * @param url + * @param appId + * @param key + * @param subject + * @param body + * @param amount + * @param clientIp + * @param mchOrderNo + * @param storeId + * @param notifyUrl + * @param returnUrl + * @return + */ + public PublicResp pcscanpay(String url,String appId,String key,String subject, String body, Long amount, String clientIp, String mchOrderNo, String storeId, String notifyUrl, String returnUrl ){ + ScanpayReq scanpayReq=new ScanpayReq(subject, body, amount, "cny", clientIp, mchOrderNo, storeId); + PublicParam param=new PublicParam(appId,null,SignTypeEnum.MD5.getValue(), null,DateUtils.getSdfTimes(),"1.0",String.valueOf(System.currentTimeMillis())); + try { + String str=JSONUtil.toJSONString(sortFields(scanpayReq)); + param.setBizData(str); + String tt = sortFieldsAndPrint(param); + String MD5 = tt.concat("appSecret=" + key); + log.info("加签原传:{}", MD5); + String sign = MD5Util.encrypt(MD5); + param.setSign(sign); + String reqbody = JSONUtil.toJSONString(param); + log.info("请求参数:{}", reqbody); + String response = HttpRequest.post(url.concat(scanpay)).body(reqbody).execute().body(); + log.info("返回结果:{}", response); + PublicResp resp =JSONUtil.parseJSONStr2T(response,PublicResp.class); + resp.setObjData(JSONUtil.parseJSONStr2T(resp.getBizData(),ScanpayResp.class)); + return resp; + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + + /** + * 手机网页支付 + * @param url + * @param appId + * @param key + * @param subject + * @param body + * @param amount + * @param payType + * @param clientIp + * @param mchOrderNo + * @param storeId + * @param notifyUrl + * @param returnUrl + * @return + */ + public PublicResp h5Pay(String url,String appId,String key,String subject, String body, Long amount, String payType, String clientIp, String mchOrderNo, String storeId, String notifyUrl, String returnUrl){ + H5payReq h5payReq=new H5payReq(subject, body, amount, "cny", payType, clientIp, mchOrderNo, storeId, notifyUrl, returnUrl); + + PublicParam param=new PublicParam(appId,null,SignTypeEnum.MD5.getValue(), null,DateUtils.getSdfTimes(),"1.0",String.valueOf(System.currentTimeMillis())); + try { + String str=JSONUtil.toJSONString(sortFields(h5payReq)); + param.setBizData(str); + String tt = sortFieldsAndPrint(param); + String MD5 = tt.concat("appSecret=" + key); + log.info("加签原传:{}", MD5); + String sign = MD5Util.encrypt(MD5); + param.setSign(sign); + String reqbody = JSONUtil.toJSONString(param); + log.info("请求参数:{}", reqbody); + String response = HttpRequest.post(url.concat(h5pay)).body(reqbody).execute().body(); + log.info("返回结果:{}", response); + PublicResp resp =JSONUtil.parseJSONStr2T(response,PublicResp.class); + resp.setObjData(JSONUtil.parseJSONStr2T(resp.getBizData(),H5payResp.class)); + return resp; + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + + } + + /** + * 公众号/生活号/银联js支付 + * @param url + * @param appId + * @param key + * @param subject + * @param body + * @param amount + * @param payType + * @param subAppid + * @param userId + * @param clientIp + * @param mchOrderNo + * @param storeId + * @param notifyUrl + * @param returnUrl + * @return + */ + public PublicResp jspay(String url,String appId,String key,String subject, String body, Long amount, String payType, String subAppid, String userId, String clientIp, String mchOrderNo, String storeId, String notifyUrl, String returnUrl){ + JspayReq jspayReq=new JspayReq(subject, body, amount, "cny", payType, subAppid, userId, clientIp, mchOrderNo, storeId, notifyUrl, returnUrl); + + PublicParam param=new PublicParam(appId,null,SignTypeEnum.MD5.getValue(), null,DateUtils.getSdfTimes(),"1.0",String.valueOf(System.currentTimeMillis())); + try { + String str=JSONUtil.toJSONString(sortFields(jspayReq)); + param.setBizData(str); + String tt = sortFieldsAndPrint(param); + String MD5 = tt.concat("appSecret=" + key); + log.info("加签原传:{}", MD5); + String sign = MD5Util.encrypt(MD5); + param.setSign(sign); + String reqbody = JSONUtil.toJSONString(param); + log.info("请求参数:{}", reqbody); + String response = HttpRequest.post(url.concat(jspay)).body(reqbody).execute().body(); + log.info("返回结果:{}", response); + PublicResp resp =JSONUtil.parseJSONStr2T(response,PublicResp.class); + resp.setObjData(JSONUtil.parseJSONStr2T(resp.getBizData(),JspayResp.class)); + return resp; + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + + /*** + * app 支付 + * @param url + * @param appId + * @param key + * @param subject + * @param body + * @param amount + * @param payType + * @param clientIp + * @param mchOrderNo + * @param storeId + * @param notifyUrl + * @param returnUrl + * @return + */ + + public PublicResp apppay(String url,String appId,String key,String subject, String body, Long amount, String payType, String clientIp, String mchOrderNo, String storeId, String notifyUrl, String returnUrl){ + ApppayReq apppayReq=new ApppayReq(subject, body, amount, "cny", payType, clientIp, mchOrderNo, storeId, notifyUrl, returnUrl); + + + PublicParam param=new PublicParam(appId,null,SignTypeEnum.MD5.getValue(), null,DateUtils.getSdfTimes(),"1.0",String.valueOf(System.currentTimeMillis())); + try { + String str=JSONUtil.toJSONString(sortFields(apppayReq)); + param.setBizData(str); + String tt = sortFieldsAndPrint(param); + String MD5 = tt.concat("appSecret=" + key); + log.info("加签原传:{}", MD5); + String sign = MD5Util.encrypt(MD5); + param.setSign(sign); + String reqbody = JSONUtil.toJSONString(param); + log.info("请求参数:{}", reqbody); + String response = HttpRequest.post(url.concat(apppay)).body(reqbody).execute().body(); + log.info("返回结果:{}", response); + PublicResp resp =JSONUtil.parseJSONStr2T(response,PublicResp.class); + resp.setObjData(JSONUtil.parseJSONStr2T(resp.getBizData(),ApppayResp.class)); + return resp; + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + + + + + + diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/util/WechatUtil.java b/src/main/java/com/chaozhanggui/system/cashierservice/util/WechatUtil.java index e778af7..2a389ce 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/util/WechatUtil.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/util/WechatUtil.java @@ -101,4 +101,22 @@ public class WechatUtil { throw new RuntimeException(linkedHashMap.getOrDefault(resObj.get("errcode") + "", "未知错误")); } + + + public static JSONObject getSessionKeyOrOpenId(String code, String appId, String secrete) { + String requestUrl = "https://api.weixin.qq.com/sns/jscode2session"; + Map requestUrlParam = new HashMap<>(); + // https://mp.weixin.qq.com/wxopen/devprofile?action=get_profile&token=164113089&lang=zh_CN + //小程序appId + requestUrlParam.put("appid", appId); + //小程序secret + requestUrlParam.put("secret", secrete); + //小程序端返回的code + requestUrlParam.put("js_code", code); + //默认参数 + requestUrlParam.put("grant_type", "authorization_code"); + //发送post请求读取调用微信接口获取openid用户唯一标识 + JSONObject jsonObject = JSON.parseObject(HttpClientUtil.doPost(requestUrl,requestUrlParam)); + return jsonObject; + } } From 73bad5713a852026293b99ee4e87400a4697ed68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=89=9B=E5=8F=89=E9=97=AA=E9=97=AA?= <18322780655@163.com> Date: Thu, 12 Sep 2024 14:08:19 +0800 Subject: [PATCH 04/19] =?UTF-8?q?=E6=B7=BB=E5=8A=A0pcpay=20=E6=94=AF?= =?UTF-8?q?=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 8 ++++++++ src/main/resources/application.yml | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/pom.xml b/pom.xml index 6c09948..6440f19 100644 --- a/pom.xml +++ b/pom.xml @@ -212,6 +212,14 @@ + + + + com.alipay.sdk + alipay-sdk-java + 4.39.208.ALL + + diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 7c61761..110ae23 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -60,6 +60,10 @@ wx: appId: wxd88fffa983758a30 secrete: a34a61adc0602118b49400baa8812454 warnMsgTmpId: AV-KybUHaK3KtFVLqpy6PHccHBS7XeX__mOM4RbufnQ +ali: + appId: 2021003175619219 + privateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCInywsrhhiSNj7jjOB4/zL79pAaLzoYOuOqHeQELxgXrVFmpqJ7y76wniu4nrHKfp4jQVIHw4+IkBsTNwABTPiryVzAQ4ydb/opzn4zblWRB4S7mAgnc2wqO4FMcwSOiHh7uPFAqvB8oZmEizlbXIJSiDFd3rqG2l8ZADjwuwM0nue1fUJLu65d2B6NDFgBIa11enkrNyX9uPiaeIFW62lvTN1W2AUqTJLvfko5ejExGUDkie6g5W5MIvUSKfq7sDkpt5IoQCooBzjJJ/Ckfw/rJlqoPDFzUSiANBABwu0jAJ42MGYdJ8+dyDDUNla20xmMjXbRtUe5roVzJrrgMjFAgMBAAECggEAPKPx9o77sbxF2zod8JxiW57Fj+stVjOWuoZaM27KPjgrW46o42pvvsvMx0stVfNzAkkNvBpUtw167Nccm0Gz6vz0sVwZkhojqT94gs/FYN3xP1PhBPkmEDCbHWEiBEEbQu5G2O47kGV2dB3DIb53bFoju6Ixw3GRW64DmxSss2+ZsErAWPBwbxIbUDGzIxtGhuWrvWX6pSnnvs+PNNqyoisXnh4cDjrmS9qSgsgcL4D0HwNGTsG1uBeLx4g3D2vKKqhP1osEly91P0QAGzcpuvKqeJ2ZwfFMDlabeOyqRQxFW/FLT2DuY1KmBhcGx6tjDMo7EEpVJ7NHcSHYfAa6wQKBgQDzZbIAV7shEiwS6ZwLSbeMvJkWELJtmEGk/qI/01tULHmrwDh8FIjbrHZrQNXruZ+dS+RObahCKywjYVEr/g15v5vv4yA20bmUgmO27/mVj6mpwvoHYBn0H/511a6V7lopFlCA735K+liFZ6ZW+qZxV8gkZ3/ZZDUy1LSArQmg8QKBgQCPsiK+mUdvs+1ReDm09RessbastXgYvj6UWIsPHc4Mxx/6R8qgy9nt2n2u95cK2uONtpNWswpDtOeWVakuHSKHbdG7Xz0DlklHuzin2JhOBwBu36HAVDjWPF+JDcVkUz7hFWFwl0DawRijFBcr0OV6GUoUURB21xtRnrQPmK/lFQKBgHPWFE7hceedVGhz0ZX1sWtDXsAHlkNeUO+LWAB0QGTg/c7lnnw+8ZtKitkkdCrJntMniTJiMc+76De2WwFK2XL14+rY9z3ftiidnYM01l19j8uBRak47WEn0NyXo40rcLFZM1sJn9tjJbnnyFxg0dHjaxcYQtpdPIxCet06fPihAoGAfaqJ3CnsYXH3H4KG5Qxa8fpRCWWCbBEkZVOx+TxVkLMr8hOKz2i3Y93qgHOisimPS8XZwL6/QUsaJU0wsVVldw7Blp3JnDN4TrUa7R7sw4A4Dr6glLSTKDiQTCmw8PYkTXAHURHV8/le9G+DfBwqM8eeE3p5bZTdHVovmlwrp6kCgYEA7uTSOa0phZ7ts++FVdEZf9TI/B4tRuP4aT31BHs9UoCW1g01/NEEBDiHV9udq9B6Cd5onq+QFj4jiwakTNzXjhQZqgmag1TBE9VpahLxYAD5pYn/Tvm8l5vWuSKcOSwQb2lDg5R2/bmCJRV/QHRkdkAAhHGC/TrOskUCRgosUac= + publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiQkrz+emAuS1mB3KKDOMmAZRd/BlPbh7fAIHAqAj1+QCZNcV3o2BTLIIqnuKpSlFXDG3uDzp2VsBxcizXuBbFyPGylnD9CgCj5abyh3+FIHPAZ2IM3TtpqImZ0TSPGXrMli4Nir7MvZktgccCqQKCC4o6iaDGz+UwWwJUIPna8fm2tiTZ+KH150CZbKVj4ZGNpBh5XSV/1dRgyQIV9D/EwSbkZ0n6VgKQLJBi0C2UE3QB17aL1Ir6+gDXIDbknN8O7GUD3aMGdThYdSRUb5wp9CZ5qfV7vCS/CgaRo38nhH3NOzkTL+7v0m1ZDHPmqEkn9VzZN6sCQdL7PoAOjHOCwIDAQAB mybatis-plus: From 6a9f084df10957a904e1ecdd0489ed455c5521a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=89=9B=E5=8F=89=E9=97=AA=E9=97=AA?= <18322780655@163.com> Date: Thu, 12 Sep 2024 14:34:19 +0800 Subject: [PATCH 05/19] =?UTF-8?q?=E6=B7=BB=E5=8A=A0pcpay=20=E6=94=AF?= =?UTF-8?q?=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/cashierservice/service/PayService.java | 10 ++++++++++ .../system/cashierservice/util/WechatUtil.java | 5 +++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/service/PayService.java b/src/main/java/com/chaozhanggui/system/cashierservice/service/PayService.java index b146960..0f03308 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/service/PayService.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/service/PayService.java @@ -1897,6 +1897,16 @@ public class PayService { public Result createOrder(String ip,String userId,String payType,String shopId,BigDecimal amount) throws JsonProcessingException { + if(ObjectUtil.isNull(userId)||ObjectUtil.isEmpty(userId)||ObjectUtil.isEmpty(payType)||ObjectUtil.isNull(payType) + + ||ObjectUtil.isNull(shopId)||ObjectUtil.isEmpty(shopId)||ObjectUtil.isNull(shopId)||ObjectUtil.isNull(amount)||ObjectUtil.isEmpty(amount) + ){ + return Result.fail(CodeEnum.PARAM); + } + + if(!"WECHAT".equals(payType)||!"ALIPAY".equals(payType)){ + return Result.fail(CodeEnum.PARAM); + } TbShopInfo shopInfo= tbShopInfoMapper.selectByPrimaryKey(Integer.valueOf(shopId)); if(ObjectUtil.isNull(shopInfo)){ diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/util/WechatUtil.java b/src/main/java/com/chaozhanggui/system/cashierservice/util/WechatUtil.java index 2a389ce..6bb4a48 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/util/WechatUtil.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/util/WechatUtil.java @@ -104,7 +104,7 @@ public class WechatUtil { public static JSONObject getSessionKeyOrOpenId(String code, String appId, String secrete) { - String requestUrl = "https://api.weixin.qq.com/sns/jscode2session"; + String requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?"; Map requestUrlParam = new HashMap<>(); // https://mp.weixin.qq.com/wxopen/devprofile?action=get_profile&token=164113089&lang=zh_CN //小程序appId @@ -112,10 +112,11 @@ public class WechatUtil { //小程序secret requestUrlParam.put("secret", secrete); //小程序端返回的code - requestUrlParam.put("js_code", code); + requestUrlParam.put("code", code); //默认参数 requestUrlParam.put("grant_type", "authorization_code"); //发送post请求读取调用微信接口获取openid用户唯一标识 + log.info("请求参数:{}",JSONUtil.toJSONString(requestUrlParam)); JSONObject jsonObject = JSON.parseObject(HttpClientUtil.doPost(requestUrl,requestUrlParam)); return jsonObject; } From 3029e6c8bec2c123505c436c3f31197e00b61eb2 Mon Sep 17 00:00:00 2001 From: SongZhang <2064194730@qq.com> Date: Fri, 13 Sep 2024 10:10:43 +0800 Subject: [PATCH 06/19] =?UTF-8?q?=E9=A3=9E=E9=B9=85=E6=89=93=E5=8D=B0?= =?UTF-8?q?=E6=9C=BA=E6=89=93=E5=8D=B0=E8=8F=9C=E5=93=81=E5=B0=8F=E7=A5=A8?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E4=BD=BF=E7=94=A8=E7=B1=BB=E5=9E=8B=E5=8C=BA?= =?UTF-8?q?=E5=88=86type?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/cashierservice/rabbit/PrintMechineConsumer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintMechineConsumer.java b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintMechineConsumer.java index a60b8a0..e867773 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintMechineConsumer.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintMechineConsumer.java @@ -674,7 +674,9 @@ public class PrintMechineConsumer { break; case "one": //一菜一品 - if (!orderInfo.getStatus().equals("unpaid")) { + if (orderInfo.getPayType() != null + && "postPay".equals(orderInfo.getPayType()) + && !orderInfo.getStatus().equals("unpaid")) { return; } From 724d5fc2dad30ffa9c36dff7b67a578cc85badd3 Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Fri, 13 Sep 2024 10:45:03 +0800 Subject: [PATCH 07/19] =?UTF-8?q?=E5=BA=97=E9=93=BA=E4=BF=A1=E6=81=AF=20?= =?UTF-8?q?=E8=BF=90=E8=90=A5=E6=A8=A1=E5=BC=8F=20restaurant=20=E9=A4=90?= =?UTF-8?q?=E9=A5=AE=E7=89=88=20=E5=85=88=E4=B8=8B=E5=8D=95=E5=90=8E?= =?UTF-8?q?=E6=94=AF=E4=BB=98=20munchies=20=20=20=E5=BF=AB=E9=A4=90?= =?UTF-8?q?=E7=89=88=EF=BC=88=E5=85=88=E6=94=AF=E4=BB=98=E5=90=8E=E4=B8=8B?= =?UTF-8?q?=E5=8D=95=EF=BC=89=20=E6=98=AF=E5=90=A6=E5=BC=80=E5=90=AF?= =?UTF-8?q?=E6=A1=8C=E4=BD=8D=E8=B4=B9=200=E5=90=A61=E6=98=AF=20=E6=A1=8C?= =?UTF-8?q?=E4=BD=8D=E8=B4=B9=20=E5=B0=B1=E9=A4=90=E6=A8=A1=E5=BC=8F=20=20?= =?UTF-8?q?=E5=A0=82=E9=A3=9F=20dine-in=20=20=E5=A4=96=E5=B8=A6=20take-out?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ShopInfoController.java | 5 ++ .../cashierservice/entity/TbShopInfo.java | 53 +++++++++++++++++-- .../service/ShopInfoService.java | 4 ++ .../resources/mapper/TbShopInfoMapper.xml | 8 ++- 4 files changed, 66 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/controller/ShopInfoController.java b/src/main/java/com/chaozhanggui/system/cashierservice/controller/ShopInfoController.java index a6fb4e1..522c1a7 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/controller/ShopInfoController.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/controller/ShopInfoController.java @@ -17,6 +17,11 @@ public class ShopInfoController { @Autowired ShopInfoService shopInfoService; + @GetMapping("/queryShopInfo") + public Result queryShopInfo(@RequestParam Integer shopId){ + return shopInfoService.queryShopInfo(shopId); + } + @GetMapping("queryShopArea") public Result queryShopArea(@RequestHeader("token") String token, @RequestHeader("loginName") String loginName, diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbShopInfo.java b/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbShopInfo.java index b1a62cc..9ec0ae2 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbShopInfo.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbShopInfo.java @@ -105,9 +105,16 @@ public class TbShopInfo implements Serializable { private String isMemberReturn; - - - + //是否开启桌位费 0否1是 + private Integer isTableFee; + //桌位费 + private BigDecimal tableFee; + //就餐模式 堂食 dine-in 外带 take-out + private String eatModel; + //程序码(零点八零首页) + private String smallQrcode; + //店铺收款码 + private String paymentQrcode; private static final long serialVersionUID = 1L; @@ -495,4 +502,44 @@ public class TbShopInfo implements Serializable { public void setIsMemberReturn(String isMemberReturn) { this.isMemberReturn = isMemberReturn; } + + public Integer getIsTableFee() { + return isTableFee; + } + + public void setIsTableFee(Integer isTableFee) { + this.isTableFee = isTableFee; + } + + public BigDecimal getTableFee() { + return tableFee; + } + + public void setTableFee(BigDecimal tableFee) { + this.tableFee = tableFee; + } + + public String getEatModel() { + return eatModel; + } + + public void setEatModel(String eatModel) { + this.eatModel = eatModel; + } + + public String getSmallQrcode() { + return smallQrcode; + } + + public void setSmallQrcode(String smallQrcode) { + this.smallQrcode = smallQrcode; + } + + public String getPaymentQrcode() { + return paymentQrcode; + } + + public void setPaymentQrcode(String paymentQrcode) { + this.paymentQrcode = paymentQrcode; + } } \ No newline at end of file diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/service/ShopInfoService.java b/src/main/java/com/chaozhanggui/system/cashierservice/service/ShopInfoService.java index 48db52d..14e6f74 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/service/ShopInfoService.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/service/ShopInfoService.java @@ -53,6 +53,10 @@ public class ShopInfoService { this.orderInfoMapper = orderInfoMapper; } + public Result queryShopInfo(Integer shopId) { + return new Result(CodeEnum.SUCCESS,tbShopInfoMapper.selectByPrimaryKey(shopId)); + } + public Result queryShopArea(String shopId){ List list= tbShopAreaMapper.selectByShopId(shopId); return Result.success(CodeEnum.SUCCESS,list); diff --git a/src/main/resources/mapper/TbShopInfoMapper.xml b/src/main/resources/mapper/TbShopInfoMapper.xml index 47ed043..e9f9f2b 100644 --- a/src/main/resources/mapper/TbShopInfoMapper.xml +++ b/src/main/resources/mapper/TbShopInfoMapper.xml @@ -51,6 +51,11 @@ + + + + + @@ -61,7 +66,8 @@ detail, lat, lng, mch_id, register_type, is_wx_ma_independent, address, city, type, industry, industry_name, business_time, post_time, post_amount_line, on_sale, settle_type, settle_time, enter_at, expire_at, status, average, order_wait_pay_minute, support_device_number, - distribute_level, created_at, updated_at, proxy_id,is_custom,is_return,is_member_in,is_member_return + distribute_level, created_at, updated_at, proxy_id,is_custom,is_return,is_member_in,is_member_return, + is_table_fee,table_fee,eat_model,small_qrcode,payment_qrcode view From 0775b09c77bb35a48040061a703257390246ac2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=89=9B=E5=8F=89=E9=97=AA=E9=97=AA?= <18322780655@163.com> Date: Fri, 13 Sep 2024 11:06:36 +0800 Subject: [PATCH 08/19] =?UTF-8?q?=E6=B7=BB=E5=8A=A0pcpay=20=E6=94=AF?= =?UTF-8?q?=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/PayController.java | 65 ++++- .../interceptor/WebAppConfigurer.java | 1 + .../cashierservice/service/PayService.java | 262 +++++++++--------- 3 files changed, 184 insertions(+), 144 deletions(-) diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/controller/PayController.java b/src/main/java/com/chaozhanggui/system/cashierservice/controller/PayController.java index 9104fda..1bbec3e 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/controller/PayController.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/controller/PayController.java @@ -1,8 +1,10 @@ package com.chaozhanggui.system.cashierservice.controller; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; +import com.alipay.api.AlipayConfig; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.request.AlipaySystemOauthTokenRequest; import com.alipay.api.request.AlipayUserInfoShareRequest; @@ -17,6 +19,7 @@ import com.chaozhanggui.system.cashierservice.service.PayService; import com.chaozhanggui.system.cashierservice.sign.CodeEnum; import com.chaozhanggui.system.cashierservice.sign.Result; import com.chaozhanggui.system.cashierservice.util.IpUtil; +import com.chaozhanggui.system.cashierservice.util.JSONUtil; import com.chaozhanggui.system.cashierservice.util.RedisCst; import com.chaozhanggui.system.cashierservice.util.WechatUtil; import com.fasterxml.jackson.core.JsonProcessingException; @@ -28,6 +31,7 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; +import java.time.LocalDate; import java.util.List; import java.util.Objects; @@ -304,6 +308,10 @@ public class PayController { } + + + + @RequestMapping("createOrder") public Result createOrder(HttpServletRequest request,@RequestBody PaymentReq paymentReq){ try { @@ -315,8 +323,10 @@ public class PayController { } - - + @GetMapping("queryOrderPay") + public Result queryOrderPay(String orderId){ + return payService.queryOrderPay(orderId); + } @@ -365,15 +375,32 @@ public class PayController { return Result.success(CodeEnum.SUCCESS,openid); }else if("ALIPAY".equals(payType)){ - AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",aliAppId,privateKey,"json","GBK",publicKey,"RSA2"); - AlipayUserInfoShareRequest request = new AlipayUserInfoShareRequest(); - AlipayUserInfoShareResponse response = alipayClient.execute(request,code); - log.info("AlipayUserInfoShareResponse:{}",JSONObject.toJSONString(response)); - if(!response.isSuccess()){ + + // 初始化SDK + AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig()); + + // 构造请求参数以调用接口 + AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest(); + + // 设置刷新令牌 +// request.setRefreshToken("201208134b203fe6c11548bcabd8da5bb087a83b"); + + // 设置授权码 + request.setCode(code); + + // 设置授权方式 + request.setGrantType("authorization_code"); + + AlipaySystemOauthTokenResponse response = alipayClient.execute(request); + + log.info("AlipaySystemOauthTokenResponse:{}", JSONUtil.toJSONString(response)); + + response.setAccessToken(response.getRefreshToken()); + if (!response.isSuccess()) { return Result.fail("获取支付宝userId失败"); } - return Result.success(CodeEnum.SUCCESS,response.getUserId()); + return Result.success(CodeEnum.SUCCESS, ObjectUtil.isNull(response.getUserId())?response.getOpenId():response.getUserId()); } return Result.fail(CodeEnum.FAIL); @@ -381,6 +408,28 @@ public class PayController { + private AlipayConfig getAlipayConfig() { + AlipayConfig alipayConfig = new AlipayConfig(); + alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do"); + alipayConfig.setAppId(aliAppId); + alipayConfig.setPrivateKey(privateKey); + alipayConfig.setFormat("json"); + alipayConfig.setAlipayPublicKey(publicKey); + alipayConfig.setCharset("UTF-8"); + alipayConfig.setSignType("RSA2"); + return alipayConfig; + } + + + public static void main(String[] args){ + LocalDate date=LocalDate.now(); + if(date.isLeapYear()){ + System.out.println(); + } + } + + + diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/WebAppConfigurer.java b/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/WebAppConfigurer.java index 2aa9cb5..7a8f40a 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/WebAppConfigurer.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/WebAppConfigurer.java @@ -31,6 +31,7 @@ public class WebAppConfigurer implements WebMvcConfigurer { .excludePathPatterns("/pay/pcscanpay") .excludePathPatterns("/pay/openId") .excludePathPatterns("/pay/createOrder") + .excludePathPatterns("/pay/queryOrderPay") ; diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/service/PayService.java b/src/main/java/com/chaozhanggui/system/cashierservice/service/PayService.java index 0f03308..4f49752 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/service/PayService.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/service/PayService.java @@ -40,7 +40,6 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; -import java.util.concurrent.atomic.AtomicReference; import static com.chaozhanggui.system.cashierservice.sign.CodeEnum.ACCOUNTEIXST; import static com.chaozhanggui.system.cashierservice.sign.CodeEnum.SUCCESS; @@ -50,43 +49,27 @@ import static com.chaozhanggui.system.cashierservice.sign.CodeEnum.SUCCESS; public class PayService { + private final RedisTemplate redisTemplate; @Autowired TbOrderInfoMapper tbOrderInfoMapper; - @Autowired TbMerchantThirdApplyMapper tbMerchantThirdApplyMapper; - @Autowired TbOrderPaymentMapper tbOrderPaymentMapper; - @Autowired TbShopPayTypeMapper tbShopPayTypeMapper; - @Autowired TbCashierCartMapper tbCashierCartMapper; - @Autowired TbShopUserMapper tbShopUserMapper; - - @Autowired TbShopUserFlowMapper tbShopUserFlowMapper; - @Autowired TbOrderDetailMapper tbOrderDetailMapper; - @Autowired RestTemplate restTemplate; - - @Autowired RabbitProducer producer; - @Resource - private TbGroupOrderInfoMapper tbGroupOrderInfoMapper; - @Resource - private TbGroupOrderCouponMapper couponMapper; - - @Autowired TbUserInfoMapper tbUserInfoMapper; @Autowired @@ -95,22 +78,24 @@ public class PayService { TbShopInfoMapper tbShopInfoMapper; @Autowired TbQuickPayMapper tbQuickPayMapper; - + @Autowired + TbmerchantAccountMapper tbmerchantAccountMapper; + @Autowired + TbPlussShopStaffMapper tbPlussShopStaffMapper; + @Resource + private TbGroupOrderInfoMapper tbGroupOrderInfoMapper; + @Resource + private TbGroupOrderCouponMapper couponMapper; @Autowired private TbProductSkuMapper productSkuMapper; - @Autowired private TbProductMapper productMapper; - @Autowired private TbShopUnitMapper shopUnitMapper; - @Autowired private TbProductStockDetailMapper productStockDetailMapper; - @Autowired private RedisUtils redisUtil; - @Value("${gateway.url}") private String gateWayUrl; @Value("${client.backUrl}") @@ -121,14 +106,6 @@ public class PayService { private String url; @Value("${thirdPay.callBack}") private String callBack; - - - @Autowired - TbmerchantAccountMapper tbmerchantAccountMapper; - - - @Autowired - TbPlussShopStaffMapper tbPlussShopStaffMapper; @Autowired private MpShopUserMapper mpShopUserMapper; @Autowired @@ -136,12 +113,13 @@ public class PayService { @Autowired private MpShopTableMapper mpShopTableMapper; - private final RedisTemplate redisTemplate; - public PayService(RedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; } + public static void main(String[] args) { + System.out.println(MD5Util.encrypt("123456".concat("13718478323").concat("10"))); + } public Result queryPayType(String shopId) { return Result.success(CodeEnum.SUCCESS, tbShopPayTypeMapper.selectByShopId(shopId)); @@ -305,7 +283,7 @@ public class PayService { log.info("更新购物车:{}", cartCount); //更新子单状态 - tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed",orderInfo.getDiscountRatio()); + tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed", orderInfo.getDiscountRatio()); JSONObject jsonObject = new JSONObject(); jsonObject.put("token", token); @@ -387,10 +365,10 @@ public class PayService { int cartCount = tbCashierCartMapper.updateByOrderId(orderId, "final"); log.info("更新购物车:{}", cartCount); - if(ObjectUtil.isNotNull(orderInfo.getDiscountRatio())&&ObjectUtil.isNotEmpty(orderInfo.getDiscountRatio())){ - tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed",orderInfo.getDiscountRatio()); - }else { - tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed",null); + if (ObjectUtil.isNotNull(orderInfo.getDiscountRatio()) && ObjectUtil.isNotEmpty(orderInfo.getDiscountRatio())) { + tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed", orderInfo.getDiscountRatio()); + } else { + tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed", null); } JSONObject jsonObject = new JSONObject(); @@ -509,10 +487,10 @@ public class PayService { int cartCount = tbCashierCartMapper.updateByOrderId(orderId, "final"); log.info("更新购物车:{}", cartCount); - if(ObjectUtil.isNotNull(orderInfo.getDiscountRatio())&&ObjectUtil.isNotEmpty(orderInfo.getDiscountRatio())){ - tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed",orderInfo.getDiscountRatio()); - }else { - tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed",null); + if (ObjectUtil.isNotNull(orderInfo.getDiscountRatio()) && ObjectUtil.isNotEmpty(orderInfo.getDiscountRatio())) { + tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed", orderInfo.getDiscountRatio()); + } else { + tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed", null); } JSONObject jsonObject = new JSONObject(); jsonObject.put("token", token); @@ -595,7 +573,7 @@ public class PayService { if (ObjectUtil.isNotEmpty(memberAccount)) { - if (!memberAccount.substring(0, 2).equals("46")) { + if (!memberAccount.startsWith("46")) { return Result.fail(CodeEnum.ERRORQR); } @@ -647,10 +625,10 @@ public class PayService { //更新购物车状态 int cartCount = tbCashierCartMapper.updateByOrderId(orderId, "final"); - if(ObjectUtil.isNotNull(orderInfo.getDiscountRatio())&&ObjectUtil.isNotEmpty(orderInfo.getDiscountRatio())){ - tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed",orderInfo.getDiscountRatio()); - }else { - tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed",null); + if (ObjectUtil.isNotNull(orderInfo.getDiscountRatio()) && ObjectUtil.isNotEmpty(orderInfo.getDiscountRatio())) { + tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed", orderInfo.getDiscountRatio()); + } else { + tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed", null); } log.info("更新购物车:{}", cartCount); @@ -671,14 +649,13 @@ public class PayService { producer.sendStockSaleMsg(mqData); - - JSONObject baObj=new JSONObject(); - baObj.put("userId",user.getUserId()); - baObj.put("shopId",user.getShopId()); - baObj.put("amount",orderInfo.getPayAmount()); - baObj.put("balance",user.getAmount()); - baObj.put("type","消费"); - baObj.put("time",flow.getCreateTime()); + JSONObject baObj = new JSONObject(); + baObj.put("userId", user.getUserId()); + baObj.put("shopId", user.getShopId()); + baObj.put("amount", orderInfo.getPayAmount()); + baObj.put("balance", user.getAmount()); + baObj.put("type", "消费"); + baObj.put("time", flow.getCreateTime()); producer.balance(baObj.toString()); String tableCartKey = RedisCst.getCurrentOrderKey(orderInfo.getTableId(), @@ -738,7 +715,7 @@ public class PayService { } - TbShopUser user = tbShopUserMapper.selectByShopId(orderInfo.getShopId(), tbUserInfo.getId().toString(),"2").get(0); + TbShopUser user = tbShopUserMapper.selectByShopId(orderInfo.getShopId(), tbUserInfo.getId().toString(), "2").get(0); if (ObjectUtil.isEmpty(user) || !"1".equals(user.getIsVip().toString())) { return Result.fail(CodeEnum.MEMBERNOEXIST); } @@ -778,11 +755,10 @@ public class PayService { int cartCount = tbCashierCartMapper.updateByOrderId(orderId, "final"); - - if(ObjectUtil.isNotNull(orderInfo.getDiscountRatio())&&ObjectUtil.isNotEmpty(orderInfo.getDiscountRatio())){ - tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed",orderInfo.getDiscountRatio()); - }else { - tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed",null); + if (ObjectUtil.isNotNull(orderInfo.getDiscountRatio()) && ObjectUtil.isNotEmpty(orderInfo.getDiscountRatio())) { + tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed", orderInfo.getDiscountRatio()); + } else { + tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed", null); } @@ -804,14 +780,13 @@ public class PayService { producer.sendStockSaleMsg(mqData); - - JSONObject baObj=new JSONObject(); - baObj.put("userId",user.getUserId()); - baObj.put("shopId",user.getShopId()); - baObj.put("amount",orderInfo.getPayAmount()); - baObj.put("balance",user.getAmount()); - baObj.put("type","消费"); - baObj.put("time",flow.getCreateTime()); + JSONObject baObj = new JSONObject(); + baObj.put("userId", user.getUserId()); + baObj.put("shopId", user.getShopId()); + baObj.put("amount", orderInfo.getPayAmount()); + baObj.put("balance", user.getAmount()); + baObj.put("type", "消费"); + baObj.put("time", flow.getCreateTime()); producer.balance(baObj.toString()); clearTableInfoCache(orderInfo); @@ -823,7 +798,7 @@ public class PayService { return Result.fail(CodeEnum.PARAM); } - TbOrderInfo orderInfo = tbOrderInfoMapper.selectByPrimaryKey(Integer.valueOf(orderId)); + TbOrderInfo orderInfo = tbOrderInfoMapper.selectByPrimaryKey(orderId); if (ObjectUtil.isEmpty(orderInfo)) { return Result.fail(CodeEnum.ORDERNOEXIST); @@ -859,8 +834,6 @@ public class PayService { } - - TbShopUserFlow userFlow = new TbShopUserFlow(); userFlow.setAmount((payAmount != null && discountAmount != null) ? payAmount : orderInfo.getOrderAmount()); userFlow.setBalance(shopUser.getAmount().subtract((payAmount != null && discountAmount != null) ? payAmount : orderInfo.getOrderAmount())); @@ -890,10 +863,10 @@ public class PayService { int cartCount = tbCashierCartMapper.updateByOrderId(String.valueOf(orderId), "final"); - if(ObjectUtil.isNotNull(orderInfo.getDiscountRatio())&&ObjectUtil.isNotEmpty(orderInfo.getDiscountRatio())){ - tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed",orderInfo.getDiscountRatio()); - }else { - tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed",null); + if (ObjectUtil.isNotNull(orderInfo.getDiscountRatio()) && ObjectUtil.isNotEmpty(orderInfo.getDiscountRatio())) { + tbOrderDetailMapper.updateStatusByOrderId(orderId, "closed", orderInfo.getDiscountRatio()); + } else { + tbOrderDetailMapper.updateStatusByOrderId(orderId, "closed", null); } log.info("更新购物车:{}", cartCount); @@ -980,10 +953,10 @@ public class PayService { int cartCount = tbCashierCartMapper.updateByOrderId(orderId, "final"); - if(ObjectUtil.isNotNull(orderInfo.getDiscountRatio())&&ObjectUtil.isNotEmpty(orderInfo.getDiscountRatio())){ - tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed",orderInfo.getDiscountRatio()); - }else { - tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed",null); + if (ObjectUtil.isNotNull(orderInfo.getDiscountRatio()) && ObjectUtil.isNotEmpty(orderInfo.getDiscountRatio())) { + tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed", orderInfo.getDiscountRatio()); + } else { + tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed", null); } log.info("更新购物车:{}", cartCount); @@ -1074,10 +1047,10 @@ public class PayService { int cartCount = tbCashierCartMapper.updateByOrderId(orderId, "final"); log.info("更新购物车:{}", cartCount); - if(ObjectUtil.isNotNull(orderInfo.getDiscountRatio())&&ObjectUtil.isNotEmpty(orderInfo.getDiscountRatio())){ - tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed",orderInfo.getDiscountRatio()); - }else { - tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed",null); + if (ObjectUtil.isNotNull(orderInfo.getDiscountRatio()) && ObjectUtil.isNotEmpty(orderInfo.getDiscountRatio())) { + tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed", orderInfo.getDiscountRatio()); + } else { + tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed", null); } JSONObject jsonObject = new JSONObject(); @@ -1216,7 +1189,7 @@ public class PayService { detailPo.setStatus("closed"); } - BigDecimal returnAmount = it.getPriceAmount().divide(new BigDecimal(it.getNum()), 2, RoundingMode.DOWN).multiply(new BigDecimal(map1.get(it.getId())));; + BigDecimal returnAmount = it.getPriceAmount().divide(new BigDecimal(it.getNum()), 2, RoundingMode.DOWN).multiply(new BigDecimal(map1.get(it.getId()))); detailPo.setReturnNum(map1.get(it.getId())); detailPos.add(detailPo); @@ -1266,7 +1239,7 @@ public class PayService { } } else { - TbOrderPayment payment = tbOrderPaymentMapper.selectByOrderId(orderId + ""); + TbOrderPayment payment = tbOrderPaymentMapper.selectByOrderId(String.valueOf(orderId)); PublicResp publicResp = thirdPayService.returnOrder(url, thirdApply.getAppId(), newOrderInfo.getOrderNo(), payment.getTradeNumber(), null, "订单退款", newOrderInfo.getPayAmount().setScale(2, RoundingMode.DOWN).multiply(new BigDecimal(100)).longValue(), callBack, null, thirdApply.getAppToken()); if (ObjectUtil.isNotNull(publicResp) && ObjectUtil.isNotEmpty(publicResp)) { @@ -1318,13 +1291,13 @@ public class PayService { tbShopUserFlowMapper.insert(flow); - JSONObject baObj=new JSONObject(); - baObj.put("userId",user.getUserId()); - baObj.put("shopId",user.getShopId()); - baObj.put("amount",newOrderInfo.getPayAmount()); - baObj.put("balance",user.getAmount()); - baObj.put("type","退款"); - baObj.put("time",flow.getCreateTime()); + JSONObject baObj = new JSONObject(); + baObj.put("userId", user.getUserId()); + baObj.put("shopId", user.getShopId()); + baObj.put("amount", newOrderInfo.getPayAmount()); + baObj.put("balance", user.getAmount()); + baObj.put("type", "退款"); + baObj.put("time", flow.getCreateTime()); producer.balance(baObj.toString()); } @@ -1365,13 +1338,9 @@ public class PayService { producer.putOrderCollect(jsonObject.toJSONString()); - producer.printMechine(newOrderInfo.getId().toString()); - - - //修改耗材数据 JSONObject jsonObject1 = new JSONObject(); jsonObject1.put("orderId", newOrderInfo.getId()); @@ -1692,7 +1661,6 @@ public class PayService { return Result.success(CodeEnum.SUCCESS); } - public Result getOrderDiscount(String staffId, String orderId, String token) { if (ObjectUtil.isNull(staffId) || ObjectUtil.isNull(orderId) || ObjectUtil.isEmpty(staffId) || ObjectUtil.isEmpty(orderId)) { return Result.fail(CodeEnum.PARAM); @@ -1719,7 +1687,7 @@ public class PayService { } if ("master".equals(staff.getType())) { - return Result.success(SUCCESS, new BigDecimal(0.1)); + return Result.success(SUCCESS, new BigDecimal("0.1")); } if (ObjectUtil.isEmpty(staff.getMaxDiscountAmount()) || ObjectUtil.isNull(staff.getMaxDiscountAmount())) { @@ -1729,7 +1697,7 @@ public class PayService { if ("0".equals(staff.getDiscountType())) { if (staff.getMaxDiscountAmount().compareTo(tbOrderInfo.getOrderAmount()) >= 0) { - staff.setMaxDiscountAmount(new BigDecimal(0.1)); + staff.setMaxDiscountAmount(new BigDecimal("0.1")); } else { staff.setMaxDiscountAmount(BigDecimal.ONE.subtract(staff.getMaxDiscountAmount().divide(tbOrderInfo.getOrderAmount(), 2, RoundingMode.HALF_DOWN).setScale(2, RoundingMode.HALF_DOWN))); } @@ -1739,9 +1707,8 @@ public class PayService { return Result.success(SUCCESS, staff.getMaxDiscountAmount()); } - - public Result pcscanpay(String orderId,String ip,String userId,String payType) throws JsonProcessingException { - if (ObjectUtil.isEmpty(orderId) || ObjectUtil.isEmpty(ip)) { + public Result pcscanpay(String orderId, String ip, String userId, String payType) throws JsonProcessingException { + if (ObjectUtil.isEmpty(orderId) || ObjectUtil.isEmpty(ip)) { return Result.fail(CodeEnum.PARAM); } @@ -1757,7 +1724,6 @@ public class PayService { } - List cashierCarts = tbCashierCartMapper.selectByOrderId(orderId, null); if (ObjectUtil.isEmpty(cashierCarts) || ObjectUtil.isNull(cashierCarts)) { return Result.fail(CodeEnum.CARTEXIST); @@ -1778,7 +1744,6 @@ public class PayService { } - TbOrderPayment payment = tbOrderPaymentMapper.selectByOrderId(orderId); if (ObjectUtil.isEmpty(payment) || payment == null) { payment = new TbOrderPayment(); @@ -1814,10 +1779,10 @@ public class PayService { reqbody = body.toString(); } - PublicResp publicResp = thirdPayService.jspay(url,thirdApply.getAppId(),thirdApply.getAppToken(),reqbody,reqbody,orderInfo.getOrderAmount().multiply(new BigDecimal(100)).longValue(),payType,"WECHAT".equals(payType)?thirdApply.getSmallAppid():null,userId,ip,DateUtils.getSsdfTimes(),thirdApply.getStoreId(),backUrl,backUrl); + PublicResp publicResp = thirdPayService.jspay(url, thirdApply.getAppId(), thirdApply.getAppToken(), reqbody, reqbody, orderInfo.getOrderAmount().multiply(new BigDecimal(100)).longValue(), payType, "WECHAT".equals(payType) ? thirdApply.getSmallAppid() : null, userId, ip, DateUtils.getSsdfTimes(), thirdApply.getStoreId(), backUrl, backUrl); - if (ObjectUtil.isNotNull(publicResp) && ObjectUtil.isNotEmpty(publicResp)) { + if (ObjectUtil.isNotNull(publicResp) && ObjectUtil.isNotEmpty(publicResp)) { if ("000000".equals(publicResp.getCode())) { JspayResp scanpayResp = publicResp.getObjData(); if ("TRADE_SUCCESS".equals(scanpayResp.getState())) { @@ -1835,10 +1800,10 @@ public class PayService { int cartCount = tbCashierCartMapper.updateByOrderId(orderId, "final"); log.info("更新购物车:{}", cartCount); - if(ObjectUtil.isNotNull(orderInfo.getDiscountRatio())&&ObjectUtil.isNotEmpty(orderInfo.getDiscountRatio())){ - tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed",orderInfo.getDiscountRatio()); - }else { - tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed",null); + if (ObjectUtil.isNotNull(orderInfo.getDiscountRatio()) && ObjectUtil.isNotEmpty(orderInfo.getDiscountRatio())) { + tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed", orderInfo.getDiscountRatio()); + } else { + tbOrderDetailMapper.updateStatusByOrderId(Integer.valueOf(orderId), "closed", null); } // JSONObject jsonObject = new JSONObject(); @@ -1854,7 +1819,7 @@ public class PayService { ObjectMapper mapper = new ObjectMapper(); return Result.success(CodeEnum.SUCCESS, mapper.readTree(scanpayResp.getPayInfo())); - }else if("TRADE_AWAIT".equals(scanpayResp.getState())){ + } else if ("TRADE_AWAIT".equals(scanpayResp.getState())) { orderInfo.setStatus("paying"); orderInfo.setPayOrderNo(payment.getTradeNumber()); tbOrderInfoMapper.updateByPrimaryKeySelective(orderInfo); @@ -1864,11 +1829,11 @@ public class PayService { tbOrderPaymentMapper.updateByPrimaryKeySelective(payment); - if("WECHAT".equals(scanpayResp.getPayType())){ + if ("WECHAT".equals(scanpayResp.getPayType())) { orderInfo.setPayType("WECHAT"); - }else if("ALIPAY".equals(scanpayResp.getPayType())){ + } else if ("ALIPAY".equals(scanpayResp.getPayType())) { orderInfo.setPayType("ALIPAY"); - }else if("UNIONPAY".equals(scanpayResp.getPayType())){ + } else if ("UNIONPAY".equals(scanpayResp.getPayType())) { orderInfo.setPayType("UNIONPAY"); } @@ -1877,7 +1842,7 @@ public class PayService { ObjectMapper mapper = new ObjectMapper(); - return Result.success(CodeEnum.PAYING,mapper.readTree(scanpayResp.getPayInfo())); + return Result.success(CodeEnum.PAYING, mapper.readTree(scanpayResp.getPayInfo())); } } } @@ -1886,7 +1851,6 @@ public class PayService { } - public String generateOrderNumber() { String date = DateUtils.getSdfTimes(); Random random = new Random(); @@ -1894,28 +1858,23 @@ public class PayService { return "QR" + date + randomNum; } + public Result createOrder(String ip, String userId, String payType, String shopId, BigDecimal amount) throws JsonProcessingException { - public Result createOrder(String ip,String userId,String payType,String shopId,BigDecimal amount) throws JsonProcessingException { + if (ObjectUtil.isNull(userId) || ObjectUtil.isEmpty(userId) || ObjectUtil.isEmpty(payType) || ObjectUtil.isNull(payType) - if(ObjectUtil.isNull(userId)||ObjectUtil.isEmpty(userId)||ObjectUtil.isEmpty(payType)||ObjectUtil.isNull(payType) - - ||ObjectUtil.isNull(shopId)||ObjectUtil.isEmpty(shopId)||ObjectUtil.isNull(shopId)||ObjectUtil.isNull(amount)||ObjectUtil.isEmpty(amount) - ){ + || ObjectUtil.isNull(shopId) || ObjectUtil.isEmpty(shopId) || ObjectUtil.isNull(shopId) || ObjectUtil.isNull(amount) || ObjectUtil.isEmpty(amount) + ) { return Result.fail(CodeEnum.PARAM); } - if(!"WECHAT".equals(payType)||!"ALIPAY".equals(payType)){ - return Result.fail(CodeEnum.PARAM); - } - TbShopInfo shopInfo= tbShopInfoMapper.selectByPrimaryKey(Integer.valueOf(shopId)); + TbShopInfo shopInfo = tbShopInfoMapper.selectByPrimaryKey(Integer.valueOf(shopId)); - if(ObjectUtil.isNull(shopInfo)){ + if (ObjectUtil.isNull(shopInfo)) { return Result.fail(CodeEnum.SHOPINFONOEXIST); } - - TbOrderInfo orderInfo=new TbOrderInfo(); + TbOrderInfo orderInfo = new TbOrderInfo(); String orderNo = generateOrderNumber(); orderInfo.setOrderNo(orderNo); @@ -1963,8 +1922,6 @@ public class PayService { } - - TbMerchantThirdApply thirdApply = tbMerchantThirdApplyMapper.selectByPrimaryKey(Integer.valueOf(orderInfo.getMerchantId())); if (ObjectUtil.isEmpty(thirdApply) || ObjectUtil.isNull(thirdApply)) { return Result.fail(CodeEnum.NOCUSTOMER); @@ -1973,7 +1930,7 @@ public class PayService { String reqbody = "店铺收款码"; - PublicResp publicResp = thirdPayService.jspay(url,thirdApply.getAppId(),thirdApply.getAppToken(),reqbody,reqbody,orderInfo.getOrderAmount().multiply(new BigDecimal(100)).longValue(),payType,"WECHAT".equals(payType)?thirdApply.getSmallAppid():null,userId,ip,DateUtils.getSsdfTimes(),thirdApply.getStoreId(),backUrl,backUrl); + PublicResp publicResp = thirdPayService.jspay(url, thirdApply.getAppId(), thirdApply.getAppToken(), reqbody, reqbody, orderInfo.getOrderAmount().multiply(new BigDecimal(100)).longValue(), payType, "WECHAT".equals(payType) ? thirdApply.getSmallAppid() : null, userId, ip, DateUtils.getSsdfTimes(), thirdApply.getStoreId(), backUrl, backUrl); if (ObjectUtil.isNotNull(publicResp) && ObjectUtil.isNotEmpty(publicResp)) { @@ -2014,22 +1971,55 @@ public class PayService { ObjectMapper mapper = new ObjectMapper(); - return Result.success(CodeEnum.PAYING, mapper.readTree(scanpayResp.getPayInfo())); + + Map map=new HashMap<>(); + + map.put("orderInfo",orderInfo); + map.put("payInfo",mapper.readTree(scanpayResp.getPayInfo())); + return Result.success(CodeEnum.PAYING, map); } } } return Result.fail(CodeEnum.FAIL); } + public Result queryOrderPay(String orderId) { + if (ObjectUtil.isEmpty(orderId)) { + return Result.fail(CodeEnum.PARAM); + } + + TbOrderInfo orderInfo = tbOrderInfoMapper.selectByPrimaryKey(Integer.valueOf(orderId)); + + if (ObjectUtil.isEmpty(orderInfo)) { + return Result.fail(CodeEnum.ORDERNOEXIST); + } + if ("unpaid".equals(orderInfo.getStatus()) || "paying".equals(orderInfo.getStatus())) { + TbMerchantThirdApply thirdApply = tbMerchantThirdApplyMapper.selectByPrimaryKey(Integer.valueOf(orderInfo.getMerchantId())); + if (ObjectUtil.isEmpty(thirdApply) || ObjectUtil.isNull(thirdApply)) { + return Result.fail(CodeEnum.NOCUSTOMER); + } + TbOrderPayment tbOrderPayment = tbOrderPaymentMapper.selectByOrderId(orderId); + if (ObjectUtil.isNotEmpty(tbOrderPayment)) { + PublicResp orderstatus = thirdPayService.queryOrder(url, thirdApply.getAppId(), tbOrderPayment.getTradeNumber(), null, thirdApply.getAppToken()); + if (ObjectUtil.isNotNull(orderstatus) && ObjectUtil.isNotEmpty(orderstatus)) { + if ("000000".equals(orderstatus.getCode())) { + if ("TRADE_SUCCESS".equals(orderstatus.getObjData().getState())) { + orderInfo.setStatus("closed"); + orderInfo.setPayOrderNo(tbOrderPayment.getTradeNumber()); + tbOrderInfoMapper.updateByPrimaryKeySelective(orderInfo); + } + } + } + } + } + return Result.success(CodeEnum.SUCCESS, orderInfo); - public static void main(String[] args) { - System.out.println(MD5Util.encrypt("123456".concat("13718478323").concat("10"))); } } From 074cc5374deb4b0d3d7658e82a2a0b5db48403f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=89=9B=E5=8F=89=E9=97=AA=E9=97=AA?= <18322780655@163.com> Date: Fri, 13 Sep 2024 11:08:33 +0800 Subject: [PATCH 09/19] =?UTF-8?q?=E6=B7=BB=E5=8A=A0pcpay=20=E6=94=AF?= =?UTF-8?q?=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 110ae23..f2b9a7b 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -61,8 +61,8 @@ wx: secrete: a34a61adc0602118b49400baa8812454 warnMsgTmpId: AV-KybUHaK3KtFVLqpy6PHccHBS7XeX__mOM4RbufnQ ali: - appId: 2021003175619219 - privateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCInywsrhhiSNj7jjOB4/zL79pAaLzoYOuOqHeQELxgXrVFmpqJ7y76wniu4nrHKfp4jQVIHw4+IkBsTNwABTPiryVzAQ4ydb/opzn4zblWRB4S7mAgnc2wqO4FMcwSOiHh7uPFAqvB8oZmEizlbXIJSiDFd3rqG2l8ZADjwuwM0nue1fUJLu65d2B6NDFgBIa11enkrNyX9uPiaeIFW62lvTN1W2AUqTJLvfko5ejExGUDkie6g5W5MIvUSKfq7sDkpt5IoQCooBzjJJ/Ckfw/rJlqoPDFzUSiANBABwu0jAJ42MGYdJ8+dyDDUNla20xmMjXbRtUe5roVzJrrgMjFAgMBAAECggEAPKPx9o77sbxF2zod8JxiW57Fj+stVjOWuoZaM27KPjgrW46o42pvvsvMx0stVfNzAkkNvBpUtw167Nccm0Gz6vz0sVwZkhojqT94gs/FYN3xP1PhBPkmEDCbHWEiBEEbQu5G2O47kGV2dB3DIb53bFoju6Ixw3GRW64DmxSss2+ZsErAWPBwbxIbUDGzIxtGhuWrvWX6pSnnvs+PNNqyoisXnh4cDjrmS9qSgsgcL4D0HwNGTsG1uBeLx4g3D2vKKqhP1osEly91P0QAGzcpuvKqeJ2ZwfFMDlabeOyqRQxFW/FLT2DuY1KmBhcGx6tjDMo7EEpVJ7NHcSHYfAa6wQKBgQDzZbIAV7shEiwS6ZwLSbeMvJkWELJtmEGk/qI/01tULHmrwDh8FIjbrHZrQNXruZ+dS+RObahCKywjYVEr/g15v5vv4yA20bmUgmO27/mVj6mpwvoHYBn0H/511a6V7lopFlCA735K+liFZ6ZW+qZxV8gkZ3/ZZDUy1LSArQmg8QKBgQCPsiK+mUdvs+1ReDm09RessbastXgYvj6UWIsPHc4Mxx/6R8qgy9nt2n2u95cK2uONtpNWswpDtOeWVakuHSKHbdG7Xz0DlklHuzin2JhOBwBu36HAVDjWPF+JDcVkUz7hFWFwl0DawRijFBcr0OV6GUoUURB21xtRnrQPmK/lFQKBgHPWFE7hceedVGhz0ZX1sWtDXsAHlkNeUO+LWAB0QGTg/c7lnnw+8ZtKitkkdCrJntMniTJiMc+76De2WwFK2XL14+rY9z3ftiidnYM01l19j8uBRak47WEn0NyXo40rcLFZM1sJn9tjJbnnyFxg0dHjaxcYQtpdPIxCet06fPihAoGAfaqJ3CnsYXH3H4KG5Qxa8fpRCWWCbBEkZVOx+TxVkLMr8hOKz2i3Y93qgHOisimPS8XZwL6/QUsaJU0wsVVldw7Blp3JnDN4TrUa7R7sw4A4Dr6glLSTKDiQTCmw8PYkTXAHURHV8/le9G+DfBwqM8eeE3p5bZTdHVovmlwrp6kCgYEA7uTSOa0phZ7ts++FVdEZf9TI/B4tRuP4aT31BHs9UoCW1g01/NEEBDiHV9udq9B6Cd5onq+QFj4jiwakTNzXjhQZqgmag1TBE9VpahLxYAD5pYn/Tvm8l5vWuSKcOSwQb2lDg5R2/bmCJRV/QHRkdkAAhHGC/TrOskUCRgosUac= + appId: 2021004174605036 + privateKey: MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQD48HaUoV7OH7os+9L01kHgxzwIhJick4OkFq4aHsntsXEJJ3gedhuEZtV8oHKZ30DPW12IJ4S8NXtpr8OWaqrAPFonf4wVaRY1d0yIAea57kfLEn9oOEEy4FzARgMNDkyxC+/3OUdGbLHpTjfVX3gusXsEhUDy1/WewihAkoNYF37+W3W/uVLzeWoPq0EcUbRv/G/t/p6gL69ltsMAiVFG4Q/Yk24YAN6lYgBPNLXUEwQ1Q+T+1omjfavHgvarKOp33z3JOUH+aGOmDsJ5Y9gyGtJzOCipAd8Zcv+T1ygsEzZYO1/gzcbPnfO1ShqStCHzssuw8FBVx2JdfQKXKMMNAgMBAAECggEAVTrO/pg5Q00titU1Jspsh67u6OOs9H605Ws2dI7yB8VmtAGlaJh7V1t14FN2qSP8poHbhhAxq9aLyGV7C3a9u09udnN+3J28EtYjh7VO732bavWMVXxdJjQWzWWrCb9JlpxFrlkYBA6W4w/6ob0sAqCVQ7jzwbEa0R4cde8ztOa5nysKSfr4YTSs0gqvoiC6fmg8eiRJraEQBoYz9VkKFtOhhh/4w5FhVcYQ2gQvZ3kK3QVuD1eJIQKlCtz8qaox9lXKDiZT4SCmnKshdUL0u5TYIcYeBjZmhJz0Q50KHcpZrCs5y7I0+vRBH3hU+TKSQt7ureymwhbwWMHScLV2gQKBgQD+58SHXhr5M8NGagAmTdsgmCnNv2kOYMd4STyPMY10SVwCv1Bk808ZuP+7e558J1b5/OuDLI5dLq6xrZ/1wLv1G++XqxI00hlFuWS5mUGJVcXotT1mw20rVeUILc7Qe3mLvbMGgfyKf4A7Qa5SSZ4bDeDTJYaFxyiQ281hMzDuPQKBgQD6AiL/Na2/uPH4CG6juwpjYvYVUcjK+7gbRwf3wWsWMpk90Z4ju2iUiP5c1J/oK9P+1T3PIr6M4Xjza8JJj+r9KC/PVB0gBv6vVM96cDpKUEy/UMpcn/T81vqj/Z+WEOODU8Ms6NiTTm+u9ldvpCjbu0u8M+9c0JeIyadJvSTFEQKBgQCsxmFyM3nq8YfpgU2qqNjfBeRH3faSVUy+nj1a/YZYjKS+A/i1BCnYUImeBVNN6chNV342ggvY4xxruDiU9Vcw8wd58O09Oi8BEIFSP6upL6cebUI6Fjo3xlegLJRiwV6INkNTJOYM5hD/mSxUACwXQFfkJipBINXBIgraWD1RLQKBgQCj49axWq0F6+WjZVOyPaD3uh37p9trRUxRhWTxw3fB23WdktaKMgbCqHOmwzP4bRLSEVQtf2dOz1gMqu14b8HqJvgAf/F/11YJ9hz09LEhmjZVjE68HZfqT7uK2W5OX8/lfXmK7TFcj6SjG5YB96lZMhTZ0WnufEd6QkdKDZYXIQKBgQD9GDTcIMbFwbEaKHnfZaTD3f876EGRgsgrCxwdEk7LBCRPwWo7yI929M4psIlpNwNeiyjBkBunWIVkpznp6qPtJqagIPUYesU4f5v6/okq5wcpaNKSkWbIvWVLaLGOiA1aeGJtbpMpyClbSr52puHpRRdvAiIEQ74yYh0JX8q96g== publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiQkrz+emAuS1mB3KKDOMmAZRd/BlPbh7fAIHAqAj1+QCZNcV3o2BTLIIqnuKpSlFXDG3uDzp2VsBxcizXuBbFyPGylnD9CgCj5abyh3+FIHPAZ2IM3TtpqImZ0TSPGXrMli4Nir7MvZktgccCqQKCC4o6iaDGz+UwWwJUIPna8fm2tiTZ+KH150CZbKVj4ZGNpBh5XSV/1dRgyQIV9D/EwSbkZ0n6VgKQLJBi0C2UE3QB17aL1Ir6+gDXIDbknN8O7GUD3aMGdThYdSRUb5wp9CZ5qfV7vCS/CgaRo38nhH3NOzkTL+7v0m1ZDHPmqEkn9VzZN6sCQdL7PoAOjHOCwIDAQAB From 9a07219470cefe247e8c79a345405ff7ddab6755 Mon Sep 17 00:00:00 2001 From: SongZhang <2064194730@qq.com> Date: Fri, 13 Sep 2024 15:32:12 +0800 Subject: [PATCH 10/19] =?UTF-8?q?=E9=A3=9E=E9=B9=85=E6=89=93=E5=8D=B0?= =?UTF-8?q?=E6=9C=BA=E9=80=80=E5=8D=95=E5=B0=8F=E7=A5=A8=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E6=94=BE=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/cashierservice/rabbit/PrintMechineConsumer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintMechineConsumer.java b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintMechineConsumer.java index e867773..dfc5c18 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintMechineConsumer.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintMechineConsumer.java @@ -612,8 +612,8 @@ public class PrintMechineConsumer { String printType = "退款单"; String data = PrinterUtils.getCashPrintData(detailPO, printType, "return"); -// String voiceJson = "{\"bizType\":\"2\",\"content\":\"您有一笔新的订单,请及时处理\"}"; -// PrinterUtils.printTickets(voiceJson,1, Integer.valueOf(printerNum), tbPrintMachineWithBLOBs.getAddress(), data); + String voiceJson = "{\"bizType\":\"2\",\"content\":\"您有一笔新的订单,请及时处理\"}"; + PrinterUtils.printTickets(voiceJson,1, Integer.valueOf(printerNum), tbPrintMachineWithBLOBs.getAddress(), data); } } From 92008db954a01a03ad896bcb92b63f0d51cb9627 Mon Sep 17 00:00:00 2001 From: SongZhang <2064194730@qq.com> Date: Fri, 13 Sep 2024 15:50:22 +0800 Subject: [PATCH 11/19] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E6=89=93=E5=8C=85=E8=B4=B9=E9=BB=98=E8=AE=A4=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/cashierservice/service/OrderService.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/service/OrderService.java b/src/main/java/com/chaozhanggui/system/cashierservice/service/OrderService.java index 178ca2a..375dd52 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/service/OrderService.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/service/OrderService.java @@ -838,6 +838,9 @@ public class OrderService { for (TbOrderDetail orderDetail : orderDetails) { orderDetail.setOrderId(orderId); + if (orderDetail.getPackAmount() == null) { + orderDetail.setPackAmount(BigDecimal.ZERO); + } orderDetailMapper.insert(orderDetail); } From 5c0adcbe379b3c9bed7b781f11bbee0a536243b5 Mon Sep 17 00:00:00 2001 From: SongZhang <2064194730@qq.com> Date: Fri, 13 Sep 2024 15:59:33 +0800 Subject: [PATCH 12/19] =?UTF-8?q?=E9=A3=9E=E9=B9=85=E6=89=93=E5=8D=B0?= =?UTF-8?q?=E6=8A=98=E6=89=A3=E7=A9=BA=E5=80=BC=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cashierservice/rabbit/PrintMechineConsumer.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintMechineConsumer.java b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintMechineConsumer.java index dfc5c18..616eb0d 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintMechineConsumer.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintMechineConsumer.java @@ -607,7 +607,14 @@ public class PrintMechineConsumer { if (ObjectUtil.isNotEmpty(detailList) && detailList.size() > 0) { // OrderDetailPO detailPO = new OrderDetailPO(shopInfo.getShopName(), "普通打印", orderInfo.getMasterId(), orderInfo.getOrderNo(), DateUtils.getTime(new Date(orderInfo.getCreatedAt())), "【POS-1】001", orderInfo.getOrderAmount().toPlainString(), balance, orderInfo.getPayType(), "0", detailList); - 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.getOrderAmount().toPlainString(), balance, orderInfo.getPayType(), "0", detailList, orderInfo.getRemark(), orderInfo.getDiscountAmount().toPlainString(), orderInfo.getDiscountRatio().toPlainString()); + 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.getOrderAmount().toPlainString(), + balance, orderInfo.getPayType(), "0", + detailList, orderInfo.getRemark(), orderInfo.getDiscountAmount() == null ? null : orderInfo.getDiscountAmount().toPlainString(), + orderInfo.getDiscountRatio() == null ? null : orderInfo.getDiscountRatio().toPlainString()); String printType = "退款单"; From dbb66f93fa42a81ab27a62682ae23bf05cfffcc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=89=9B=E5=8F=89=E9=97=AA=E9=97=AA?= <18322780655@163.com> Date: Sat, 14 Sep 2024 09:18:57 +0800 Subject: [PATCH 13/19] =?UTF-8?q?=E6=B7=BB=E5=8A=A0pcpay=20=E6=94=AF?= =?UTF-8?q?=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cashierservice/service/PayService.java | 119 +++++++++++++----- .../thirdpay/req/ChrpayReq.java | 45 +++++++ .../thirdpay/resp/ChrpayResp.java | 51 ++++++++ .../thirdpay/service/ThirdPayService.java | 43 +++++++ 4 files changed, 225 insertions(+), 33 deletions(-) create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/req/ChrpayReq.java create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/resp/ChrpayResp.java diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/service/PayService.java b/src/main/java/com/chaozhanggui/system/cashierservice/service/PayService.java index 4f49752..00373d7 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/service/PayService.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/service/PayService.java @@ -1929,57 +1929,110 @@ public class PayService { String reqbody = "店铺收款码"; - - PublicResp publicResp = thirdPayService.jspay(url, thirdApply.getAppId(), thirdApply.getAppToken(), reqbody, reqbody, orderInfo.getOrderAmount().multiply(new BigDecimal(100)).longValue(), payType, "WECHAT".equals(payType) ? thirdApply.getSmallAppid() : null, userId, ip, DateUtils.getSsdfTimes(), thirdApply.getStoreId(), backUrl, backUrl); + if("WECHAT".equals(payType)){ + PublicResp publicResp = thirdPayService.jspay(url, thirdApply.getAppId(), thirdApply.getAppToken(), reqbody, reqbody, orderInfo.getOrderAmount().multiply(new BigDecimal(100)).longValue(), payType, "WECHAT".equals(payType) ? thirdApply.getSmallAppid() : null, userId, ip, DateUtils.getSsdfTimes(), thirdApply.getStoreId(), backUrl, backUrl); - if (ObjectUtil.isNotNull(publicResp) && ObjectUtil.isNotEmpty(publicResp)) { - if ("000000".equals(publicResp.getCode())) { - JspayResp scanpayResp = publicResp.getObjData(); - if ("TRADE_SUCCESS".equals(scanpayResp.getState())) { + if (ObjectUtil.isNotNull(publicResp) && ObjectUtil.isNotEmpty(publicResp)) { + if ("000000".equals(publicResp.getCode())) { + JspayResp scanpayResp = publicResp.getObjData(); + if ("TRADE_SUCCESS".equals(scanpayResp.getState())) { - payment.setTradeNumber(scanpayResp.getPayOrderId()); - payment.setUpdatedAt(System.currentTimeMillis()); - tbOrderPaymentMapper.updateByPrimaryKeySelective(payment); + payment.setTradeNumber(scanpayResp.getPayOrderId()); + payment.setUpdatedAt(System.currentTimeMillis()); + tbOrderPaymentMapper.updateByPrimaryKeySelective(payment); - //处理支付成功的订单 - orderInfo.setStatus("closed"); - orderInfo.setPayOrderNo(scanpayResp.getPayOrderId()); - tbOrderInfoMapper.updateByPrimaryKeySelective(orderInfo); + //处理支付成功的订单 + orderInfo.setStatus("closed"); + orderInfo.setPayOrderNo(scanpayResp.getPayOrderId()); + tbOrderInfoMapper.updateByPrimaryKeySelective(orderInfo); - ObjectMapper mapper = new ObjectMapper(); - return Result.success(CodeEnum.SUCCESS, mapper.readTree(scanpayResp.getPayInfo())); + ObjectMapper mapper = new ObjectMapper(); + return Result.success(CodeEnum.SUCCESS, mapper.readTree(scanpayResp.getPayInfo())); - } else if ("TRADE_AWAIT".equals(scanpayResp.getState())) { - orderInfo.setStatus("paying"); - orderInfo.setPayOrderNo(payment.getTradeNumber()); - tbOrderInfoMapper.updateByPrimaryKeySelective(orderInfo); + } else if ("TRADE_AWAIT".equals(scanpayResp.getState())) { + orderInfo.setStatus("paying"); + orderInfo.setPayOrderNo(payment.getTradeNumber()); + tbOrderInfoMapper.updateByPrimaryKeySelective(orderInfo); - payment.setTradeNumber(scanpayResp.getPayOrderId()); - payment.setUpdatedAt(System.currentTimeMillis()); - tbOrderPaymentMapper.updateByPrimaryKeySelective(payment); + payment.setTradeNumber(scanpayResp.getPayOrderId()); + payment.setUpdatedAt(System.currentTimeMillis()); + tbOrderPaymentMapper.updateByPrimaryKeySelective(payment); - if ("WECHAT".equals(scanpayResp.getPayType())) { - orderInfo.setPayType("WECHAT"); - } else if ("ALIPAY".equals(scanpayResp.getPayType())) { - orderInfo.setPayType("ALIPAY"); - } else if ("UNIONPAY".equals(scanpayResp.getPayType())) { - orderInfo.setPayType("UNIONPAY"); + if ("WECHAT".equals(scanpayResp.getPayType())) { + orderInfo.setPayType("WECHAT"); + } else if ("ALIPAY".equals(scanpayResp.getPayType())) { + orderInfo.setPayType("ALIPAY"); + } else if ("UNIONPAY".equals(scanpayResp.getPayType())) { + orderInfo.setPayType("UNIONPAY"); + } + + + ObjectMapper mapper = new ObjectMapper(); + + Map map=new HashMap<>(); + + map.put("orderInfo",orderInfo); + map.put("payInfo",mapper.readTree(scanpayResp.getPayInfo())); + return Result.success(CodeEnum.PAYING, map); } + } + } + }else if("ALIPAY".equals(payType)){ + PublicResp publicResp= thirdPayService.apppay(url,thirdApply.getAppId(),thirdApply.getAppToken(),reqbody,reqbody,orderInfo.getOrderAmount().multiply(new BigDecimal(100)).longValue(),payType,ip,DateUtils.getSsdfTimes(),thirdApply.getStoreId(),backUrl,backUrl); + + if (ObjectUtil.isNotNull(publicResp) && ObjectUtil.isNotEmpty(publicResp)) { + if ("000000".equals(publicResp.getCode())) { + ApppayResp scanpayResp = publicResp.getObjData(); + if ("TRADE_SUCCESS".equals(scanpayResp.getState())) { + + payment.setTradeNumber(scanpayResp.getPayOrderId()); + payment.setUpdatedAt(System.currentTimeMillis()); + tbOrderPaymentMapper.updateByPrimaryKeySelective(payment); + + //处理支付成功的订单 + orderInfo.setStatus("closed"); + orderInfo.setPayOrderNo(scanpayResp.getPayOrderId()); + tbOrderInfoMapper.updateByPrimaryKeySelective(orderInfo); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = new ObjectMapper(); + return Result.success(CodeEnum.SUCCESS, mapper.readTree(scanpayResp.getPayInfo())); - Map map=new HashMap<>(); + } else if ("TRADE_AWAIT".equals(scanpayResp.getState())) { + orderInfo.setStatus("paying"); + orderInfo.setPayOrderNo(payment.getTradeNumber()); + tbOrderInfoMapper.updateByPrimaryKeySelective(orderInfo); - map.put("orderInfo",orderInfo); - map.put("payInfo",mapper.readTree(scanpayResp.getPayInfo())); - return Result.success(CodeEnum.PAYING, map); + payment.setTradeNumber(scanpayResp.getPayOrderId()); + payment.setUpdatedAt(System.currentTimeMillis()); + tbOrderPaymentMapper.updateByPrimaryKeySelective(payment); + + + if ("WECHAT".equals(scanpayResp.getPayType())) { + orderInfo.setPayType("WECHAT"); + } else if ("ALIPAY".equals(scanpayResp.getPayType())) { + orderInfo.setPayType("ALIPAY"); + } else if ("UNIONPAY".equals(scanpayResp.getPayType())) { + orderInfo.setPayType("UNIONPAY"); + } + + + ObjectMapper mapper = new ObjectMapper(); + + Map map=new HashMap<>(); + + map.put("orderInfo",orderInfo); + map.put("payInfo",mapper.readTree(scanpayResp.getPayInfo())); + return Result.success(CodeEnum.PAYING, map); + } } } } + + return Result.fail(CodeEnum.FAIL); } diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/req/ChrpayReq.java b/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/req/ChrpayReq.java new file mode 100644 index 0000000..7eac5aa --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/req/ChrpayReq.java @@ -0,0 +1,45 @@ +package com.chaozhanggui.system.cashierservice.thirdpay.req; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class ChrpayReq implements Serializable { + + + + private String subject; + + private String body; + + private Long amount; + + private String currency="cny"; + + private String payType; + + + private String clientIp; + + private String mchOrderNo; + + private String storeId; + + private String notifyUrl; + + private String returnUrl; + + public ChrpayReq(String subject, String body, Long amount, String currency, String payType, String clientIp, String mchOrderNo, String storeId, String notifyUrl, String returnUrl) { + this.subject = subject; + this.body = body; + this.amount = amount; + this.currency = currency; + this.payType = payType; + this.clientIp = clientIp; + this.mchOrderNo = mchOrderNo; + this.storeId = storeId; + this.notifyUrl = notifyUrl; + this.returnUrl = returnUrl; + } +} diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/resp/ChrpayResp.java b/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/resp/ChrpayResp.java new file mode 100644 index 0000000..84bdfa3 --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/resp/ChrpayResp.java @@ -0,0 +1,51 @@ +package com.chaozhanggui.system.cashierservice.thirdpay.resp; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class ChrpayResp implements Serializable { + + private Long amount; + + private String mchOrderNo; + + private String payOrderId; + + private String mercNo; + + private String channelSendNo; + + private String channelTradeNo; + + private String state; + + private String payType; + + private String ifCode; + + private String extParam; + + private String payInfo; + + private String liteInfo; + + private String note; + + private String tradeFee; + + private String storeId; + + private String subject; + + private String drType; + + private String refundAmt; + + private String refundState; + + private String cashFee; + + private String settlementType; +} diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/service/ThirdPayService.java b/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/service/ThirdPayService.java index 63083eb..e588ff6 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/service/ThirdPayService.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/thirdpay/service/ThirdPayService.java @@ -36,6 +36,8 @@ public class ThirdPayService { private static String jspay="/api/open/payment/jspay"; private static String apppay="/api/open/payment/apppay"; + + private static String chrpay="/api/open/payment/chrpay"; /** * 被扫接口 * @param url @@ -420,6 +422,47 @@ public class ThirdPayService { } + /** + * 聚合收银台 + * @param url + * @param appId + * @param key + * @param subject + * @param body + * @param amount + * @param clientIp + * @param mchOrderNo + * @param storeId + * @param notifyUrl + * @param returnUrl + * @return + */ + public PublicResp chrpay(String url,String appId,String key,String subject, String body, Long amount, String payType, String clientIp, String mchOrderNo, String storeId, String notifyUrl, String returnUrl){ + ChrpayReq chrpayReq=new ChrpayReq(subject, body, amount, "cny",payType,clientIp, mchOrderNo, storeId, notifyUrl, returnUrl); + + + PublicParam param=new PublicParam(appId,null,SignTypeEnum.MD5.getValue(), null,DateUtils.getSdfTimes(),"1.0",String.valueOf(System.currentTimeMillis())); + try { + String str=JSONUtil.toJSONString(sortFields(chrpayReq)); + param.setBizData(str); + String tt = sortFieldsAndPrint(param); + String MD5 = tt.concat("appSecret=" + key); + log.info("加签原传:{}", MD5); + String sign = MD5Util.encrypt(MD5); + param.setSign(sign); + String reqbody = JSONUtil.toJSONString(param); + log.info("请求参数:{}", reqbody); + String response = HttpRequest.post(url.concat(chrpay)).body(reqbody).execute().body(); + log.info("返回结果:{}", response); + PublicResp resp =JSONUtil.parseJSONStr2T(response,PublicResp.class); + resp.setObjData(JSONUtil.parseJSONStr2T(resp.getBizData(),ChrpayResp.class)); + return resp; + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + 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 14/19] =?UTF-8?q?=E6=89=93=E5=8D=B0=E6=95=B4=E5=90=88?= =?UTF-8?q?=E4=BF=AE=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); + } + } +} From 04718abc01d3674611a85cbcfccfb376e494e5d6 Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Sat, 14 Sep 2024 17:40:43 +0800 Subject: [PATCH 15/19] =?UTF-8?q?=E5=A2=9E=E5=8A=A0sql=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 5 +++ .../rabbit/BalanceConsumer.java | 6 ++-- src/main/resources/application-dev.yml | 4 +-- src/main/resources/spy.properties | 32 +++++++++++++++++++ 4 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/spy.properties diff --git a/pom.xml b/pom.xml index 6440f19..0e5eba4 100644 --- a/pom.xml +++ b/pom.xml @@ -196,6 +196,11 @@ + + p6spy + p6spy + 3.8.2 + com.baomidou mybatis-plus-boot-starter diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/BalanceConsumer.java b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/BalanceConsumer.java index 8532993..dfd6096 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/BalanceConsumer.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/BalanceConsumer.java @@ -37,11 +37,11 @@ public class BalanceConsumer { - @Value("${wx.balance.appId}") +// @Value("${wx.balance.appId}") private static String appId="wxd88fffa983758a30" ; - @Value("${wx.balance.secrete}") +// @Value("${wx.balance.secrete}") private static String secrete="a34a61adc0602118b49400baa8812454" ; - @Value("${wx.balance.warnMsgTmpId}") +// @Value("${wx.balance.warnMsgTmpId}") private static String msgTmpId = "AV-KybUHaK3KtFVLqpy6PHccHBS7XeX__mOM4RbufnQ"; static LinkedHashMap linkedHashMap=new LinkedHashMap<>(); diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index ba41bd9..e5b3d3e 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -4,10 +4,10 @@ spring: application: name: cashierService datasource: - url: jdbc:mysql://rm-bp1kn7h89nz62cno1ro.mysql.rds.aliyuncs.com:3306/fycashier_test?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useJDBCCompliantTimezoneShift=true&serverTimezone=Asia/Shanghai&useSSL=false&allowMultiQueries=true + url: jdbc:p6spy:mysql://rm-bp1kn7h89nz62cno1ro.mysql.rds.aliyuncs.com:3306/fycashier_test?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useJDBCCompliantTimezoneShift=true&serverTimezone=Asia/Shanghai&useSSL=false&allowMultiQueries=true username: cashier password: Cashier@1@ - driver-class-name: com.mysql.cj.jdbc.Driver + driver-class-name: com.p6spy.engine.spy.P6SpyDriver initialSize: 5 minIdle: 5 maxActive: 20 diff --git a/src/main/resources/spy.properties b/src/main/resources/spy.properties new file mode 100644 index 0000000..2d47097 --- /dev/null +++ b/src/main/resources/spy.properties @@ -0,0 +1,32 @@ +#?????????? +modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory +#?????????? +logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger +#?????? ???? +#appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger +#??????? SLF4J ???? +#appender=com.p6spy.engine.spy.appender.Slf4JLogger +#??????? file?? +appender=com.p6spy.engine.spy.appender.FileLogger +#?????????? +logfile=sql.log +#???? JDBC ??????????? +#deregisterdrivers=true +#?????????????? +useprefix=true +#????????????????????? +excludecategories=info,debug,result,commit,resultset +#????????????? +dateformat=yyyy-MM-dd HH:mm:ss +#?????????????? +databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss +#?? JDBC ?????? +#driverlist=org.h2.Driver +#?????? +outagedetection=true +#?????????????????? +outagedetectioninterval=2 +#?? SQL ???? +filter=true +#?????? "SELECT 1" ? SQL ?? +exclude=SELECT 1 From eb8a53718dfc8c1dc83a1f1425fea2431b3ff7aa Mon Sep 17 00:00:00 2001 From: SongZhang <2064194730@qq.com> Date: Sat, 14 Sep 2024 17:49:49 +0800 Subject: [PATCH 16/19] =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 ++++ .../system/cashierservice/rabbit/PrintConsumer.java | 5 +++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 6440f19..042ed46 100644 --- a/pom.xml +++ b/pom.xml @@ -21,6 +21,10 @@ + + org.springframework.boot + spring-boot-starter-test + org.apache.commons commons-lang3 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 c67dd6e..c46e148 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintConsumer.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintConsumer.java @@ -69,9 +69,10 @@ public class PrintConsumer { } @RabbitListener(queues = {RabbitConstants.QUEUE_PRINT_DISHES}) - public void printDishesListener(JSONObject jsonObject) { + public void printDishesListener(String msg) { try { - log.info("打印消息mq 接收到打印菜品消息,消息内容: {}", jsonObject); + log.info("打印消息mq 接收到打印菜品消息,消息内容: {}", msg); + JSONObject jsonObject = JSONObject.parseObject(msg); Integer orderId = jsonObject.getInteger("orderId"); JSONArray orderDetailIds = jsonObject.getJSONArray("orderDetailIds"); Boolean isReturn = jsonObject.getBoolean("isReturn"); From 89ac3c9e25a2e28e072e9288ea407dffd01e1ea3 Mon Sep 17 00:00:00 2001 From: SongZhang <2064194730@qq.com> Date: Sat, 14 Sep 2024 17:50:21 +0800 Subject: [PATCH 17/19] =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/cashierservice/Tets.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/test/java/com/chaozhanggui/system/cashierservice/Tets.java diff --git a/src/test/java/com/chaozhanggui/system/cashierservice/Tets.java b/src/test/java/com/chaozhanggui/system/cashierservice/Tets.java new file mode 100644 index 0000000..002d451 --- /dev/null +++ b/src/test/java/com/chaozhanggui/system/cashierservice/Tets.java @@ -0,0 +1,43 @@ +package com.chaozhanggui.system.cashierservice; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.poi.excel.ExcelUtil; +import cn.hutool.poi.excel.ExcelWriter; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.chaozhanggui.system.cashierservice.rabbit.PrintConsumer; +import com.chaozhanggui.system.cashierservice.rabbit.PrintMechineConsumer; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.Map; + +@ActiveProfiles("dev") +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class Tets { + @Autowired + private PrintMechineConsumer printMechineConsumer; + @Autowired + private PrintConsumer printConsumer; + + @Test + public void test() { +// printMechineConsumer.listener("4537"); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("orderId", 4557); + jsonObject.put("orderDetailIds", new Integer[]{10454, 10455}); + jsonObject.put("isReturn", false); +// printConsumer.printDishesListener(jsonObject); + } + + public static void main(String[] args) { + + } +} From a84f3f39b361f5cd7b577385552f8024360572b2 Mon Sep 17 00:00:00 2001 From: yijiegong Date: Sat, 14 Sep 2024 18:04:47 +0800 Subject: [PATCH 18/19] =?UTF-8?q?=E8=AF=B7=E6=B1=82=E5=91=98=E5=B7=A5?= =?UTF-8?q?=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/StaffPermissionController.java | 25 ++++ .../dao/TbShopPermissionDao.java | 15 ++ .../dao/TbShopStaffPermissionDao.java | 15 ++ .../entity/TbShopPermission.java | 129 ++++++++++++++++++ .../entity/TbShopStaffPermission.java | 77 +++++++++++ .../service/TbShopPermissionService.java | 21 +++ .../service/TbShopStaffPermissionService.java | 15 ++ .../impl/TbShopPermissionServiceImpl.java | 46 +++++++ .../TbShopStaffPermissionServiceImpl.java | 21 +++ .../cashierservice/StaffPermissionTest.java | 22 +++ 10 files changed, 386 insertions(+) create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/controller/StaffPermissionController.java create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/dao/TbShopPermissionDao.java create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/dao/TbShopStaffPermissionDao.java create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/entity/TbShopPermission.java create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/entity/TbShopStaffPermission.java create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/service/TbShopPermissionService.java create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/service/TbShopStaffPermissionService.java create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/service/impl/TbShopPermissionServiceImpl.java create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/service/impl/TbShopStaffPermissionServiceImpl.java create mode 100644 src/test/java/com/chaozhanggui/system/cashierservice/StaffPermissionTest.java diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/controller/StaffPermissionController.java b/src/main/java/com/chaozhanggui/system/cashierservice/controller/StaffPermissionController.java new file mode 100644 index 0000000..98a2b89 --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/controller/StaffPermissionController.java @@ -0,0 +1,25 @@ +package com.chaozhanggui.system.cashierservice.controller; + +import com.chaozhanggui.system.cashierservice.service.TbShopPermissionService; +import com.chaozhanggui.system.cashierservice.service.TbShopStaffPermissionService; +import com.chaozhanggui.system.cashierservice.sign.Result; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Slf4j +@RequestMapping("staffPermission") +public class StaffPermissionController { + + @Autowired + private TbShopPermissionService permissionService; + + @GetMapping + public Result getStaffPermission(String staffId, String code) { + return permissionService.getStaffPermission(staffId, code); + } + +} diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/dao/TbShopPermissionDao.java b/src/main/java/com/chaozhanggui/system/cashierservice/dao/TbShopPermissionDao.java new file mode 100644 index 0000000..664e64c --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/dao/TbShopPermissionDao.java @@ -0,0 +1,15 @@ +package com.chaozhanggui.system.cashierservice.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.chaozhanggui.system.cashierservice.entity.TbShopPermission; + +/** + * (TbShopPermission)表数据库访问层 + * + * @author makejava + * @since 2024-09-14 17:08:48 + */ +public interface TbShopPermissionDao extends BaseMapper { + +} + diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/dao/TbShopStaffPermissionDao.java b/src/main/java/com/chaozhanggui/system/cashierservice/dao/TbShopStaffPermissionDao.java new file mode 100644 index 0000000..a536686 --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/dao/TbShopStaffPermissionDao.java @@ -0,0 +1,15 @@ +package com.chaozhanggui.system.cashierservice.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.chaozhanggui.system.cashierservice.entity.TbShopStaffPermission; + +/** + * 店铺员工权限关联表(TbShopStaffPermission)表数据库访问层 + * + * @author makejava + * @since 2024-09-14 17:07:33 + */ +public interface TbShopStaffPermissionDao extends BaseMapper { + +} + diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbShopPermission.java b/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbShopPermission.java new file mode 100644 index 0000000..380a643 --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbShopPermission.java @@ -0,0 +1,129 @@ +package com.chaozhanggui.system.cashierservice.entity; + +import java.util.Date; + +import com.baomidou.mybatisplus.extension.activerecord.Model; + +import java.io.Serializable; + +/** + * (TbShopPermission)表实体类 + * + * @author makejava + * @since 2024-09-14 17:08:48 + */ +@SuppressWarnings("serial") +public class TbShopPermission extends Model { + + private Integer id; + //权限类型:staff 员工, + private String type; + //权限名称 + private String label; + //权限code,为了区分采用汉语拼音 + private String code; + //层级 + private Integer level; + //上级ID + private Integer parentId; + //是否重要: 重要对应页面红色 + private Integer isImportant; + //排序 + private Integer sort; + + private Date createTime; + + private Date updateTime; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public Integer getParentId() { + return parentId; + } + + public void setParentId(Integer parentId) { + this.parentId = parentId; + } + + public Integer getIsImportant() { + return isImportant; + } + + public void setIsImportant(Integer isImportant) { + this.isImportant = isImportant; + } + + public Integer getSort() { + return sort; + } + + public void setSort(Integer sort) { + this.sort = sort; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + /** + * 获取主键值 + * + * @return 主键值 + */ + @Override + protected Serializable pkVal() { + return this.id; + } +} + diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbShopStaffPermission.java b/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbShopStaffPermission.java new file mode 100644 index 0000000..46c4a31 --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbShopStaffPermission.java @@ -0,0 +1,77 @@ +package com.chaozhanggui.system.cashierservice.entity; + +import com.baomidou.mybatisplus.extension.activerecord.Model; + +import java.io.Serializable; + +/** + * 店铺员工权限关联表(TbShopStaffPermission)表实体类 + * + * @author makejava + * @since 2024-09-14 17:07:33 + */ +@SuppressWarnings("serial") +public class TbShopStaffPermission extends Model { + + private Integer id; + //权限ID + private Integer permissionId; + //员工ID + private Integer staffId; + //店铺ID + private Integer shopId; + //用户ID + private Integer userId; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getPermissionId() { + return permissionId; + } + + public void setPermissionId(Integer permissionId) { + this.permissionId = permissionId; + } + + public Integer getStaffId() { + return staffId; + } + + public void setStaffId(Integer staffId) { + this.staffId = staffId; + } + + public Integer getShopId() { + return shopId; + } + + public void setShopId(Integer shopId) { + this.shopId = shopId; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + /** + * 获取主键值 + * + * @return 主键值 + */ + @Override + protected Serializable pkVal() { + return this.id; + } +} + diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/service/TbShopPermissionService.java b/src/main/java/com/chaozhanggui/system/cashierservice/service/TbShopPermissionService.java new file mode 100644 index 0000000..9fb6a38 --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/service/TbShopPermissionService.java @@ -0,0 +1,21 @@ +package com.chaozhanggui.system.cashierservice.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.chaozhanggui.system.cashierservice.entity.TbShopPermission; +import com.chaozhanggui.system.cashierservice.sign.Result; + +/** + * (TbShopPermission)表服务接口 + * + * @author makejava + * @since 2024-09-14 17:08:48 + */ +public interface TbShopPermissionService extends IService { + + /** + * 查询员工是否拥有某个权限 + */ + Result getStaffPermission(String staffId, String code); + +} + diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/service/TbShopStaffPermissionService.java b/src/main/java/com/chaozhanggui/system/cashierservice/service/TbShopStaffPermissionService.java new file mode 100644 index 0000000..e6da0ac --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/service/TbShopStaffPermissionService.java @@ -0,0 +1,15 @@ +package com.chaozhanggui.system.cashierservice.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.chaozhanggui.system.cashierservice.entity.TbShopStaffPermission; + +/** + * 店铺员工权限关联表(TbShopStaffPermission)表服务接口 + * + * @author makejava + * @since 2024-09-14 17:07:33 + */ +public interface TbShopStaffPermissionService extends IService { + +} + diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/service/impl/TbShopPermissionServiceImpl.java b/src/main/java/com/chaozhanggui/system/cashierservice/service/impl/TbShopPermissionServiceImpl.java new file mode 100644 index 0000000..686eac0 --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/service/impl/TbShopPermissionServiceImpl.java @@ -0,0 +1,46 @@ +package com.chaozhanggui.system.cashierservice.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.chaozhanggui.system.cashierservice.dao.TbShopPermissionDao; +import com.chaozhanggui.system.cashierservice.entity.TbShopPermission; +import com.chaozhanggui.system.cashierservice.entity.TbShopStaffPermission; +import com.chaozhanggui.system.cashierservice.service.TbShopPermissionService; +import com.chaozhanggui.system.cashierservice.service.TbShopStaffPermissionService; +import com.chaozhanggui.system.cashierservice.sign.CodeEnum; +import com.chaozhanggui.system.cashierservice.sign.Result; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Service; + +/** + * (TbShopPermission)表服务实现类 + * + * @author makejava + * @since 2024-09-14 17:08:49 + */ +@Service +@Primary +public class TbShopPermissionServiceImpl extends ServiceImpl implements TbShopPermissionService { + + @Autowired + private TbShopStaffPermissionService shopStaffPermissionService; + + @Override + public Result getStaffPermission(String staffId, String code) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("code", code); + TbShopPermission permission = this.getOne(queryWrapper); + if (permission == null) { + return Result.fail("权限不存在"); + } + + QueryWrapper staffPermissionQueryWrapper = new QueryWrapper<>(); + staffPermissionQueryWrapper.eq("staff_id", staffId); + staffPermissionQueryWrapper.eq("permission_id", permission.getId()); + TbShopStaffPermission staffPermission = shopStaffPermissionService.getOne(staffPermissionQueryWrapper); + + return Result.success(CodeEnum.SUCCESS, staffPermission != null); + } +} + diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/service/impl/TbShopStaffPermissionServiceImpl.java b/src/main/java/com/chaozhanggui/system/cashierservice/service/impl/TbShopStaffPermissionServiceImpl.java new file mode 100644 index 0000000..19af549 --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/service/impl/TbShopStaffPermissionServiceImpl.java @@ -0,0 +1,21 @@ +package com.chaozhanggui.system.cashierservice.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.chaozhanggui.system.cashierservice.dao.TbShopStaffPermissionDao; +import com.chaozhanggui.system.cashierservice.entity.TbShopStaffPermission; +import com.chaozhanggui.system.cashierservice.service.TbShopStaffPermissionService; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Service; + +/** + * 店铺员工权限关联表(TbShopStaffPermission)表服务实现类 + * + * @author makejava + * @since 2024-09-14 17:07:33 + */ +@Service +@Primary +public class TbShopStaffPermissionServiceImpl extends ServiceImpl implements TbShopStaffPermissionService { + +} + diff --git a/src/test/java/com/chaozhanggui/system/cashierservice/StaffPermissionTest.java b/src/test/java/com/chaozhanggui/system/cashierservice/StaffPermissionTest.java new file mode 100644 index 0000000..302aed4 --- /dev/null +++ b/src/test/java/com/chaozhanggui/system/cashierservice/StaffPermissionTest.java @@ -0,0 +1,22 @@ +package com.chaozhanggui.system.cashierservice; + +import com.chaozhanggui.system.cashierservice.service.TbShopPermissionService; +import com.chaozhanggui.system.cashierservice.sign.Result; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; + +@ActiveProfiles("dev") +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class StaffPermissionTest { + @Autowired + private TbShopPermissionService tbShopPermissionService; + @Test + public void testStaffPermission() { + + Result yunXuTuiKuan = tbShopPermissionService.getStaffPermission("128", "yun_xu_tui_kuan2"); + System.out.println(yunXuTuiKuan); + + } +} From 3ae12ce04d8b0cfd3920206162bff148d774294a Mon Sep 17 00:00:00 2001 From: yijiegong Date: Thu, 19 Sep 2024 15:32:04 +0800 Subject: [PATCH 19/19] =?UTF-8?q?PC=20=E6=9C=80=E6=96=B0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/VersionController.java | 40 +++++++++++++++++++ .../interceptor/SignInterceptor.java | 6 ++- .../cashierservice/service/LoginService.java | 9 +++-- 3 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/chaozhanggui/system/cashierservice/controller/VersionController.java diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/controller/VersionController.java b/src/main/java/com/chaozhanggui/system/cashierservice/controller/VersionController.java new file mode 100644 index 0000000..73247ed --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/controller/VersionController.java @@ -0,0 +1,40 @@ +package com.chaozhanggui.system.cashierservice.controller; + +import com.chaozhanggui.system.cashierservice.entity.TbVersion; +import com.chaozhanggui.system.cashierservice.service.LoginService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author yijiegong + */ +@RestController +@RequestMapping("/version") +public class VersionController { + + @Autowired + LoginService loginService; + + @GetMapping("pcDownload") + public ResponseEntity pcDownload(HttpServletRequest request, HttpServletResponse response) { + TbVersion pcVersion = loginService.getCurrentPcVersion(); + + if (pcVersion == null) { + throw new RuntimeException("未找到PC版本信息"); + } + + // 重定向到下载地址 + HttpHeaders headers = new HttpHeaders(); + headers.setLocation(java.net.URI.create(pcVersion.getUrl())); + return new ResponseEntity<>(headers, HttpStatus.FOUND); + } + +} diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/SignInterceptor.java b/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/SignInterceptor.java index ad1dba3..acf8bf3 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/SignInterceptor.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/interceptor/SignInterceptor.java @@ -37,7 +37,7 @@ public class SignInterceptor implements HandlerInterceptor { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - String requestURI = request.getRequestURI(); + String requestUri = request.getRequestURI(); if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) { response.setStatus(HttpServletResponse.SC_OK); @@ -45,6 +45,10 @@ public class SignInterceptor implements HandlerInterceptor { return true; } + if (requestUri.contains("/version/pcDownload")) { + return true; + } + String token=request.getHeader("token"); String loginName=request.getHeader("loginName"); String clientType=request.getHeader("clientType"); diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/service/LoginService.java b/src/main/java/com/chaozhanggui/system/cashierservice/service/LoginService.java index dcc52f1..709dffa 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/service/LoginService.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/service/LoginService.java @@ -146,14 +146,17 @@ public class LoginService { } public Result findVersion() { + TbVersion pcVersion = getCurrentPcVersion(); + return new Result(SUCCESS, pcVersion); + } + + public TbVersion getCurrentPcVersion() { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(TbVersion::getSource,"PC"); queryWrapper.eq(TbVersion::getSel,1); - return new Result(SUCCESS,versionMapper.selectOne(queryWrapper)); + return versionMapper.selectOne(queryWrapper); } - - public Result logout(String loginName, String clientType, String token, String status) { String key = RedisCst.ONLINE_USER.concat(":").concat(clientType).concat(":").concat(loginName);