diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java index 1c34d008..5fc7d6aa 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java @@ -114,6 +114,7 @@ public interface ErrorCodeConstants { ErrorCode STORE_ORDER_NOT_EXISTS = new ErrorCode(1_007_904_005, "商品订单不存在"); ErrorCode AMOUNT_NOT_ENOUGH = new ErrorCode(1_007_904_008, "金额不足"); + ErrorCode CODE_NOT_TIME = new ErrorCode(1_007_904_008, "二维码过期"); ErrorCode STATUS_ERROR = new ErrorCode(1_007_904_007, "订单已完成或已退款"); diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/store/AppStoreController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/store/AppStoreController.java index be2bb22a..7da720bd 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/store/AppStoreController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/store/AppStoreController.java @@ -1,10 +1,10 @@ package cn.iocoder.yudao.module.member.controller.app.store; import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.StoreResult; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.member.controller.admin.storegoodsinventory.vo.AddReqVO; import cn.iocoder.yudao.module.member.controller.app.store.dto.FacePayDto; import cn.iocoder.yudao.module.member.controller.app.store.dto.StoreOrderDto; import cn.iocoder.yudao.module.member.controller.app.store.dto.StoreOrderUploadDto; @@ -19,6 +19,7 @@ import cn.iocoder.yudao.module.member.dal.dataobject.storegoods.StoreGoodsDO; import cn.iocoder.yudao.module.member.dal.dataobject.storegoodstype.StoreGoodsTypeDO; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import cn.iocoder.yudao.module.member.enums.StoreOrderStatusEnum; +import cn.iocoder.yudao.module.member.service.async.MemberAsyncService; import cn.iocoder.yudao.module.member.service.storegoods.StoreGoodsService; import cn.iocoder.yudao.module.member.service.storegoodstype.StoreGoodsTypeService; import cn.iocoder.yudao.module.member.service.storeorder.StoreOrderService; @@ -59,6 +60,8 @@ public class AppStoreController { private StoreOrderService orderService; @Resource private StoreOrderDetailService orderDetailService; + @Resource + private MemberAsyncService memberAsyncService; @GetMapping("/mgcr/memberUser/getMenberTwoList") @Operation(summary = "获取用户关联信息") @@ -180,14 +183,10 @@ public class AppStoreController { @PostMapping("/mgcr/order/payByCodeOrder") @Operation(summary = "添加二维码订单") public String payByCodeOrder(@RequestBody StoreOrderDto dto) { + AddReqVO addReqVO = orderService.codePay(dto); + memberAsyncService.batchRecord(addReqVO); + return JsonUtils.toJsonString(StoreResult.success(null)); - String s = orderService.codePay(dto); - - if(StrUtil.isNotBlank(s)){ - return JsonUtils.toJsonString(StoreResult.fail(s)); - }else { - return JsonUtils.toJsonString(StoreResult.success(null)); - } } public String reverseHexAndConvert(String hexStr) { diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/storeorder/AppStoreOrderController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/storeorder/AppStoreOrderController.java index 0b02ce80..23f28a51 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/storeorder/AppStoreOrderController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/storeorder/AppStoreOrderController.java @@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.member.controller.admin.storegoodsinventory.vo.Ad import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderPageReqVO; import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderRespVO; import cn.iocoder.yudao.module.member.controller.app.storeorder.vo.AppStoreOrderDetailVo; +import cn.iocoder.yudao.module.member.controller.app.storeorder.vo.AppStoreOrderVO; import cn.iocoder.yudao.module.member.controller.app.storeorder.vo.CardDto; import cn.iocoder.yudao.module.member.dal.dataobject.storeorder.StoreOrderDO; import cn.iocoder.yudao.module.member.service.async.MemberAsyncService; @@ -73,6 +74,12 @@ public class AppStoreOrderController { return success(storeOrderService.code(orderId)); } + @GetMapping("/info") + @Operation(summary = "二维码商品信息") + public CommonResult info(String code) { + return success(storeOrderService.info(code)); + } + @GetMapping("/complete") @Operation(summary = "核销") public CommonResult complete(Integer orderId) { diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/storeorder/vo/AppStoreOrderVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/storeorder/vo/AppStoreOrderVO.java new file mode 100644 index 00000000..a2d26bd3 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/storeorder/vo/AppStoreOrderVO.java @@ -0,0 +1,62 @@ +package cn.iocoder.yudao.module.member.controller.app.storeorder.vo; + +import cn.iocoder.yudao.module.member.dal.dataobject.storeorderdetail.StoreOrderDetailDO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** + * @author zt + * @description + * @since 2024/11/13 + */ +@Data +public class AppStoreOrderVO { + + private Integer orderId; + /** + * 读取卡号 + */ + private String cardNumber; + /** + * 人脸 + */ + private String openId; + /** + * 数量 + */ + private Integer number; + /** + * 设备ID + */ + private String equipmentCode; + /** + * 离线缓存ID + */ + private String uuid; + /** + * 总价钱 + */ + private Double totalPrice; + + private Long userId; + + /** + * 减免金额 + */ + private Double reductionPrice; + + /** + * 门店ID + */ + private Long carteenId; + + /** + * (1-已支付,2-已完成,3-已取消,4-已退款) + */ + private Integer status; + + @Schema(description = "商品详情") + private List goodsList; +} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderService.java index 34e01712..37a828ad 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderService.java @@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.member.controller.app.store.dto.FacePayDto; import cn.iocoder.yudao.module.member.controller.app.store.dto.StoreOrderDto; import cn.iocoder.yudao.module.member.controller.app.store.dto.StoreOrderUploadDto; import cn.iocoder.yudao.module.member.controller.app.store.vo.UserInfoVo; +import cn.iocoder.yudao.module.member.controller.app.storeorder.vo.AppStoreOrderVO; import cn.iocoder.yudao.module.member.controller.app.storeorder.vo.CardDto; import cn.iocoder.yudao.module.member.dal.dataobject.storeorder.StoreOrderDO; @@ -67,7 +68,7 @@ public interface StoreOrderService { String cardPay(StoreOrderDto dto); - String codePay(StoreOrderDto dto); + AddReqVO codePay(StoreOrderDto dto); void batchCacheOrder(StoreOrderUploadDto dto); @@ -83,6 +84,8 @@ public interface StoreOrderService { String code(Integer orderId); + AppStoreOrderVO info(String code); + Boolean complete(Integer orderId); AddReqVO cancel(Integer orderId); diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderServiceImpl.java index fb46beea..9f9a01ec 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderServiceImpl.java @@ -19,6 +19,7 @@ import cn.iocoder.yudao.module.member.controller.app.store.dto.StoreOrderDto; import cn.iocoder.yudao.module.member.controller.app.store.dto.StoreOrderUploadDto; import cn.iocoder.yudao.module.member.controller.app.store.vo.UserInfoVo; import cn.iocoder.yudao.module.member.controller.app.storeorder.vo.AppStoreGoodsDetail; +import cn.iocoder.yudao.module.member.controller.app.storeorder.vo.AppStoreOrderVO; import cn.iocoder.yudao.module.member.controller.app.storeorder.vo.CardDto; import cn.iocoder.yudao.module.member.dal.dataobject.storeorder.StoreOrderDO; import cn.iocoder.yudao.module.member.dal.dataobject.storeorderdetail.StoreOrderDetailDO; @@ -203,25 +204,42 @@ public class StoreOrderServiceImpl implements StoreOrderService { @Override @Transactional(rollbackFor = Exception.class) - public String codePay(StoreOrderDto dto) { + public AddReqVO codePay(StoreOrderDto dto) { String s = storeOrderRedisTemplate.opsForValue().get(dto.getJwt()); if (StrUtil.isBlank(s)) { - return "二维码过期"; + throw exception(CODE_NOT_TIME); } + Long storeId = cashregisterinfoApi.getStoreId(dto.getEquipmentCode()); + List equipmentGoodsCustoms = dto.getEquipmentGoodsCustoms(); double sum = equipmentGoodsCustoms.stream() .mapToDouble(StoreGoodsDto::getTotalPrice) .sum(); BigDecimal totalMoney = BigDecimal.valueOf(sum); -// BigDecimal amount = amountService.getAmount(dto.getUserId()); MemberUserDO user = userService.getUser(Long.valueOf(s)); dto.setUserId(user.getId()); if(user.getMoney().compareTo(totalMoney) < 0){ - return "金额不足"; + throw exception(AMOUNT_NOT_ENOUGH); } + + //库存处理,扣除库存 + AddReqVO addReqVO = new AddReqVO(); + addReqVO.setType(InventoryTypeEnum.OUT.getCode()); + addReqVO.setOutType(OutTypeEnum.SELL.getCode()); + List infos = new ArrayList<>(); + for (StoreGoodsDto detail : dto.getEquipmentGoodsCustoms()){ + GoodsInfoReqVO vo = new GoodsInfoReqVO(); + BeanUtil.copyProperties(detail,vo); + vo.setCarteenId(storeId); + vo.setWeight(0d); + infos.add(vo); + } + addReqVO.setList(infos); + storeGoodsInventoryService.createStoreGoodsInventory(addReqVO); + StoreOrderDO order = createOrder(dto,StoreOrderStatusEnum.COMPLETE.getCode()); Double totalPrice = order.getTotalPrice(); BigDecimal total = BigDecimal.valueOf(totalPrice).setScale(2, RoundingMode.HALF_UP); @@ -230,7 +248,7 @@ public class StoreOrderServiceImpl implements StoreOrderService { if (compute.compareTo(BigDecimal.ZERO) < 0) { storeOrderMapper.deleteById(order.getOrderId()); orderDetailService.deleteByOrderNo(order.getOrderId()); - return "金额不足"; + throw exception(AMOUNT_NOT_ENOUGH); } //营业数据 StatisticsVo statisticsVo = new StatisticsVo(); @@ -241,7 +259,7 @@ public class StoreOrderServiceImpl implements StoreOrderService { statisticsVo.setOrderId(order.getOrderId().longValue()); storeBusinessService.updateStatistics(statisticsVo); - return null; + return addReqVO; } @Override @@ -408,7 +426,19 @@ public class StoreOrderServiceImpl implements StoreOrderService { @Override public String code(Integer orderId) { - return QRCodeWithJWTUtil.generateQRCode(orderId.toString(), 350, 350, null);// 生 + return QRCodeWithJWTUtil.generateQRCode(QRCodeWithJWTUtil.QR_PREFIX_HX+orderId.toString(), 350, 350, null);// 生 + } + + @Override + public AppStoreOrderVO info(String code) { + code = code.replace(QRCodeWithJWTUtil.QR_PREFIX_HX,""); + Integer orderId = Integer.valueOf(code); + StoreOrderDO storeOrderDO = storeOrderMapper.selectById(orderId); + AppStoreOrderVO vo = new AppStoreOrderVO(); + BeanUtil.copyProperties(storeOrderDO,vo); + List listByOrderId = orderDetailService.getListByOrderId(orderId); + vo.setGoodsList(listByOrderId); + return vo; } @Override diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java index 13e09511..babacac4 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java @@ -921,6 +921,7 @@ public class MemberUserServiceImpl implements MemberUserService { // return url; // } String encode = DigestUtil.md5Hex(userId.toString()+System.currentTimeMillis()); + encode = QRCodeWithJWTUtil.QR_PREFIX_ZF+encode; String fileName = "QRCode_" + userId + ".png"; String path = QRCodeWithJWTUtil.BASE_PATH+fileName; String s = QRCodeWithJWTUtil.generateQRCode(encode, 350, 350, path);// 生 diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/util/QRCodeWithJWTUtil.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/util/QRCodeWithJWTUtil.java index 64cb56e8..26f47e7b 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/util/QRCodeWithJWTUtil.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/util/QRCodeWithJWTUtil.java @@ -1,20 +1,14 @@ package cn.iocoder.yudao.module.member.util; -import cn.hutool.core.io.FileUtil; import cn.hutool.crypto.digest.DigestUtil; import cn.hutool.extra.qrcode.QrCodeUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; - import cn.hutool.jwt.JWTUtil; - import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; -import java.io.File; - -import java.time.LocalDateTime; import java.util.Base64; import java.util.HashMap; import java.util.Map; @@ -24,7 +18,8 @@ import java.util.concurrent.TimeUnit; public class QRCodeWithJWTUtil { private static final String SECRET_KEY = "your_secret_key"; // 使用HS256算法生成秘钥 public static final String BASE_PATH = "qrCodes/"; - public static final String QR_PREFIX = "QRCODE_"; + public static final String QR_PREFIX_ZF = "ZF_"; + public static final String QR_PREFIX_HX = "HX_"; // public static void main(String[] args) throws WriterException, IOException { // // 用户ID // Long userId = 123L;