Browse Source

Merge remote-tracking branch 'origin/master'

luoyb 1 năm trước cách đây
mục cha
commit
4790025f81
34 tập tin đã thay đổi với 890 bổ sung23 xóa
  1. 2 2
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BuildAreaTypeEnum.java
  2. 34 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/ConsumeRecordTypeEnum.java
  3. 33 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/CountTypeEnum.java
  4. 8 2
      ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/EncryptorManager.java
  5. 10 0
      ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisDecryptInterceptor.java
  6. 10 0
      ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisEncryptInterceptor.java
  7. 2 0
      ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/handler/SensitiveHandler.java
  8. 4 0
      ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/TenantKeyPrefixHandler.java
  9. 1 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/errfill/ErrFillBusiness.java
  10. 21 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/controller/PtSubsidyitemController.java
  11. 45 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/bo/PtSubsidyReportBo.java
  12. 73 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/vo/PtSubsidyReportVo.java
  13. 7 3
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/vo/PtSubsidyitemVo.java
  14. 13 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/mapper/PtSubsidyitemMapper.java
  15. 5 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/IPtSubsidyitemService.java
  16. 1 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/impl/PtSubsidyServiceImpl.java
  17. 29 6
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/impl/PtSubsidyitemServiceImpl.java
  18. 10 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfConsumeDetailController.java
  19. 5 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/XfConsumeDetail.java
  20. 5 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfConsumeDetailBo.java
  21. 239 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/vo/XfConsumeDetailCKBKVo.java
  22. 5 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/vo/XfConsumeDetailVo.java
  23. 2 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfConsumeDetailService.java
  24. 51 3
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfConsumeDetailServiceImpl.java
  25. 8 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/controller/PtBagController.java
  26. 7 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/domain/bo/PtUserAccountBo.java
  27. 126 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/impl/PtUserAccountServiceImpl.java
  28. 92 0
      ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/cardCenter/cardOperation/PtSubsidyitemMapper.xml
  29. 6 0
      ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/payment/PtUserAccountMapper.xml
  30. 4 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java
  31. 4 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java
  32. 5 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java
  33. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRegisterInfoServiceImpl.java
  34. 22 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java

+ 2 - 2
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BuildAreaTypeEnum.java

