Bläddra i källkod

feature: 请求消费时卡类限额与折扣逻辑处理

luo.yibo@datuai.com 1 år sedan
förälder
incheckning
9c26b487e6
41 ändrade filer med 696 tillägg och 291 borttagningar
  1. 3 1
      ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/RemoteXfDiscountService.java
  2. 5 4
      ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/domain/vo/RemoteDiscountVo.java
  3. 6 5
      ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/domain/vo/RemoteQuotaVo.java
  4. 11 11
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfDiscounttermController.java
  5. 7 7
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfQuotatermController.java
  6. 5 4
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/XfDiscount.java
  7. 1 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/XfDiscountTerm.java
  8. 6 5
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/XfQuota.java
  9. 1 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/XfQuotaTerm.java
  10. 10 9
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfDiscountBo.java
  11. 3 4
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfDiscountTermBo.java
  12. 11 10
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfQuotaBo.java
  13. 3 4
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfQuotaTermBo.java
  14. 18 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/convert/RemoteDiscountVoConvert.java
  15. 18 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/convert/RemoteQuotaVoConvert.java
  16. 3 5
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/vo/XfDiscountTermVo.java
  17. 6 8
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/vo/XfDiscountVo.java
  18. 7 9
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/vo/XfQuotaVo.java
  19. 2 4
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/vo/XfQuotatermVo.java
  20. 15 3
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/dubbo/RemoteXfDiscountServiceImpl.java
  21. 4 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/dubbo/RemoteXfLimitedServiceImpl.java
  22. 16 4
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/dubbo/RemoteXfQuotaServiceImpl.java
  23. 15 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/mapper/XfDiscountTermMapper.java
  24. 0 15
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/mapper/XfDiscounttermMapper.java
  25. 2 2
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/mapper/XfQuotaTermMapper.java
  26. 10 3
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfDiscountService.java
  27. 15 9
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfDiscountTermService.java
  28. 0 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfLimitedService.java
  29. 8 3
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfQuotaService.java
  30. 13 7
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfQuotaTermService.java
  31. 21 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfDiscountServiceImpl.java
  32. 49 36
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfDiscountTermServiceImpl.java
  33. 17 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfQuotaServiceImpl.java
  34. 44 31
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfQuotaTermServiceImpl.java
  35. 2 2
      ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/consumption/XfDiscountTermMapper.xml
  36. 2 2
      ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/consumption/XfQuotaTermMapper.xml
  37. 18 24
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/BaseBusiness.java
  38. 286 42
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/CheckBusiness.java
  39. 29 11
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/ConsumeBusiness.java
  40. 3 2
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfCardLimited.java
  41. 1 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfCardLimitedService.java

+ 3 - 1
ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/RemoteXfDiscountService.java

@@ -46,8 +46,10 @@ public interface RemoteXfDiscountService {
 
     /**
      * 根据卡类型查询折扣信息
+     *
      * @param cardType 卡类
+     * @param mealType 餐类
      * @return 卡类折扣信息
      */
-    RemoteDiscountVo queryDisCountByCardType(Integer cardType);
+    RemoteDiscountVo queryDisCountByCardType(Integer cardType, String mealType);
 }

+ 5 - 4
ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/domain/vo/RemoteDiscountVo.java

@@ -4,6 +4,7 @@ import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.math.BigDecimal;
 
 
 /**
@@ -45,22 +46,22 @@ public class RemoteDiscountVo implements Serializable {
     /**
      * 折扣率1
      */
-    private Long oneRate;
+    private BigDecimal oneRate;
 
     /**
      * 折扣率2
      */
-    private Long twoRate;
+    private BigDecimal twoRate;
 
     /**
      * 折扣率3
      */
-    private Long threeRate;
+    private BigDecimal threeRate;
 
     /**
      * 折扣率4
      */
-    private Long fourRate;
+    private BigDecimal fourRate;
 
     /**
      * 备注

+ 6 - 5
ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/domain/vo/RemoteQuotaVo.java

@@ -5,6 +5,7 @@ import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.math.BigDecimal;
 
 
 /**
@@ -35,27 +36,27 @@ public class RemoteQuotaVo implements Serializable {
     /**
      * 每日金额
      */
-    private Long dailyMoney;
+    private BigDecimal dailyMoney;
 
     /**
      * 早餐金额
      */
-    private Long oneMoney;
+    private BigDecimal oneMoney;
 
     /**
      * 午餐金额
      */
-    private Long twoMoney;
+    private BigDecimal twoMoney;
 
     /**
      * 晚餐金额
      */
-    private Long threeMoney;
+    private BigDecimal threeMoney;
 
     /**
      * 宵夜金额
      */
-    private Long fourMoney;
+    private BigDecimal fourMoney;
 
     /**
      * 备注

+ 11 - 11
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfDiscounttermController.java

@@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.backstage.consumption.domain.vo.XfDiscountTermVo;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -17,9 +18,8 @@ import org.dromara.common.core.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
 import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.excel.utils.ExcelUtil;
-import org.dromara.backstage.consumption.domain.vo.XfDiscounttermVo;
-import org.dromara.backstage.consumption.domain.bo.XfDiscounttermBo;
-import org.dromara.backstage.consumption.service.IXfDiscounttermService;
+import org.dromara.backstage.consumption.domain.bo.XfDiscountTermBo;
+import org.dromara.backstage.consumption.service.IXfDiscountTermService;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 
 import org.dromara.common.message.kafka.aop.annotation.SyncDataToLocal;
@@ -39,14 +39,14 @@ import static org.dromara.common.message.kafka.constant.MessageEventTypeConstant
 @RequestMapping("/consumption/xfDiscountterm")
 public class XfDiscounttermController extends BaseController {
 
-    private final IXfDiscounttermService xfDiscounttermService;
+    private final IXfDiscountTermService xfDiscounttermService;
 
     /**
      * 查询折扣设备列表
      */
     @SaCheckPermission("consumption:xfDiscountterm:list")
     @GetMapping("/list")
