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

Merge branch 'master' of http://115.29.66.169:10080/yiyao_shop/api

lubo месяцев назад: 4
Родитель
Сommit
cdfba3691f
16 измененных файлов с 173 добавлено и 39 удалено
  1. 26 14
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/user/UserController.java
  2. 2 1
      ruoyi-api/src/main/java/com/ruoyi/api/controller/shop/ApiAgentWithdrawalController.java
  3. 2 1
      ruoyi-api/src/main/java/com/ruoyi/api/controller/shop/ApiUserWithdrawalController.java
  4. 21 0
      ruoyi-common/src/main/java/com/ruoyi/common/convert/StringToDateConverter.java
  5. 2 0
      ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
  6. 6 0
      ruoyi-shop/src/main/java/com/ruoyi/shop/business/domain/bo/UserBusinessVerifierIntegralBo.java
  7. 8 8
      ruoyi-shop/src/main/java/com/ruoyi/shop/business/service/impl/UserBusinessRoleServiceImpl.java
  8. 17 6
      ruoyi-shop/src/main/java/com/ruoyi/shop/withdrawal/domain/bo/WithdrawalBo.java
  9. 2 1
      ruoyi-shop/src/main/java/com/ruoyi/shop/withdrawal/service/IWithdrawalService.java
  10. 11 7
      ruoyi-shop/src/main/java/com/ruoyi/shop/withdrawal/service/impl/WithdrawalServiceImpl.java
  11. 11 0
      ruoyi-user/src/main/java/com/ruoyi/user/domain/bo/UserBo.java
  12. 15 0
      ruoyi-user/src/main/java/com/ruoyi/user/domain/vo/UserStatisticsVo.java
  13. 6 0
      ruoyi-user/src/main/java/com/ruoyi/user/mapper/UserMapper.java
  14. 2 0
      ruoyi-user/src/main/java/com/ruoyi/user/service/IUserService.java
  15. 10 1
      ruoyi-user/src/main/java/com/ruoyi/user/service/impl/UserServiceImpl.java
  16. 32 0
      ruoyi-user/src/main/resources/mapper/user/UserMapper.xml

+ 26 - 14
ruoyi-admin/src/main/java/com/ruoyi/web/controller/user/UserController.java

@@ -1,33 +1,36 @@
 package com.ruoyi.web.controller.user;
 
-import java.util.List;
-import java.util.Arrays;
-
-import com.ruoyi.common.enums.FilePathSplicingType;
-import com.ruoyi.common.filepathsplicing.FilePathSplicing;
-import lombok.RequiredArgsConstructor;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.validation.annotation.Validated;
-import com.ruoyi.common.annotation.RepeatSubmit;
 import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.annotation.RepeatSubmit;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.PageQuery;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.core.validate.AddGroup;
 import com.ruoyi.common.core.validate.EditGroup;
 import com.ruoyi.common.core.validate.QueryGroup;
 import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.enums.FilePathSplicingType;
+import com.ruoyi.common.filepathsplicing.FilePathSplicing;
 import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.user.domain.vo.UserVo;
+import com.ruoyi.subsidy.service.ISubsidyQueueService;
 import com.ruoyi.user.domain.bo.UserBo;
+import com.ruoyi.user.domain.vo.UserStatisticsVo;
+import com.ruoyi.user.domain.vo.UserVo;
 import com.ruoyi.user.service.IUserService;
-import com.ruoyi.common.core.page.TableDataInfo;
 import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiParam;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.Arrays;
+import java.util.List;
 
 /**
  * 小程序用户管理Controller
@@ -43,6 +46,15 @@ import io.swagger.annotations.ApiOperation;
 public class UserController extends BaseController {
 
     private final IUserService iUserService;
+    private final ISubsidyQueueService subsidyQueueService;
+
+    @ApiOperation("用户金额统计")
+    @GetMapping("/statistics")
+    public R<UserStatisticsVo> statistics(UserBo bo) {
+        UserStatisticsVo vo = iUserService.statistics(bo);
+//        vo.setSurplusQueueMoney(subsidyQueueService.);
+        return R.ok(vo);
+    }
 
     /**
      * 查询小程序用户管理列表

+ 2 - 1
ruoyi-api/src/main/java/com/ruoyi/api/controller/shop/ApiAgentWithdrawalController.java

@@ -22,6 +22,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.validation.constraints.DecimalMin;
 import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
+import java.util.Map;
 
 /**
  * 提现Controller
@@ -63,7 +64,7 @@ public class ApiAgentWithdrawalController extends AbstractApiController {
      */
     @ApiOperation("获取提现手续费")
     @GetMapping("/fee")