@@ -15,9 +15,9 @@ public enum BuildAreaTypeEnum {
     private final String code;
     private final String name;
 
-    BuildAreaTypeEnum(String code, String message) {
+    BuildAreaTypeEnum(String code, String name) {
         this.code = code;
-        this.name = message;
+        this.name = name;
     }
 
     public String code() {

+ 34 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/ConsumeRecordTypeEnum.java

@@ -0,0 +1,34 @@
+package org.dromara.common.core.enums;
+
+/**
+ * 消费类型  consume_record_type
+ */
+public enum ConsumeRecordTypeEnum {
+    CKBK("0","错扣补款消费"),
+    XFJXF_1("1","消费机消费"),
+    BKXF("3","补扣消费"),
+    XFJXF_4("4","消费机消费");
+
+    private final String code;
+    private final String name;
+
+    ConsumeRecordTypeEnum(String code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+
+    public String code() {
+        return this.code;
+    }
+
+    public String message() {
+        return this.name;
+    }
+
+
+    @Override
+    public String toString() {
+        return this.name();
+    }
+
+}

+ 33 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/CountTypeEnum.java

@@ -0,0 +1,33 @@
+package org.dromara.common.core.enums;
+
+/**
+ * 统计方式
+ */
+public enum CountTypeEnum {
+    year("0","按年"),
+    month("1","按月"),
+    date("2","按日");
+
+    private final String code;
+    private final String name;
+
+    CountTypeEnum(String code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+
+    public String code() {
+        return this.code;
+    }
+
+    public String message() {
+        return this.name;
+    }
+
+
+    @Override
+    public String toString() {
+        return this.name();
+    }
+
+}

+ 8 - 2
ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/core/EncryptorManager.java

@@ -8,16 +8,22 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.io.Resources;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.encrypt.annotation.EncryptField;
+import org.dromara.common.encrypt.properties.EncryptorProperties;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.core.io.Resource;
 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
 import org.springframework.core.io.support.ResourcePatternResolver;
 import org.springframework.core.type.ClassMetadata;
 import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
+import org.springframework.stereotype.Service;
 import org.springframework.util.ClassUtils;
 
 import java.lang.reflect.Field;
-import java.util.*;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 
@@ -30,7 +36,7 @@ import java.util.stream.Collectors;
 @Slf4j
 @NoArgsConstructor
 public class EncryptorManager {
-
+    private EncryptorProperties defaultProperties;
     /**
      * 缓存加密器
      */

+ 10 - 0
ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisDecryptInterceptor.java

@@ -108,6 +108,16 @@ public class MybatisDecryptInterceptor implements Interceptor {
         return this.encryptorManager.decrypt(value, encryptContext);
     }
 
+    public String decrypt(String value) {
+        EncryptContext encryptContext = new EncryptContext();
+        encryptContext.setAlgorithm(defaultProperties.getAlgorithm());
+        encryptContext.setEncode(defaultProperties.getEncode());
+        encryptContext.setPassword(defaultProperties.getPassword());
+        encryptContext.setPrivateKey(defaultProperties.getPrivateKey());
+        encryptContext.setPublicKey(defaultProperties.getPublicKey());
+        return this.encryptorManager.decrypt(value, encryptContext);
+    }
+
     @Override
     public Object plugin(Object target) {
         return Plugin.wrap(target, this);

+ 10 - 0
ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisEncryptInterceptor.java

@@ -14,6 +14,7 @@ import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.encrypt.annotation.EncryptField;
 import org.dromara.common.encrypt.core.EncryptContext;
 import org.dromara.common.encrypt.core.EncryptorManager;
+import org.dromara.common.encrypt.core.IEncryptor;
 import org.dromara.common.encrypt.enumd.AlgorithmType;
 import org.dromara.common.encrypt.enumd.EncodeType;
 import org.dromara.common.encrypt.properties.EncryptorProperties;
@@ -117,6 +118,15 @@ public class MybatisEncryptInterceptor implements Interceptor {
         return this.encryptorManager.encrypt(value, encryptContext);
     }
 
+    public String encrypt(String value) {
+        EncryptContext encryptContext = new EncryptContext();
+        encryptContext.setAlgorithm(defaultProperties.getAlgorithm());
+        encryptContext.setEncode(defaultProperties.getEncode());
+        encryptContext.setPassword(defaultProperties.getPassword());
+        encryptContext.setPrivateKey(defaultProperties.getPrivateKey());
+        encryptContext.setPublicKey(defaultProperties.getPublicKey());
+        return this.encryptorManager.encrypt(value, encryptContext);
+    }
 
     @Override
     public void setProperties(Properties properties) {

+ 2 - 0
ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/handler/SensitiveHandler.java

@@ -7,6 +7,8 @@ import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.JsonSerializer;
 import com.fasterxml.jackson.databind.SerializerProvider;
 import com.fasterxml.jackson.databind.ser.ContextualSerializer;
+import lombok.AllArgsConstructor;
+import lombok.NoArgsConstructor;
 import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.sensitive.annotation.Sensitive;
 import org.dromara.common.sensitive.core.SensitiveService;

+ 4 - 0
ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/TenantKeyPrefixHandler.java

@@ -36,6 +36,8 @@ public class TenantKeyPrefixHandler extends KeyPrefixHandler {
         String tenantId = TenantHelper.getTenantId();
         if (StringUtils.isBlank(tenantId)) {
             log.error("无法获取有效的租户id -> Null");
+            // todo 暂时设置租户id
+            tenantId = "20200813044411";
         }
         if (StringUtils.startsWith(name, tenantId + "")) {
             // 如果存在则直接返回
@@ -62,6 +64,8 @@ public class TenantKeyPrefixHandler extends KeyPrefixHandler {
         String tenantId = TenantHelper.getTenantId();
         if (StringUtils.isBlank(tenantId)) {
             log.error("无法获取有效的租户id -> Null");
+            // todo 暂时设置租户id
+            tenantId = "20200813044411";
         }
         if (StringUtils.startsWith(unmap, tenantId + "")) {
             // 如果存在则删除

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

@@ -151,7 +151,7 @@ public class ErrFillBusiness {
         //错扣补款设置statusFlag为0
         consumeDetailBo.setStatusFlag(0L);
         //将需要补款的消费记录Id记入原始消费Id,以便追查消费记录是否有补扣以及对应的补扣记录
-        consumeDetailBo.setOriginalId(bo.getConsumeId());
+        consumeDetailBo.setDetailId(bo.getConsumeId());
         consumeDetailBo.setRemark(remark);
 
         return consumeDetailService.createConsumeDetailRecord(consumeDetailBo);

+ 21 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/controller/PtSubsidyitemController.java

@@ -6,6 +6,8 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.backstage.cardCenter.domain.bo.PtSubsidyReportBo;
+import org.dromara.backstage.cardCenter.domain.vo.PtSubsidyReportVo;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -53,7 +55,9 @@ public class PtSubsidyitemController extends BaseController {
     @Log(title = "补助明细", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(PtSubsidyitemBo bo, HttpServletResponse response) {
-        List<PtSubsidyitemVo> list = ptSubsidyitemService.queryList(bo);
+        PageQuery pageQuery = new PageQuery();
+        pageQuery.setPageSize(Integer.MAX_VALUE);
+        List<PtSubsidyitemVo> list = ptSubsidyitemService.queryPageList(bo, pageQuery).getRows();
         ExcelUtil.exportExcel(list, "补助明细", PtSubsidyitemVo.class, response);
     }
 
@@ -103,4 +107,20 @@ public class PtSubsidyitemController extends BaseController {
                           @PathVariable Long[] itemIds) {
         return toAjax(ptSubsidyitemService.deleteWithValidByIds(List.of(itemIds), true));
     }
+
+    // 补助报表
+    @SaCheckPermission("subsidy:ptSubsidyitem:ptSubsidyitemReport")
+    @GetMapping("/queryReport")
+    public TableDataInfo<PtSubsidyReportVo> queryReport(PtSubsidyReportBo bo, PageQuery pageQuery) {
+        return ptSubsidyitemService.queryPageReportList(bo, pageQuery);
+    }
+
+    //补助报表导出
+    @SaCheckPermission("subsidy:ptSubsidyitem:ptSubsidyitemReport")
+    @Log(title = "补助报表导出", businessType = BusinessType.EXPORT)
+    @PostMapping("/exportReport")
+    public void exportReport(PtSubsidyReportBo bo, HttpServletResponse response) {
+        List<PtSubsidyReportVo> list = ptSubsidyitemService.queryReportList(bo);
+        ExcelUtil.exportExcel(list, "补助报表", PtSubsidyReportVo.class, response);
+    }
 }

+ 45 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/bo/PtSubsidyReportBo.java

@@ -0,0 +1,45 @@
+package org.dromara.backstage.cardCenter.domain.bo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 补助报表参数
+ *
+ */
+@Data
+public class PtSubsidyReportBo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1622303989650597970L;
+    /**
+     * 统计方式
+     */
+    private String countType;
+
+    /**
+     * 补助类型
+     */
+    private String subsidyType;
+
+    /**
+     * 创建者
+     */
+    private String createByName;
+
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private Date beginCountTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private Date endCountTime;
+
+
+}

+ 73 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/vo/PtSubsidyReportVo.java

@@ -0,0 +1,73 @@
+package org.dromara.backstage.cardCenter.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.backstage.cardCenter.domain.PtSubsidyitem;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+ * 补助报表 VO对象
+ *
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class PtSubsidyReportVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 到账日期
+     */
+    @ExcelProperty(value = "日期")
+   /* @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")*/
+    private String fillDate;
+
+    /**
+     * 补助类型
+     */
+    @ExcelProperty(value = "补助类型", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "SUBTYPE")
+    private String subsidyType;
+
+    /**
+     * 补助金额
+     */
+    @ExcelProperty(value = "补助总金额(元)")
+    private BigDecimal fillMoney;
+
+
+    @ExcelProperty(value = "笔数")
+    private Long countNumber;
+
+    @ExcelProperty(value = "已领金额(元)")
+    private BigDecimal receiveMoney;
+
+    @ExcelProperty(value = "已领笔数")
+    private Long receiveNumber;
+
+    @ExcelProperty(value = "未领金额")
+    private BigDecimal notReceiveMoney;
+
+    @ExcelProperty(value = "未领笔数")
+    private Long notReceiveNumber;
+
+    /**
+     * 用户编号/工号
+     */
+    @ExcelProperty(value = "创建者")
+    private String createByName;
+
+}

+ 7 - 3
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/vo/PtSubsidyitemVo.java

@@ -33,7 +33,7 @@ public class PtSubsidyitemVo implements Serializable {
     /**
      * 明细Id,主键
      */
-    @ExcelProperty(value = "明细Id,主键")
+    @ExcelProperty(value = "Id")
     private Long itemId;
 
     /**
@@ -69,7 +69,8 @@ public class PtSubsidyitemVo implements Serializable {
     /**
      * 领取状态
      */
-    @ExcelProperty(value = "领取状态")
+    @ExcelProperty(value = "领取状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "sys_yes_no")
     private String fillStatus;
 
     /**
@@ -93,7 +94,7 @@ public class PtSubsidyitemVo implements Serializable {
     /**
      * 原始记录Id,一般是指写入的充值备份表主键
      */
-    @ExcelProperty(value = "原始记录Id,一般是指写入的充值备份表主键")
+//    @ExcelProperty(value = "原始记录Id,一般是指写入的充值备份表主键")
     private String originalId;
 
     /**
@@ -126,4 +127,7 @@ public class PtSubsidyitemVo implements Serializable {
 
     @ExcelProperty(value = "创建时间")
     private Date createTime;
+
+    @ExcelProperty(value = "补助名称")
+    private String subsidyName;
 }

+ 13 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/mapper/PtSubsidyitemMapper.java

@@ -1,9 +1,17 @@
 package org.dromara.backstage.cardCenter.mapper;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.dromara.backstage.basics.domain.PtOperator;
 import org.dromara.backstage.cardCenter.domain.PtSubsidyitem;
+import org.dromara.backstage.cardCenter.domain.bo.PtSubsidyReportBo;
+import org.dromara.backstage.cardCenter.domain.bo.PtSubsidyitemBo;
+import org.dromara.backstage.cardCenter.domain.vo.PtSubsidyReportVo;
 import org.dromara.backstage.cardCenter.domain.vo.PtSubsidyitemVo;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 
+import java.util.List;
+
 /**
  * 补助明细Mapper接口
  *
@@ -11,5 +19,10 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
  * @date 2024-08-14
  */
 public interface PtSubsidyitemMapper extends BaseMapperPlus<PtSubsidyitem, PtSubsidyitemVo> {
+    Page<PtSubsidyitemVo> customPageList(Page<PtSubsidyitem> page, PtSubsidyitemBo bo
+        , @Param("beginFillDate") String beginFillDate, @Param("endFillDate") String endFillDate);
+
+    List<PtSubsidyReportVo> queryReportList(@Param("bo")PtSubsidyReportBo bo);
+    Page<PtSubsidyReportVo> queryReportPageList(@Param("page") Page<PtSubsidyReportVo> page, @Param("bo")PtSubsidyReportBo bo);
 
 }

+ 5 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/IPtSubsidyitemService.java

@@ -1,6 +1,8 @@
 package org.dromara.backstage.cardCenter.service;
 
 import org.dromara.backstage.cardCenter.domain.PtSubsidyitem;
+import org.dromara.backstage.cardCenter.domain.bo.PtSubsidyReportBo;
+import org.dromara.backstage.cardCenter.domain.vo.PtSubsidyReportVo;
 import org.dromara.backstage.cardCenter.domain.vo.PtSubsidyitemVo;
 import org.dromara.backstage.cardCenter.domain.bo.PtSubsidyitemBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -17,6 +19,8 @@ import java.util.List;
  */
 public interface IPtSubsidyitemService {
 
+    List<PtSubsidyReportVo> queryReportList(PtSubsidyReportBo bo);
+
     /**
      * 查询补助明细
      *
@@ -33,6 +37,7 @@ public interface IPtSubsidyitemService {
      * @return 补助明细分页列表
      */
     TableDataInfo<PtSubsidyitemVo> queryPageList(PtSubsidyitemBo bo, PageQuery pageQuery);
+    TableDataInfo<PtSubsidyReportVo> queryPageReportList(PtSubsidyReportBo bo, PageQuery pageQuery);
 
     /**
      * 查询符合条件的补助明细列表

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

@@ -55,6 +55,7 @@ public class PtSubsidyServiceImpl implements IPtSubsidyService {
     @Override
     public TableDataInfo<PtSubsidyVo> queryPageList(PtSubsidyBo bo, PageQuery pageQuery) {
         LambdaQueryWrapper<PtSubsidy> lqw = buildQueryWrapper(bo);
+        lqw.orderByDesc(PtSubsidy::getCreateTime);
         Page<PtSubsidyVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
         return TableDataInfo.build(result);
     }

+ 29 - 6
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/impl/PtSubsidyitemServiceImpl.java

@@ -4,6 +4,8 @@ import org.dromara.backstage.basics.domain.bo.PtAccountBo;
 import org.dromara.backstage.basics.domain.vo.PtAccountVo;
 import org.dromara.backstage.basics.mapper.PtAccountMapper;
 import org.dromara.backstage.basics.service.IPtAccountService;
+import org.dromara.backstage.cardCenter.domain.bo.PtSubsidyReportBo;
+import org.dromara.backstage.cardCenter.domain.vo.PtSubsidyReportVo;
 import org.dromara.backstage.payment.domain.PtUserAccount;
 import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
 import org.dromara.backstage.payment.mapper.PtUserAccountMapper;
@@ -22,10 +24,7 @@ import org.dromara.backstage.cardCenter.domain.PtSubsidyitem;
 import org.dromara.backstage.cardCenter.mapper.PtSubsidyitemMapper;
 import org.dromara.backstage.cardCenter.service.IPtSubsidyitemService;
 
-import java.util.List;
-import java.util.Map;
-import java.util.Collection;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 import static java.util.stream.Collectors.toMap;
@@ -45,6 +44,15 @@ public class PtSubsidyitemServiceImpl implements IPtSubsidyitemService {
     private final PtUserAccountMapper userAccountMapper;
 
 
+    /**
+     * @param bo
+     * @return
+     */
+    @Override
+    public List<PtSubsidyReportVo> queryReportList(PtSubsidyReportBo bo) {
+        return baseMapper.queryReportList(bo);
+    }
+
     /**
      * 查询补助明细
      *
@@ -65,12 +73,27 @@ public class PtSubsidyitemServiceImpl implements IPtSubsidyitemService {
      */
     @Override
     public TableDataInfo<PtSubsidyitemVo> queryPageList(PtSubsidyitemBo bo, PageQuery pageQuery) {
-        LambdaQueryWrapper<PtSubsidyitem> lqw = buildQueryWrapper(bo);
-        Page<PtSubsidyitemVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+//        LambdaQueryWrapper<PtSubsidyitem> lqw = buildQueryWrapper(bo);
+        Map<String, Object> parms = bo.getParams();
+        String beginFillDate = Optional.ofNullable(parms.get("beginFillDate")).orElse("").toString();
+        String endFillDate = Optional.ofNullable(parms.get("endFillDate")).orElse("").toString();
+        Page<PtSubsidyitemVo> result = baseMapper.customPageList(pageQuery.build(), bo,
+            beginFillDate, endFillDate);
         addUserInfo(result.getRecords());
         return TableDataInfo.build(result);
     }
 
+    /**
+     * @param bo
+     * @param pageQuery
+     * @return
+     */
+    @Override
+    public TableDataInfo<PtSubsidyReportVo> queryPageReportList(PtSubsidyReportBo bo, PageQuery pageQuery) {
+        Page<PtSubsidyReportVo> page = baseMapper.queryReportPageList(pageQuery.build(), bo);
+        return TableDataInfo.build(page);
+    }
+
     /**
      * 补充人员信息
      * @param subsidyitemVoList

+ 10 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfConsumeDetailController.java

@@ -9,6 +9,7 @@ import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import org.dromara.backstage.consumption.domain.bo.XfConsumeDetailBo;
 import org.dromara.backstage.consumption.domain.vo.XfConsumeAnalyzeVo;
+import org.dromara.backstage.consumption.domain.vo.XfConsumeDetailCKBKVo;
 import org.dromara.backstage.consumption.domain.vo.XfConsumeDetailVo;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.springframework.web.bind.annotation.*;
@@ -49,6 +50,15 @@ public class XfConsumeDetailController extends BaseController {
         return xfConsumeDetailService.queryPageList(bo, pageQuery);
     }
 
+    /**
+     * 查询消费明细列表 for 错扣补款
+     */
+    @SaCheckPermission("consumption:xfConsumeDetail:list")
+    @GetMapping("/listCKBK")
+    public TableDataInfo<XfConsumeDetailCKBKVo> listCKBK(XfConsumeDetailBo bo, PageQuery pageQuery) {
+        return xfConsumeDetailService.queryPageCKBKList(bo, pageQuery);
+    }
+
     @GetMapping("/selfList")
     public TableDataInfo<XfConsumeDetailVo> selfList(XfConsumeDetailBo bo, PageQuery pageQuery) {
         bo.setUserId(LoginHelper.getUserId());

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

@@ -196,4 +196,9 @@ public class XfConsumeDetail extends TenantEntity {
     @TableLogic
     private String delFlag;
 
+    /**
+     * 针对错扣补款的消费记录的id
+     */
+    private String detailId;
+
 }

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

@@ -202,5 +202,10 @@ public class XfConsumeDetailBo extends BaseEntity {
      */
     private String remark;
 
+    /**
+     * 针对错扣补款的消费记录的id
+     */
+    private String detailId;
+
 
 }

+ 239 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/vo/XfConsumeDetailCKBKVo.java

@@ -0,0 +1,239 @@
+package org.dromara.backstage.consumption.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.backstage.consumption.domain.XfConsumeDetail;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * 消费明细视图对象 t_xf_consumeDetail
+ *
+ * @author LionLi
+ * @date 2024-08-15
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = XfConsumeDetail.class)
+public class XfConsumeDetailCKBKVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 消费记录Id,主键
+     */
+    @ExcelProperty(value = "消费记录Id,主键")
+    private String consumeId;
+
+    /**
+     * 原始记录Id,主键
+     */
+    @ExcelProperty(value = "原始记录Id,主键")
+    private String originalId;
+
+    /**
+     * 记录Id
+     */
+    @ExcelProperty(value = "记录Id")
+    private Long recordId;
+
+    /**
+     * 人员Id
+     */
+    @ExcelProperty(value = "人员Id")
+    private Long userId;
+
+    /**
+     * 学/工号
+     */
+    @ExcelProperty(value = "学/工号")
+    private String userNumb;
+
+    /**
+     * 用户姓名
+     */
+    @ExcelProperty(value = "用户姓名")
+    private String realName;
+
+    /**
+     * 部门Id
+     */
+    @ExcelProperty(value = "部门Id")
+    private Long deptId;
+
+    /**
+     * 部门名称
+     */
+    @ExcelProperty(value = "部门名称")
+    private String deptName;
+
+    /**
+     * 消费日期
+     */
+    @ExcelProperty(value = "消费日期")
+    private Date consumeDate;
+
+    /**
+     * 消费金额
+     */
+    @ExcelProperty(value = "消费金额")
+    private BigDecimal consumeMoney;
+
+    /**
+     * 卡流水号
+     */
+    @ExcelProperty(value = "卡流水号")
+    private Long cardNo;
+
+    /**
+     * 物理卡号
+     */
+    @ExcelProperty(value = "物理卡号")
+    private Long factoryId;
+
+    /**
+     * 卡上余额
+     */
+    @ExcelProperty(value = "卡上余额")
+    private BigDecimal cardValue;
+
+    /**
+     * 卡使用次数
+     */
+    @ExcelProperty(value = "卡使用次数")
+    private Long cardCount;
+
+    /**
+     * 消费账户金额
+     */
+    @ExcelProperty(value = "消费账户金额")
+    private BigDecimal consumeBalance;
+
+    /**
+     * 设备机号
+     */
+    @ExcelProperty(value = "设备机号")
+    private Long termNo;
+
+    /**
+     * 设备名称
+     */
+    @ExcelProperty(value = "设备名称")
+    private String termName;
+
+    /**
+     * 机器流水号
+     */
+    @ExcelProperty(value = "机器流水号")
+    private Long termRecordId;
+
+    /**
+     * 是否已处理(和灰记录处理有关)
+     */
+    @ExcelProperty(value = "是否已处理(和灰记录处理有关)")
+    private Long analysisFlag;
+
+    /**
+     * 状态标识(记录消费类型?)
+     */
+    @ExcelProperty(value = "状态标识", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "记=录消费类型?")
+    private Long statusFlag;
+
+    /**
+     * 营业员Id
+     */
+    @ExcelProperty(value = "营业员Id")
+    private Long operatorId;
+
+    /**
+     * 营业员名称
+     */
+    @ExcelProperty(value = "营业员名称")
+    private String operatorName;
+
+    /**
+     * 结算账户Id
+     */
+    @ExcelProperty(value = "结算账户Id")
+    private Long accountId;
+
+    /**
+     * 结算账户名称
+     */
+    @ExcelProperty(value = "结算账户名称")
+    private String accountName;
+
+    /**
+     * 房间Id
+     */
+    @ExcelProperty(value = "房间Id")
+    private Long roomId;
+
+    /**
+     * 房间名称
+     */
+    @ExcelProperty(value = "房间名称")
+    private String roomName;
+
+    /**
+     * 钱包类型
+     */
+    @ExcelProperty(value = "钱包类型")
+    private String bagType;
+
+    /**
+     * 餐类Id
+     */
+    @ExcelProperty(value = "餐类Id")
+    private Long mealType;
+
+    /**
+     * 餐类名称
+     */
+    @ExcelProperty(value = "餐类名称")
+    private String mealName;
+
+    /**
+     * 是否发送短信,见 sys_yes_no字典类别
+     */
+    @ExcelProperty(value = "是否发送短信,见 sys_yes_no字典类别")
+    private String smsSend;
+
+    /**
+     * 消费记录标志位?
+     */
+    @ExcelProperty(value = "消费记录标志位?")
+    private Long recordStatus;
+
+    /**
+     * 同步标志,0-未同步,1-已同步
+     */
+    @ExcelProperty(value = "同步标志,0-未同步,1-已同步")
+    private Long syncStatus;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 针对错扣补款的消费记录的id
+     */
+    private String detailId;
+
+    private List<XfConsumeDetailVo> details;
+
+
+}

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

@@ -228,5 +228,10 @@ public class XfConsumeDetailVo implements Serializable {
     @ExcelProperty(value = "备注")
     private String remark;
 
+    /**
+     * 针对错扣补款的消费记录的id
+     */
+    private String detailId;
+
 
 }

+ 2 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfConsumeDetailService.java

@@ -2,6 +2,7 @@ package org.dromara.backstage.consumption.service;
 
 import org.dromara.backstage.consumption.domain.bo.XfConsumeDetailBo;
 import org.dromara.backstage.consumption.domain.vo.XfConsumeAnalyzeVo;
+import org.dromara.backstage.consumption.domain.vo.XfConsumeDetailCKBKVo;
 import org.dromara.backstage.consumption.domain.vo.XfConsumeDetailVo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
@@ -34,6 +35,7 @@ public interface IXfConsumeDetailService {
      * @return 消费明细分页列表
      */
     TableDataInfo<XfConsumeDetailVo> queryPageList(XfConsumeDetailBo bo, PageQuery pageQuery);
+    TableDataInfo<XfConsumeDetailCKBKVo> queryPageCKBKList(XfConsumeDetailBo bo, PageQuery pageQuery);
 
     /**
      * 查询符合条件的消费明细列表

+ 51 - 3
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfConsumeDetailServiceImpl.java

@@ -1,16 +1,20 @@
 package org.dromara.backstage.consumption.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.seata.common.util.CollectionUtils;
 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.XfConsumeAnalyzeVo;
+import org.dromara.backstage.consumption.domain.vo.XfConsumeDetailCKBKVo;
 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.enums.ConsumeRecordTypeEnum;
 import org.dromara.common.core.utils.DateUtils;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
@@ -20,9 +24,8 @@ import org.springframework.stereotype.Service;
 
 import java.time.YearMonth;
 import java.time.format.DateTimeFormatter;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 消费明细Service业务层处理
@@ -68,6 +71,51 @@ public class XfConsumeDetailServiceImpl implements IXfConsumeDetailService {
         return TableDataInfo.build(result);
     }
 
+    /**
+     * @param bo
+     * @param pageQuery
+     * @return
+     */
+    @Override
+    public TableDataInfo<XfConsumeDetailCKBKVo> queryPageCKBKList(XfConsumeDetailBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<XfConsumeDetail> lqw = buildQueryWrapper(bo);
+        Map<String, Object> params = bo.getParams();
+        Object beginDate =  params.get("beginConsumeDate");
+        Object endDate =  params.get("endConsumeDate");
+        if(beginDate != null && endDate != null){
+            lqw.between(XfConsumeDetail::getConsumeDate, beginDate + " 00:00:00", endDate + " 23:59:59");
+        }
+        //lqw.orderByDesc(XfConsumeDetail::getConsumeDate);
+        lqw.in(XfConsumeDetail::getStatusFlag,
+            Arrays.asList(ConsumeRecordTypeEnum.XFJXF_1.code(), ConsumeRecordTypeEnum.XFJXF_4.code(), ConsumeRecordTypeEnum.BKXF.code()));
+        Page<XfConsumeDetailVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        List<XfConsumeDetailCKBKVo> records = BeanUtil.copyToList(result.getRecords(), XfConsumeDetailCKBKVo.class);
+        Page<XfConsumeDetailCKBKVo> rs = new Page<>(result.getCurrent(), result.getSize(), result.getTotal());
+        rs.setRecords(records);
+
+        //查询各消费记录的 错扣补款记录
+        if(CollectionUtils.isNotEmpty(records)){
+            List<String> consumeIds = records.stream().map(XfConsumeDetailCKBKVo::getConsumeId).toList();
+            LambdaQueryWrapper<XfConsumeDetail> wrapper = new LambdaQueryWrapper<>();
+            wrapper.in(XfConsumeDetail::getDetailId, consumeIds);
+            wrapper.eq(XfConsumeDetail::getStatusFlag, ConsumeRecordTypeEnum.CKBK.code());
+            List<XfConsumeDetailVo> vos = baseMapper.selectVoList(wrapper);
+            if(CollectionUtils.isNotEmpty(vos)){
+                Map<String, List<XfConsumeDetailVo>> map = vos.stream().collect(Collectors.groupingBy(XfConsumeDetailVo::getDetailId));
+                records.forEach(item -> {
+                    List<XfConsumeDetailVo> list = map.get(item.getConsumeId());
+                    if(CollectionUtils.isNotEmpty(list)){
+                        item.setDetails(list);
+                    }else{
+                        item.setDetails(new ArrayList<>());
+                    }
+                });
+           }
+        }
+
+        return TableDataInfo.build(rs);
+    }
+
     /**
      * 查询符合条件的消费明细列表
      *

+ 8 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/controller/PtBagController.java

@@ -15,6 +15,7 @@ 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.backstage.payment.service.impl.PtBagServiceImpl;
 import org.dromara.common.core.constant.Constants;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.core.enums.CreditTypeEnum;
@@ -36,6 +37,7 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.MessageFormat;
 import java.util.List;
+import java.util.Optional;
 
 /**
  * 账户钱包
@@ -55,6 +57,7 @@ public class PtBagController extends BaseController {
     private final IPtUserAccountService accountService;
     private final PaymentsStrategyContent paymentsStrategyContent;
     private final ErrFillBusiness errFillBusiness;
+    private final IPtBagService bagService;
 
     //根据userId查询账户余额
 //    @SaCheckPermission("payment:ptBag:query")
@@ -156,6 +159,11 @@ public class PtBagController extends BaseController {
     @RepeatSubmit()
     @PostMapping("/refund")
     public R<PtBagVo> refund(@Validated(EditGroup.class) @RequestBody PtBagBo bo) {
+        //校验钱包余额是否充足
+        PtBagVo bagVo = bagService.queryByUserBagCode(bo.getUserId(), bo.getBagCode());
+        if (bagVo.getBalance().compareTo(bo.getReceiptMoney()) < 0) {
+            return R.fail(MessageFormat.format("账户余额不足,当前余额为:{0}", bagVo.getBalance()));
+        }
         bo.setUseType(SystemUseTypeEnum.CONSUME);
         //退款是记支出,所以金额设置为负数
         bo.setReceiptMoney(bo.getReceiptMoney().negate());

+ 7 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/domain/bo/PtUserAccountBo.java

@@ -12,6 +12,8 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import jakarta.validation.constraints.*;
 import java.util.Date;
+import java.util.List;
+
 import com.fasterxml.jackson.annotation.JsonFormat;
 import org.dromara.common.sensitive.annotation.Sensitive;
 import org.dromara.common.sensitive.core.SensitiveStrategy;
@@ -205,6 +207,11 @@ public class PtUserAccountBo extends BaseEntity {
      */
     private String userType;
 
+    /**
+     * 需要排除的部门Id集合
+     */
+    private List<Long> excludeDeptsAndChildren;
+
     // 构建器类
     public static class Builder {
         private Long userId;

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

@@ -1,11 +1,16 @@
 package org.dromara.backstage.payment.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.lang.UUID;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import lombok.Builder;
+import lombok.NoArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.dromara.backstage.cardCenter.domain.bo.PtCardBo;
@@ -14,9 +19,11 @@ import org.dromara.backstage.payment.domain.vo.PtUserAccount4SelectVo;
 import org.dromara.backstage.payment.service.IPtBagService;
 import org.dromara.common.core.domain.R;
 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.core.utils.file.FileUtils;
 import org.dromara.common.core.utils.file.MimeTypeUtils;
+import org.dromara.common.encrypt.interceptor.MybatisEncryptInterceptor;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -32,8 +39,11 @@ import org.dromara.backstage.payment.mapper.PtUserAccountMapper;
 import org.dromara.backstage.payment.service.IPtUserAccountService;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.io.IOException;
+import java.io.*;
 import java.math.BigDecimal;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.nio.charset.Charset;
 import java.text.MessageFormat;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -123,6 +133,10 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
     }
 
     private LambdaQueryWrapper<PtUserAccount> buildQueryWrapper(PtUserAccountBo bo) {
+
+        //手机号加密处理
+        MybatisEncryptInterceptor encryptInterceptor = SpringUtils.getBean(MybatisEncryptInterceptor.class);
+        bo.setPhone(encryptInterceptor.encrypt(bo.getPhone()));
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<PtUserAccount> lqw = Wrappers.lambdaQuery();
         lqw.eq(bo.getPostId() != null, PtUserAccount::getPostId, bo.getPostId());
@@ -449,4 +463,115 @@ public class PtUserAccountServiceImpl implements IPtUserAccountService {
         }
         return vo;
     }
+
+    public static void downloadPicture(String urlList,String name,String userNumb) {
+        URL url = null;
+        int imageNumber = 0;
+
+        try {
+            url = new URL("http://172.16.137.86:8080/upload/"+urlList);
+            DataInputStream dataInputStream = new DataInputStream(url.openStream());
+
+            String imageName =  "C:\\Users\\LENOVO\\Desktop\\img\\"+name+"_"+userNumb+urlList.substring(urlList.lastIndexOf("."));
+
+            FileOutputStream fileOutputStream = new FileOutputStream(new File(imageName));
+            ByteArrayOutputStream output = new ByteArrayOutputStream();
+
+            byte[] buffer = new byte[1024];
+            int length;
+
+            while ((length = dataInputStream.read(buffer)) > 0) {
+                output.write(buffer, 0, length);
+            }
+            byte[] context=output.toByteArray();
+            fileOutputStream.write(output.toByteArray());
+            dataInputStream.close();
+            fileOutputStream.close();
+        } catch (MalformedURLException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static class ImageData{
+        private String url;
+        private String name;
+
+        private String userNumb;
+
+        public ImageData(String url, String name, String userNumb) {
+            this.url = url;
+            this.name = name;
+            this.userNumb = userNumb;
+        }
+    }
+
+    public static List<ImageData> parseTxt(String filePath){
+        return FileUtils.readLines(filePath, Charset.defaultCharset()).stream().map(line->{
+            String[] split = line.split("\\|");
+            if(split.length!=3){
+                throw new RuntimeException("txt文件格式错误");
+            }
+            String userNumb = split[0].replaceAll(" ", "");
+            String url = split[1].replaceAll(" ", "");
+            String name = split[2].replaceAll(" ", "");
+            return new ImageData(url,name,userNumb);
+        }).collect(Collectors.toList());
+    }
+
+    //使用 http form-data方式上传图片,使用hutool工具包
+    public static String uploadImage(String userNumb,String name) throws IOException {
+        //使用 http form-data方式上传图片,使用hutool工具包
+        String imagePath = "C:\\Users\\LENOVO\\Desktop\\img\\"+name+"_"+userNumb+".jpg";
+        File file = new File(imagePath);
+        Long length = file.length();
+        if(!file.exists() || length <= 0){
+            System.err.println(userNumb+" "+name+" "+"照片不存在 "+ imagePath);
+            return "error: "+ userNumb+" "+name+" "+"照片不存在";
+        }
+        Map<String,String> headers = new HashMap<>();
+        headers.put("Content-Type", "multipart/form-data");
+        headers.put("cookie", "Data=jsv2g08wiSwgsuDrAwQvLCDfueDealwvg330G2yywIAVWXnLV1M/jR6EKPdJqhxGkWwYfHnmjF6+WJk2b8t4gPWQ8T35rBBxD1GiOIQF9jM%3D; Words=MTY6OTQyNjgyNDIyOjg1ODkyODk0NTo5NDMwNzU2MzI6ODQyMDE5NjM3");
+        String json = "{\"method\":\"faceInfoUpdate.addFace\",\"params\":{\"GroupID\":1,\"PersonInfo\":{\"CertificateType\":\"IC\",\"ID\":\""+userNumb+"\"},\"ImageInfo\":{\"Lengths\":["+length+"],\"Amount\":1}},\"session\":\"1d6e61e33641e339c68a3930c4b3e949\",\"id\":120}";
+//        System.err.println(" json "+json);
+        HttpRequest form = HttpRequest.post("http://172.19.50.101/CmdCall")
+            .addHeaders(headers)
+            .form("json", json)
+            .form("data", file);
+        HttpResponse execute = form.execute();
+        String body = execute.body();
+
+        if(body.contains("error")){
+            System.err.println("error: "+ userNumb+" "+name+" "+"照片上传失败,请手动上传"+ "  " + body);
+        }else{
+            System.out.println("state : "+ userNumb+" "+name+" " + execute.isOk() + "  " + body);
+        }
+//        System.err.println("body : " + body);
+        return "ok";
+    }
+
+    public static void main(String[] args) throws IOException {
+        /*List<ImageData> list = new ArrayList<>();
+        list = parseTxt("C:\\Users\\LENOVO\\Desktop\\T_PT_User_202410221658_txt.txt");
+
+        System.err.println(list);
+
+        list.forEach(item->{
+            downloadPicture(item.url,item.name, item.userNumb);
+        });*/
+        /*File file = new File("C:\\Users\\LENOVO\\Desktop\\img\\冯晓辉_2022118036.jpg");
+        System.err.println(file.length());*/
+
+        List<ImageData> list = new ArrayList<>();
+        list = parseTxt("C:\\Users\\LENOVO\\Desktop\\userdata.txt");
+
+        for (ImageData imageData : list) {
+            uploadImage(imageData.userNumb,imageData.name);
+        }
+
+
+        System.err.println("11111");
+    }
+
 }

+ 92 - 0
ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/cardCenter/cardOperation/PtSubsidyitemMapper.xml

@@ -28,4 +28,96 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <result property="updateBy"    column="update_by"    />
             <result property="updateTime"    column="update_time"    />
     </resultMap>
+
+    <select id="customPageList" resultType="org.dromara.backstage.cardCenter.domain.vo.PtSubsidyitemVo">
+        SELECT
+            b.subsidy_name,a.item_id,a.user_id, a.subsidy_type, a.fill_money, a.fill_date, a.fill_status, a.get_date
+             , a.before_money, a.after_money, a.original_id, a.user_numb, a.real_name, a.dept_name, a.remark, a.del_flag
+             , a.create_dept, a.create_by, a.create_time, a.update_by
+        FROM
+            t_pt_subsidyItem a
+                left join t_pt_subsidy b on a.main_id = b.main_id
+        <where>
+            <if test="bo.mainId == null or bo.mainId == ''">
+                and b.audit_status = 'Y'
+            </if>
+            <if test="bo.realName != null and bo.realName != ''">
+                and a.real_name like concat('%', #{bo.realName}, '%')
+            </if>
+            <if test="beginFillDate != '' and endFillDate != ''">
+                and a.fill_date between #{beginFillDate} and #{endFillDate}
+            </if>
+            <if test="bo.fillStatus != null and bo.fillStatus != ''">
+                and a.fill_status = #{bo.fillStatus}
+            </if>
+            <if test="bo.deptName != null and bo.deptName != ''">
+                and a.dept_name like concat('%', #{bo.deptName}, '%')
+            </if>
+            <if test="bo.mainId != null and bo.mainId != ''">
+                and a.main_id = #{bo.mainId}
+            </if>
+        </where>
+    </select>
+
+    <select id="queryReportList" resultType="org.dromara.backstage.cardCenter.domain.vo.PtSubsidyReportVo">
+        select (case  #{bo.countType} when '0' then to_char(i.fill_date, '%Y') when '1' then to_char(i.fill_date, '%Y-%m') else to_char(i.fill_date, '%Y-%m-%d') end) fillDate,
+               (case when #{bo.subsidyType} is not null and #{bo.subsidyType} != '' then i.subsidy_type else '所有' end) subsidyType,
+                (case when #{bo.createByName} is not null and #{bo.createByName} != '' then u.real_name else '所有' end)  createByName,
+                sum(ifnull(i.fill_money,0)) fillMoney,
+                count(*)  countNumber,
+                sum(case when i.fill_status = 'Y' then ifnull(i.fill_money,0) else 0 end) receiveMoney,
+                sum(case when i.fill_status = 'Y' then 1 else 0 end) receiveNumber,
+                sum(case when i.fill_status = 'N' then ifnull(i.fill_money,0) else 0 end) notReceiveMoney,
+                sum(case when i.fill_status = 'N' then 1 else 0 end) notReceiveNumber
+                from t_pt_subsidyItem i join t_pt_subsidy  s on i.main_id = s.main_id
+               left join t_sys_user u on s.create_by = u.user_id
+        <where>
+             i.del_flag = 0 and s.del_flag = 0
+            <if test="bo.beginCountTime != null">
+                and #{bo.beginCountTime} &lt;= to_char(i.fill_date, '%Y-%m-%d')
+            </if>
+            <if test="bo.endCountTime !=null">
+                and to_char(i.fill_date, '%Y-%m-%d')  &lt;= #{bo.endCountTime}
+            </if>
+            <if test="bo.subsidyType !=null and bo.subsidyType !=''">
+                and i.subsidy_type = #{bo.subsidyType}
+            </if>
+            <if test="bo.createByName!=null and bo.createByName!=''">
+              and u.real_name like concat('%',#{bo.createByName},'%')
+            </if>
+        </where>
+        group by fillDate, subsidyType,createByName
+        order by fillDate desc,subsidyType desc,createByName desc
+    </select>
+
+    <select id="queryReportPageList" resultType="org.dromara.backstage.cardCenter.domain.vo.PtSubsidyReportVo">
+        select (case  #{bo.countType} when '0' then to_char(i.fill_date, '%Y') when '1' then to_char(i.fill_date, '%Y-%m') else to_char(i.fill_date, '%Y-%m-%d') end) fillDate,
+        (case when #{bo.subsidyType} is not null and #{bo.subsidyType} != '' then i.subsidy_type else '所有' end) subsidyType,
+        (case when #{bo.createByName} is not null and #{bo.createByName} != '' then u.real_name else '所有' end)  createByName,
+        sum(ifnull(i.fill_money,0)) fillMoney,
+        count(*)  countNumber,
+        sum(case when i.fill_status = 'Y' then ifnull(i.fill_money,0) else 0 end) receiveMoney,
+        sum(case when i.fill_status = 'Y' then 1 else 0 end) receiveNumber,
+        sum(case when i.fill_status = 'N' then ifnull(i.fill_money,0) else 0 end) notReceiveMoney,
+        sum(case when i.fill_status = 'N' then 1 else 0 end) notReceiveNumber
+        from t_pt_subsidyItem i join t_pt_subsidy  s on i.main_id = s.main_id
+        left join t_sys_user u on s.create_by = u.user_id
+        <where>
+            i.del_flag = 0 and s.del_flag = 0
+            <if test="bo.beginCountTime != null">
+                and #{bo.beginCountTime} &lt;= to_char(i.fill_date, '%Y-%m-%d')
+            </if>
+            <if test="bo.endCountTime !=null">
+                and to_char(i.fill_date, '%Y-%m-%d')  &lt;= #{bo.endCountTime}
+            </if>
+            <if test="bo.subsidyType !=null and bo.subsidyType !=''">
+                and i.subsidy_type = #{bo.subsidyType}
+            </if>
+            <if test="bo.createByName!=null and bo.createByName!=''">
+                and u.real_name like concat('%',#{bo.createByName},'%')
+            </if>
+        </where>
+        group by fillDate, subsidyType,createByName
+        order by fillDate desc,subsidyType desc,createByName desc
+    </select>
 </mapper>

+ 6 - 0
ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/payment/PtUserAccountMapper.xml

@@ -68,6 +68,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="bo.phone != null and  bo.phone != ''">
                 and u.phone = #{bo.phone}
             </if>
+            <if test="bo.excludeDeptsAndChildren != null and bo.excludeDeptsAndChildren.size() > 0">
+                and a.dept_id not in
+                <foreach collection="bo.excludeDeptsAndChildren" item="item" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
         </where>
         order by u.dept_id,u.user_id
     </select>

+ 4 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java

@@ -12,6 +12,8 @@ import org.dromara.common.core.constant.UserConstants;
 import org.dromara.common.core.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
 import org.dromara.common.core.xss.Xss;
+import org.dromara.common.encrypt.annotation.EncryptField;
+import org.dromara.common.encrypt.enumd.AlgorithmType;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
 import org.dromara.common.sensitive.annotation.Sensitive;
 import org.dromara.common.sensitive.core.SensitiveStrategy;
@@ -89,7 +91,8 @@ public class SysUserBo extends BaseEntity {
     /**
      * 手机号码
      */
-    @Sensitive(strategy = SensitiveStrategy.PHONE)
+//    @Sensitive(strategy = SensitiveStrategy.PHONE)
+    @EncryptField(algorithm = AlgorithmType.BASE64)
     private String phone;
 
     /**

+ 4 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.ResultType;
+import org.apache.ibatis.annotations.Select;
 import org.dromara.common.mybatis.annotation.DataColumn;
 import org.dromara.common.mybatis.annotation.DataPermission;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
@@ -54,7 +56,8 @@ public interface SysUserMapper extends BaseMapperPlus<SysUser, SysUserVo> {
         @DataColumn(key = "deptName", value = "d.dept_id"),
         @DataColumn(key = "userName", value = "u.user_id")
     })
-    Page<SysUserVo> selectAllocatedList(@Param("page") Page<SysUser> page, @Param(Constants.WRAPPER) Wrapper<SysUser> queryWrapper);
+    Page<SysUserVo> selectAllocatedList(@Param("page") Page<SysUser> page,
+                                       @Param(Constants.WRAPPER) Wrapper<SysUser> queryWrapper);
 
     /**
      * 根据条件分页查询未分配用户角色列表

+ 5 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java

@@ -364,9 +364,13 @@ public class SysDeptServiceImpl implements ISysDeptService {
 
     @Override
     public List<Long> selectDeptAndChildrenDeptById(Long deptId) {
+        SysDeptVo sysDeptVo = baseMapper.selectVoById(deptId);
+        if (ObjectUtil.isNull(sysDeptVo)) {
+            return CollUtil.newArrayList(deptId);
+        }
         return baseMapper.selectList(Wrappers.lambdaQuery(SysDept.class)
             .select(SysDept::getDeptId)
-            .eq(SysDept::getParentId, deptId).or().eq(SysDept::getDeptId, deptId)
+            .eq(SysDept::getParentId, deptId).or().eq(SysDept::getDeptId, deptId).or().likeRight(SysDept::getAncestors, sysDeptVo.getAncestors()+","+deptId)
         ).stream().map(SysDept::getDeptId).toList();
     }
 

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRegisterInfoServiceImpl.java

@@ -193,7 +193,7 @@ public class SysRegisterInfoServiceImpl implements ISysRegisterInfoService {
             tempVo.setCustomerId(customerId);
             tempVo.setDealerNo(dealerNo);
             vo.set(tempVo);
-
+            // todo 获取不到租户id,无法设置缓存 使用默认租户id
             RedisUtils.setCacheObject(CacheNames.CUSTOM_PUB_KEY,customerPublicKey);
             RedisUtils.setCacheObject(CacheNames.CUSTOM_PRI_KEY,customerPrivateKey);
         });

+ 22 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java

@@ -28,6 +28,8 @@ import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.core.utils.StreamUtils;
 import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.encrypt.interceptor.MybatisDecryptInterceptor;
+import org.dromara.common.encrypt.interceptor.MybatisEncryptInterceptor;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.helper.DataBaseHelper;
@@ -93,6 +95,10 @@ public class SysUserServiceImpl implements ISysUserService {
     }
 
     private Wrapper<SysUser> buildQueryWrapper(SysUserBo user) {
+        //手机号加密处理
+        MybatisEncryptInterceptor encryptInterceptor = SpringUtils.getBean(MybatisEncryptInterceptor.class);
+        user.setPhone(encryptInterceptor.encrypt(user.getPhone()));
+
         Map<String, Object> params = user.getParams();
         QueryWrapper<SysUser> wrapper = Wrappers.query();
         wrapper.eq("del_flag", UserConstants.USER_NORMAL)
@@ -126,6 +132,9 @@ public class SysUserServiceImpl implements ISysUserService {
      */
     @Override
     public TableDataInfo<SysUserVo> selectAllocatedList(SysUserBo user, PageQuery pageQuery) {
+        //查询条件加密
+        MybatisEncryptInterceptor encrypt = SpringUtils.getBean(MybatisEncryptInterceptor.class);
+        user.setPhone(encrypt.encrypt(user.getPhone()));
         QueryWrapper<SysUser> wrapper = Wrappers.query();
         wrapper.eq("u.del_flag", UserConstants.USER_NORMAL)
             .eq(ObjectUtil.isNotNull(user.getRoleId()), "r.role_id", user.getRoleId())
@@ -134,6 +143,11 @@ public class SysUserServiceImpl implements ISysUserService {
             .like(StringUtils.isNotBlank(user.getPhone()), "u.phone", user.getPhone())
             .orderByAsc("u.user_id");
         Page<SysUserVo> page = baseMapper.selectAllocatedList(pageQuery.build(), wrapper);
+        //返回数据解密
+        MybatisDecryptInterceptor dencrypt = SpringUtils.getBean(MybatisDecryptInterceptor.class);
+        page.getRecords().stream().forEach(item -> {
+            item.setPhone(dencrypt.decrypt(item.getPhone()));
+        });
         return TableDataInfo.build(page);
     }
 
@@ -146,6 +160,9 @@ public class SysUserServiceImpl implements ISysUserService {
     @Override
     public TableDataInfo<SysUserVo> selectUnallocatedList(SysUserBo user, PageQuery pageQuery) {
         List<Long> userIds = userRoleMapper.selectUserIdsByRoleId(user.getRoleId());
+        //查询条件加密
+        MybatisEncryptInterceptor encrypt = SpringUtils.getBean(MybatisEncryptInterceptor.class);
+        user.setPhone(encrypt.encrypt(user.getPhone()));
         QueryWrapper<SysUser> wrapper = Wrappers.query();
         wrapper.eq("u.del_flag", UserConstants.USER_NORMAL)
             .and(w -> w.ne("r.role_id", user.getRoleId()).or().isNull("r.role_id"))
@@ -154,6 +171,11 @@ public class SysUserServiceImpl implements ISysUserService {
             .like(StringUtils.isNotBlank(user.getPhone()), "u.phone", user.getPhone())
             .orderByAsc("u.user_id");
         Page<SysUserVo> page = baseMapper.selectUnallocatedList(pageQuery.build(), wrapper);
+        //返回数据解密
+        MybatisDecryptInterceptor dencrypt = SpringUtils.getBean(MybatisDecryptInterceptor.class);
+        page.getRecords().stream().forEach(item -> {
+            item.setPhone(dencrypt.decrypt(item.getPhone()));
+        });
         return TableDataInfo.build(page);
     }