-    public TableDataInfo<XfDiscounttermVo> list(XfDiscounttermBo bo, PageQuery pageQuery) {
+    public TableDataInfo<XfDiscountTermVo> list(XfDiscountTermBo bo, PageQuery pageQuery) {
         return xfDiscounttermService.queryPageList(bo, pageQuery);
     }
 
@@ -56,9 +56,9 @@ public class XfDiscounttermController extends BaseController {
     @SaCheckPermission("consumption:xfDiscountterm:export")
     @Log(title = "折扣设备", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
-    public void export(XfDiscounttermBo bo, HttpServletResponse response) {
-        List<XfDiscounttermVo> list = xfDiscounttermService.queryList(bo);
-        ExcelUtil.exportExcel(list, "折扣设备", XfDiscounttermVo.class, response);
+    public void export(XfDiscountTermBo bo, HttpServletResponse response) {
+        List<XfDiscountTermVo> list = xfDiscounttermService.queryList(bo);
+        ExcelUtil.exportExcel(list, "折扣设备", XfDiscountTermVo.class, response);
     }
 
     /**
@@ -68,7 +68,7 @@ public class XfDiscounttermController extends BaseController {
      */
     @SaCheckPermission("consumption:xfDiscountterm:query")
     @GetMapping("/{discountTermId}")
-    public R<XfDiscounttermVo> getInfo(@NotNull(message = "主键不能为空")
+    public R<XfDiscountTermVo> getInfo(@NotNull(message = "主键不能为空")
                                      @PathVariable Long discountTermId) {
         return R.ok(xfDiscounttermService.queryById(discountTermId));
     }
@@ -81,7 +81,7 @@ public class XfDiscounttermController extends BaseController {
     @RepeatSubmit()
 //    @SyncDataToLocal(eventType = DISCOUNT_TERM_ADD, sender = XF_DISCOUNT_SENDER)
     @PostMapping()
-    public R<Void> add(@Validated(AddGroup.class) @RequestBody XfDiscounttermBo bo) {
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody XfDiscountTermBo bo) {
         return toAjax(xfDiscounttermService.insertByBo(bo));
     }
 
@@ -104,7 +104,7 @@ public class XfDiscounttermController extends BaseController {
     @Log(title = "折扣设备", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
-    public R<Void> edit(@Validated(EditGroup.class) @RequestBody XfDiscounttermBo bo) {
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody XfDiscountTermBo bo) {
         return toAjax(xfDiscounttermService.updateByBo(bo));
     }
 

+ 7 - 7
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfQuotatermController.java

@@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.backstage.consumption.domain.bo.XfQuotaTermBo;
 import org.dromara.common.message.kafka.aop.annotation.SyncDataToLocal;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
@@ -19,8 +20,7 @@ import org.dromara.common.core.validate.EditGroup;
 import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.excel.utils.ExcelUtil;
 import org.dromara.backstage.consumption.domain.vo.XfQuotatermVo;
-import org.dromara.backstage.consumption.domain.bo.XfQuotatermBo;
-import org.dromara.backstage.consumption.service.IXfQuotatermService;
+import org.dromara.backstage.consumption.service.IXfQuotaTermService;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 
 import static org.dromara.common.message.kafka.constant.MessageEventTypeConstants.*;
@@ -38,14 +38,14 @@ import static org.dromara.common.message.kafka.constant.MessageEventTypeConstant
 @RequestMapping("/consumption/xfQuotaterm")
 public class XfQuotatermController extends BaseController {
 
-    private final IXfQuotatermService xfQuotatermService;
+    private final IXfQuotaTermService xfQuotatermService;
 
     /**
      * 查询限额设备绑定列表
      */
     @SaCheckPermission("consumption:xfQuotaterm:list")
     @GetMapping("/list")
-    public TableDataInfo<XfQuotatermVo> list(XfQuotatermBo bo, PageQuery pageQuery) {
+    public TableDataInfo<XfQuotatermVo> list(XfQuotaTermBo bo, PageQuery pageQuery) {
         return xfQuotatermService.queryPageList(bo, pageQuery);
     }
 
@@ -55,7 +55,7 @@ public class XfQuotatermController extends BaseController {
     @SaCheckPermission("consumption:xfQuotaterm:export")
     @Log(title = "限额设备绑定", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
-    public void export(XfQuotatermBo bo, HttpServletResponse response) {
+    public void export(XfQuotaTermBo bo, HttpServletResponse response) {
         List<XfQuotatermVo> list = xfQuotatermService.queryList(bo);
         ExcelUtil.exportExcel(list, "限额设备绑定", XfQuotatermVo.class, response);
     }
@@ -80,7 +80,7 @@ public class XfQuotatermController extends BaseController {
     @RepeatSubmit()
 //    @SyncDataToLocal(eventType = QUOTA_TERM_ADD, sender = XF_QUOTA_SENDER)
     @PostMapping()
-    public R<Void> add(@Validated(AddGroup.class) @RequestBody XfQuotatermBo bo) {
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody XfQuotaTermBo bo) {
         return toAjax(xfQuotatermService.insertByBo(bo));
     }
 
@@ -103,7 +103,7 @@ public class XfQuotatermController extends BaseController {
     @Log(title = "限额设备绑定", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
-    public R<Void> edit(@Validated(EditGroup.class) @RequestBody XfQuotatermBo bo) {
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody XfQuotaTermBo bo) {
         return toAjax(xfQuotatermService.updateByBo(bo));
     }
 

+ 5 - 4
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/XfDiscount.java

@@ -6,6 +6,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import java.io.Serial;
+import java.math.BigDecimal;
 
 /**
  * 折扣管理对象 t_xf_discount
@@ -45,22 +46,22 @@ public class XfDiscount extends TenantEntity {
     /**
      * 折扣率1
      */
-    private Long oneRate;
+    private BigDecimal oneRate;
 
     /**
      * 折扣率2
      */
-    private Long twoRate;
+    private BigDecimal twoRate;
 
     /**
      * 折扣率3
      */
-    private Long threeRate;
+    private BigDecimal threeRate;
 
     /**
      * 折扣率4
      */
-    private Long fourRate;
+    private BigDecimal fourRate;
 
     /**
      * 备注

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/XfDiscountterm.java → ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/XfDiscountTerm.java

@@ -16,7 +16,7 @@ import java.io.Serial;
 @Data
 @EqualsAndHashCode(callSuper = true)
 @TableName("t_xf_discountTerm")
-public class XfDiscountterm extends TenantEntity {
+public class XfDiscountTerm extends TenantEntity {
 
     @Serial
     private static final long serialVersionUID = 1L;

+ 6 - 5
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/XfQuota.java

@@ -6,6 +6,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import java.io.Serial;
+import java.math.BigDecimal;
 
 /**
  * 限额管理对象 t_xf_quota
@@ -35,27 +36,27 @@ public class XfQuota extends TenantEntity {
     /**
      * 每日金额
      */
-    private Long dailyMoney;
+    private BigDecimal dailyMoney;
 
     /**
      * 早餐金额
      */
-    private Long oneMoney;
+    private BigDecimal oneMoney;
 
     /**
      * 午餐金额
      */
-    private Long twoMoney;
+    private BigDecimal twoMoney;
 
     /**
      * 晚餐金额
      */
-    private Long threeMoney;
+    private BigDecimal threeMoney;
 
     /**
      * 宵夜金额
      */
-    private Long fourMoney;
+    private BigDecimal fourMoney;
 
     /**
      * 备注

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/XfQuotaterm.java → ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/XfQuotaTerm.java

@@ -16,7 +16,7 @@ import java.io.Serial;
 @Data
 @EqualsAndHashCode(callSuper = true)
 @TableName("t_xf_quotaTerm")
-public class XfQuotaterm extends TenantEntity {
+public class XfQuotaTerm extends TenantEntity {
 
     @Serial
     private static final long serialVersionUID = 1L;

+ 10 - 9
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfDiscountBo.java

@@ -1,16 +1,17 @@
 package org.dromara.backstage.consumption.domain.bo;
 
-import org.dromara.backstage.consumption.domain.XfDiscount;
-import org.dromara.common.mybatis.core.domain.BaseEntity;
-import org.dromara.common.core.validate.AddGroup;
-import org.dromara.common.core.validate.EditGroup;
 import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import jakarta.validation.constraints.*;
+import org.dromara.backstage.consumption.domain.XfDiscount;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
 import org.dromara.common.tenant.core.TenantEntity;
 
 import java.io.Serial;
+import java.math.BigDecimal;
 
 /**
  * 折扣管理业务对象 t_xf_discount
@@ -51,22 +52,22 @@ public class XfDiscountBo extends TenantEntity {
     /**
      * 折扣率1
      */
-    private Long oneRate;
+    private BigDecimal oneRate;
 
     /**
      * 折扣率2
      */
-    private Long twoRate;
+    private BigDecimal twoRate;
 
     /**
      * 折扣率3
      */
-    private Long threeRate;
+    private BigDecimal threeRate;
 
     /**
      * 折扣率4
      */
-    private Long fourRate;
+    private BigDecimal fourRate;
 
     /**
      * 备注

+ 3 - 4
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfDiscounttermBo.java → ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfDiscountTermBo.java

@@ -1,7 +1,6 @@
 package org.dromara.backstage.consumption.domain.bo;
 
-import org.dromara.backstage.consumption.domain.XfDiscountterm;
-import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.backstage.consumption.domain.XfDiscountTerm;
 import org.dromara.common.core.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
 import io.github.linpeilie.annotations.AutoMapper;
@@ -20,8 +19,8 @@ import java.io.Serial;
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
-@AutoMapper(target = XfDiscountterm.class, reverseConvertGenerate = false)
-public class XfDiscounttermBo extends TenantEntity {
+@AutoMapper(target = XfDiscountTerm.class, reverseConvertGenerate = false)
+public class XfDiscountTermBo extends TenantEntity {
 
     @Serial
     private static final long serialVersionUID = 5738441094984271180L;

+ 11 - 10
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfQuotaBo.java

@@ -1,16 +1,17 @@
 package org.dromara.backstage.consumption.domain.bo;
 
-import org.dromara.backstage.consumption.domain.XfQuota;
-import org.dromara.common.mybatis.core.domain.BaseEntity;
-import org.dromara.common.core.validate.AddGroup;
-import org.dromara.common.core.validate.EditGroup;
 import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import jakarta.validation.constraints.*;
+import org.dromara.backstage.consumption.domain.XfQuota;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
 import org.dromara.common.tenant.core.TenantEntity;
 
 import java.io.Serial;
+import java.math.BigDecimal;
 
 /**
  * 限额管理业务对象 t_xf_quota
@@ -41,31 +42,31 @@ public class XfQuotaBo extends TenantEntity {
      * 每日金额
      */
 //    @NotNull(message = "每日金额不能为空", groups = { AddGroup.class, EditGroup.class })
-    private Long dailyMoney;
+    private BigDecimal dailyMoney;
 
     /**
      * 早餐金额
      */
 //    @NotNull(message = "早餐金额不能为空", groups = { AddGroup.class, EditGroup.class })
-    private Long oneMoney;
+    private BigDecimal oneMoney;
 
     /**
      * 午餐金额
      */
 //    @NotNull(message = "午餐金额不能为空", groups = { AddGroup.class, EditGroup.class })
-    private Long twoMoney;
+    private BigDecimal twoMoney;
 
     /**
      * 晚餐金额
      */
 //    @NotNull(message = "晚餐金额不能为空", groups = { AddGroup.class, EditGroup.class })
-    private Long threeMoney;
+    private BigDecimal threeMoney;
 
     /**
      * 宵夜金额
      */
 //    @NotNull(message = "宵夜金额不能为空", groups = { AddGroup.class, EditGroup.class })
-    private Long fourMoney;
+    private BigDecimal fourMoney;
 
     /**
      * 备注

+ 3 - 4
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfQuotatermBo.java → ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfQuotaTermBo.java

@@ -1,7 +1,6 @@
 package org.dromara.backstage.consumption.domain.bo;
 
-import org.dromara.backstage.consumption.domain.XfQuotaterm;
-import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.backstage.consumption.domain.XfQuotaTerm;
 import org.dromara.common.core.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
 import io.github.linpeilie.annotations.AutoMapper;
@@ -20,8 +19,8 @@ import java.io.Serial;
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
-@AutoMapper(target = XfQuotaterm.class, reverseConvertGenerate = false)
-public class XfQuotatermBo extends TenantEntity {
+@AutoMapper(target = XfQuotaTerm.class, reverseConvertGenerate = false)
+public class XfQuotaTermBo extends TenantEntity {
 
     @Serial
     private static final long serialVersionUID = 1406757870540616686L;

+ 18 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/convert/RemoteDiscountVoConvert.java

@@ -0,0 +1,18 @@
+package org.dromara.backstage.consumption.domain.convert;
+
+import io.github.linpeilie.BaseMapper;
+import org.dromara.backstage.api.domain.vo.RemoteDiscountVo;
+import org.dromara.backstage.consumption.domain.vo.XfDiscountVo;
+import org.mapstruct.Mapper;
+import org.mapstruct.MappingConstants;
+import org.mapstruct.ReportingPolicy;
+
+/**
+ * 卡片视图对象转换器
+ *
+ * @author bing
+ */
+@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface RemoteDiscountVoConvert extends BaseMapper<XfDiscountVo, RemoteDiscountVo> {
+
+}

+ 18 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/convert/RemoteQuotaVoConvert.java

@@ -0,0 +1,18 @@
+package org.dromara.backstage.consumption.domain.convert;
+
+import io.github.linpeilie.BaseMapper;
+import org.dromara.backstage.api.domain.vo.RemoteQuotaVo;
+import org.dromara.backstage.consumption.domain.vo.XfQuotaVo;
+import org.mapstruct.Mapper;
+import org.mapstruct.MappingConstants;
+import org.mapstruct.ReportingPolicy;
+
+/**
+ * 卡片视图对象转换器
+ *
+ * @author bing
+ */
+@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface RemoteQuotaVoConvert extends BaseMapper<XfQuotaVo, RemoteQuotaVo> {
+
+}

+ 3 - 5
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/vo/XfDiscounttermVo.java → ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/vo/XfDiscountTermVo.java

@@ -1,10 +1,8 @@
 package org.dromara.backstage.consumption.domain.vo;
 
-import org.dromara.backstage.consumption.domain.XfDiscountterm;
+import org.dromara.backstage.consumption.domain.XfDiscountTerm;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
-import org.dromara.common.excel.annotation.ExcelDictFormat;
-import org.dromara.common.excel.convert.ExcelDictConvert;
 import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 
@@ -22,8 +20,8 @@ import java.util.Date;
  */
 @Data
 @ExcelIgnoreUnannotated
-@AutoMapper(target = XfDiscountterm.class)
-public class XfDiscounttermVo implements Serializable {
+@AutoMapper(target = XfDiscountTerm.class)
+public class XfDiscountTermVo implements Serializable {
 
     @Serial
     private static final long serialVersionUID = 1L;

+ 6 - 8
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/vo/XfDiscountVo.java

@@ -1,18 +1,16 @@
 package org.dromara.backstage.consumption.domain.vo;
 
-import org.dromara.backstage.consumption.domain.XfDiscount;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
-import org.dromara.common.excel.annotation.ExcelDictFormat;
-import org.dromara.common.excel.convert.ExcelDictConvert;
 import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
+import org.dromara.backstage.consumption.domain.XfDiscount;
 import org.dromara.common.translation.annotation.Translation;
 import org.dromara.common.translation.constant.TransConstant;
 
 import java.io.Serial;
 import java.io.Serializable;
-import java.util.Date;
+import java.math.BigDecimal;
 
 
 
@@ -66,25 +64,25 @@ public class XfDiscountVo implements Serializable {
      * 折扣率1
      */
     @ExcelProperty(value = "折扣率1")
-    private Long oneRate;
+    private BigDecimal oneRate;
 
     /**
      * 折扣率2
      */
     @ExcelProperty(value = "折扣率2")
-    private Long twoRate;
+    private BigDecimal twoRate;
 
     /**
      * 折扣率3
      */
     @ExcelProperty(value = "折扣率3")
-    private Long threeRate;
+    private BigDecimal threeRate;
 
     /**
      * 折扣率4
      */
     @ExcelProperty(value = "折扣率4")
-    private Long fourRate;
+    private BigDecimal fourRate;
 
     /**
      * 备注

+ 7 - 9
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/vo/XfQuotaVo.java

@@ -1,18 +1,16 @@
 package org.dromara.backstage.consumption.domain.vo;
 
-import org.dromara.backstage.consumption.domain.XfQuota;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
-import org.dromara.common.excel.annotation.ExcelDictFormat;
-import org.dromara.common.excel.convert.ExcelDictConvert;
 import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
+import org.dromara.backstage.consumption.domain.XfQuota;
 import org.dromara.common.translation.annotation.Translation;
 import org.dromara.common.translation.constant.TransConstant;
 
 import java.io.Serial;
 import java.io.Serializable;
-import java.util.Date;
+import java.math.BigDecimal;
 
 
 
@@ -50,31 +48,31 @@ public class XfQuotaVo implements Serializable {
      * 每日金额
      */
     @ExcelProperty(value = "每日金额")
-    private Long dailyMoney;
+    private BigDecimal dailyMoney;
 
     /**
      * 早餐金额
      */
     @ExcelProperty(value = "早餐金额")
-    private Long oneMoney;
+    private BigDecimal oneMoney;
 
     /**
      * 午餐金额
      */
     @ExcelProperty(value = "午餐金额")
-    private Long twoMoney;
+    private BigDecimal twoMoney;
 
     /**
      * 晚餐金额
      */
     @ExcelProperty(value = "晚餐金额")
-    private Long threeMoney;
+    private BigDecimal threeMoney;
 
     /**
      * 宵夜金额
      */
     @ExcelProperty(value = "宵夜金额")
-    private Long fourMoney;
+    private BigDecimal fourMoney;
 
     /**
      * 备注

+ 2 - 4
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/vo/XfQuotatermVo.java

@@ -1,10 +1,8 @@
 package org.dromara.backstage.consumption.domain.vo;
 
-import org.dromara.backstage.consumption.domain.XfQuotaterm;
+import org.dromara.backstage.consumption.domain.XfQuotaTerm;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
-import org.dromara.common.excel.annotation.ExcelDictFormat;
-import org.dromara.common.excel.convert.ExcelDictConvert;
 import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 
@@ -22,7 +20,7 @@ import java.util.Date;
  */
 @Data
 @ExcelIgnoreUnannotated
-@AutoMapper(target = XfQuotaterm.class)
+@AutoMapper(target = XfQuotaTerm.class)
 public class XfQuotatermVo implements Serializable {
 
     @Serial

+ 15 - 3
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/dubbo/RemoteXfDiscountServiceImpl.java

@@ -1,14 +1,18 @@
 package org.dromara.backstage.consumption.dubbo;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
 import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.dromara.backstage.api.RemoteXfDiscountService;
 import org.dromara.backstage.api.domain.bo.RemoteXfDiscountBo;
 import org.dromara.backstage.api.domain.vo.RemoteDiscountVo;
 import org.dromara.backstage.consumption.domain.bo.XfDiscountBo;
+import org.dromara.backstage.consumption.domain.vo.XfDiscountTermVo;
+import org.dromara.backstage.consumption.domain.vo.XfDiscountVo;
 import org.dromara.backstage.consumption.service.IXfDiscountService;
-import org.dromara.backstage.consumption.service.IXfDiscounttermService;
+import org.dromara.backstage.consumption.service.IXfDiscountTermService;
+import org.dromara.common.core.utils.MapstructUtils;
 import org.springframework.stereotype.Service;
 
 import java.util.Collection;
@@ -25,7 +29,7 @@ import java.util.List;
 @DubboService
 public class RemoteXfDiscountServiceImpl implements RemoteXfDiscountService {
     private final IXfDiscountService discountService;
-    private final IXfDiscounttermService discountTermService;
+    private final IXfDiscountTermService discountTermService;
 
     @Override
     public Boolean insertByBo(RemoteXfDiscountBo bo) throws Exception {
@@ -55,11 +59,19 @@ public class RemoteXfDiscountServiceImpl implements RemoteXfDiscountService {
 
     @Override
     public Long queryDisCountTermIdByTermId(Long termId) {
+        XfDiscountTermVo vo=  discountTermService.queryByTermId(termId);
+        if (ObjectUtil.isNotEmpty(vo)) {
+            return vo.getDiscountTermId();
+        }
         return 0L;
     }
 
     @Override
-    public RemoteDiscountVo queryDisCountByCardType(Integer cardType) {
+    public RemoteDiscountVo queryDisCountByCardType(Integer cardType, String mealType) {
+        XfDiscountVo vo = discountService.queryByCardType(cardType, mealType);
+        if (ObjectUtil.isNotEmpty(vo)) {
+            return MapstructUtils.convert(vo, RemoteDiscountVo.class);
+        }
         return null;
     }
 }

+ 4 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/dubbo/RemoteXfLimitedServiceImpl.java

@@ -77,7 +77,10 @@ public class RemoteXfLimitedServiceImpl implements RemoteXfLimitedService {
     @Override
     public RemoteLimitedVo queryLimitedByCardType(Integer cardType) {
         XfLimitedVo vo = limitedService.queryByCardType(cardType);
-        return MapstructUtils.convert(vo, RemoteLimitedVo.class);
+        if(ObjectUtil.isNotEmpty(vo)) {
+            return MapstructUtils.convert(vo, RemoteLimitedVo.class);
+        }
+        return null;
     }
 
 }

+ 16 - 4
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/dubbo/RemoteXfQuotaServiceImpl.java

@@ -1,14 +1,18 @@
 package org.dromara.backstage.consumption.dubbo;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
 import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.dromara.backstage.api.RemoteXfQuotaService;
 import org.dromara.backstage.api.domain.bo.RemoteXfQuotaBo;
 import org.dromara.backstage.api.domain.vo.RemoteQuotaVo;
 import org.dromara.backstage.consumption.domain.bo.XfQuotaBo;
+import org.dromara.backstage.consumption.domain.vo.XfQuotaVo;
+import org.dromara.backstage.consumption.domain.vo.XfQuotatermVo;
 import org.dromara.backstage.consumption.service.IXfQuotaService;
-import org.dromara.backstage.consumption.service.IXfQuotatermService;
+import org.dromara.backstage.consumption.service.IXfQuotaTermService;
+import org.dromara.common.core.utils.MapstructUtils;
 import org.springframework.stereotype.Service;
 
 import java.util.Collection;
@@ -25,7 +29,7 @@ import java.util.List;
 @DubboService
 public class RemoteXfQuotaServiceImpl implements RemoteXfQuotaService {
     private final IXfQuotaService xfQuotaService;
-    private final IXfQuotatermService xfQuotatermService;
+    private final IXfQuotaTermService xfQuotaTermService;
     @Override
     public Boolean insertByBo(RemoteXfQuotaBo bo) throws Exception {
         return xfQuotaService.insertByBo(BeanUtil.copyProperties(bo, XfQuotaBo.class));
@@ -43,21 +47,29 @@ public class RemoteXfQuotaServiceImpl implements RemoteXfQuotaService {
 
     @Override
     public Boolean addQuotaTerm(List<Long> ids) {
-        return xfQuotatermService.insertByTermIds(ids);
+        return xfQuotaTermService.insertByTermIds(ids);
     }
 
     @Override
     public Boolean deleteQuotaTerm(List<Long> ids) {
-        return xfQuotatermService.deleteWithValidByIds(ids,true);
+        return xfQuotaTermService.deleteWithValidByIds(ids,true);
     }
 
     @Override
     public Long queryQuotaTermIdByTermId(Long termId) {
+        XfQuotatermVo vo = xfQuotaTermService.queryByTermId(termId);
+        if (ObjectUtil.isNotEmpty(vo)) {
+            return vo.getQuotaTermId();
+        }
         return 0L;
     }
 
     @Override
     public RemoteQuotaVo queryQuotaByCardType(Integer cardType) {
+        XfQuotaVo vo = xfQuotaService.queryByCardType(cardType);
+        if (ObjectUtil.isNotEmpty(vo)) {
+            return MapstructUtils.convert(vo, RemoteQuotaVo.class);
+        }
         return null;
     }
 }

+ 15 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/mapper/XfDiscountTermMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.backstage.consumption.mapper;
+
+import org.dromara.backstage.consumption.domain.XfDiscountTerm;
+import org.dromara.backstage.consumption.domain.vo.XfDiscountTermVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 折扣设备Mapper接口
+ *
+ * @author bing
+ * @date 2024-08-14
+ */
+public interface XfDiscountTermMapper extends BaseMapperPlus<XfDiscountTerm, XfDiscountTermVo> {
+
+}

+ 0 - 15
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/mapper/XfDiscounttermMapper.java

@@ -1,15 +0,0 @@
-package org.dromara.backstage.consumption.mapper;
-
-import org.dromara.backstage.consumption.domain.XfDiscountterm;
-import org.dromara.backstage.consumption.domain.vo.XfDiscounttermVo;
-import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
-
-/**
- * 折扣设备Mapper接口
- *
- * @author bing
- * @date 2024-08-14
- */
-public interface XfDiscounttermMapper extends BaseMapperPlus<XfDiscountterm, XfDiscounttermVo> {
-
-}

+ 2 - 2
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/mapper/XfQuotatermMapper.java → ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/mapper/XfQuotaTermMapper.java

@@ -1,6 +1,6 @@
 package org.dromara.backstage.consumption.mapper;
 
-import org.dromara.backstage.consumption.domain.XfQuotaterm;
+import org.dromara.backstage.consumption.domain.XfQuotaTerm;
 import org.dromara.backstage.consumption.domain.vo.XfQuotatermVo;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 
@@ -10,6 +10,6 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
  * @author bing
  * @date 2024-08-14
  */
-public interface XfQuotatermMapper extends BaseMapperPlus<XfQuotaterm, XfQuotatermVo> {
+public interface XfQuotaTermMapper extends BaseMapperPlus<XfQuotaTerm, XfQuotatermVo> {
 
 }

+ 10 - 3
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfDiscountService.java

@@ -1,10 +1,9 @@
 package org.dromara.backstage.consumption.service;
 
-import org.dromara.backstage.consumption.domain.XfDiscount;
-import org.dromara.backstage.consumption.domain.vo.XfDiscountVo;
 import org.dromara.backstage.consumption.domain.bo.XfDiscountBo;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.backstage.consumption.domain.vo.XfDiscountVo;
 import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
 
 import java.util.Collection;
 import java.util.List;
@@ -66,4 +65,12 @@ public interface IXfDiscountService {
      * @return 是否删除成功
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+    /**
+     * 根据卡类型查询折扣信息
+     *
+     * @param cardType 卡类
+     * @param mealType 餐类
+     * @return 卡类折扣信息
+     */
+    XfDiscountVo queryByCardType(Integer cardType, String mealType);
 }

+ 15 - 9
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfDiscounttermService.java → ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfDiscountTermService.java

@@ -1,8 +1,7 @@
 package org.dromara.backstage.consumption.service;
 
-import org.dromara.backstage.consumption.domain.XfDiscountterm;
-import org.dromara.backstage.consumption.domain.vo.XfDiscounttermVo;
-import org.dromara.backstage.consumption.domain.bo.XfDiscounttermBo;
+import org.dromara.backstage.consumption.domain.vo.XfDiscountTermVo;
+import org.dromara.backstage.consumption.domain.bo.XfDiscountTermBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
 
@@ -15,7 +14,7 @@ import java.util.List;
  * @author bing
  * @date 2024-08-14
  */
-public interface IXfDiscounttermService {
+public interface IXfDiscountTermService {
 
     /**
      * 查询折扣设备
@@ -23,7 +22,7 @@ public interface IXfDiscounttermService {
      * @param discountTermId 主键
      * @return 折扣设备
      */
-    XfDiscounttermVo queryById(Long discountTermId);
+    XfDiscountTermVo queryById(Long discountTermId);
 
     /**
      * 分页查询折扣设备列表
@@ -32,7 +31,7 @@ public interface IXfDiscounttermService {
      * @param pageQuery 分页参数
      * @return 折扣设备分页列表
      */
-    TableDataInfo<XfDiscounttermVo> queryPageList(XfDiscounttermBo bo, PageQuery pageQuery);
+    TableDataInfo<XfDiscountTermVo> queryPageList(XfDiscountTermBo bo, PageQuery pageQuery);
 
     /**
      * 查询符合条件的折扣设备列表
@@ -40,7 +39,7 @@ public interface IXfDiscounttermService {
      * @param bo 查询条件
      * @return 折扣设备列表
      */
-    List<XfDiscounttermVo> queryList(XfDiscounttermBo bo);
+    List<XfDiscountTermVo> queryList(XfDiscountTermBo bo);
 
     /**
      * 新增折扣设备
@@ -48,7 +47,7 @@ public interface IXfDiscounttermService {
      * @param bo 折扣设备
      * @return 是否新增成功
      */
-    Boolean insertByBo(XfDiscounttermBo bo);
+    Boolean insertByBo(XfDiscountTermBo bo);
 
     /**
      * 根据设备id批量新增折扣设备
@@ -63,7 +62,7 @@ public interface IXfDiscounttermService {
      * @param bo 折扣设备
      * @return 是否修改成功
      */
-    Boolean updateByBo(XfDiscounttermBo bo);
+    Boolean updateByBo(XfDiscountTermBo bo);
 
     /**
      * 校验并批量删除折扣设备信息
@@ -73,4 +72,11 @@ public interface IXfDiscounttermService {
      * @return 是否删除成功
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 根据设备Id查询折扣设备信息
+     * @param termId 设备Id
+     * @return 折扣设备信息
+     */
+    XfDiscountTermVo queryByTermId(Long termId);
 }

+ 0 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfLimitedService.java

@@ -71,6 +71,5 @@ public interface IXfLimitedService {
      * @param cardType 卡类
      * @return 卡类限次信息
      */
-
     XfLimitedVo queryByCardType(Integer cardType);
 }

+ 8 - 3
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfQuotaService.java

@@ -1,10 +1,9 @@
 package org.dromara.backstage.consumption.service;
 
-import org.dromara.backstage.consumption.domain.XfQuota;
-import org.dromara.backstage.consumption.domain.vo.XfQuotaVo;
 import org.dromara.backstage.consumption.domain.bo.XfQuotaBo;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.backstage.consumption.domain.vo.XfQuotaVo;
 import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
 
 import java.util.Collection;
 import java.util.List;
@@ -66,4 +65,10 @@ public interface IXfQuotaService {
      * @return 是否删除成功
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+    /**
+     * 根据卡类型查询限额信息
+     * @param cardType 卡类
+     * @return 卡类限额信息
+     */
+    XfQuotaVo queryByCardType(Integer cardType);
 }

+ 13 - 7
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfQuotatermService.java → ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfQuotaTermService.java

@@ -1,8 +1,7 @@
 package org.dromara.backstage.consumption.service;
 
-import org.dromara.backstage.consumption.domain.XfQuotaterm;
+import org.dromara.backstage.consumption.domain.bo.XfQuotaTermBo;
 import org.dromara.backstage.consumption.domain.vo.XfQuotatermVo;
-import org.dromara.backstage.consumption.domain.bo.XfQuotatermBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
 
@@ -15,7 +14,7 @@ import java.util.List;
  * @author bing
  * @date 2024-08-14
  */
-public interface IXfQuotatermService {
+public interface IXfQuotaTermService {
 
     /**
      * 根据设备id批量新增限额设备
@@ -39,7 +38,7 @@ public interface IXfQuotatermService {
      * @param pageQuery 分页参数
      * @return 限额设备绑定分页列表
      */
-    TableDataInfo<XfQuotatermVo> queryPageList(XfQuotatermBo bo, PageQuery pageQuery);
+    TableDataInfo<XfQuotatermVo> queryPageList(XfQuotaTermBo bo, PageQuery pageQuery);
 
     /**
      * 查询符合条件的限额设备绑定列表
@@ -47,7 +46,7 @@ public interface IXfQuotatermService {
      * @param bo 查询条件
      * @return 限额设备绑定列表
      */
-    List<XfQuotatermVo> queryList(XfQuotatermBo bo);
+    List<XfQuotatermVo> queryList(XfQuotaTermBo bo);
 
     /**
      * 新增限额设备绑定
@@ -55,7 +54,7 @@ public interface IXfQuotatermService {
      * @param bo 限额设备绑定
      * @return 是否新增成功
      */
-    Boolean insertByBo(XfQuotatermBo bo);
+    Boolean insertByBo(XfQuotaTermBo bo);
 
     /**
      * 修改限额设备绑定
@@ -63,7 +62,7 @@ public interface IXfQuotatermService {
      * @param bo 限额设备绑定
      * @return 是否修改成功
      */
-    Boolean updateByBo(XfQuotatermBo bo);
+    Boolean updateByBo(XfQuotaTermBo bo);
 
     /**
      * 校验并批量删除限额设备绑定信息
@@ -73,4 +72,11 @@ public interface IXfQuotatermService {
      * @return 是否删除成功
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 根据设备Id查询限额
+     * @param termId 设备Id
+     * @return 限额设备信息
+     */
+    XfQuotatermVo queryByTermId(Long termId);
 }

+ 21 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfDiscountServiceImpl.java

@@ -1,5 +1,6 @@
 package org.dromara.backstage.consumption.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
@@ -73,7 +74,7 @@ public class XfDiscountServiceImpl implements IXfDiscountService {
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<XfDiscount> lqw = Wrappers.lambdaQuery();
         lqw.eq(bo.getCardType() != null, XfDiscount::getCardType, bo.getCardType());
-        lqw.eq(bo.getMealType() != null, XfDiscount::getMealType, bo.getMealType());
+        lqw.eq(StringUtils.isNotBlank(bo.getMealType()), XfDiscount::getMealType, bo.getMealType());
         lqw.eq(StringUtils.isNotBlank(bo.getStatus()), XfDiscount::getStatus, bo.getStatus());
         return lqw;
     }
@@ -135,4 +136,23 @@ public class XfDiscountServiceImpl implements IXfDiscountService {
         }
         return baseMapper.deleteByIds(ids) > 0;
     }
+    /**
+     * 根据卡类型查询折扣信息
+     *
+     * @param cardType 卡类
+     * @param mealType 餐类
+     * @return 卡类折扣信息
+     */
+    @Override
+    public XfDiscountVo queryByCardType(Integer cardType, String mealType) {
+        XfDiscountBo bo = new XfDiscountBo();
+        bo.setCardType(Long.valueOf(cardType));
+        bo.setMealType(mealType);
+
+        List<XfDiscountVo> list = this.queryList(bo);
+        if (CollectionUtil.isNotEmpty(list)) {
+            return list.get(0);
+        }
+        return null;
+    }
 }

+ 49 - 36
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfDiscounttermServiceImpl.java → ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfDiscountTermServiceImpl.java

@@ -1,10 +1,11 @@
 package org.dromara.backstage.consumption.service.impl;
 
 import cn.hutool.core.collection.CollectionUtil;
+import org.dromara.backstage.consumption.domain.XfDiscountTerm;
+import org.dromara.backstage.consumption.domain.vo.XfDiscountTermVo;
 import org.dromara.backstage.consumption.domain.vo.XfTermVo;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.MapstructUtils;
-import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -12,11 +13,9 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
-import org.dromara.backstage.consumption.domain.bo.XfDiscounttermBo;
-import org.dromara.backstage.consumption.domain.vo.XfDiscounttermVo;
-import org.dromara.backstage.consumption.domain.XfDiscountterm;
-import org.dromara.backstage.consumption.mapper.XfDiscounttermMapper;
-import org.dromara.backstage.consumption.service.IXfDiscounttermService;
+import org.dromara.backstage.consumption.domain.bo.XfDiscountTermBo;
+import org.dromara.backstage.consumption.mapper.XfDiscountTermMapper;
+import org.dromara.backstage.consumption.service.IXfDiscountTermService;
 
 import java.util.List;
 import java.util.Map;
@@ -31,9 +30,9 @@ import java.util.stream.Collectors;
  */
 @RequiredArgsConstructor
 @Service
-public class XfDiscounttermServiceImpl implements IXfDiscounttermService {
+public class XfDiscountTermServiceImpl implements IXfDiscountTermService {
 
-    private final XfDiscounttermMapper baseMapper;
+    private final XfDiscountTermMapper baseMapper;
 
     private final XfTermServiceImpl termService;
 
@@ -44,7 +43,7 @@ public class XfDiscounttermServiceImpl implements IXfDiscounttermService {
      * @return 折扣设备
      */
     @Override
-    public XfDiscounttermVo queryById(Long discountTermId){
+    public XfDiscountTermVo queryById(Long discountTermId){
         return baseMapper.selectVoById(discountTermId);
     }
 
@@ -56,13 +55,13 @@ public class XfDiscounttermServiceImpl implements IXfDiscounttermService {
      * @return 折扣设备分页列表
      */
     @Override
-    public TableDataInfo<XfDiscounttermVo> queryPageList(XfDiscounttermBo bo, PageQuery pageQuery) {
-        LambdaQueryWrapper<XfDiscountterm> lqw = buildQueryWrapper(bo);
-        Page<XfDiscounttermVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+    public TableDataInfo<XfDiscountTermVo> queryPageList(XfDiscountTermBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<XfDiscountTerm> lqw = buildQueryWrapper(bo);
+        Page<XfDiscountTermVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
 
-        List<XfDiscounttermVo> records = result.getRecords();
+        List<XfDiscountTermVo> records = result.getRecords();
         if(CollectionUtil.isNotEmpty(records)){
-            Map<Long, XfTermVo> xfTermVoMap = termService.queryMapByIds(records.stream().map(XfDiscounttermVo::getTermId).collect(Collectors.toList()));
+            Map<Long, XfTermVo> xfTermVoMap = termService.queryMapByIds(records.stream().map(XfDiscountTermVo::getTermId).collect(Collectors.toList()));
             records.forEach(x -> {
                 XfTermVo xfTermVo = xfTermVoMap.get(x.getTermId());
                 if(xfTermVo != null){
@@ -82,14 +81,15 @@ public class XfDiscounttermServiceImpl implements IXfDiscounttermService {
      * @return 折扣设备列表
      */
     @Override
-    public List<XfDiscounttermVo> queryList(XfDiscounttermBo bo) {
-        LambdaQueryWrapper<XfDiscountterm> lqw = buildQueryWrapper(bo);
+    public List<XfDiscountTermVo> queryList(XfDiscountTermBo bo) {
+        LambdaQueryWrapper<XfDiscountTerm> lqw = buildQueryWrapper(bo);
         return baseMapper.selectVoList(lqw);
     }
 
-    private LambdaQueryWrapper<XfDiscountterm> buildQueryWrapper(XfDiscounttermBo bo) {
+    private LambdaQueryWrapper<XfDiscountTerm> buildQueryWrapper(XfDiscountTermBo bo) {
         Map<String, Object> params = bo.getParams();
-        LambdaQueryWrapper<XfDiscountterm> lqw = Wrappers.lambdaQuery();
+        LambdaQueryWrapper<XfDiscountTerm> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getTermId() != null, XfDiscountTerm::getTermId, bo.getTermId());
         return lqw;
     }
 
@@ -100,8 +100,8 @@ public class XfDiscounttermServiceImpl implements IXfDiscounttermService {
      * @return 是否新增成功
      */
     @Override
-    public Boolean insertByBo(XfDiscounttermBo bo) {
-        XfDiscountterm add = MapstructUtils.convert(bo, XfDiscountterm.class);
+    public Boolean insertByBo(XfDiscountTermBo bo) {
+        XfDiscountTerm add = MapstructUtils.convert(bo, XfDiscountTerm.class);
         validEntityBeforeSave(add);
         boolean flag = baseMapper.insert(add) > 0;
         if (flag) {
@@ -113,15 +113,15 @@ public class XfDiscounttermServiceImpl implements IXfDiscounttermService {
     @Override
     public Boolean insertByTermIds(List<Long> ids) {
         if(CollectionUtil.isEmpty(ids)) return true;
-        LambdaQueryWrapper<XfDiscountterm> w = Wrappers.lambdaQuery();
-        w.in(XfDiscountterm::getTermId, ids);
-        List<XfDiscountterm> exists = baseMapper.selectList(w);
-        List<Long> existIds = exists.stream().map(XfDiscountterm::getTermId).toList();
+        LambdaQueryWrapper<XfDiscountTerm> w = Wrappers.lambdaQuery();
+        w.in(XfDiscountTerm::getTermId, ids);
+        List<XfDiscountTerm> exists = baseMapper.selectList(w);
+        List<Long> existIds = exists.stream().map(XfDiscountTerm::getTermId).toList();
         if(CollectionUtil.isNotEmpty(existIds)){
             List<Long> adds = ids.stream().filter(id -> !existIds.contains(id)).toList();
             if(CollectionUtil.isNotEmpty(adds)){
                 return baseMapper.insertBatch(adds.stream().map(id -> {
-                    XfDiscountterm discountterm = new XfDiscountterm();
+                    XfDiscountTerm discountterm = new XfDiscountTerm();
                     discountterm.setTermId(id);
                     return discountterm;
                 }).collect(Collectors.toList()));
@@ -129,7 +129,7 @@ public class XfDiscounttermServiceImpl implements IXfDiscounttermService {
             return true;
         }
         return baseMapper.insertBatch(ids.stream().map(id -> {
-            XfDiscountterm discountterm = new XfDiscountterm();
+            XfDiscountTerm discountterm = new XfDiscountTerm();
             discountterm.setTermId(id);
             return discountterm;
         }).collect(Collectors.toList()));
@@ -142,8 +142,8 @@ public class XfDiscounttermServiceImpl implements IXfDiscounttermService {
      * @return 是否修改成功
      */
     @Override
-    public Boolean updateByBo(XfDiscounttermBo bo) {
-        XfDiscountterm update = MapstructUtils.convert(bo, XfDiscountterm.class);
+    public Boolean updateByBo(XfDiscountTermBo bo) {
+        XfDiscountTerm update = MapstructUtils.convert(bo, XfDiscountTerm.class);
         validEntityBeforeSave(update);
         return baseMapper.updateById(update) > 0;
     }
@@ -151,10 +151,10 @@ public class XfDiscounttermServiceImpl implements IXfDiscounttermService {
     /**
      * 保存前的数据校验
      */
-    private void validEntityBeforeSave(XfDiscountterm entity){
-        LambdaQueryWrapper<XfDiscountterm> wrapper = Wrappers.<XfDiscountterm>lambdaQuery();
-        wrapper.eq(XfDiscountterm::getDiscountTermId, entity.getDiscountTermId())
-            .ne(entity.getDiscountTermId()!=null,XfDiscountterm::getDiscountTermId, entity.getDiscountTermId());
+    private void validEntityBeforeSave(XfDiscountTerm entity){
+        LambdaQueryWrapper<XfDiscountTerm> wrapper = Wrappers.<XfDiscountTerm>lambdaQuery();
+        wrapper.eq(XfDiscountTerm::getDiscountTermId, entity.getDiscountTermId())
+            .ne(entity.getDiscountTermId()!=null, XfDiscountTerm::getDiscountTermId, entity.getDiscountTermId());
         if (baseMapper.selectCount(wrapper) > 0) {
             throw new ServiceException("设备已经存在");
         }
@@ -172,10 +172,23 @@ public class XfDiscounttermServiceImpl implements IXfDiscounttermService {
         if(isValid){
             //可以删除
         }
-        LambdaQueryWrapper<XfDiscountterm> wrapper = Wrappers.<XfDiscountterm>lambdaQuery();
-        wrapper.in(XfDiscountterm::getTermId, ids);
+        LambdaQueryWrapper<XfDiscountTerm> wrapper = Wrappers.<XfDiscountTerm>lambdaQuery();
+        wrapper.in(XfDiscountTerm::getTermId, ids);
         return baseMapper.delete(wrapper) > 0;
     }
-
-
+    /**
+     * 根据设备Id查询折扣设备信息
+     * @param termId 设备Id
+     * @return 折扣设备信息
+     */
+    @Override
+    public XfDiscountTermVo queryByTermId(Long termId) {
+        XfDiscountTermBo bo = new XfDiscountTermBo();
+        bo.setTermId(termId);
+        List<XfDiscountTermVo> list = this.queryList(bo);
+        if (CollectionUtil.isNotEmpty(list)) {
+            return list.get(0);
+        }
+        return null;
+    }
 }

+ 17 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfQuotaServiceImpl.java

@@ -1,5 +1,6 @@
 package org.dromara.backstage.consumption.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
@@ -73,6 +74,7 @@ public class XfQuotaServiceImpl implements IXfQuotaService {
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<XfQuota> lqw = Wrappers.lambdaQuery();
         lqw.eq(StringUtils.isNotBlank(bo.getStatus()), XfQuota::getStatus, bo.getStatus());
+        lqw.eq(bo.getCardType() != null, XfQuota::getCardType, bo.getCardType());
         return lqw;
     }
 
@@ -132,4 +134,19 @@ public class XfQuotaServiceImpl implements IXfQuotaService {
         }
         return baseMapper.deleteByIds(ids) > 0;
     }
+    /**
+     * 根据卡类型查询限额信息
+     * @param cardType 卡类
+     * @return 卡类限额信息
+     */
+    @Override
+    public XfQuotaVo queryByCardType(Integer cardType) {
+        XfQuotaBo bo = new XfQuotaBo();
+        bo.setCardType(cardType.longValue());
+        List<XfQuotaVo> list = this.queryList(bo);
+        if (CollectionUtil.isNotEmpty(list)) {
+            return list.get(0);
+        }
+        return null;
+    }
 }

+ 44 - 31
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfQuotatermServiceImpl.java → ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfQuotaTermServiceImpl.java

@@ -1,12 +1,11 @@
 package org.dromara.backstage.consumption.service.impl;
 
 import cn.hutool.core.collection.CollectionUtil;
-import org.dromara.backstage.consumption.domain.XfDiscountterm;
-import org.dromara.backstage.consumption.domain.vo.XfDiscounttermVo;
+import org.dromara.backstage.consumption.domain.XfQuotaTerm;
+import org.dromara.backstage.consumption.domain.bo.XfQuotaTermBo;
 import org.dromara.backstage.consumption.domain.vo.XfTermVo;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.MapstructUtils;
-import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -14,11 +13,9 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
-import org.dromara.backstage.consumption.domain.bo.XfQuotatermBo;
 import org.dromara.backstage.consumption.domain.vo.XfQuotatermVo;
-import org.dromara.backstage.consumption.domain.XfQuotaterm;
-import org.dromara.backstage.consumption.mapper.XfQuotatermMapper;
-import org.dromara.backstage.consumption.service.IXfQuotatermService;
+import org.dromara.backstage.consumption.mapper.XfQuotaTermMapper;
+import org.dromara.backstage.consumption.service.IXfQuotaTermService;
 
 import java.util.List;
 import java.util.Map;
@@ -33,24 +30,24 @@ import java.util.stream.Collectors;
  */
 @RequiredArgsConstructor
 @Service
-public class XfQuotatermServiceImpl implements IXfQuotatermService {
+public class XfQuotaTermServiceImpl implements IXfQuotaTermService {
 
-    private final XfQuotatermMapper baseMapper;
+    private final XfQuotaTermMapper baseMapper;
 
     private final XfTermServiceImpl termService;
 
     @Override
     public Boolean insertByTermIds(List<Long> ids) {
         if(CollectionUtil.isEmpty(ids)) return true;
-        LambdaQueryWrapper<XfQuotaterm> w = Wrappers.lambdaQuery();
-        w.in(XfQuotaterm::getTermId, ids);
-        List<XfQuotaterm> exists = baseMapper.selectList(w);
-        List<Long> existIds = exists.stream().map(XfQuotaterm::getTermId).toList();
+        LambdaQueryWrapper<XfQuotaTerm> w = Wrappers.lambdaQuery();
+        w.in(XfQuotaTerm::getTermId, ids);
+        List<XfQuotaTerm> exists = baseMapper.selectList(w);
+        List<Long> existIds = exists.stream().map(XfQuotaTerm::getTermId).toList();
         if(CollectionUtil.isNotEmpty(existIds)){
             List<Long> adds = ids.stream().filter(id -> !existIds.contains(id)).toList();
             if(CollectionUtil.isNotEmpty(adds)){
                 return baseMapper.insertBatch(adds.stream().map(id -> {
-                    XfQuotaterm quotaterm = new XfQuotaterm();
+                    XfQuotaTerm quotaterm = new XfQuotaTerm();
                     quotaterm.setTermId(id);
                     return quotaterm;
                 }).collect(Collectors.toList()));
@@ -58,7 +55,7 @@ public class XfQuotatermServiceImpl implements IXfQuotatermService {
             return true;
         }
         return baseMapper.insertBatch(ids.stream().map(id -> {
-            XfQuotaterm quotaterm = new XfQuotaterm();
+            XfQuotaTerm quotaterm = new XfQuotaTerm();
             quotaterm.setTermId(id);
             return quotaterm;
         }).collect(Collectors.toList()));
@@ -83,8 +80,8 @@ public class XfQuotatermServiceImpl implements IXfQuotatermService {
      * @return 限额设备绑定分页列表
      */
     @Override
-    public TableDataInfo<XfQuotatermVo> queryPageList(XfQuotatermBo bo, PageQuery pageQuery) {
-        LambdaQueryWrapper<XfQuotaterm> lqw = buildQueryWrapper(bo);
+    public TableDataInfo<XfQuotatermVo> queryPageList(XfQuotaTermBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<XfQuotaTerm> lqw = buildQueryWrapper(bo);
         Page<XfQuotatermVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
         List<XfQuotatermVo> records = result.getRecords();
         if(CollectionUtil.isNotEmpty(records)){
@@ -107,14 +104,15 @@ public class XfQuotatermServiceImpl implements IXfQuotatermService {
      * @return 限额设备绑定列表
      */
     @Override
-    public List<XfQuotatermVo> queryList(XfQuotatermBo bo) {
-        LambdaQueryWrapper<XfQuotaterm> lqw = buildQueryWrapper(bo);
+    public List<XfQuotatermVo> queryList(XfQuotaTermBo bo) {
+        LambdaQueryWrapper<XfQuotaTerm> lqw = buildQueryWrapper(bo);
         return baseMapper.selectVoList(lqw);
     }
 
-    private LambdaQueryWrapper<XfQuotaterm> buildQueryWrapper(XfQuotatermBo bo) {
+    private LambdaQueryWrapper<XfQuotaTerm> buildQueryWrapper(XfQuotaTermBo bo) {
         Map<String, Object> params = bo.getParams();
-        LambdaQueryWrapper<XfQuotaterm> lqw = Wrappers.lambdaQuery();
+        LambdaQueryWrapper<XfQuotaTerm> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getTermId() != null, XfQuotaTerm::getTermId, bo.getTermId());
         return lqw;
     }
 
@@ -125,8 +123,8 @@ public class XfQuotatermServiceImpl implements IXfQuotatermService {
      * @return 是否新增成功
      */
     @Override
-    public Boolean insertByBo(XfQuotatermBo bo) {
-        XfQuotaterm add = MapstructUtils.convert(bo, XfQuotaterm.class);
+    public Boolean insertByBo(XfQuotaTermBo bo) {
+        XfQuotaTerm add = MapstructUtils.convert(bo, XfQuotaTerm.class);
         validEntityBeforeSave(add);
         boolean flag = baseMapper.insert(add) > 0;
         if (flag) {
@@ -142,8 +140,8 @@ public class XfQuotatermServiceImpl implements IXfQuotatermService {
      * @return 是否修改成功
      */
     @Override
-    public Boolean updateByBo(XfQuotatermBo bo) {
-        XfQuotaterm update = MapstructUtils.convert(bo, XfQuotaterm.class);
+    public Boolean updateByBo(XfQuotaTermBo bo) {
+        XfQuotaTerm update = MapstructUtils.convert(bo, XfQuotaTerm.class);
         validEntityBeforeSave(update);
         return baseMapper.updateById(update) > 0;
     }
@@ -151,10 +149,10 @@ public class XfQuotatermServiceImpl implements IXfQuotatermService {
     /**
      * 保存前的数据校验
      */
-    private void validEntityBeforeSave(XfQuotaterm entity){
-        LambdaQueryWrapper<XfQuotaterm> q = Wrappers.lambdaQuery();
-        q.eq(XfQuotaterm::getTermId, entity.getTermId())
-            .ne(entity.getQuotaTermId()!=null, XfQuotaterm::getQuotaTermId, entity.getQuotaTermId());
+    private void validEntityBeforeSave(XfQuotaTerm entity){
+        LambdaQueryWrapper<XfQuotaTerm> q = Wrappers.lambdaQuery();
+        q.eq(XfQuotaTerm::getTermId, entity.getTermId())
+            .ne(entity.getQuotaTermId()!=null, XfQuotaTerm::getQuotaTermId, entity.getQuotaTermId());
         if(baseMapper.selectCount(q)>0){
             throw new ServiceException("设备已绑定");
         }
@@ -172,8 +170,23 @@ public class XfQuotatermServiceImpl implements IXfQuotatermService {
         if(isValid){
             //可以删除
         }
-        LambdaQueryWrapper<XfQuotaterm> q = Wrappers.lambdaQuery();
-        q.in(XfQuotaterm::getTermId, ids);
+        LambdaQueryWrapper<XfQuotaTerm> q = Wrappers.lambdaQuery();
+        q.in(XfQuotaTerm::getTermId, ids);
         return baseMapper.delete(q) > 0;
     }
+    /**
+     * 根据设备Id查询限额
+     * @param termId 设备Id
+     * @return 限额设备信息
+     */
+    @Override
+    public XfQuotatermVo queryByTermId(Long termId) {
+        XfQuotaTermBo bo = new XfQuotaTermBo();
+        bo.setTermId(termId);
+        List<XfQuotatermVo> list = this.queryList(bo);
+        if (CollectionUtil.isNotEmpty(list)) {
+            return list.get(0);
+        }
+        return null;
+    }
 }

+ 2 - 2
ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/consumption/XfDiscounttermMapper.xml → ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/consumption/XfDiscountTermMapper.xml

@@ -2,9 +2,9 @@
 <!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="org.dromara.backstage.consumption.mapper.XfDiscounttermMapper">
+<mapper namespace="org.dromara.backstage.consumption.mapper.XfDiscountTermMapper">
 
-    <resultMap type="org.dromara.backstage.consumption.domain.XfDiscountterm" id="XfDiscounttermResult">
+    <resultMap type="org.dromara.backstage.consumption.domain.XfDiscountTerm" id="XfDiscountTermResult">
             <result property="discountTermId"    column="discount_term_id"    />
             <result property="tenantId"    column="tenant_id"    />
             <result property="termId"    column="term_id"    />

+ 2 - 2
ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/consumption/XfQuotatermMapper.xml → ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/consumption/XfQuotaTermMapper.xml

@@ -2,9 +2,9 @@
 <!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="org.dromara.backstage.consumption.mapper.XfQuotatermMapper">
+<mapper namespace="org.dromara.backstage.consumption.mapper.XfQuotaTermMapper">
 
-    <resultMap type="org.dromara.backstage.consumption.domain.XfQuotaterm" id="XfQuotatermResult">
+    <resultMap type="org.dromara.backstage.consumption.domain.XfQuotaTerm" id="XfQuotaTermResult">
             <result property="quotaTermId"    column="quota_term_id"    />
             <result property="tenantId"    column="tenant_id"    />
             <result property="termId"    column="term_id"    />

+ 18 - 24
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/BaseBusiness.java

@@ -5,7 +5,6 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.dromara.backstage.api.domain.bo.RemoteCardBo;
 import org.dromara.backstage.api.domain.vo.RemoteCardVo;
 import org.dromara.backstage.api.domain.vo.RemoteMealTypeVo;
 import org.dromara.backstage.api.domain.vo.RemoteUserAccountVo;
@@ -95,10 +94,25 @@ public class BaseBusiness {
         return R.fail();
     }
 
+    /**
+     * 消费记录入库
+     * 1.写入消费明细表
+     * 2.更新人员日统计表
+     * 3.更新设备日统计表
+     * 4.更新钱包余额
+     *
+     * @param bo            消费业务对象
+     * @param userAccountVo 消费账户
+     * @param cardVo        卡片
+     * @param bagVos        钱包
+     * @param termVo        设备
+     * @param mealTypeVo    餐类
+     * @param remark        备注
+     * @return 入库信息
+     */
     @Transactional(rollbackFor = ConsumeException.class)
     public R<ErrorInfo> postConsumeRecord(ConsumptionBo bo, RemoteUserAccountVo userAccountVo, RemoteCardVo cardVo,
-                                          List<PtBagVo> bagVos, XfTermVo termVo, RemoteMealTypeVo mealTypeVo,
-                                          String remark) {
+                                          List<PtBagVo> bagVos, XfTermVo termVo, RemoteMealTypeVo mealTypeVo, String remark) {
         ErrorInfo errorInfo;
         // 1.入消费明细表,根据消费金额与扣款方式及扣款钱包的余额,可能会从多个钱包扣钱,则对应的有多笔消费明细记录
         AtomicReference<Boolean> result = new AtomicReference<>();
@@ -129,7 +143,6 @@ public class BaseBusiness {
         if (!updateBagBalance(bagVos)) {
             return R.fail(new ErrorInfo(400, ApiErrorTypeConstants.EXCEPTION, "更新钱包余额表失败", ""));
         }
-        // 5.更新记录入库成功状态
         return R.ok();
     }
 
@@ -209,26 +222,6 @@ public class BaseBusiness {
         return result.get();
     }
 
-    public boolean updateCardData(ConsumptionBo bo, RemoteCardVo cardVo,RemoteMealTypeVo mealTypeVo) {
-        RemoteCardBo remoteCardBo = new RemoteCardBo();
-        // remoteCardBo.setCardNo();
-        // remoteCardBo.setCardType();
-        // remoteCardBo.setLifespan();
-        // remoteCardBo.setFactoryId();
-        // remoteCardBo.setMainCard();
-        // remoteCardBo.setStatus();
-        // remoteCardBo.setChangeTime();
-        remoteCardBo.setDayTotal(cardVo.getDayTotal().add(bo.getConsumeMoney()));
-        remoteCardBo.setDayCount(cardVo.getDayCount() + 1);
-        remoteCardBo.setMealTotal(cardVo.getMealTotal().add(bo.getConsumeMoney()));
-        remoteCardBo.setMealCount(cardVo.getMealCount() + 1);
-        remoteCardBo.setLastPay(bo.getConsumeDate());
-        remoteCardBo.setLastMeal(mealTypeVo.getMealId());
-
-
-        return true;
-    }
-
     /**
      * 创建一条消费明细记录
      *
@@ -275,6 +268,7 @@ public class BaseBusiness {
         consumeDetailBo.setStatusFlag(bo.getStatusFlag().longValue());
         // 该字段为补款记录对应的消费明细Id,以便追查消费记录是否有补扣以及对应的补扣记录
         consumeDetailBo.setDetailId(bo.getConsumeId());
+        consumeDetailBo.setRecordId(bo.getRecordId());
         consumeDetailBo.setRemark(remark);
 
         return consumeDetailService.createConsumeDetailRecord(consumeDetailBo);

+ 286 - 42
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/CheckBusiness.java

@@ -13,6 +13,8 @@ import org.dromara.backstage.api.domain.vo.*;
 import org.dromara.common.core.constant.ApiErrorTypeConstants;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.core.domain.model.ErrorInfo;
+import org.dromara.common.core.enums.BagNameEnum;
+import org.dromara.common.core.enums.CardStatusEnum;
 import org.dromara.common.core.enums.TradeStatusEnum;
 import org.dromara.common.core.enums.UserAccountStatusEnum;
 import org.dromara.common.core.utils.RecordIdUtils;
@@ -26,6 +28,7 @@ import org.jetbrains.annotations.NotNull;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.MessageFormat;
 import java.time.LocalDateTime;
 import java.time.ZoneOffset;
@@ -181,19 +184,28 @@ public class CheckBusiness {
      * @return 验证结果
      */
     public R<ErrorInfo> checkConsume(ConsumptionBo bo, RemoteUserAccountVo userAccountVo, RemoteCardVo userCardVo, XfTermVo useTermVo) {
+        ErrorInfo errorInfo;
         R<ErrorInfo> result;
         // 1.消费账户状态验证,验证账户是否已开户、是否冻结、状态是否正常、是否过有效期
         if ("Y".equals(userAccountVo.getFreezeStatus())) {
-            return R.fail(new ErrorInfo(400, ApiErrorTypeConstants.NOT_FOUND, "账户已被冻结", "账户已被冻结"));
+            errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.NOT_FOUND, "账户已被冻结",
+                                      MessageFormat.format("流水号为[{0}]的账户已被冻结,不允许交易", userAccountVo.getUserNo()));
+            return R.fail(errorInfo);
         }
         if ("N".equals(userAccountVo.getStatus())) {
-            return R.fail(new ErrorInfo(400, ApiErrorTypeConstants.NOT_FOUND, "账户状态不正常", "账户状态不正常"));
+            errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.NOT_FOUND, "账户状态不正常",
+                                      MessageFormat.format("流水号为[{0}]的账户状态不正常,不允许交易", userAccountVo.getUserNo()));
+            return R.fail(errorInfo);
         }
         if (!ObjectUtil.equal(userAccountVo.getAccountStatus(), UserAccountStatusEnum.IS_OPEN.code().toString())) {
-            return R.fail(new ErrorInfo(400, ApiErrorTypeConstants.NOT_FOUND, "账户尚未开户", "账户尚未开户"));
+            errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.NOT_FOUND, "账户尚未开户",
+                                      MessageFormat.format("流水号为[{0}]的账户尚未开户,不允许交易", userAccountVo.getUserNo()));
+            return R.fail(errorInfo);
         }
         if (userAccountVo.getLifespan() != null && bo.getConsumeDate().getTime() > userAccountVo.getLifespan().getTime()) {
-            return R.fail(new ErrorInfo(400, ApiErrorTypeConstants.NOT_FOUND, "账户已过有效期", "账户已过有效期"));
+            errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.NOT_FOUND, "账户已过有效期",
+                                      MessageFormat.format("流水号为[{0}]的账户已过有效期,不允许交易", userAccountVo.getUserNo()));
+            return R.fail(errorInfo);
         }
         // 2.餐类验证
         RemoteMealTypeVo mealType = remoteMealTypeService.queryMealTypeVoByTime(bo.getConsumeDate());
@@ -201,7 +213,7 @@ public class CheckBusiness {
             return R.fail(new ErrorInfo(400, ApiErrorTypeConstants.NOT_FOUND, "不在交易时段", "不在交易时段"));
         }
         // 3.设备限制验证
-        result = checkTermLimitDeal(bo, userAccountVo, useTermVo, userCardVo, mealType);
+        result = checkTermLimitDeal(bo, useTermVo, userCardVo, mealType);
         if (R.isError(result)) {
             return R.fail(new ErrorInfo(400, ApiErrorTypeConstants.NOT_FOUND, "消费限制判断存在问题", JSONUtil.toJsonStr(result.getData())));
         }
@@ -248,12 +260,26 @@ public class CheckBusiness {
         return R.ok();
     }
 
+    /**
+     * 设置返回的消费用户信息
+     *
+     * @param bo        消费业务
+     * @param accountVo 消费账户
+     */
     private void setUserInfo(ConsumptionBo bo, RemoteUserAccountVo accountVo) {
         bo.setRealName(StrUtil.isEmpty(accountVo.getRealName()) ? "----" : accountVo.getRealName());
         bo.setUserNo(accountVo.getUserNo());
         bo.setUserNumb(accountVo.getUserNumb());
     }
 
+    /**
+     * 检查卡流水号
+     *
+     * @param bo            消费业务
+     * @param userAccountVo 消费账户
+     * @param userCardVo    消费卡片
+     * @return 检查结果
+     */
     @NotNull
     private R<ErrorInfo> checkCardNo(ConsumptionBo bo, RemoteUserAccountVo userAccountVo, RemoteCardVo userCardVo) {
         Long cardNo = bo.getCardNo();
@@ -265,7 +291,7 @@ public class CheckBusiness {
 
             return R.fail(errorInfo);
         }
-        if (!"1".equals(cardVo.getStatus())) {
+        if (!String.valueOf(CardStatusEnum.NORMAL.code()).equals(cardVo.getStatus())) {
             errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "卡片状态不正确",
                                       MessageFormat.format("流水号为[{0}]的卡片状态不正确,不允许交易", cardNo));
 
@@ -286,6 +312,14 @@ public class CheckBusiness {
         return R.ok();
     }
 
+    /**
+     * 检查物理卡号
+     *
+     * @param bo            消费业务
+     * @param userAccountVo 消费账户
+     * @param userCardVo    消费卡片
+     * @return 检查结果
+     */
     @NotNull
     private R<ErrorInfo> checkFactoryId(ConsumptionBo bo, RemoteUserAccountVo userAccountVo, RemoteCardVo userCardVo) {
         ErrorInfo errorInfo;
@@ -294,14 +328,11 @@ public class CheckBusiness {
         if (ObjectUtil.isEmpty(cardVo)) {
             errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "卡片不存在",
                                       MessageFormat.format("物理卡号为[{0}]的卡片不存在,不允许交易", factoryId));
-
             return R.fail(errorInfo);
         }
-        if (!"1".equals(cardVo.getStatus())) {
+        if (!String.valueOf(CardStatusEnum.NORMAL.code()).equals(cardVo.getStatus())) {
             errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "卡片状态不正确",
-                                      MessageFormat.format("物理卡号为[{0}]的卡片卡片状态不正确,不允许交易",
-                                                           factoryId));
-
+                                      MessageFormat.format("物理卡号为[{0}]的卡片卡片状态不正确,不允许交易", factoryId));
             return R.fail(errorInfo);
         }
         RemoteUserAccountVo accountVo = remoteUserAccountService.getUserAccountVoById(cardVo.getUserId());
@@ -312,6 +343,14 @@ public class CheckBusiness {
         return R.ok();
     }
 
+    /**
+     * 检查用户流水号
+     *
+     * @param bo            消费业务
+     * @param userAccountVo 消费账户
+     * @param userCardVo    消费卡片
+     * @return 检查结果
+     */
     @NotNull
     private R<ErrorInfo> checkUserNo(ConsumptionBo bo, RemoteUserAccountVo userAccountVo, RemoteCardVo userCardVo) {
         ErrorInfo errorInfo;
@@ -326,11 +365,12 @@ public class CheckBusiness {
         RemoteCardVo cardVo = remoteCardService.queryMainCardByUserId(accountVo.getUserId());
         if (ObjectUtil.isEmpty(cardVo)) {
             errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "卡片不存在",
-                                      MessageFormat.format("流水号为[{0}]的人员卡片不存在,不允许交易", userNo));
+                                      MessageFormat.format("没有流水号为[{0}]人员的卡片信息,不允许交易", userNo));
 
             return R.fail(errorInfo);
         }
-        if (!"1".equals(cardVo.getStatus())) {
+        // 实体卡时需要验证卡状态
+        if (!String.valueOf(CardStatusEnum.NORMAL.code()).equals(cardVo.getStatus()) && cardVo.getFactoryId() > 0) {
             errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "卡片状态不正确",
                                       MessageFormat.format("流水号为[{0}]的人员卡片状态不正确,不允许交易", userNo));
 
@@ -344,6 +384,14 @@ public class CheckBusiness {
         return R.ok();
     }
 
+    /**
+     * 检查人员编号
+     *
+     * @param bo            消费业务
+     * @param userAccountVo 消费账户
+     * @param userCardVo    消费卡片
+     * @return 检查结果
+     */
     @NotNull
     private R<ErrorInfo> checkUserNumb(ConsumptionBo bo, RemoteUserAccountVo userAccountVo, RemoteCardVo userCardVo) {
         ErrorInfo errorInfo;
@@ -359,11 +407,12 @@ public class CheckBusiness {
         RemoteCardVo cardVo = remoteCardService.queryMainCardByUserId(accountVo.getUserId());
         if (ObjectUtil.isEmpty(cardVo)) {
             errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "卡片不存在",
-                                      MessageFormat.format("编号为[{0}]的人员卡片不存在,不允许交易", userNumb));
+                                      MessageFormat.format("没有编号为[{0}]的人员的卡片信息,不允许交易", userNumb));
 
             return R.fail(errorInfo);
         }
-        if (!"1".equals(cardVo.getStatus())) {
+        // 实体卡时需要验证卡状态
+        if (!String.valueOf(CardStatusEnum.NORMAL.code()).equals(cardVo.getStatus()) && cardVo.getFactoryId() > 0) {
             errorInfo = new ErrorInfo(400, ApiErrorTypeConstants.PARAM_ERROR, "卡片状态不正确",
                                       MessageFormat.format("编号为[{0}]的人员卡片状态不正确,不允许交易", userNumb));
 
@@ -399,6 +448,7 @@ public class CheckBusiness {
     }
 
     public R<ErrorInfo> checkDeductionBag(ConsumptionBo bo, RemoteUserAccountVo userAccountVo, XfTermVo termVo, List<PtBagVo> bagVos) {
+        StringBuilder sb = new StringBuilder();
         // 设备的扣费钱包字符串
         String consumeType = termVo.getConsumeType();
         // 分解扣费钱包
@@ -410,6 +460,18 @@ public class CheckBusiness {
         // 计算后实际需要扣费的钱包,会小于或等于指定的扣费钱包数
         List<PtBagVo> doBagVos = new ArrayList<>();
         BigDecimal totalBalance = BigDecimal.ZERO;
+        // 计算扣费钱包的总金额
+        for (String bagCode : bagCodes) {
+            PtBagVo bagVo = bagService.queryByUserBagCode(userId, bagCode);
+            if(ObjectUtil.isNotEmpty(bagVo)) {
+                totalBalance = totalBalance.add(bagVo.getBalance());
+            }
+        }
+        // 如果扣费钱包总余额<消费金额,则不允许消费
+        if (consumeMoney.compareTo(totalBalance) > 0) {
+            return R.fail(new ErrorInfo(400, ApiErrorTypeConstants.CONSUME_CHECK_FAIL, "钱包余额不足",
+                                        MessageFormat.format("余额不足,余额[{0}],消费金额[{1}]", totalBalance, consumeMoney)));
+        }
         for (String bagCode : bagCodes) {
             // 1.查询对应的钱包
             PtBagVo bagVo = bagService.queryByUserBagCode(userId, bagCode);
@@ -420,12 +482,11 @@ public class CheckBusiness {
             // 2.比较扣费金额
             BigDecimal balance = bagVo.getBalance();
             if (balance.compareTo(BigDecimal.ZERO) > 0) {
-                totalBalance = totalBalance.add(balance);
                 if (balance.compareTo(doMoney) >= 0) {
                     // 如果钱包金额>扣费金额,设置扣费结果并中断循环
                     bagVo.setReceiptMoney(doMoney);
                     bagVo.setBalance(balance.subtract(doMoney));
-                    doMoney = BigDecimal.ZERO;
+                    sb.append(BagNameEnum.getMessage(Integer.parseInt(bagCode)));
                     doBagVos.add(bagVo);
                     break;
                 } else {
@@ -433,28 +494,35 @@ public class CheckBusiness {
                     bagVo.setReceiptMoney(balance);
                     bagVo.setBalance(BigDecimal.ZERO);
                     doMoney = doMoney.subtract(balance);
+                    sb.append(BagNameEnum.getMessage(Integer.parseInt(bagCode)));
                     doBagVos.add(bagVo);
                 }
             }
         }
-        if (doMoney.compareTo(BigDecimal.ZERO) > 0) {
-            // 循环扣费后,如果还有未扣的金额,表示钱包余额不足,不允许交易
-            return R.fail(new ErrorInfo(400, ApiErrorTypeConstants.CONSUME_CHECK_FAIL, "钱包余额不足",
-                                        MessageFormat.format("余额不足,余额[{0}],消费金额[{1}]", totalBalance,
-                                                             consumeMoney)));
-        }
+
         bo.setBalance(totalBalance.subtract(consumeMoney));
+        bo.setDigitalSign(sb.toString());
         bagVos.addAll(doBagVos);
+
         return R.ok();
     }
 
-    public R<ErrorInfo> checkTermLimitDeal(ConsumptionBo bo, RemoteUserAccountVo userAccountVo, XfTermVo termVo, RemoteCardVo userCardVo,
-                                           RemoteMealTypeVo mealTypeVo) {
+    /**
+     * 设备限额、限次与折扣验证
+     *
+     * @param bo         消费业务
+     * @param termVo     消费设备
+     * @param userCardVo 消费卡片
+     * @param mealTypeVo 消费类型
+     * @return 检查结果
+     */
+    public R<ErrorInfo> checkTermLimitDeal(ConsumptionBo bo, XfTermVo termVo, RemoteCardVo userCardVo, RemoteMealTypeVo mealTypeVo) {
         Long termNo = termVo.getTermNo();
         BigDecimal consumeValue = bo.getConsumeMoney();
         Long factoryFixId = userCardVo.getFactoryId();
         String mealTypeId = mealTypeVo.getTypeId();
         if (termNo == 0 && ObjectUtil.equal("0", mealTypeId)) {
+            // 机号为0并且餐类不在正常餐类
             return R.ok();
         }
         // 当前卡片类型
@@ -473,14 +541,12 @@ public class CheckBusiness {
         int termSwipeInterval = termVo.getSwipeInterval() == null ? 0 : termVo.getSwipeInterval();
         // 设备是否启用了卡有效
         boolean termUseValidity = Objects.equals(termVo.getTermValidity(), "0") ? Boolean.FALSE : Boolean.TRUE;
-
+        // 当前时间
         LocalDateTime currentLocalDt = LocalDateTime.now();
-        LocalDateTime expiryLocalDt;
-
         // 最后消费时间
         LocalDateTime lastPayLocalDt = LocalDateTime.ofInstant(userCardVo.getLastPay().toInstant(), ZoneOffset.of("+8"));
         // 有效期时间
-        expiryLocalDt = LocalDateTime.ofInstant(userCardVo.getLifespan().toInstant(), ZoneOffset.of("+8"));
+        LocalDateTime expiryLocalDt = LocalDateTime.ofInstant(userCardVo.getLifespan().toInstant(), ZoneOffset.of("+8"));
 
         // 设备消费间隔验证
         if ((currentLocalDt.toEpochSecond(ZoneOffset.of("+8"))
@@ -505,8 +571,7 @@ public class CheckBusiness {
         // 餐限次验证
         String lastMeal = userCardVo.getLastMeal().toString();
         int mealCount = userCardVo.getMealCount().intValue();
-        if (!ObjectUtil.equals(lastMeal, mealTypeId)
-                || !currentLocalDt.toLocalDate().isEqual(lastPayLocalDt.toLocalDate())) {
+        if (!ObjectUtil.equals(lastMeal, mealTypeId) || !currentLocalDt.toLocalDate().isEqual(lastPayLocalDt.toLocalDate())) {
             // 如果当前餐类!=消费餐类,初始化卡片的餐类消费数据
             remoteCardService.initCardMealData(userCardVo.getCardNo(), mealTypeId);
         } else {
@@ -514,7 +579,7 @@ public class CheckBusiness {
                 return R.fail(new ErrorInfo(400, TradeStatusEnum.MealLimitTimes.toString(), "设备餐限次", TradeStatusEnum.MealLimitTimes.getName()));
             }
         }
-        // 日限次 日限额效验(每日第一次消费)
+        // 设备日限次 日限额效验(每日第一次消费)
         int dayCount = userCardVo.getDayCount().intValue();
         BigDecimal dayValue = userCardVo.getDayTotal();
         if (!currentLocalDt.toLocalDate().isEqual(lastPayLocalDt.toLocalDate())) {
@@ -528,6 +593,7 @@ public class CheckBusiness {
                 return R.fail(new ErrorInfo(400, TradeStatusEnum.DayLimitMoney.toString(), "设备日限额", TradeStatusEnum.DayLimitMoney.getName()));
             }
         }
+        // 当前卡片校验处理
         R<ErrorInfo> result = checkCardLimitDeal(bo, termVo, userCardVo, mealTypeVo);
         if (R.isError(result)) {
             return R.fail(result.getData());
@@ -535,6 +601,15 @@ public class CheckBusiness {
         return R.ok();
     }
 
+    /**
+     * 卡类限额、限次与折扣验证
+     *
+     * @param bo         消费业务
+     * @param termVo     消费设备
+     * @param userCardVo 消费卡片
+     * @param mealTypeVo 消费类型
+     * @return 检查结果
+     */
     public R<ErrorInfo> checkCardLimitDeal(ConsumptionBo bo, XfTermVo termVo, RemoteCardVo userCardVo, RemoteMealTypeVo mealTypeVo) {
         LocalDateTime currentLocalDt = LocalDateTime.now();
         Long cardNo = userCardVo.getCardNo();
@@ -546,8 +621,7 @@ public class CheckBusiness {
             cardLimitedVo = initXfCardLimited(cardNo, mealTypeVo.getMealId(), lastPayDate);
         }
         // 最后交易时间
-        LocalDateTime lastPayLimitLocalDt = LocalDateTime.ofInstant(cardLimitedVo.getLastPay().toInstant(),
-                                                                   ZoneOffset.of("+8"));
+        LocalDateTime lastPayLimitLocalDt = LocalDateTime.ofInstant(cardLimitedVo.getLastPay().toInstant(), ZoneOffset.of("+8"));
         // 最后交易餐类
         Long lastPayLimitMealType = cardLimitedVo.getLastMeal();
         // 判断交易是否为新的一天,如果是则需要重置日消费数据
@@ -558,8 +632,18 @@ public class CheckBusiness {
         if (!Objects.equals(lastPayLimitMealType, mealTypeId)) {
             cardLimitedVo = cardLimitedService.resetMealCardLimitedData(cardNo, mealTypeId.toString());
         }
-        // 卡类限次检查
-        R<ErrorInfo> result = checkCardLimited(termVo, userCardVo, cardLimitedVo, mealTypeVo);
+        // 卡类折扣检查
+        R<ErrorInfo> result = checkCardDisCount(termVo, userCardVo, cardLimitedVo, mealTypeVo, bo);
+        if (R.isError(result)) {
+            return R.fail(result.getData());
+        }
+        // 卡类限额检查
+        result = checkCardQuota(termVo, userCardVo, cardLimitedVo, mealTypeVo, bo.getConsumeMoney());
+        if (R.isError(result)) {
+            return R.fail(result.getData());
+        }
+        // 卡类限次检
+        result = checkCardLimited(termVo, userCardVo, cardLimitedVo, mealTypeVo);
         if (R.isError(result)) {
             return R.fail(result.getData());
         }
@@ -567,7 +651,7 @@ public class CheckBusiness {
     }
 
     /**
-     * 卡的限次验证处理
+     * 卡的限次验证处理
      *
      * @param termVo        设备信息
      * @param userCardVo    卡片信息
@@ -651,8 +735,133 @@ public class CheckBusiness {
     }
 
     /**
-     * 更新其它消费信息
+     * 卡类的限额验证处理
+     *
+     * @param termVo        设备信息
+     * @param userCardVo    卡片信息
+     * @param cardLimitedVo 卡片限制信息
+     * @param mealTypeVo    餐类信息
+     * @param disCountMoney 折扣金额
+     * @return 验证结果
+     */
+    private R<ErrorInfo> checkCardQuota(XfTermVo termVo, RemoteCardVo userCardVo, XfCardLimitedVo cardLimitedVo, RemoteMealTypeVo mealTypeVo,
+                                        BigDecimal disCountMoney) {
+        String useQuota = remotePtParameterService.getPtParameterByKey("XE_CONSUME");
+        String mealType = mealTypeVo.getTypeId();
+        if (StrUtil.isEmpty(useQuota) || ObjectUtil.notEqual(useQuota, "1")) {
+            // 如果没有启用限额,直接返回
+            return R.ok();
+        }
+        Long quotaTermId = remoteQuotaService.queryQuotaTermIdByTermId(termVo.getTermId());
+        if (ObjectUtil.equals(quotaTermId, 0L)) {
+            // 当前设备没有设置限额
+            return R.ok();
+        }
+        RemoteQuotaVo remoteQuotaVo = remoteQuotaService.queryQuotaByCardType(userCardVo.getCardType().intValue());
+        if (ObjectUtil.isEmpty(remoteQuotaVo)) {
+            // 当前卡类没有限额信息
+            return R.ok();
+        }
+        String quotaStatus = remoteQuotaVo.getStatus();
+        if (ObjectUtil.isEmpty(quotaStatus) || ObjectUtil.equals(quotaStatus, "0")) {
+            // 卡类限额未启用
+            return R.ok();
+        }
+        // 每日金额
+        BigDecimal dayMoney = remoteQuotaVo.getDailyMoney();
+        // 早餐金额
+        BigDecimal oneMoney = remoteQuotaVo.getOneMoney();
+        // 午餐金额
+        BigDecimal twoMoney = remoteQuotaVo.getTwoMoney();
+        // 晚餐金额
+        BigDecimal threeMoney = remoteQuotaVo.getThreeMoney();
+        // 宵夜金额
+        BigDecimal fourMoney = remoteQuotaVo.getFourMoney();
+
+        if (dayMoney.compareTo(BigDecimal.ZERO) > 0 || oneMoney.compareTo(BigDecimal.ZERO) > 0 || twoMoney.compareTo(BigDecimal.ZERO) > 0
+                || threeMoney.compareTo(BigDecimal.ZERO) > 0 || fourMoney.compareTo(BigDecimal.ZERO) > 0) {
+            if (dayMoney.compareTo(BigDecimal.ZERO) > 0) {
+                BigDecimal mealQuotaMoney = cardLimitedVo.getMealMoney();
+                // 日限额
+                if (dayMoney.compareTo(cardLimitedVo.getDayMoney().add(disCountMoney)) < 0) {
+                    return R.fail(
+                        new ErrorInfo(400, TradeStatusEnum.DayLimitMoney.toString(), "卡类日限制额度", TradeStatusEnum.DayLimitMoney.getName()));
+                }
+                // 早餐限额
+                if (ObjectUtil.equals(mealType, "1") && oneMoney.compareTo(BigDecimal.ZERO) > 0) {
+                    if (oneMoney.compareTo(mealQuotaMoney.add(disCountMoney)) < 0) {
+                        return R.fail(new ErrorInfo(400, TradeStatusEnum.MealLimitMoney.toString(), "卡类早餐限制额度",
+                                                    TradeStatusEnum.MealLimitMoney.getName()));
+                    }
+                }
+                // 午餐限额
+                if (ObjectUtil.equals(mealType, "2") && twoMoney.compareTo(BigDecimal.ZERO) > 0) {
+                    if (twoMoney.compareTo(mealQuotaMoney.add(disCountMoney)) < 0) {
+                        return R.fail(new ErrorInfo(400, TradeStatusEnum.MealLimitMoney.toString(), "卡类午餐限制额度",
+                                                    TradeStatusEnum.MealLimitMoney.getName()));
+                    }
+                }
+                // 晚餐限额
+                if (ObjectUtil.equals(mealType, "3") && threeMoney.compareTo(BigDecimal.ZERO) > 0) {
+                    if (threeMoney.compareTo(mealQuotaMoney.add(disCountMoney)) < 0) {
+                        return R.fail(new ErrorInfo(400, TradeStatusEnum.MealLimitMoney.toString(), "卡类晚餐限制额度",
+                                                    TradeStatusEnum.MealLimitMoney.getName()));
+                    }
+                }
+                // 宵夜限额
+                if (ObjectUtil.equals(mealType, "4")&& threeMoney.compareTo(BigDecimal.ZERO) > 0) {
+                    if (fourMoney.compareTo(mealQuotaMoney.add(disCountMoney)) < 0) {
+                        return R.fail(new ErrorInfo(400, TradeStatusEnum.MealLimitMoney.toString(), "卡类夜宵限制额度",
+                                                    TradeStatusEnum.MealLimitMoney.getName()));
+                    }
+                }
+            }
+        }
+        return R.ok();
+    }
+
+    /**
+     * 卡类的折扣处理
+     *
+     * @param termVo        设备信息
+     * @param userCardVo    卡片信息
+     * @param cardLimitedVo 卡片限制信息
+     * @param mealTypeVo    餐类信息
+     * @return 验证结果
+     */
+    private R<ErrorInfo> checkCardDisCount(XfTermVo termVo, RemoteCardVo userCardVo, XfCardLimitedVo cardLimitedVo, RemoteMealTypeVo mealTypeVo,
+                                           ConsumptionBo bo) {
+        String useDisCount = remotePtParameterService.getPtParameterByKey("RATE_CONSUME");
+        if (StrUtil.isEmpty(useDisCount) || ObjectUtil.notEqual(useDisCount, "1")) {
+            // 如果没有启用折扣,直接返回
+            return R.ok();
+        }
+        Long disCountTermId = remoteDisCountService.queryDisCountTermIdByTermId(termVo.getTermId());
+        if (ObjectUtil.equals(disCountTermId, 0L)) {
+            // 当前设备没有设置折扣
+            return R.ok();
+        }
+        RemoteDiscountVo remoteDiscountVo = remoteDisCountService.queryDisCountByCardType(userCardVo.getCardType().intValue(), mealTypeVo.getTypeId());
+        if (ObjectUtil.isEmpty(remoteDiscountVo)) {
+            // 当前卡类没有折扣信息
+            return R.ok();
+        }
+        String disCountStatus = remoteDiscountVo.getStatus();
+        if (ObjectUtil.isEmpty(disCountStatus) || ObjectUtil.equals(disCountStatus, "0")) {
+            // 卡类折扣未启用
+            return R.ok();
+        }
+        // 计算折扣金额
+        BigDecimal disCountMoney = getDisCountMoney(cardLimitedVo, bo, remoteDiscountVo);
+        // 最后的消费金额为折扣后的金额
+        bo.setConsumeMoney(disCountMoney);
+        return R.ok();
+    }
+
+    /**
+     * 消费记录入库成功后更新其它消费信息
      * 1.更新卡片交易信息
+     * 2.更新卡片的折扣、限次与限额信息
      *
      * @param bo         交易业务对象
      * @param userCardVo 卡片视图对象
@@ -708,7 +917,7 @@ public class CheckBusiness {
                 // 当前设备也有折扣
                 if (ObjectUtil.isNotEmpty(disCountTermId) && disCountTermId > 0) {
                     // 查询卡类的折扣信息
-                    RemoteDiscountVo remoteDisCountVo = remoteDisCountService.queryDisCountByCardType(userCardVo.getCardType().intValue());
+                    RemoteDiscountVo remoteDisCountVo = remoteDisCountService.queryDisCountByCardType(userCardVo.getCardType().intValue(), mealTypeVo.getTypeId());
                     // 有卡类的折扣信息并已启用
                     if (ObjectUtil.isNotEmpty(remoteDisCountVo) && ObjectUtil.equals(remoteDisCountVo.getStatus(), "1")) {
                         // 更新卡类的折扣信息
@@ -716,10 +925,7 @@ public class CheckBusiness {
                     }
                 }
             }
-
-
         }
-
     }
 
     /**
@@ -748,6 +954,7 @@ public class CheckBusiness {
 
     /**
      * 获取营业员信息
+     *
      * @param bo 消费业务对象
      * @return 营业员信息
      */
@@ -760,4 +967,41 @@ public class CheckBusiness {
         }
         return operatorVo;
     }
+    /**
+     * 计算折扣金额
+     *
+     * @param cardLimitedVo    卡片限制信息
+     * @param bo               消费记录
+     * @param remoteDiscountVo 折扣信息
+     * @return 折扣金额
+     */
+    @NotNull
+    private static BigDecimal getDisCountMoney(XfCardLimitedVo cardLimitedVo, ConsumptionBo bo, RemoteDiscountVo remoteDiscountVo) {
+        int rateCount = remoteDiscountVo.getRateType().equals(
+            "0") ? cardLimitedVo.getDayDiscountCount().intValue() : cardLimitedVo.getMealDiscountCount().intValue();
+        BigDecimal disCountMoney;
+        BigDecimal consumeMoney = bo.getConsumeMoney();
+        // 折扣率1
+        BigDecimal oneRate = remoteDiscountVo.getOneRate();
+        // 折扣率2
+        BigDecimal twoRate = remoteDiscountVo.getTwoRate();
+        // 折扣率3
+        BigDecimal threeRate = remoteDiscountVo.getThreeRate();
+        // 折扣率4
+        BigDecimal fourRate = remoteDiscountVo.getFourRate();
+        if (rateCount == 0) {
+            disCountMoney = consumeMoney.multiply(oneRate.divide(new BigDecimal("100.0"), 2, RoundingMode.HALF_UP)).setScale(2, RoundingMode.HALF_UP);
+        } else if (rateCount == 1) {// 第二次
+            disCountMoney = consumeMoney.multiply(twoRate.divide(new BigDecimal("100.0"), 2, RoundingMode.HALF_UP)).setScale(2, RoundingMode.HALF_UP);
+        } else if (rateCount == 2) {// 第三次
+            disCountMoney = consumeMoney.multiply(threeRate.divide(new BigDecimal("100.0"), 2, RoundingMode.HALF_UP)).setScale(2,
+                                                                                                                               RoundingMode.HALF_UP);
+        } else { // 第四次及以上
+            disCountMoney = consumeMoney.multiply(fourRate.divide(new BigDecimal("100.0"), 2, RoundingMode.HALF_UP)).setScale(2,
+                                                                                                                              RoundingMode.HALF_UP);
+        }
+        return disCountMoney;
+    }
+
+
 }

+ 29 - 11
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/ConsumeBusiness.java

@@ -15,7 +15,6 @@ import org.dromara.server.consume.domain.vo.XfConsumeDetailOriginalVo;
 import org.dromara.server.consume.domain.vo.XfTermVo;
 import org.springframework.stereotype.Service;
 
-import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -40,22 +39,26 @@ public class ConsumeBusiness {
      * 请求消费
      *
      * @param bo    消费记录
-     * @param mac
-     * @param xfPwd
+     * @param mac 校验码
+     * @param xfPwd 消费密码
      * @return 请求结果
      */
     public R<ErrorInfo> createOrder(ConsumptionBo bo, String mac, String xfPwd) {
-        log.info("[请求交易]-[开始]-[{}]", JSONUtil.toJsonStr(bo));
+        log.info("[请求交易]-[开始参数验证]-[{}]", JSONUtil.toJsonStr(bo));
         R<ErrorInfo> result = checkBusiness.checkParam(bo);
         if (R.isError(result)) {
             log.error("[请求交易]-[参数验证失败]-[{}]", JSONUtil.toJsonStr(result.getData()));
             return result;
         }
+
+        log.info("[请求交易]-[mac校验]-[{}]", JSONUtil.toJsonStr(bo));
         result = checkBusiness.checkMac(bo, mac);
         if (R.isError(result)) {
             log.error("[请求交易]-[mac校验失败]-[{}]", JSONUtil.toJsonStr(result.getData()));
             return result;
         }
+
+        log.info("[请求交易]-[用户信息验证]-[{}]", JSONUtil.toJsonStr(bo));
         RemoteUserAccountVo userAccountVo = new RemoteUserAccountVo();
         RemoteCardVo userCardVo = new RemoteCardVo();
         result = checkBusiness.checkUser(bo, userAccountVo, userCardVo);
@@ -63,25 +66,30 @@ public class ConsumeBusiness {
             log.error("[请求交易]-[用户信息验证失败]-[{}]", JSONUtil.toJsonStr(result.getData()));
             return result;
         }
+
+        log.info("[请求交易]-[设备信息验证]-[{}]", JSONUtil.toJsonStr(bo));
         XfTermVo termVo = new XfTermVo();
          result = checkBusiness.checkTerm(bo, termVo);
         if (R.isError(result)) {
             log.error("[请求交易]-[设备验证失败]-[{}]", result.getData());
             return result;
         }
+
+        log.info("[请求交易]-[交易流程验证]-[{}]", JSONUtil.toJsonStr(bo));
         result = checkBusiness.checkConsume(bo, userAccountVo, userCardVo, termVo);
         if (R.isError(result)) {
             log.error("[请求交易]-[交易验证失败]-[{}]", JSONUtil.toJsonStr(result.getData()));
             return result;
         }
 
+        log.info("[请求交易]-[生成原始消费记录]-[{}]", JSONUtil.toJsonStr(bo));
         XfConsumeDetailOriginalVo originalVo = new XfConsumeDetailOriginalVo();
         result = baseBusiness.createOriginalOrder(bo, userAccountVo, originalVo);
         if (R.isError(result)) {
-            String msg = MessageFormat.format("设备编号[{0}] 消费流水号[{1}] 卡流水号[{2}]", bo.getTermNo(), bo.getTermRecordId(), userCardVo.getCardNo());
             log.error("[请求交易]-[消费原始记录表入库失败]-[{}]", JSONUtil.toJsonStr(result.getData()));
             return result;
         }
+
         bo.setRecordId(originalVo.getRecordId());
         bo.setStatusFlag(originalVo.getStatusFlag().intValue());
         return R.ok();
@@ -91,23 +99,25 @@ public class ConsumeBusiness {
      * 上传消费记录
      *
      * @param bo    消费记录
-     * @param mac
-     * @param xfPwd
+     * @param mac 校验码
+     * @param xfPwd 消费密码
      * @return 上传结果
      */
     public R<ErrorInfo> postOrder(ConsumptionBo bo, String mac, String xfPwd) {
+        log.info("[上传交易]-[开始参数验证]-[{}]", JSONUtil.toJsonStr(bo));
         R<ErrorInfo> result = checkBusiness.checkParam(bo);
         if (R.isError(result)) {
             log.error("[上传交易]-[参数验证失败]-[{}]", JSONUtil.toJsonStr(result.getData()));
             return result;
         }
+        log.info("[上传交易]-[消费设备验证]-[{}]", JSONUtil.toJsonStr(bo));
         XfTermVo termVo = new XfTermVo();
         result = checkBusiness.checkTerm(bo, termVo);
         if (R.isError(result)) {
-            log.error("[上传交易]-[交易验证失败]-[{}]", result.getData());
+            log.error("[上传交易]-[设备验证失败]-[{}]", result.getData());
             return result;
         }
-
+        log.info("[上传交易]-[交易账单处理]-[{}]", JSONUtil.toJsonStr(bo));
         RemoteUserAccountVo userAccountVo = new RemoteUserAccountVo();
         RemoteCardVo userCardVo = new RemoteCardVo();
         List<PtBagVo> bagVos = new ArrayList<>();
@@ -118,6 +128,7 @@ public class ConsumeBusiness {
             log.error("[上传交易]-[交易账单处理失败]-[{}]", result.getData());
             return result;
         }
+        log.info("[上传交易]-[交易入库]-[{}]", JSONUtil.toJsonStr(bo));
         result = baseBusiness.postConsumeRecord(bo, userAccountVo, userCardVo, bagVos, termVo, mealTypeVo, "");
         if (R.isError(result)) {
             log.error("[上传交易]-[交易入库失败]-[{}]", result.getData());
@@ -126,13 +137,20 @@ public class ConsumeBusiness {
         return R.ok();
     }
 
+    /**
+     * 全流程消费处理 将请求消费和上传消费记录一次性执行完成
+     * @param bo 消费业务对象
+     * @param mac 校验码
+     * @param xfPwd 消费密码
+     * @return 处理结果
+     */
     public R<ErrorInfo> fullOrder(ConsumptionBo bo, String mac, String xfPwd) {
-        R<ErrorInfo> result = this.createOrder(bo, "", "");
+        R<ErrorInfo> result = this.createOrder(bo, mac, xfPwd);
         if(!R.isSuccess(result)) {
             log.error("[请求交易]-[请求交易处理失败]-[{}]", JSONUtil.toJsonStr(result.getData()));
             return result;
         }
-        result = this.postOrder(bo, "", "");
+        result = this.postOrder(bo, mac, xfPwd);
         if(!R.isSuccess(result)) {
             log.error("[交易上传]-[交易上传处理失败]-[{}]", JSONUtil.toJsonStr(result.getData()));
             return result;

+ 3 - 2
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/XfCardLimited.java

@@ -8,6 +8,7 @@ import lombok.EqualsAndHashCode;
 import org.dromara.common.tenant.core.TenantEntity;
 
 import java.io.Serial;
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -44,7 +45,7 @@ public class XfCardLimited extends TenantEntity {
     /**
      * 每天限制消费金额
      */
-    private Long dayMoney;
+    private BigDecimal dayMoney;
 
     /**
      * 每餐限制消费次数
@@ -54,7 +55,7 @@ public class XfCardLimited extends TenantEntity {
     /**
      * 每餐限制消费金额
      */
-    private Long mealMoney;
+    private BigDecimal mealMoney;
 
     /**
      * 每天折扣限制消费次数

+ 1 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IXfCardLimitedService.java

@@ -115,6 +115,7 @@ public interface IXfCardLimitedService {
 
     /**
      * 更新折扣信息
+     *
      * @param cardNo 卡流水号
      * @return 更新结果
      */