-    public R<BigDecimal> queryFee(@NotNull(message = "金额不能为空")
+    public R<Map<String, BigDecimal>> queryFee(@NotNull(message = "金额不能为空")
                                   @DecimalMin(value = "0.01", message = "金额必须大于0.01")
                                   BigDecimal amount) {
         return R.ok(iWithdrawalService.queryFee(WithdrawalSource.AGENT, amount));

+ 2 - 1
ruoyi-api/src/main/java/com/ruoyi/api/controller/shop/ApiUserWithdrawalController.java

@@ -22,6 +22,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.validation.constraints.DecimalMin;
 import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
+import java.util.Map;
 
 /**
  * 提现Controller
@@ -63,7 +64,7 @@ public class ApiUserWithdrawalController extends AbstractApiController {
      */
     @ApiOperation("获取提现手续费")
     @GetMapping("/fee")
-    public R<BigDecimal> queryFee(@NotNull(message = "金额不能为空")
+    public R<Map<String, BigDecimal>> queryFee(@NotNull(message = "金额不能为空")
                                   @DecimalMin(value = "0.01", message = "金额必须大于0.01")
                                   BigDecimal amount) {
         return R.ok(iWithdrawalService.queryFee(WithdrawalSource.USER, amount));

+ 21 - 0
ruoyi-common/src/main/java/com/ruoyi/common/convert/StringToDateConverter.java

@@ -0,0 +1,21 @@
+package com.ruoyi.common.convert;
+
+import org.springframework.core.convert.converter.Converter;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class StringToDateConverter implements Converter<String, Date> {
+    private static final String[] PATTERNS = {"yyyy-MM-dd", "yyyy/MM/dd", "yyyy-MM-dd HH:mm:ss", "yyyy/MM/dd HH:mm:ss"};
+
+    @Override
+    public Date convert(String source) {
+        for (String pattern : PATTERNS) {
+            try {
+                return new SimpleDateFormat(pattern).parse(source);
+            } catch (ParseException ignored) {}
+        }
+        throw new IllegalArgumentException("无效日期格式: " + source);
+    }
+}

+ 2 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java

@@ -1,5 +1,6 @@
 package com.ruoyi.framework.config;
 
+import com.ruoyi.common.convert.StringToDateConverter;
 import com.ruoyi.common.enums.serializer.EnumConvertFactory;
 import com.ruoyi.framework.interceptor.PlusWebInvokeTimeInterceptor;
 import com.yomahub.tlog.web.interceptor.TLogWebInterceptor;
@@ -35,6 +36,7 @@ public class ResourcesConfig implements WebMvcConfigurer {
     @Override
     public void addFormatters(FormatterRegistry registry) {
         registry.addConverterFactory(enumConvertFactory);
+        registry.addConverter(new StringToDateConverter());
     }
     @Override
     public void addInterceptors(InterceptorRegistry registry) {

+ 6 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/business/domain/bo/UserBusinessVerifierIntegralBo.java

@@ -1,7 +1,9 @@
 package com.ruoyi.shop.business.domain.bo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
@@ -49,11 +51,15 @@ public class UserBusinessVerifierIntegralBo implements Serializable {
      * 开始时间
      */
     @ApiModelProperty("开始时间")
+    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
     private Date startTime;
 
     /**
      * 结束时间
      */
     @ApiModelProperty("结束时间")
+    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
     private Date endTime;
 }

+ 8 - 8
ruoyi-shop/src/main/java/com/ruoyi/shop/business/service/impl/UserBusinessRoleServiceImpl.java

@@ -225,7 +225,7 @@ public class UserBusinessRoleServiceImpl implements IUserBusinessRoleService {
     @Override
     public void updateByUserAndBusiness(Long userId, Long businessId, BigDecimal amount, OrderType orderType) {
         UserBusinessRole userBusinessRole = queryByUserAndBusiness(userId, businessId);
-        if(ObjectUtil.isEmpty(userBusinessRole)){
+        if(ObjectUtil.isNull(userBusinessRole)){
             userBusinessRole = new UserBusinessRole();
             userBusinessRole.setUserId(userId);
             userBusinessRole.setBusinessId(businessId);
@@ -234,6 +234,13 @@ public class UserBusinessRoleServiceImpl implements IUserBusinessRoleService {
             } else if (OrderType.ONLINE.equals(orderType)) {
                 userBusinessRole.setOnlineOrderTotalConsumption(amount);
             }
+            Long count = baseMapper.selectCount(new LambdaQueryWrapper<UserBusinessRole>().eq(UserBusinessRole::getUserId, userId));
+            if (count > 0) {
+                userBusinessRole.setIsBound(false);
+            } else {
+                //第一次消费
+                userBusinessRole.setIsBound(true);
+            }
         } else {
             if (OrderType.NORMAL.equals(orderType)) {
                 userBusinessRole.setOrderTotalConsumption(userBusinessRole.getOrderTotalConsumption().add(amount));
@@ -241,13 +248,6 @@ public class UserBusinessRoleServiceImpl implements IUserBusinessRoleService {
                 userBusinessRole.setOnlineOrderTotalConsumption(userBusinessRole.getOnlineOrderTotalConsumption().add(amount));
             }
         }
-        Long count = baseMapper.selectCount(new LambdaQueryWrapper<UserBusinessRole>().eq(UserBusinessRole::getUserId, userId));
-        if (count > 0) {
-            userBusinessRole.setIsBound(false);
-        } else {
-            //第一次消费
-            userBusinessRole.setIsBound(true);
-        }
         baseMapper.insertOrUpdate(userBusinessRole);
     }
 

+ 17 - 6
ruoyi-shop/src/main/java/com/ruoyi/shop/withdrawal/domain/bo/WithdrawalBo.java

@@ -1,6 +1,7 @@
 package com.ruoyi.shop.withdrawal.domain.bo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.core.domain.BaseEntity;
 import com.ruoyi.common.core.validate.AddGroup;
 import com.ruoyi.common.core.validate.EditGroup;
 import com.ruoyi.common.enums.AuditStatus;
@@ -11,14 +12,12 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import javax.validation.constraints.*;
-
-import java.util.Date;
+import org.springframework.format.annotation.DateTimeFormat;
 
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
-
-import com.ruoyi.common.core.domain.BaseEntity;
-import org.springframework.format.annotation.DateTimeFormat;
+import java.util.Date;
 
 /**
  * 提现业务对象 tb_withdrawal
@@ -55,6 +54,18 @@ public class WithdrawalBo extends BaseEntity {
     @ApiModelProperty(value = "提现来源ID", required = true)
     private Long withdrawalSourceId;
 
+    /**
+     * 提现人手机号
+     */
+    @ApiModelProperty("提现人手机号")
+    private String withdrawalPhone;
+
+    /**
+     * 提现人名称
+     */
+    @ApiModelProperty("提现人名称")
+    private String withdrawalName;
+
     /**
      * 提现金额
      */

+ 2 - 1
ruoyi-shop/src/main/java/com/ruoyi/shop/withdrawal/service/IWithdrawalService.java

@@ -11,6 +11,7 @@ import com.ruoyi.shop.withdrawal.enums.WithdrawalSource;
 import java.math.BigDecimal;
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 提现Service接口
@@ -75,7 +76,7 @@ public interface IWithdrawalService {
      * @param amount 提现金额
      * @return 提现手续费
      */
-    BigDecimal queryFee(WithdrawalSource withdrawalSource, BigDecimal amount);
+    Map<String, BigDecimal> queryFee(WithdrawalSource withdrawalSource, BigDecimal amount);
     /**
      * 校验并批量删除提现信息
      *

+ 11 - 7
ruoyi-shop/src/main/java/com/ruoyi/shop/withdrawal/service/impl/WithdrawalServiceImpl.java

@@ -48,10 +48,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * 提现Service业务层处理
@@ -178,7 +175,8 @@ public class WithdrawalServiceImpl implements IWithdrawalService {
             throw new ServiceException("支付密码错误");
         }
         //判断手续费是否一致
-        if (queryFee(bo.getWithdrawalSource(), bo.getAmount()).compareTo(bo.getFee()) != 0) {
+        Map<String, BigDecimal> map = queryFee(bo.getWithdrawalSource(), bo.getAmount());
+        if (map.getOrDefault("fee", BigDecimal.ZERO).compareTo(bo.getFee()) != 0) {
             throw new ServiceException(WithdrawalExceptionEnum.WITHDRAWAL_FEE_NOT_MATCH);
         }
         Withdrawal add = BeanUtil.toBean(bo, Withdrawal.class);
@@ -198,7 +196,7 @@ public class WithdrawalServiceImpl implements IWithdrawalService {
      * 查询提现手续费
      */
     @Override
-    public BigDecimal queryFee(WithdrawalSource withdrawalSource, BigDecimal amount) {
+    public Map<String, BigDecimal> queryFee(WithdrawalSource withdrawalSource, BigDecimal amount) {
         RevenueSharingConfigVo info = revenueSharingConfigService.getInfo();
         BigDecimal withdrawRatio = null;
         if (WithdrawalSource.USER.equals(withdrawalSource)) {
@@ -210,7 +208,10 @@ public class WithdrawalServiceImpl implements IWithdrawalService {
         if (withdrawRatio != null) {
             fee = MathUtils.setScale(amount.doubleValue() * withdrawRatio.doubleValue() / 100);
         }
-        return fee;
+        Map<String, BigDecimal> map = new HashMap<>();
+        map.put("fee", fee);
+        map.put("withdrawRatio", withdrawRatio);
+        return map;
     }
 
     /**
@@ -262,6 +263,9 @@ public class WithdrawalServiceImpl implements IWithdrawalService {
         }
         //查提现审核中
         BigDecimal withdrawing = baseMapper.withdrawing(withdrawalSourceId, withdrawalSource.getCode(), AuditStatus.WAIT_AUDIT.getCode());
+        if (withdrawing == null) {
+            withdrawing = BigDecimal.ZERO;
+        }
         WithdrawalAmountVo amountVo = new WithdrawalAmountVo();
         amountVo.setAbleAmount(balance.subtract(withdrawing));
         amountVo.setProcessingAmount(withdrawing);

+ 11 - 0
ruoyi-user/src/main/java/com/ruoyi/user/domain/bo/UserBo.java

@@ -131,4 +131,15 @@ public class UserBo extends BaseEntity {
      */
     @ApiModelProperty("账户余额")
     private BigDecimal balance;
+
+    @ApiModelProperty("消费开始时间")
+    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private Date consumeStartTime;
+    @ApiModelProperty("消费结束时间")
+    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private Date consumeEndTime;
+    @ApiModelProperty("商家主键")
+    private Long businessId;
 }

+ 15 - 0
ruoyi-user/src/main/java/com/ruoyi/user/domain/vo/UserStatisticsVo.java

@@ -9,6 +9,8 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.math.BigDecimal;
+
 
 /**
  * 统计注册 用户对象 tb_user
@@ -47,4 +49,17 @@ public class UserStatisticsVo {
             weekValue = DateUtil.dayOfWeek(DateUtils.parseDate(createDay));
         }
     }
+
+    @ApiModelProperty("累计商城消费")
+    private BigDecimal shopConsume;
+    @ApiModelProperty("累计可用余额")
+    private BigDecimal availableBalance;
+    @ApiModelProperty("累计扫码消费")
+    private BigDecimal lineConsume;
+    @ApiModelProperty("剩余排队金额")
+    private BigDecimal surplusQueueMoney;
+    @ApiModelProperty("累计补贴金额")
+    private BigDecimal subsidyMoney;
+    @ApiModelProperty("累计可用积分")
+    private BigDecimal availablePoint;
 }

+ 6 - 0
ruoyi-user/src/main/java/com/ruoyi/user/mapper/UserMapper.java

@@ -2,10 +2,12 @@ package com.ruoyi.user.mapper;
 
 import com.ruoyi.common.core.mapper.BaseMapperPlus;
 import com.ruoyi.user.domain.User;
+import com.ruoyi.user.domain.bo.UserBo;
 import com.ruoyi.user.domain.vo.UserStatisticsVo;
 import com.ruoyi.user.domain.vo.UserVo;
 import org.apache.ibatis.annotations.Param;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
@@ -26,4 +28,8 @@ public interface UserMapper extends BaseMapperPlus<UserMapper, User, UserVo> {
     List<UserStatisticsVo> queryUserStatisticsList(@Param("businessId") Long businessId, @Param("start") String start, @Param("end") String end);
 
     List<UserStatisticsVo> queryUserYearStatisticsList(@Param("businessId") Long businessId, @Param("start") String start, @Param("end") String end);
+
+    BigDecimal queryAvailableBalance(@Param("bo") UserBo bo);
+
+    BigDecimal queryAvailablePoint(@Param("bo") UserBo bo);
 }

+ 2 - 0
ruoyi-user/src/main/java/com/ruoyi/user/service/IUserService.java

@@ -191,4 +191,6 @@ public interface IUserService {
     List<UserStatisticsVo> queryUserYearStatisticsList(Long businessId, Date startTime, Date endTime);
 
     String queryNameById(Long userId);
+
+    UserStatisticsVo statistics(UserBo bo);
 }

+ 10 - 1
ruoyi-user/src/main/java/com/ruoyi/user/service/impl/UserServiceImpl.java

@@ -115,7 +115,6 @@ public class UserServiceImpl implements IUserService {
         if(ObjectUtil.isNotNull(bo.getCreateDayEnd())) {
             bo.setCreateDayEnd(DateUtil.endOfDay(bo.getCreateDayEnd()));
         }
-
         LambdaQueryWrapper<User> lqw = buildQueryWrapper(bo);
         Page<UserVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
         return TableDataInfo.build(result);
@@ -768,6 +767,16 @@ public class UserServiceImpl implements IUserService {
         return ObjectUtil.isNotNull(user) ? user.getNickname() : "";
     }
 
+    @Override
+    public UserStatisticsVo statistics(UserBo bo) {
+        UserStatisticsVo vo = new UserStatisticsVo();
+        //累计可用余额
+        vo.setAvailableBalance(baseMapper.queryAvailableBalance(bo));
+        //累计可用积分
+        vo.setAvailablePoint(baseMapper.queryAvailablePoint(bo));
+        return vo;
+    }
+
     private String generateUniqueMemberCode(Long userId) {
         //生成唯一码 用户不会重复 6-8位
         String userIdPart = String.valueOf(userId);

+ 32 - 0
ruoyi-user/src/main/resources/mapper/user/UserMapper.xml

@@ -95,4 +95,36 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         group by createDay
     </select>
 
+    <select id="queryAvailableBalance" resultType="java.math.BigDecimal">
+        select sum(u.balance) from tb_user u
+        <include refid="whereByStatis"/>
+    </select>
+
+    <select id="queryAvailablePoint" resultType="java.math.BigDecimal">
+        select sum(ub.integral_able) from tb_user u
+         join tb_user_business_role ub on u.id = ub.user_id
+        <include refid="whereByStatis"/>
+        <where>
+            <if test="bo.businessId != null">
+                and ub.business_id = #{bo.businessId}
+            </if>
+        </where>
+    </select>
+
+    <sql id="whereByStatis">
+        <where>
+            <if test="bo.mobile != null and bo.mobile != ''">
+                and u.mobile like concat('%',#{bo.mobile},'%')
+            </if>
+            <if test="bo.nickname != null and bo.nickname != ''">
+                and u.nickname like concat('%',#{bo.nickname},'%')
+            </if>
+            <if test="bo.createDayStart != null">
+                and u.create_day &gt;= #{bo.createDayStart}
+            </if>
+            <if test="bo.createDayEnd != null">
+                and u.create_day &lt;= #{bo.createDayEnd}
+            </if>
+        </where>
+    </sql>
 </mapper>