Просмотр исходного кода

feature: 卡务中心->错扣补款业务

luoyb 1 год назад
Родитель
Сommit
064325d5d2
44 измененных файлов с 680 добавлено и 159 удалено
  1. 24 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java
  2. 24 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/consume/ConsumeException.java
  3. 7 0
      ruoyi-common/ruoyi-common-core/src/main/resources/i18n/messages_zh_CN.properties
  4. 0 0
      ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/XfConsumeDetailOriginalMapper.xml
  5. 10 10
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/controller/PtMealtypeController.java
  6. 6 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/PtMealType.java
  7. 8 3
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/bo/PtMealTypeBo.java
  8. 8 7
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/vo/PtMealTypeVo.java
  9. 3 3
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/mapper/PtMealtypeMapper.java
  10. 14 8
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/IPtMealtypeService.java
  11. 3 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtAccountServiceImpl.java
  12. 35 21
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtMealtypeServiceImpl.java
  13. 3 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtRoomServiceImpl.java
  14. 218 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/errfill/ErrFillBusiness.java
  15. 0 2
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/PaymentsBusiness.java
  16. 8 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/IPtCardService.java
  17. 22 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/impl/PtCardServiceImpl.java
  18. 3 3
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfConsumeDetailController.java
  19. 1 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfConsumeDetailOriginalController.java
  20. 5 5
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfTermtotalController.java
  21. 5 3
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/XfConsumeDetail.java
  22. 1 3
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/XfTerm.java
  23. 100 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/ConsumptionBo.java
  24. 5 4
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfConsumeDetailBo.java
  25. 1 2
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfTermBo.java
  26. 4 3
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/vo/XfConsumeDetailVo.java
  27. 4 7
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/vo/XfTermTotalVo.java
  28. 1 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/mapper/XfConsumeDetailMapper.java
  29. 1 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/mapper/XfConsumeDetailOriginalMapper.java
  30. 2 2
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/mapper/XfTermTotalMapper.java
  31. 17 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfConsumeDetailService.java
  32. 4 5
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfTermtotalService.java
  33. 49 15
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfConsumeDetailServiceImpl.java
  34. 2 2
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfConsumedetailoriginalServiceImpl.java
  35. 13 5
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfTermServiceImpl.java
  36. 7 7
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfTermtotalServiceImpl.java
  37. 40 19
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/controller/PtBagController.java
  38. 11 5
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/impl/PtBagServiceImpl.java
  39. 5 4
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/impl/PtUserAccountServiceImpl.java
  40. 1 1
      ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/basicParameter/PtMealtypeMapper.xml
  41. 2 2
      ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/consumption/XfConsumeDetailMapper.xml
  42. 1 1
      ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/consumption/XfConsumeDetailOriginalMapper.xml
  43. 1 1
      ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/consumption/XfTermMapper.xml
  44. 1 1
      ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/consumption/XfTermtotalMapper.xml

+ 24 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java

@@ -93,4 +93,28 @@ public interface CacheNames {
      * 卡片类别
      */
     String PT_CARD_TYPE = "pt_card_type";
+    /**
+     * 用户卡片
+     */
+    String PT_USER_CARD= "pt_user_card";
+
+    /**
+     * 营业时段/餐类
+     */
+    String PT_MEAL_TYPE = "pt_meal_type";
+
+    /**
+     * 消费设备
+     */
+    String PT_TERM = "pt_term";
+
+    /**
+     * 结算账户
+     */
+    String PT_ACCOUNT = "pt_account";
+
+    /**
+     * 房间信息
+     */
+    String PT_ROOM = "pt_room";
 }

+ 24 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/consume/ConsumeException.java

@@ -0,0 +1,24 @@
+package org.dromara.common.core.exception.consume;
+
+import org.dromara.common.core.exception.base.BaseException;
+
+import java.io.Serial;
+
+/**
+ * name: ConsumeException
+ * package: org.dromara.common.core.exception.consume
+ * description: 消费异常类
+ * date: 2024-09-04 09:47:44 09:47
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+public class ConsumeException extends BaseException {
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    public ConsumeException(String code, Object... args) {
+        super("consumption", code, args, null);
+    }
+}

+ 7 - 0
ruoyi-common/ruoyi-common-core/src/main/resources/i18n/messages_zh_CN.properties

@@ -61,8 +61,15 @@ tenant.blocked=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u79DF\u6237\u5DF2\u7981\u752
 tenant.expired=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u79DF\u6237\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458
 ##\u94B1\u5305
 bag.balance.valid=\u8D26\u6237\u4F59\u989D\u6821\u9A8C\u5931\u8D25
+bag.balance.update=\u8D26\u6237\u5361\u4F59\u66F4\u65B0\u5931\u8D25!{0}
 ## \u8D44\u91D1\u6536\u652F
 payments.OriginalRecord.create=\u521B\u5EFA\u539F\u59CB\u6536\u652F\u8BB0\u5F55\u5931\u8D25:{0}
 payments.OriginalRecord.get=\u65E0\u6B64Id\u5BF9\u5E94\u7684\u539F\u59CB\u6536\u652F\u8BB0\u5F55:{0}
 payments.OriginalRecord.isPost=\u8BE5\u7B14\u539F\u59CB\u6536\u652F\u8BB0\u5F55\u5DF2\u5165\u8D26,\u539F\u59CBId:{0},\u6536\u652FId:{1}
 payments.keepAccounts.create = \u539F\u59CB\u6536\u652F\u8BB0\u5F55\u5165\u8D26\u5931\u8D25,\u539F\u59CBId:{0}
+## \u6D88\u8D39
+consumption.userAccount.not.exists = \u4E0D\u5B58\u5728\u6B64\u6D88\u8D39\u8D26\u6237!{0}
+consumption.userCard.not.exists = \u4E0D\u5B58\u5728\u6B64\u5361\u7247\u4FE1\u606F!{0}
+consumption.userBag.not.exists = \u4E0D\u5B58\u5728\u6B64\u94B1\u5305\u4FE1\u606F!{0}
+consumption.consumeDetail.failure = {0}->\u5199\u6D88\u8D39\u660E\u7EC6\u8868\u5931\u8D25!
+consumption.xfTerm.not.exists = \u4E0D\u5B58\u7F16\u53F7\u4E3A[{0}]\u7684\u8BBE\u5907\u4FE1\u606F!

+ 0 - 0
ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/TestDemoMapper.xml → ruoyi-example/ruoyi-demo/src/main/resources/mapper/demo/XfConsumeDetailOriginalMapper.xml


+ 10 - 10
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/controller/PtMealtypeController.java

@@ -17,8 +17,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.basics.domain.vo.PtMealtypeVo;
-import org.dromara.backstage.basics.domain.bo.PtMealtypeBo;
+import org.dromara.backstage.basics.domain.vo.PtMealTypeVo;
+import org.dromara.backstage.basics.domain.bo.PtMealTypeBo;
 import org.dromara.backstage.basics.service.IPtMealtypeService;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 
@@ -42,13 +42,13 @@ public class PtMealtypeController extends BaseController {
      */
     @SaCheckPermission("basicParameter:ptMealtype:list")
     @GetMapping("/list")
