From 96dbde39430ecb88ccc5ffb0baefe3f08196b135 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Fri, 21 Mar 2025 11:29:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E9=92=B1=E5=8C=85=E8=AE=B0=E8=B4=A6?= =?UTF-8?q?=E6=89=A3=E6=AC=BE=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hard/api/constant/HardTypeEnum.java | 6 ++- .../api/constant/order/HardPayTypeEnum.java | 1 + .../dto/app/HardAppCreateOrderScancode.java | 18 ++++++++ .../dto/order/app/HardAppCreateOrderDto.java | 8 +++- .../controller/order/HardOrderController.java | 18 ++++++++ .../hard/service/HardOrderService.java | 5 +++ .../impl/order/HardOrderServiceImpl.java | 40 ++++++++++++++++++ .../api/vo/code/MchCollectionCodeVo.java | 4 -- .../controller/MchManageController.java | 8 ++++ .../WalletTransactionController.java | 20 +++++++++ .../wallet/service/MchManageService.java | 5 +++ .../service/impl/MchManageServiceImpl.java | 39 ++++++++++++++--- .../main/resources/file/个人记账扣款明细.xlsx | Bin 0 -> 10071 bytes 13 files changed, 160 insertions(+), 12 deletions(-) create mode 100644 pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/app/HardAppCreateOrderScancode.java create mode 100644 pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/file/个人记账扣款明细.xlsx diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardTypeEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardTypeEnum.java index 2b9bc77bd..d5a0684ff 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardTypeEnum.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardTypeEnum.java @@ -19,12 +19,16 @@ public enum HardTypeEnum { CANTEEN("2", "食堂"), READ_CARD("3", "读卡器"), DOOR("4", "生鲜柜"), + MERCHANT_QR_CODE("5", "商户二维码扣款牌"), ; private final String type; private final String description; // 是否能预定 - private static final List isReserveList = List.of(SUPERMARKET, CANTEEN); + public static final List isReserveList = List.of(SUPERMARKET, CANTEEN); + + // 不需要创建购物车 + public static final List isNoneCar = List.of(MERCHANT_QR_CODE); public static Boolean isReserve(HardTypeEnum type) { return isReserveList.contains(type); diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardPayTypeEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardPayTypeEnum.java index d7ffcf9b0..92b859f08 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardPayTypeEnum.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardPayTypeEnum.java @@ -15,6 +15,7 @@ import java.util.Arrays; public enum HardPayTypeEnum { WALLET_DEFAULT("1", "普通钱包支付"), WALLET_QR_CODE("2", "钱包二维码支付"), + WALLET_QR_CODE_SCAN("22", "钱包扫一扫支付"), WALLET_CARD("3", "钱包饭卡支付"), FACE("4", "人脸识别支付"), STRIDE_DEPT_QR_CODE("5", "跨单位二维码支付"), diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/app/HardAppCreateOrderScancode.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/app/HardAppCreateOrderScancode.java new file mode 100644 index 000000000..07065b793 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/app/HardAppCreateOrderScancode.java @@ -0,0 +1,18 @@ +package com.bsd.pjcloud.hard.api.dto.app; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class HardAppCreateOrderScancode { + + @Schema(description = "商户id") + @NotNull(message = "商户id不能为空") + private Long merchantId; + + @Schema(description = "用户输入的价格") + @NotNull(message = "自定义金额不能为空") + private Integer customPrice; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppCreateOrderDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppCreateOrderDto.java index 0666aef21..4cdcd3a0f 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppCreateOrderDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppCreateOrderDto.java @@ -4,6 +4,7 @@ import com.bsd.pjcloud.hard.api.constant.HardTypeEnum; import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum; import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum; import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; +import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; @@ -16,7 +17,6 @@ import lombok.NoArgsConstructor; @Data public class HardAppCreateOrderDto { - @NotNull(message = "父订单id不能为空") private Long carParentId; @NotNull(message = "用户id不能为空") @@ -36,4 +36,10 @@ public class HardAppCreateOrderDto { private Long orderSourceTypeId; + // 用户自定义的价格(分)不是通过计算购物车总价得来的 + private Integer customPrice; + + // 商户id + private Long merchantId; + } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderController.java index 25590953e..c52fbf3ff 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderController.java @@ -23,6 +23,7 @@ import com.bsd.pjcloud.hard.api.constant.HardTypeEnum; import com.bsd.pjcloud.hard.api.constant.order.HardHourTypeEnum; import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum; import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum; +import com.bsd.pjcloud.hard.api.dto.app.HardAppCreateOrderScancode; import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; import com.bsd.pjcloud.hard.api.dto.order.HardOrderPreferencesDto; import com.bsd.pjcloud.hard.api.dto.order.app.HardAppCreateOrderDto; @@ -41,6 +42,7 @@ import org.springframework.http.HttpHeaders; import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.io.IOException; @@ -102,6 +104,22 @@ public class HardOrderController { HardAppCreateOrderDto dto = HardAppCreateOrderDto.builder().carParentId(carParentId).walletType(WalletTypeEnum.EAT).hardType(hardType).userId(user.getId()).orderType(HardOrderTypeEnum.RESERVE).payType(HardPayTypeEnum.WALLET_DEFAULT).build(); return R.ok(hardwareOrderService.appCreateOrder(dto)); } + + @Operation(summary = "app创建订单扫一扫", description = "app创建订单扫一扫") + @PostMapping("/app/create-order-scan-qrcode") + @Idempotent(expireTime = 10, info = "正在创建订单中,请勿重复操作") + public R appCreateOrderScancode(@Validated @RequestBody HardAppCreateOrderScancode body) { + PjcloudUser user = SecurityUtils.getUser(); + HardAppCreateOrderDto dto = HardAppCreateOrderDto.builder() + .customPrice(body.getCustomPrice()) + .userId(user.getId()) + .hardType(HardTypeEnum.MERCHANT_QR_CODE) + .orderType(HardOrderTypeEnum.RESERVE) + .walletType(WalletTypeEnum.EAT) + .payType(HardPayTypeEnum.WALLET_QR_CODE_SCAN) + .build(); + return R.ok(hardwareOrderService.appCreateOrderScancode(dto)); + } /* ************************************* end app end ************************************* */ @Operation(summary = "分页查询", description = "分页查询") diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java index 8483dc39d..f6968945d 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java @@ -30,6 +30,11 @@ public interface HardOrderService extends IService { */ Long appCreateOrder(@Valid HardAppCreateOrderDto dto); + /** + * 创建app订单 + */ + Long appCreateOrderScancode(@Valid HardAppCreateOrderDto dto); + /** * 快速扣款,离线订单使用 */ diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java index 73757e9af..9c3ba2cd9 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java @@ -337,6 +337,46 @@ public class HardOrderServiceImpl extends ServiceImpl list = walletTransactionService.scopeList(dto, DataScope.of()); + walletTransactionService.exportByTemplate(response, dto, "file/个人记账扣款明细.xlsx", list); + } + + @Operation(summary = "消费导出", description = "消费导出") @PostMapping("/export-xf") @PreAuthorize("@pms.hasPermission('wallet_walletTransaction_export')") diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchManageService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchManageService.java index 556b59a35..6b9f0e23d 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchManageService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchManageService.java @@ -30,4 +30,9 @@ public interface MchManageService extends IService { MchManageVo getFirstMch(List deptIds); MchManageVo getFirstMchByDeptId(Long deptId); + + /** + * 刷新商户二维码 + */ + void refreshQrcode(Long mchId); } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/MchManageServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/MchManageServiceImpl.java index 1519f3f84..241450699 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/MchManageServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/MchManageServiceImpl.java @@ -1,13 +1,13 @@ package com.bsd.pjcloud.wallet.service.impl; +import cn.hutool.core.codec.Base64; import cn.hutool.core.util.ObjectUtil; import cn.hutool.extra.spring.SpringUtil; +import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.bsd.pjcloud.admin.api.dto.UserInfo; import com.bsd.pjcloud.admin.api.entity.SysDept; import com.bsd.pjcloud.admin.api.feign.RemoteDeptService; import com.bsd.pjcloud.admin.api.feign.RemoteFileService; @@ -24,16 +24,13 @@ import com.bsd.pjcloud.wallet.api.entity.MchManageEntity; import com.bsd.pjcloud.wallet.api.entity.WalletTypeEntity; import com.bsd.pjcloud.wallet.api.utils.WalletDataUtil; import com.bsd.pjcloud.wallet.api.vo.MchManageVo; -import com.bsd.pjcloud.wallet.api.vo.WalletActiveVo; import com.bsd.pjcloud.wallet.api.vo.code.MchCollectionCodeVo; import com.bsd.pjcloud.wallet.mapper.MchManageMapper; import com.bsd.pjcloud.wallet.mapper.WalletTypeMapper; import com.bsd.pjcloud.wallet.service.MchManageService; import com.bsd.pjcloud.wallet.service.WalletThirdZyService; -import com.bsd.pjcloud.wallet.service.WalletTypeService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.cache.annotation.CacheEvict; import org.springframework.context.annotation.Lazy; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.mock.web.MockMultipartFile; @@ -88,12 +85,13 @@ public class MchManageServiceImpl extends ServiceImpl() .eq(ObjectUtil.isNotEmpty(name), MchManageEntity::getName, name) diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/file/个人记账扣款明细.xlsx b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/file/个人记账扣款明细.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5fd058e7b26c90798b2626c33a8492cc26f92e2f GIT binary patch literal 10071 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