-    public TableDataInfo<PtMealtypeVo> list(PtMealtypeBo bo, PageQuery pageQuery) {
+    public TableDataInfo<PtMealTypeVo> list(PtMealTypeBo bo, PageQuery pageQuery) {
         return ptMealtypeService.queryPageList(bo, pageQuery);
     }
 
     @SaCheckPermission("basicParameter:ptMealtype:list")
     @GetMapping("/getAll")
-    public R<List<PtMealtypeVo>> getAll(PtMealtypeBo bo) {
+    public R<List<PtMealTypeVo>> getAll(PtMealTypeBo bo) {
         return R.ok(ptMealtypeService.queryList(bo));
     }
 
@@ -58,9 +58,9 @@ public class PtMealtypeController extends BaseController {
     @SaCheckPermission("basicParameter:ptMealtype:export")
     @Log(title = "营业时段", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
-    public void export(PtMealtypeBo bo, HttpServletResponse response) {
-        List<PtMealtypeVo> list = ptMealtypeService.queryList(bo);
-        ExcelUtil.exportExcel(list, "营业时段", PtMealtypeVo.class, response);
+    public void export(PtMealTypeBo bo, HttpServletResponse response) {
+        List<PtMealTypeVo> list = ptMealtypeService.queryList(bo);
+        ExcelUtil.exportExcel(list, "营业时段", PtMealTypeVo.class, response);
     }
 
     /**
@@ -70,7 +70,7 @@ public class PtMealtypeController extends BaseController {
      */
     @SaCheckPermission("basicParameter:ptMealtype:query")
     @GetMapping("/{mealId}")
-    public R<PtMealtypeVo> getInfo(@NotNull(message = "主键不能为空")
+    public R<PtMealTypeVo> getInfo(@NotNull(message = "主键不能为空")
                                      @PathVariable Long mealId) {
         return R.ok(ptMealtypeService.queryById(mealId));
     }
@@ -82,7 +82,7 @@ public class PtMealtypeController extends BaseController {
     @Log(title = "营业时段", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
-    public R<Void> add(@Validated(AddGroup.class) @RequestBody PtMealtypeBo bo) {
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody PtMealTypeBo bo) {
         return toAjax(ptMealtypeService.insertByBo(bo));
     }
 
@@ -93,7 +93,7 @@ public class PtMealtypeController extends BaseController {
     @Log(title = "营业时段", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
-    public R<Void> edit(@Validated(EditGroup.class) @RequestBody PtMealtypeBo bo) {
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody PtMealTypeBo bo) {
         return toAjax(ptMealtypeService.updateByBo(bo));
     }
 

+ 6 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/PtMealtype.java → ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/PtMealType.java

@@ -16,7 +16,7 @@ import java.io.Serial;
 @Data
 @EqualsAndHashCode(callSuper = true)
 @TableName("t_pt_mealType")
-public class PtMealtype extends TenantEntity {
+public class PtMealType extends TenantEntity {
 
     @Serial
     private static final long serialVersionUID = 1L;
@@ -27,6 +27,11 @@ public class PtMealtype extends TenantEntity {
     @TableId(value = "meal_id")
     private Long mealId;
 
+    /**
+     * 餐类Id
+     */
+    private String typeId;
+
     /**
      * 餐类名称
      */

+ 8 - 3
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/bo/PtMealtypeBo.java → ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/bo/PtMealTypeBo.java

@@ -1,6 +1,6 @@
 package org.dromara.backstage.basics.domain.bo;
 
-import org.dromara.backstage.basics.domain.PtMealtype;
+import org.dromara.backstage.basics.domain.PtMealType;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
 import org.dromara.common.core.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
@@ -17,8 +17,8 @@ import jakarta.validation.constraints.*;
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
-@AutoMapper(target = PtMealtype.class, reverseConvertGenerate = false)
-public class PtMealtypeBo extends BaseEntity {
+@AutoMapper(target = PtMealType.class, reverseConvertGenerate = false)
+public class PtMealTypeBo extends BaseEntity {
 
     /**
      * 营业时段id
@@ -26,6 +26,11 @@ public class PtMealtypeBo extends BaseEntity {
     @NotNull(message = "营业时段id不能为空", groups = { EditGroup.class })
     private Long mealId;
 
+    /**
+     * 餐类Id
+     */
+    @NotBlank(message = "餐类Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String typeId;
     /**
      * 餐类名称
      */

+ 8 - 7
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/vo/PtMealtypeVo.java → ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/vo/PtMealTypeVo.java

@@ -1,17 +1,13 @@
 package org.dromara.backstage.basics.domain.vo;
 
-import org.dromara.backstage.basics.domain.PtMealtype;
+import org.dromara.backstage.basics.domain.PtMealType;
 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 java.io.Serial;
 import java.io.Serializable;
-import java.util.Date;
-
 
 
 /**
@@ -22,8 +18,8 @@ import java.util.Date;
  */
 @Data
 @ExcelIgnoreUnannotated
-@AutoMapper(target = PtMealtype.class)
-public class PtMealtypeVo implements Serializable {
+@AutoMapper(target = PtMealType.class)
+public class PtMealTypeVo implements Serializable {
 
     @Serial
     private static final long serialVersionUID = 1L;
@@ -34,6 +30,11 @@ public class PtMealtypeVo implements Serializable {
     @ExcelProperty(value = "营业时段id")
     private Long mealId;
 
+    /**
+     * 餐类Id
+     */
+    @ExcelProperty(value = "餐类Id")
+    private String typeId;
     /**
      * 餐类名称
      */

+ 3 - 3
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/mapper/PtMealtypeMapper.java

@@ -1,7 +1,7 @@
 package org.dromara.backstage.basics.mapper;
 
-import org.dromara.backstage.basics.domain.PtMealtype;
-import org.dromara.backstage.basics.domain.vo.PtMealtypeVo;
+import org.dromara.backstage.basics.domain.PtMealType;
+import org.dromara.backstage.basics.domain.vo.PtMealTypeVo;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 
 /**
@@ -10,6 +10,6 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
  * @author Yz
  * @date 2024-08-05
  */
-public interface PtMealtypeMapper extends BaseMapperPlus<PtMealtype, PtMealtypeVo> {
+public interface PtMealtypeMapper extends BaseMapperPlus<PtMealType, PtMealTypeVo> {
 
 }

+ 14 - 8
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/IPtMealtypeService.java

@@ -1,8 +1,7 @@
 package org.dromara.backstage.basics.service;
 
-import org.dromara.backstage.basics.domain.PtMealtype;
-import org.dromara.backstage.basics.domain.vo.PtMealtypeVo;
-import org.dromara.backstage.basics.domain.bo.PtMealtypeBo;
+import org.dromara.backstage.basics.domain.vo.PtMealTypeVo;
+import org.dromara.backstage.basics.domain.bo.PtMealTypeBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
 
@@ -23,7 +22,7 @@ public interface IPtMealtypeService {
      * @param mealId 主键
      * @return 营业时段
      */
-    PtMealtypeVo queryById(Long mealId);
+    PtMealTypeVo queryById(Long mealId);
 
     /**
      * 分页查询营业时段列表
@@ -32,7 +31,7 @@ public interface IPtMealtypeService {
      * @param pageQuery 分页参数
      * @return 营业时段分页列表
      */
-    TableDataInfo<PtMealtypeVo> queryPageList(PtMealtypeBo bo, PageQuery pageQuery);
+    TableDataInfo<PtMealTypeVo> queryPageList(PtMealTypeBo bo, PageQuery pageQuery);
 
     /**
      * 查询符合条件的营业时段列表
@@ -40,7 +39,7 @@ public interface IPtMealtypeService {
      * @param bo 查询条件
      * @return 营业时段列表
      */
-    List<PtMealtypeVo> queryList(PtMealtypeBo bo);
+    List<PtMealTypeVo> queryList(PtMealTypeBo bo);
 
     /**
      * 新增营业时段
@@ -48,7 +47,7 @@ public interface IPtMealtypeService {
      * @param bo 营业时段
      * @return 是否新增成功
      */
-    Boolean insertByBo(PtMealtypeBo bo);
+    Boolean insertByBo(PtMealTypeBo bo);
 
     /**
      * 修改营业时段
@@ -56,7 +55,7 @@ public interface IPtMealtypeService {
      * @param bo 营业时段
      * @return 是否修改成功
      */
-    Boolean updateByBo(PtMealtypeBo bo);
+    Boolean updateByBo(PtMealTypeBo bo);
 
     /**
      * 校验并批量删除营业时段信息
@@ -68,4 +67,11 @@ public interface IPtMealtypeService {
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 
     String selectMealTypeNameByIds(String ids);
+    /**
+     * 根据餐类Id查询餐类信息
+     *
+     * @param typeId 餐类Id
+     * @return 餐类视图
+     */
+    PtMealTypeVo queryVoByTypeId(String typeId);
 }

+ 3 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtAccountServiceImpl.java

@@ -3,6 +3,7 @@ package org.dromara.backstage.basics.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import org.dromara.backstage.basics.domain.PtOperator;
 import org.dromara.backstage.basics.mapper.PtOperatorMapper;
+import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
@@ -13,6 +14,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 import org.dromara.backstage.basics.domain.bo.PtAccountBo;
 import org.dromara.backstage.basics.domain.vo.PtAccountVo;
@@ -45,6 +47,7 @@ public class PtAccountServiceImpl implements IPtAccountService {
      * @return 结算账户
      */
     @Override
+    @Cacheable(cacheNames = CacheNames.PT_ACCOUNT, key = "#accountId")
     public PtAccountVo queryById(Long accountId){
         return baseMapper.selectVoById(accountId);
     }

+ 35 - 21
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtMealtypeServiceImpl.java

@@ -2,8 +2,8 @@ package org.dromara.backstage.basics.service.impl;
 
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.ObjectUtil;
+import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.utils.MapstructUtils;
-import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
@@ -11,10 +11,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
-import org.dromara.backstage.basics.domain.bo.PtMealtypeBo;
-import org.dromara.backstage.basics.domain.vo.PtMealtypeVo;
-import org.dromara.backstage.basics.domain.PtMealtype;
+import org.dromara.backstage.basics.domain.bo.PtMealTypeBo;
+import org.dromara.backstage.basics.domain.vo.PtMealTypeVo;
+import org.dromara.backstage.basics.domain.PtMealType;
 import org.dromara.backstage.basics.mapper.PtMealtypeMapper;
 import org.dromara.backstage.basics.service.IPtMealtypeService;
 
@@ -42,7 +43,7 @@ public class PtMealtypeServiceImpl implements IPtMealtypeService {
      * @return 营业时段
      */
     @Override
-    public PtMealtypeVo queryById(Long mealId){
+    public PtMealTypeVo queryById(Long mealId){
         return baseMapper.selectVoById(mealId);
     }
 
@@ -54,9 +55,9 @@ public class PtMealtypeServiceImpl implements IPtMealtypeService {
      * @return 营业时段分页列表
      */
     @Override
-    public TableDataInfo<PtMealtypeVo> queryPageList(PtMealtypeBo bo, PageQuery pageQuery) {
-        LambdaQueryWrapper<PtMealtype> lqw = buildQueryWrapper(bo);
-        Page<PtMealtypeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+    public TableDataInfo<PtMealTypeVo> queryPageList(PtMealTypeBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<PtMealType> lqw = buildQueryWrapper(bo);
+        Page<PtMealTypeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
         return TableDataInfo.build(result);
     }
 
@@ -67,17 +68,17 @@ public class PtMealtypeServiceImpl implements IPtMealtypeService {
      * @return 营业时段列表
      */
     @Override
-    public List<PtMealtypeVo> queryList(PtMealtypeBo bo) {
-        LambdaQueryWrapper<PtMealtype> lqw = buildQueryWrapper(bo);
+    public List<PtMealTypeVo> queryList(PtMealTypeBo bo) {
+        LambdaQueryWrapper<PtMealType> lqw = buildQueryWrapper(bo);
         return baseMapper.selectVoList(lqw);
     }
 
-    private LambdaQueryWrapper<PtMealtype> buildQueryWrapper(PtMealtypeBo bo) {
+    private LambdaQueryWrapper<PtMealType> buildQueryWrapper(PtMealTypeBo bo) {
         Map<String, Object> params = bo.getParams();
-        LambdaQueryWrapper<PtMealtype> lqw = Wrappers.lambdaQuery();
-        lqw.like(StringUtils.isNotBlank(bo.getMealName()), PtMealtype::getMealName, bo.getMealName());
-        lqw.ge(StringUtils.isNotBlank(bo.getBeginTime()), PtMealtype::getBeginTime, bo.getBeginTime());
-        lqw.le(StringUtils.isNotBlank(bo.getEndTime()), PtMealtype::getEndTime, bo.getEndTime());
+        LambdaQueryWrapper<PtMealType> lqw = Wrappers.lambdaQuery();
+        lqw.like(StringUtils.isNotBlank(bo.getMealName()), PtMealType::getMealName, bo.getMealName());
+        lqw.ge(StringUtils.isNotBlank(bo.getBeginTime()), PtMealType::getBeginTime, bo.getBeginTime());
+        lqw.le(StringUtils.isNotBlank(bo.getEndTime()), PtMealType::getEndTime, bo.getEndTime());
         return lqw;
     }
 
@@ -88,8 +89,8 @@ public class PtMealtypeServiceImpl implements IPtMealtypeService {
      * @return 是否新增成功
      */
     @Override
-    public Boolean insertByBo(PtMealtypeBo bo) {
-        PtMealtype add = MapstructUtils.convert(bo, PtMealtype.class);
+    public Boolean insertByBo(PtMealTypeBo bo) {
+        PtMealType add = MapstructUtils.convert(bo, PtMealType.class);
         validEntityBeforeSave(add);
         boolean flag = baseMapper.insert(add) > 0;
         if (flag) {
@@ -105,8 +106,8 @@ public class PtMealtypeServiceImpl implements IPtMealtypeService {
      * @return 是否修改成功
      */
     @Override
-    public Boolean updateByBo(PtMealtypeBo bo) {
-        PtMealtype update = MapstructUtils.convert(bo, PtMealtype.class);
+    public Boolean updateByBo(PtMealTypeBo bo) {
+        PtMealType update = MapstructUtils.convert(bo, PtMealType.class);
         validEntityBeforeSave(update);
         return baseMapper.updateById(update) > 0;
     }
@@ -114,7 +115,7 @@ public class PtMealtypeServiceImpl implements IPtMealtypeService {
     /**
      * 保存前的数据校验
      */
-    private void validEntityBeforeSave(PtMealtype entity){
+    private void validEntityBeforeSave(PtMealType entity){
         //TODO 做一些数据校验,如唯一约束
     }
 
@@ -138,11 +139,24 @@ public class PtMealtypeServiceImpl implements IPtMealtypeService {
         List<String> list = new ArrayList<>();
         for (Long id : StringUtils.splitTo(ids, Convert::toLong)) {
 //            PtMealtypeVo vo = SpringUtils.getAopProxy(this).queryById(id);
-            PtMealtypeVo vo = baseMapper.selectVoById(id);
+            PtMealTypeVo vo = baseMapper.selectVoById(id);
             if (ObjectUtil.isNotNull(vo)) {
                 list.add(vo.getMealName());
             }
         }
         return String.join(StringUtils.SEPARATOR, list);
     }
+
+    /**
+     * 根据餐类Id查询餐类信息
+     *
+     * @param typeId 餐类Id
+     * @return 餐类视图
+     */
+    @Override
+    @Cacheable(cacheNames = CacheNames.PT_MEAL_TYPE, key = "#typeId")
+    public PtMealTypeVo queryVoByTypeId(String typeId) {
+        return baseMapper.selectVoOne(new LambdaQueryWrapper<PtMealType>()
+            .eq(PtMealType::getTypeId, typeId));
+    }
 }

+ 3 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/service/impl/PtRoomServiceImpl.java

@@ -6,6 +6,7 @@ import cn.hutool.core.map.MapUtil;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import org.dromara.backstage.basics.domain.bo.PtRoomBatchSetBo;
 import org.dromara.backstage.basics.domain.vo.PtAreaVo;
+import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -14,6 +15,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 import org.dromara.backstage.basics.domain.bo.PtRoomBo;
 import org.dromara.backstage.basics.domain.vo.PtRoomVo;
@@ -45,6 +47,7 @@ public class PtRoomServiceImpl implements IPtRoomService {
      * @return 房间定义
      */
     @Override
+    @Cacheable(cacheNames = CacheNames.PT_ROOM, key = "#roomId")
     public PtRoomVo queryById(Long roomId){
         PtRoomVo ptRoomVo = baseMapper.selectVoById(roomId);
         PtAreaVo ptAreaVo = areaService.queryById(ptRoomVo.getAreaId());

+ 218 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/errfill/ErrFillBusiness.java

@@ -0,0 +1,218 @@
+package org.dromara.backstage.business.errfill;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.json.JSONUtil;
+import lombok.RequiredArgsConstructor;
+import org.dromara.backstage.basics.domain.vo.PtMealTypeVo;
+import org.dromara.backstage.basics.service.IPtMealtypeService;
+import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
+import org.dromara.backstage.cardCenter.service.IPtCardService;
+import org.dromara.backstage.consumption.domain.XfConsumeDetail;
+import org.dromara.backstage.consumption.domain.bo.ConsumptionBo;
+import org.dromara.backstage.consumption.domain.bo.XfConsumeDetailBo;
+import org.dromara.backstage.consumption.domain.vo.XfConsumeDetailVo;
+import org.dromara.backstage.consumption.domain.vo.XfTermVo;
+import org.dromara.backstage.consumption.service.IXfConsumeDetailService;
+import org.dromara.backstage.consumption.service.IXfTermService;
+import org.dromara.backstage.payment.domain.bo.PtBagBo;
+import org.dromara.backstage.payment.domain.vo.PtBagVo;
+import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
+import org.dromara.backstage.payment.service.IPtBagService;
+import org.dromara.backstage.payment.service.IPtUserAccountService;
+import org.dromara.common.core.enums.BalanceUpdateEnum;
+import org.dromara.common.core.exception.consume.BagException;
+import org.dromara.common.core.exception.consume.ConsumeException;
+import org.dromara.common.core.utils.RecordIdUtils;
+import org.jetbrains.annotations.NotNull;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * name: ErrFill
+ * package: org.dromara.backstage.business.errfill
+ * description: 错扣补款业务处理逻辑
+ * date: 2024-09-04 08:44:46 08:44
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@RequiredArgsConstructor
+@Service
+public class ErrFillBusiness {
+    private static final Logger log = LoggerFactory.getLogger(ErrFillBusiness.class);
+    private final IPtUserAccountService userAccountService;
+    private final IXfTermService termService;
+    private final IPtCardService cardService;
+    private final IPtBagService bagService;
+    private final IPtMealtypeService mealTypeService;
+    private final IXfConsumeDetailService consumeDetailService;
+
+    public PtBagVo createErrFillRecord(ConsumptionBo bo) {
+        String message;
+        //1.处理入账需要的其它信息
+        log.info("[开始错扣补款前的验证]-[{}]", JSONUtil.toJsonStr(bo));
+        List<Object> list = getOtherInfo(bo);
+        PtUserAccountVo userAccountVo = list.get(0) == null ? new PtUserAccountVo() : (PtUserAccountVo) list.get(0);
+        PtCardVo cardVo = list.get(1) == null ? new PtCardVo() : (PtCardVo) list.get(1);
+        PtBagVo bagVo = list.get(2) == null ? new PtBagVo() : (PtBagVo) list.get(2);
+        XfTermVo termVo = list.get(3) == null ? new XfTermVo() : (XfTermVo) list.get(3);
+        PtMealTypeVo mealTypeVo = list.get(4) == null ? new PtMealTypeVo() : (PtMealTypeVo) list.get(4);
+
+        log.info("[验证通过,开始写入消费明细数据]-[{}]", JSONUtil.toJsonStr(bo));
+        XfConsumeDetailVo consumeDetailVo = createConsumeRecord(bo, userAccountVo, cardVo, bagVo, termVo, mealTypeVo);
+        if (consumeDetailVo == null) {
+            message = MessageFormat.format("[错扣补款写消费明细表失败]-[{0}]", JSONUtil.toJsonStr(bo));
+            log.error(message);
+            throw new ConsumeException("consumption.consumeDetail.failure", "错扣补款");
+        }
+        // TODO 2024-09-04 23:36:42 luoyibo 写个人日统计表
+        log.info("[消费明细处理完毕,开始更新人员日统计表]-[{}]", JSONUtil.toJsonStr(bo));
+
+        // TODO 2024-09-04 23:37:35 luoyibo 更新设备的按日统计
+        log.info("[人员日统计表更新完毕,开始更新设备日统计表]-[{}]", JSONUtil.toJsonStr(bo));
+
+        log.info("[设备日统计表更新完毕,开始更新钱包余额]-[{}]", JSONUtil.toJsonStr(bo));
+        PtBagVo resultVo = updateBalance(bo, bagVo);
+        if (resultVo == null) {
+            message = MessageFormat.format("[错扣补款]-[账户Id:{0},钱包类型:{1},操作金额:{2}]", bo.getUserId(), bo.getBagType(), bo.getOperatorMoney());
+            log.error(message);
+            throw new BagException("bag.balance.update", message);
+        }
+        //卡余更新成功,设置消费明细中的卡余为更新后的卡余
+        updateConsumeRecordBalance(consumeDetailVo.getConsumeId(), resultVo.getBalance());
+        return resultVo;
+    }
+
+    private XfConsumeDetailVo createConsumeRecord(ConsumptionBo bo, PtUserAccountVo userAccountVo, PtCardVo cardVo, PtBagVo bagVo, XfTermVo termVo, PtMealTypeVo mealTypeVo) {
+        String recordId = getRecordKeyId(bo, userAccountVo, bagVo);
+        XfConsumeDetailBo consumeDetailBo = new XfConsumeDetailBo();
+        BeanUtil.copyProperties(bo, consumeDetailBo);
+        consumeDetailBo.setConsumeId(recordId);
+        //设置消费账户信息
+        BeanUtil.copyProperties(userAccountVo, consumeDetailBo);
+        //设置消费信息
+        consumeDetailBo.setConsumeDate(bo.getFillDate());
+        // 补款记一笔负消费
+        consumeDetailBo.setConsumeMoney(bo.getOperatorMoney().negate());
+        //设置卡片信息
+        consumeDetailBo.setCardNo(cardVo.getCardNo());
+        consumeDetailBo.setFactoryId(cardVo.getFactoryId());
+        consumeDetailBo.setCardValue(bagVo.getBalance());
+        //设置设备信息
+        BeanUtil.copyProperties(termVo, consumeDetailBo);
+         //设置操作员信息
+        consumeDetailBo.setOperatorId(bo.getOperatorId());
+        consumeDetailBo.setOperatorName(bo.getOperatorName());
+        //设置餐类信息
+        consumeDetailBo.setMealType(Long.valueOf(mealTypeVo.getTypeId()));
+        consumeDetailBo.setMealName(mealTypeVo.getMealName());
+        //设置钱包信息
+        consumeDetailBo.setBagType(bagVo.getBagCode());
+
+        return consumeDetailService.createConsumeDetailRecord(consumeDetailBo);
+    }
+
+    /**
+     * 更新消费明细表的卡余信息
+     *
+     * @param consumeId 消费明细Id
+     * @param balance 卡余
+     * @return 更新结果
+     */
+    private boolean updateConsumeRecordBalance(String consumeId, BigDecimal balance){
+        XfConsumeDetailBo consumeDetailBo = new XfConsumeDetailBo();
+        consumeDetailBo.setConsumeId(consumeId);
+        consumeDetailBo.setCardValue(balance);
+
+        return consumeDetailService.updateByBoId(consumeDetailBo);
+    }
+    private PtBagVo updateBalance(ConsumptionBo bo, PtBagVo bagVo) {
+        PtBagBo bagBo = new PtBagBo();
+        bagBo.setUserId(bo.getUserId());
+        bagBo.setBagId(bagVo.getBagId());
+        bagBo.setBagCode(bo.getBagType());
+        bagBo.setReceiptMoney(bo.getOperatorMoney());
+        bagBo.setOperationMode(BalanceUpdateEnum.COMPENSATE);
+        return bagService.updateBalanceByBo(bagBo);
+    }
+
+    /**
+     * 消费记录处理时获取必要的辅助信息
+     *
+     * @param bo 资金收支信息
+     * @return 辅助信息列表
+     */
+    private List<Object> getOtherInfo(ConsumptionBo bo) {
+        List<Object> list = new ArrayList<>();
+        String message;
+        //1.人员辅助信息
+        PtUserAccountVo userAccountVo = userAccountService.queryById(bo.getUserId());
+        if (userAccountVo == null) {
+            message = MessageFormat.format("账户Id:[{0}],错扣补款失败!", bo.getUserId());
+            log.error(message);
+            throw new ConsumeException("consumption.userAccount.not.exists", message);
+        }
+        list.add(userAccountVo);
+        //2.卡片辅助信息
+        PtCardVo ptCardVo;
+        if (bo.getCardNo() != null && bo.getCardNo() > 0) {
+            //如果传入了cardNo,根据cardNo查询卡片信息
+            message = MessageFormat.format("卡流水号:[{0}]", bo.getCardNo());
+            ptCardVo = cardService.queryCardByCardNo(bo.getCardNo());
+        } else {
+            //查询当前人的正常主卡
+            message = MessageFormat.format("账户Id:{0}", bo.getUserId());
+            ptCardVo = cardService.queryMainCardByUserId(bo.getUserId());
+        }
+        if (ptCardVo == null) {
+            message = message + ",错扣补款失败!";
+            log.error(message);
+            throw new ConsumeException("consumption.userCard.not.exists", message);
+        }
+        list.add(ptCardVo);
+        //3.钱包辅助信息
+        PtBagVo ptBagVo = bagService.queryByUserBagCode(bo.getUserId(), bo.getBagType());
+        if (ptBagVo == null) {
+            message = MessageFormat.format("账户Id:[{0}],钱包类型:[{1}],错扣补款失败!", bo.getUserId(), bo.getBagType());
+            log.error(message);
+            throw new ConsumeException("consumption.userBag.not.exists", message);
+        }
+        list.add(ptBagVo);
+        //4.设备辅助信息
+        XfTermVo xfTermVo = termService.queryByNo(bo.getTermNo() == null ? 0 : bo.getTermNo());
+        if(xfTermVo == null) {
+            message = MessageFormat.format("不存编号为[{0}]的设备信息,错扣补款失败!", bo.getTermNo());
+            log.error(message);
+            throw new ConsumeException("consumption.xfTerm.not.exists",bo.getTermNo());
+        }
+        list.add(xfTermVo);
+
+        //5.餐类辅助信息
+        PtMealTypeVo mealTypeVo = mealTypeService.queryVoByTypeId(bo.getMealType().toString());
+        list.add(mealTypeVo);
+
+        return list;
+    }
+
+    /**
+     * 生成消费明细表的32位主键Id
+     *
+     * @param bo        资金收支信息
+     * @param accountVo 人员账户信息
+     * @param bagVo     账户钱包信息
+     * @return 生成的记录Id
+     */
+    @NotNull
+    private String getRecordKeyId(ConsumptionBo bo, PtUserAccountVo accountVo, PtBagVo bagVo) {
+        return RecordIdUtils.getRecordId(new Date(), Short.parseShort(bo.getTermNo().toString()), 0, accountVo.getUserNo().intValue(), Integer.parseInt(bagVo.getBagCode()));
+    }
+}

+ 0 - 2
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/PaymentsBusiness.java

@@ -69,8 +69,6 @@ public class PaymentsBusiness {
      * @return 辅助信息列表
      */
     public List<Object> getOtherInfo(PtBagBo bo) {
-        Date my = DateUtil.date();
-        Date my1 = new Date();
         List<Object> list = new ArrayList<>();
         //1.人员辅助信息
         PtUserAccountVo userAccountVo = userAccountService.queryById(bo.getUserId());

+ 8 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/IPtCardService.java

@@ -126,4 +126,12 @@ public interface IPtCardService {
      * @return 管理费
      */
     BigDecimal computeCommission(PtBagBo bo);
+
+    /**
+     * 根据卡流水号获取对应的卡片信息
+     *
+     * @param cardNo     卡流水号
+     * @return 卡片信息
+     */
+    PtCardVo queryCardByCardNo(Long cardNo);
 }

+ 22 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/impl/PtCardServiceImpl.java

@@ -16,12 +16,14 @@ import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
 import org.dromara.backstage.cardCenter.mapper.PtCardMapper;
 import org.dromara.backstage.cardCenter.service.IPtCardService;
 import org.dromara.backstage.payment.domain.bo.PtBagBo;
+import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.constant.Constants;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
@@ -229,6 +231,7 @@ public class PtCardServiceImpl implements IPtCardService {
      * @return 主卡信息
      */
     @Override
+    @Cacheable(cacheNames = CacheNames.PT_USER_CARD, key = "#userId")
     public PtCardVo queryMainCardByUserId(Long userId) {
         PtCardVo vo = baseMapper.selectVoOne(new LambdaQueryWrapper<PtCard>()
             .eq(PtCard::getMainCard, "Y")
@@ -304,4 +307,23 @@ public class PtCardServiceImpl implements IPtCardService {
             return BigDecimal.ZERO;
         }
     }
+    /**
+     * 根据卡流水号获取对应的卡片信息
+     *
+     * @param cardNo     卡流水号
+     * @return 卡片信息
+     */
+    @Override
+    @Cacheable(cacheNames = CacheNames.PT_USER_CARD, key = "#cardNo")
+    public PtCardVo queryCardByCardNo(Long cardNo) {
+        PtCardVo vo = baseMapper.selectVoOne(new LambdaQueryWrapper<PtCard>()
+            .eq(PtCard::getStatus, "1")
+            .eq(PtCard::getCardNo, cardNo));
+        if (vo != null) {
+            PtCardtypeVo cardTypeVo = cardTypeService.queryByCode(vo.getCardType());
+            vo.setCardTypeName(cardTypeVo.getTypeName());
+            return vo;
+        }
+        return null;
+    }
 }

+ 3 - 3
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfConsumedetailController.java → ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfConsumeDetailController.java

@@ -19,7 +19,7 @@ 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.service.IXfConsumedetailService;
+import org.dromara.backstage.consumption.service.IXfConsumeDetailService;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 
 /**
@@ -33,9 +33,9 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
 @RequiredArgsConstructor
 @RestController
 @RequestMapping("/consumption/xfConsumedetail")
-public class XfConsumedetailController extends BaseController {
+public class XfConsumeDetailController extends BaseController {
 
-    private final IXfConsumedetailService xfConsumedetailService;
+    private final IXfConsumeDetailService xfConsumedetailService;
 
     /**
      * 查询消费明细列表

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfConsumedetailoriginalController.java → ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfConsumeDetailOriginalController.java

@@ -33,7 +33,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
 @RequiredArgsConstructor
 @RestController
 @RequestMapping("/consumption/xfConsumedetailoriginal")
-public class XfConsumedetailoriginalController extends BaseController {
+public class XfConsumeDetailOriginalController extends BaseController {
 
     private final IXfConsumedetailoriginalService xfConsumedetailoriginalService;
 

+ 5 - 5
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfTermtotalController.java

@@ -17,7 +17,7 @@ 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.XfTermtotalVo;
+import org.dromara.backstage.consumption.domain.vo.XfTermTotalVo;
 import org.dromara.backstage.consumption.domain.bo.XfTermtotalBo;
 import org.dromara.backstage.consumption.service.IXfTermtotalService;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -42,7 +42,7 @@ public class XfTermtotalController extends BaseController {
      */
     @SaCheckPermission("consumption:xfTermtotal:list")
     @GetMapping("/list")
-    public TableDataInfo<XfTermtotalVo> list(XfTermtotalBo bo, PageQuery pageQuery) {
+    public TableDataInfo<XfTermTotalVo> list(XfTermtotalBo bo, PageQuery pageQuery) {
         return xfTermtotalService.queryPageList(bo, pageQuery);
     }
 
@@ -53,8 +53,8 @@ public class XfTermtotalController extends BaseController {
     @Log(title = "消费机消费记录", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(XfTermtotalBo bo, HttpServletResponse response) {
-        List<XfTermtotalVo> list = xfTermtotalService.queryList(bo);
-        ExcelUtil.exportExcel(list, "消费机消费记录", XfTermtotalVo.class, response);
+        List<XfTermTotalVo> list = xfTermtotalService.queryList(bo);
+        ExcelUtil.exportExcel(list, "消费机消费记录", XfTermTotalVo.class, response);
     }
 
     /**
@@ -64,7 +64,7 @@ public class XfTermtotalController extends BaseController {
      */
     @SaCheckPermission("consumption:xfTermtotal:query")
     @GetMapping("/{totalId}")
-    public R<XfTermtotalVo> getInfo(@NotNull(message = "主键不能为空")
+    public R<XfTermTotalVo> getInfo(@NotNull(message = "主键不能为空")
                                      @PathVariable String totalId) {
         return R.ok(xfTermtotalService.queryById(totalId));
     }

+ 5 - 3
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/XfConsumeDetail.java

@@ -4,6 +4,8 @@ import org.dromara.common.tenant.core.TenantEntity;
 import com.baomidou.mybatisplus.annotation.*;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
 import java.util.Date;
 
 import java.io.Serial;
@@ -71,7 +73,7 @@ public class XfConsumeDetail extends TenantEntity {
     /**
      * 消费金额
      */
-    private Long consumeMoney;
+    private BigDecimal consumeMoney;
 
     /**
      * 卡流水号
@@ -86,7 +88,7 @@ public class XfConsumeDetail extends TenantEntity {
     /**
      * 卡上余额
      */
-    private Long cardValue;
+    private BigDecimal cardValue;
 
     /**
      * 卡使用次数
@@ -96,7 +98,7 @@ public class XfConsumeDetail extends TenantEntity {
     /**
      * 消费账户金额
      */
-    private Long consumeBalance;
+    private BigDecimal consumeBalance;
 
     /**
      * 设备机号

+ 1 - 3
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/XfTerm.java

@@ -1,12 +1,10 @@
 package org.dromara.backstage.consumption.domain;
 
-import com.alibaba.excel.annotation.ExcelProperty;
 import org.dromara.common.tenant.core.TenantEntity;
 import com.baomidou.mybatisplus.annotation.*;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonFormat;
 
 import java.io.Serial;
 
@@ -288,7 +286,7 @@ public class XfTerm extends TenantEntity {
     /**
      * 晚餐结束时间
      */
-    private Long suppeEnd;
+    private Long supperEnd;
 
     /**
      * 宵夜开始时间

+ 100 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/ConsumptionBo.java

@@ -0,0 +1,100 @@
+package org.dromara.backstage.consumption.domain.bo;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.enums.BalanceUpdateEnum;
+import org.dromara.common.core.enums.CreditTypeEnum;
+import org.dromara.common.core.enums.SystemUseTypeEnum;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * name: ConsumeBo
+ * package: org.dromara.backstage.consumption.domain.bo
+ * description: 消费业务对象,和消费相关的业务都使用此业务对象
+ *             属性可能会根据业务动态调整,最早的业务是错扣补款业务
+ * date: 2024-09-04 08:53:02 08:53
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ConsumptionBo extends BaseEntity {
+    //region 消费业务基础属性
+    /**
+     * 消费账户Id
+     */
+    private Long userId;
+
+    /**
+     * 学/工号
+     */
+    private String userNumb;
+
+    /**
+     * 卡流水号
+     */
+    private Long cardNo;
+    /**
+     * 钱包代码
+     */
+    @NotBlank(message = "消费钱包不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String bagType;
+
+    /**
+     * 消费金额
+     */
+    @NotNull(message = "消费金额不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal consumeMoney;
+
+    /**
+     * 消费日期
+     */
+    @NotNull(message = "消费日期不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date consumeDate;
+
+    /**
+     * 设备机号
+     */
+    @NotNull(message = "消费设备不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long termNo;
+    /**
+     * 餐类Id
+     */
+    @NotNull(message = "消费餐类不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long mealType;
+
+    /**
+     * 系统使用类型
+     */
+    private SystemUseTypeEnum useType;
+    /**
+     * 操作员Id
+     */
+    private Long operatorId;
+    /**
+     * 操作员姓名
+     */
+    private String operatorName;
+    //endregion
+
+    //region 错扣补款属性
+    /**
+     * 补款日期
+     */
+    private Date fillDate;
+
+    /**
+     * 操作金额
+     */
+    private BigDecimal operatorMoney;
+    //endregion
+}

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

@@ -8,6 +8,8 @@ import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import jakarta.validation.constraints.*;
+
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -75,7 +77,7 @@ public class XfConsumeDetailBo extends BaseEntity {
      * 消费金额
      */
     @NotNull(message = "消费金额不能为空", groups = { AddGroup.class, EditGroup.class })
-    private Long consumeMoney;
+    private BigDecimal consumeMoney;
 
     /**
      * 卡流水号
@@ -93,7 +95,7 @@ public class XfConsumeDetailBo extends BaseEntity {
      * 卡上余额
      */
     @NotNull(message = "卡上余额不能为空", groups = { AddGroup.class, EditGroup.class })
-    private Long cardValue;
+    private BigDecimal cardValue;
 
     /**
      * 卡使用次数
@@ -103,7 +105,7 @@ public class XfConsumeDetailBo extends BaseEntity {
     /**
      * 消费账户金额
      */
-    private Long consumeBalance;
+    private BigDecimal consumeBalance;
 
     /**
      * 设备机号
@@ -198,7 +200,6 @@ public class XfConsumeDetailBo extends BaseEntity {
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
 

+ 1 - 2
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfTermBo.java

@@ -11,7 +11,6 @@ import jakarta.validation.constraints.*;
 
 import java.io.Serial;
 import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonFormat;
 
 /**
  * 消费设备业务对象 t_xf_term
@@ -303,7 +302,7 @@ public class XfTermBo extends BaseEntity {
     /**
      * 晚餐结束时间
      */
-    private Long suppeEnd;
+    private Long supperEnd;
 
     /**
      * 宵夜开始时间

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

@@ -1,5 +1,6 @@
 package org.dromara.backstage.consumption.domain.vo;
 
+import java.math.BigDecimal;
 import java.util.Date;
 
 import org.dromara.backstage.consumption.domain.XfConsumeDetail;
@@ -86,7 +87,7 @@ public class XfConsumeDetailVo implements Serializable {
      * 消费金额
      */
     @ExcelProperty(value = "消费金额")
-    private Long consumeMoney;
+    private BigDecimal consumeMoney;
 
     /**
      * 卡流水号
@@ -104,7 +105,7 @@ public class XfConsumeDetailVo implements Serializable {
      * 卡上余额
      */
     @ExcelProperty(value = "卡上余额")
-    private Long cardValue;
+    private BigDecimal cardValue;
 
     /**
      * 卡使用次数
@@ -116,7 +117,7 @@ public class XfConsumeDetailVo implements Serializable {
      * 消费账户金额
      */
     @ExcelProperty(value = "消费账户金额")
-    private Long consumeBalance;
+    private BigDecimal consumeBalance;
 
     /**
      * 设备机号

+ 4 - 7
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/vo/XfTermtotalVo.java → ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/vo/XfTermTotalVo.java

@@ -3,15 +3,12 @@ package org.dromara.backstage.consumption.domain.vo;
 import org.dromara.backstage.consumption.domain.XfTermtotal;
 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 java.io.Serial;
 import java.io.Serializable;
-import java.util.Date;
-
+import java.math.BigDecimal;
 
 
 /**
@@ -23,7 +20,7 @@ import java.util.Date;
 @Data
 @ExcelIgnoreUnannotated
 @AutoMapper(target = XfTermtotal.class)
-public class XfTermtotalVo implements Serializable {
+public class XfTermTotalVo implements Serializable {
 
     @Serial
     private static final long serialVersionUID = 1L;
@@ -86,7 +83,7 @@ public class XfTermtotalVo implements Serializable {
      * 消费总额(该机该天该餐消费总额)
      */
     @ExcelProperty(value = "消费总额(该机该天该餐消费总额)")
-    private Long mealAmount;
+    private BigDecimal mealAmount;
 
     /**
      * 消费次数(该机该天该餐消费次数)
@@ -110,7 +107,7 @@ public class XfTermtotalVo implements Serializable {
      * 错扣补款总额(该机该天该餐错扣补款总额)
      */
     @ExcelProperty(value = "错扣补款总额(该机该天该餐错扣补款总额)")
-    private Long errFillMoney;
+    private BigDecimal errFillMoney;
 
 
 }

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/mapper/XfConsumedetailMapper.java → ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/mapper/XfConsumeDetailMapper.java

@@ -10,6 +10,6 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
  * @author LionLi
  * @date 2024-08-15
  */
-public interface XfConsumedetailMapper extends BaseMapperPlus<XfConsumeDetail, XfConsumeDetailVo> {
+public interface XfConsumeDetailMapper extends BaseMapperPlus<XfConsumeDetail, XfConsumeDetailVo> {
 
 }

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/mapper/XfConsumedetailoriginalMapper.java → ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/mapper/XfConsumeDetailOriginalMapper.java

@@ -10,6 +10,6 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
  * @author LionLi
  * @date 2024-08-15
  */
-public interface XfConsumedetailoriginalMapper extends BaseMapperPlus<XfConsumeDetailOriginal, XfConsumeDetailOriginalVo> {
+public interface XfConsumeDetailOriginalMapper extends BaseMapperPlus<XfConsumeDetailOriginal, XfConsumeDetailOriginalVo> {
 
 }

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

@@ -1,7 +1,7 @@
 package org.dromara.backstage.consumption.mapper;
 
 import org.dromara.backstage.consumption.domain.XfTermtotal;
-import org.dromara.backstage.consumption.domain.vo.XfTermtotalVo;
+import org.dromara.backstage.consumption.domain.vo.XfTermTotalVo;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 
 /**
@@ -10,6 +10,6 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
  * @author LionLi
  * @date 2024-08-15
  */
-public interface XfTermtotalMapper extends BaseMapperPlus<XfTermtotal, XfTermtotalVo> {
+public interface XfTermTotalMapper extends BaseMapperPlus<XfTermtotal, XfTermTotalVo> {
 
 }

+ 17 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfConsumedetailService.java → ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfConsumeDetailService.java

@@ -14,7 +14,7 @@ import java.util.List;
  * @author LionLi
  * @date 2024-08-15
  */
-public interface IXfConsumedetailService {
+public interface IXfConsumeDetailService {
 
     /**
      * 查询消费明细
@@ -65,4 +65,20 @@ public interface IXfConsumedetailService {
      * @return 是否删除成功
      */
     Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid);
+
+    /**
+     * 创建消费明细记录
+     *
+     * @param bo 消费明细
+     * @return 创建的消费明细视图
+     */
+    XfConsumeDetailVo createConsumeDetailRecord(XfConsumeDetailBo bo);
+
+    /**
+     * 修改消费明细
+     *
+     * @param bo 消费明细
+     * @return 是否修改成功
+     */
+    Boolean updateByBoId(XfConsumeDetailBo bo);
 }

+ 4 - 5
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfTermtotalService.java

@@ -1,7 +1,6 @@
 package org.dromara.backstage.consumption.service;
 
-import org.dromara.backstage.consumption.domain.XfTermtotal;
-import org.dromara.backstage.consumption.domain.vo.XfTermtotalVo;
+import org.dromara.backstage.consumption.domain.vo.XfTermTotalVo;
 import org.dromara.backstage.consumption.domain.bo.XfTermtotalBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
@@ -23,7 +22,7 @@ public interface IXfTermtotalService {
      * @param totalId 主键
      * @return 消费机消费记录
      */
-    XfTermtotalVo queryById(String totalId);
+    XfTermTotalVo queryById(String totalId);
 
     /**
      * 分页查询消费机消费记录列表
@@ -32,7 +31,7 @@ public interface IXfTermtotalService {
      * @param pageQuery 分页参数
      * @return 消费机消费记录分页列表
      */
-    TableDataInfo<XfTermtotalVo> queryPageList(XfTermtotalBo bo, PageQuery pageQuery);
+    TableDataInfo<XfTermTotalVo> queryPageList(XfTermtotalBo bo, PageQuery pageQuery);
 
     /**
      * 查询符合条件的消费机消费记录列表
@@ -40,7 +39,7 @@ public interface IXfTermtotalService {
      * @param bo 查询条件
      * @return 消费机消费记录列表
      */
-    List<XfTermtotalVo> queryList(XfTermtotalBo bo);
+    List<XfTermTotalVo> queryList(XfTermtotalBo bo);
 
     /**
      * 新增消费机消费记录

+ 49 - 15
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfConsumedetailServiceImpl.java → ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfConsumeDetailServiceImpl.java

@@ -1,24 +1,26 @@
 package org.dromara.backstage.consumption.service.impl;
 
 import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
 import org.dromara.backstage.consumption.domain.XfConsumeDetail;
 import org.dromara.backstage.consumption.domain.bo.XfConsumeDetailBo;
 import org.dromara.backstage.consumption.domain.vo.XfConsumeDetailVo;
+import org.dromara.backstage.consumption.mapper.XfConsumeDetailMapper;
+import org.dromara.backstage.consumption.service.IXfConsumeDetailService;
 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;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import lombok.RequiredArgsConstructor;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.springframework.stereotype.Service;
-import org.dromara.backstage.consumption.mapper.XfConsumedetailMapper;
-import org.dromara.backstage.consumption.service.IXfConsumedetailService;
 
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
-import java.util.Collection;
 
 /**
  * 消费明细Service业务层处理
@@ -26,12 +28,12 @@ import java.util.Collection;
  * @author LionLi
  * @date 2024-08-15
  */
+@DS("storage")
 @RequiredArgsConstructor
 @Service
-@DS("storage")
-public class XfConsumedetailServiceImpl implements IXfConsumedetailService {
+public class XfConsumeDetailServiceImpl implements IXfConsumeDetailService {
 
-    private final XfConsumedetailMapper baseMapper;
+    private final XfConsumeDetailMapper baseMapper;
 
     /**
      * 查询消费明细
@@ -40,7 +42,7 @@ public class XfConsumedetailServiceImpl implements IXfConsumedetailService {
      * @return 消费明细
      */
     @Override
-    public XfConsumeDetailVo queryById(String consumeId){
+    public XfConsumeDetailVo queryById(String consumeId) {
         return baseMapper.selectVoById(consumeId);
     }
 
@@ -119,7 +121,9 @@ public class XfConsumedetailServiceImpl implements IXfConsumedetailService {
         validEntityBeforeSave(add);
         boolean flag = baseMapper.insert(add) > 0;
         if (flag) {
-            bo.setConsumeId(add.getConsumeId());
+            if (add != null) {
+                bo.setConsumeId(add.getConsumeId());
+            }
         }
         return flag;
     }
@@ -140,7 +144,7 @@ public class XfConsumedetailServiceImpl implements IXfConsumedetailService {
     /**
      * 保存前的数据校验
      */
-    private void validEntityBeforeSave(XfConsumeDetail entity){
+    private void validEntityBeforeSave(XfConsumeDetail entity) {
         //TODO 做一些数据校验,如唯一约束
     }
 
@@ -153,9 +157,39 @@ public class XfConsumedetailServiceImpl implements IXfConsumedetailService {
      */
     @Override
     public Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid) {
-        if(isValid){
+        if (isValid) {
             //TODO 做一些业务上的校验,判断是否需要校验
         }
         return baseMapper.deleteByIds(ids) > 0;
     }
+
+    /**
+     * 创建消费明细记录
+     *
+     * @param bo 消费明细
+     * @return 创建的消费明细视图
+     */
+    @Override
+    public XfConsumeDetailVo createConsumeDetailRecord(XfConsumeDetailBo bo) {
+        if (insertByBo(bo)) {
+            return baseMapper.selectVoById(bo.getConsumeId());
+        }
+        return null;
+    }
+
+    /**
+     * 修改消费明细
+     *
+     * @param bo 消费明细
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBoId(XfConsumeDetailBo bo) {
+        LambdaUpdateWrapper<XfConsumeDetail> updateWrapper = new LambdaUpdateWrapper<>();
+        if (bo.getCardValue() != null) {
+            updateWrapper.set(XfConsumeDetail::getCardValue, bo.getCardValue());
+        }
+        updateWrapper.eq(XfConsumeDetail::getConsumeId, bo.getConsumeId());
+        return baseMapper.update(null, updateWrapper)>0;
+    }
 }

+ 2 - 2
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfConsumedetailoriginalServiceImpl.java

@@ -13,7 +13,7 @@ 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.mapper.XfConsumedetailoriginalMapper;
+import org.dromara.backstage.consumption.mapper.XfConsumeDetailOriginalMapper;
 import org.dromara.backstage.consumption.service.IXfConsumedetailoriginalService;
 
 import java.util.List;
@@ -31,7 +31,7 @@ import java.util.Collection;
 @DS("storage")
 public class XfConsumedetailoriginalServiceImpl implements IXfConsumedetailoriginalService {
 
-    private final XfConsumedetailoriginalMapper baseMapper;
+    private final XfConsumeDetailOriginalMapper baseMapper;
 
     /**
      * 查询原始消费记录

+ 13 - 5
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfTermServiceImpl.java

@@ -8,6 +8,7 @@ import org.dromara.backstage.basics.service.IPtAccountService;
 import org.dromara.backstage.basics.service.IPtRoomService;
 import org.dromara.backstage.consumption.domain.bo.XfTermParamBo;
 import org.dromara.backstage.consumption.domain.vo.XfTermParamVo;
+import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
@@ -23,6 +24,7 @@ import org.dromara.backstage.consumption.domain.bo.XfTermBo;
 import org.dromara.backstage.consumption.domain.vo.XfTermVo;
 import org.dromara.backstage.consumption.mapper.XfTermMapper;
 import org.dromara.backstage.consumption.service.IXfTermService;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 
 import java.util.*;
@@ -226,11 +228,17 @@ public class XfTermServiceImpl implements IXfTermService {
      * @return 消费设备
      */
     @Override
+    @Cacheable(cacheNames = CacheNames.PT_TERM, key = "#termNo")
     public XfTermVo queryByNo(Long termNo) {
-        XfTermBo bo = new XfTermBo();
-        bo.setTermNo(termNo);
-        List<XfTermVo> list = baseMapper.selectVoList(buildQueryWrapper(bo));
-
-        return list.isEmpty() ? null : list.get(0);
+        XfTermVo vo = baseMapper.selectVoOne(new LambdaQueryWrapper<XfTerm>().eq(XfTerm::getTermNo, termNo));
+        if(vo!=null){
+            PtRoomVo roomVo = roomService.queryById(vo.getRoomId());
+            vo.setRoomName(roomVo.getRoomName());
+
+            PtAccountVo accountVo = accountService.queryById(vo.getAccountId());
+            vo.setAccountName(accountVo.getAccountName());
+            return vo;
+        }
+        return null;
     }
 }

+ 7 - 7
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfTermtotalServiceImpl.java

@@ -11,9 +11,9 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.dromara.backstage.consumption.domain.bo.XfTermtotalBo;
-import org.dromara.backstage.consumption.domain.vo.XfTermtotalVo;
+import org.dromara.backstage.consumption.domain.vo.XfTermTotalVo;
 import org.dromara.backstage.consumption.domain.XfTermtotal;
-import org.dromara.backstage.consumption.mapper.XfTermtotalMapper;
+import org.dromara.backstage.consumption.mapper.XfTermTotalMapper;
 import org.dromara.backstage.consumption.service.IXfTermtotalService;
 
 import java.util.List;
@@ -31,7 +31,7 @@ import java.util.Collection;
 @DS("storage")
 public class XfTermtotalServiceImpl implements IXfTermtotalService {
 
-    private final XfTermtotalMapper baseMapper;
+    private final XfTermTotalMapper baseMapper;
 
     /**
      * 查询消费机消费记录
@@ -40,7 +40,7 @@ public class XfTermtotalServiceImpl implements IXfTermtotalService {
      * @return 消费机消费记录
      */
     @Override
-    public XfTermtotalVo queryById(String totalId){
+    public XfTermTotalVo queryById(String totalId){
         return baseMapper.selectVoById(totalId);
     }
 
@@ -52,9 +52,9 @@ public class XfTermtotalServiceImpl implements IXfTermtotalService {
      * @return 消费机消费记录分页列表
      */
     @Override
-    public TableDataInfo<XfTermtotalVo> queryPageList(XfTermtotalBo bo, PageQuery pageQuery) {
+    public TableDataInfo<XfTermTotalVo> queryPageList(XfTermtotalBo bo, PageQuery pageQuery) {
         LambdaQueryWrapper<XfTermtotal> lqw = buildQueryWrapper(bo);
-        Page<XfTermtotalVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        Page<XfTermTotalVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
         return TableDataInfo.build(result);
     }
 
@@ -65,7 +65,7 @@ public class XfTermtotalServiceImpl implements IXfTermtotalService {
      * @return 消费机消费记录列表
      */
     @Override
-    public List<XfTermtotalVo> queryList(XfTermtotalBo bo) {
+    public List<XfTermTotalVo> queryList(XfTermtotalBo bo) {
         LambdaQueryWrapper<XfTermtotal> lqw = buildQueryWrapper(bo);
         return baseMapper.selectVoList(lqw);
     }

+ 40 - 19
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/controller/PtBagController.java

@@ -1,35 +1,40 @@
 package org.dromara.backstage.payment.controller;
 
-import java.math.BigDecimal;
-import java.util.List;
-
+import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.bean.BeanUtil;
-import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.*;
-import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import org.dromara.backstage.business.errfill.ErrFillBusiness;
 import org.dromara.backstage.business.payments.strategy.impl.PaymentsStrategyContent;
 import org.dromara.backstage.cardCenter.service.IPtCardService;
+import org.dromara.backstage.consumption.domain.bo.ConsumptionBo;
+import org.dromara.backstage.payment.domain.bo.PtBagBo;
+import org.dromara.backstage.payment.domain.vo.PtBagVo;
 import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
+import org.dromara.backstage.payment.service.IPtBagService;
 import org.dromara.backstage.payment.service.IPtUserAccountService;
 import org.dromara.common.core.constant.Constants;
+import org.dromara.common.core.domain.R;
 import org.dromara.common.core.enums.CreditTypeEnum;
 import org.dromara.common.core.enums.SystemUseTypeEnum;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.validation.annotation.Validated;
-import org.dromara.common.idempotent.annotation.RepeatSubmit;
-import org.dromara.common.log.annotation.Log;
-import org.dromara.common.web.core.BaseController;
-import org.dromara.common.mybatis.core.page.PageQuery;
-import org.dromara.common.core.domain.R;
 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.payment.domain.vo.PtBagVo;
-import org.dromara.backstage.payment.domain.bo.PtBagBo;
-import org.dromara.backstage.payment.service.IPtBagService;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.MessageFormat;
+import java.util.List;
 
 /**
  * 账户钱包
@@ -48,6 +53,7 @@ public class PtBagController extends BaseController {
     private final IPtCardService cardService;
     private final IPtUserAccountService accountService;
     private final PaymentsStrategyContent paymentsStrategyContent;
+    private final ErrFillBusiness errFillBusiness;
 
     /**
      * 查询账户钱包列表
@@ -162,7 +168,7 @@ public class PtBagController extends BaseController {
             bo.setUserId(userId);
             bo.setReceiptMoney(doValue);
             PtBagBo commissionBo = computeCommission(bo);
-            if(commissionBo!=null){
+            if (commissionBo != null) {
                 paymentsStrategyContent.createOrder(commissionBo);
             }
             paymentsStrategyContent.createOrder(bo);
@@ -207,13 +213,28 @@ public class PtBagController extends BaseController {
         }
         return R.ok();
     }
+
+    /**
+     * 账户钱包错扣补款
+     */
+    @SaCheckPermission("payment:ptBag:edit")
+    @Log(title = "账户钱包", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PostMapping("/err-fill")
+    public R<PtBagVo> errFill(@Validated(EditGroup.class) @RequestBody ConsumptionBo bo) {
+        bo.setUseType(SystemUseTypeEnum.CONSUME);
+        PtBagVo vo = errFillBusiness.createErrFillRecord(bo);
+        String message = MessageFormat.format("错扣补款成功,补款后钱包代码:[{0}]的余额:[{1}元]", vo.getBagCode(), vo.getBalance().setScale(2, RoundingMode.HALF_UP));
+        return R.ok(message, vo);
+    }
+
     /**
      * 计算管理费
      */
     private PtBagBo computeCommission(PtBagBo bo) {
         if (bo.getTakeCommission().equals(Constants.TAKE_COMMISSION)) {
             Long cardType = bo.getCardTypeId();
-            if(bo.getCardTypeId()==null){
+            if (bo.getCardTypeId() == null) {
                 PtUserAccountVo accountVo = accountService.queryById(bo.getUserId());
                 cardType = accountVo.getCardType();
             }

+ 11 - 5
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/impl/PtBagServiceImpl.java

@@ -57,13 +57,13 @@ public class PtBagServiceImpl implements IPtBagService {
      */
     @Override
     public PtBagVo queryByUserBagCode(Long userId, String bagCode) {
-        PtBag entity = baseMapper.selectOne(Wrappers.<PtBag>lambdaQuery()
+        PtBagVo vo = baseMapper.selectVoOne(Wrappers.<PtBag>lambdaQuery()
             .eq(PtBag::getUserId, userId)
-            .eq(PtBag::getBagCode,bagCode));
-        if (ObjectUtil.isNull(entity)) {
+            .eq(PtBag::getBagCode,bagCode),PtBagVo.class);
+        if (ObjectUtil.isNull(vo)) {
             return null;
         }
-        return MapstructUtils.convert(entity, PtBagVo.class);
+        return vo;
     }
 
     /**
@@ -327,7 +327,10 @@ public class PtBagServiceImpl implements IPtBagService {
      * @param bo 账户钱包(业务)
      */
     private void recoverBag(PtBag bag, PtBagBo bo) {
-        bag.setBalance(bo.getReceiptMoney());
+        if(bag.getBalance().compareTo(bo.getReceiptMoney())>0){
+            //如果钱包余额比设置的金额大,则最后余额=设置的金额
+            bag.setBalance(bo.getReceiptMoney());
+        }
         setEncryptBalance(bag);
     }
     /**
@@ -357,8 +360,11 @@ public class PtBagServiceImpl implements IPtBagService {
      * @param bo 账户钱包(业务)
      */
     private void compensateBag(PtBag bag, PtBagBo bo) {
+        //余额=原余额+补款金额
         bag.setBalance(bag.getBalance().add(bo.getReceiptMoney()));
+        //消费次数+1
         bag.setConsumeCount(bag.getConsumeCount() + 1);
+        //因为是多消费了才补款,所以总消费金额=原总消费金额-补款的金额
         bag.setConsumeTotal(bag.getConsumeTotal().subtract(bo.getReceiptMoney()));
         setEncryptBalance(bag);
     }

+ 5 - 4
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/impl/PtUserAccountServiceImpl.java

@@ -2,7 +2,6 @@ package org.dromara.backstage.payment.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.dromara.backstage.cardCenter.service.IPtCardService;
@@ -56,9 +55,11 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
      */
     @Override
     public PtUserAccountVo queryById(Long userId){
-        PtUserAccountVo vo= baseMapper.selectVoById(userId);;
-        String deptName = remoteDeptService.selectDeptNameByIds(vo.getDeptId().toString());
-        vo.setDeptName(deptName);
+        PtUserAccountVo vo= baseMapper.selectVoById(userId);
+        if(vo!=null) {
+            String deptName = remoteDeptService.selectDeptNameByIds(vo.getDeptId().toString());
+            vo.setDeptName(deptName);
+        }
         return vo;
     }
 

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/basicParameter/PtMealtypeMapper.xml

@@ -4,7 +4,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.dromara.backstage.basics.mapper.PtMealtypeMapper">
 
-    <resultMap type="org.dromara.backstage.basics.domain.PtMealtype" id="PtMealtypeResult">
+    <resultMap type="org.dromara.backstage.basics.domain.PtMealType" id="PtMealtypeResult">
             <result property="mealId"    column="meal_id"    />
             <result property="tenantId"    column="tenant_id"    />
             <result property="mealName"    column="meal_name"    />

+ 2 - 2
ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/consumption/XfConsumedetailMapper.xml → ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/consumption/XfConsumeDetailMapper.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.XfConsumedetailMapper">
+<mapper namespace="org.dromara.backstage.consumption.mapper.XfConsumeDetailMapper">
 
-    <resultMap type="org.dromara.backstage.consumption.domain.XfConsumeDetail" id="XfConsumedetailResult">
+    <resultMap type="org.dromara.backstage.consumption.domain.XfConsumeDetail" id="XfConsumeDetailResult">
             <result property="consumeId"    column="consume_id"    />
             <result property="tenantId"    column="tenant_id"    />
             <result property="originalId"    column="original_id"    />

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/consumption/XfConsumedetailoriginalMapper.xml → ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/consumption/XfConsumeDetailOriginalMapper.xml

@@ -2,7 +2,7 @@
 <!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.XfConsumedetailoriginalMapper">
+<mapper namespace="org.dromara.backstage.consumption.mapper.XfConsumeDetailOriginalMapper">
 
     <resultMap type="org.dromara.backstage.consumption.domain.XfConsumeDetailOriginal" id="XfConsumedetailoriginalResult">
             <result property="originalId"    column="original_id"    />

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/consumption/XfTermMapper.xml

@@ -58,7 +58,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <result property="lunchBegin"    column="lunch_begin"    />
             <result property="lunchEnd"    column="lunch_end"    />
             <result property="supperBegin"    column="supper_begin"    />
-            <result property="suppeEnd"    column="suppe_end"    />
+            <result property="supperEnd"    column="supper_end"    />
             <result property="nightBegin"    column="night_begin"    />
             <result property="nightEnd"    column="night_end"    />
             <result property="swipeInterval"    column="swipe_interval"    />

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/consumption/XfTermtotalMapper.xml

@@ -2,7 +2,7 @@
 <!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.XfTermtotalMapper">
+<mapper namespace="org.dromara.backstage.consumption.mapper.XfTermTotalMapper">
 
     <resultMap type="org.dromara.backstage.consumption.domain.XfTermtotal" id="XfTermtotalResult">
             <result property="totalId"    column="total_id"    />