diff --git a/CatmDogd-Mall-Front-test/.env.development b/CatmDogd-Mall-Front-test/.env.development index d8a74eb..11fd0f5 100644 --- a/CatmDogd-Mall-Front-test/.env.development +++ b/CatmDogd-Mall-Front-test/.env.development @@ -8,7 +8,7 @@ VUE_APP_TITLE = 下单伴宠师综合管理平台 # VUE_APP_BASE_API = 'https://api.catmdogd.com' # VUE_APP_BASE_API = 'https://pet-admin.hhlm1688.com/api/' # VUE_APP_BASE_API = 'http://h5.xzaiyp.top' -VUE_APP_BASE_API = 'http://localhost:8002' +VUE_APP_BASE_API = 'http://localhost:8003' # 路由懒加载 VUE_CLI_BABEL_TRANSPILE_MODULES = true diff --git a/CatmDogd-Mall-Front-test/src/views/model/AppletConfig/hhindex.vue b/CatmDogd-Mall-Front-test/src/views/model/AppletConfig/hhindex.vue index c8d5da8..a5377c4 100644 --- a/CatmDogd-Mall-Front-test/src/views/model/AppletConfig/hhindex.vue +++ b/CatmDogd-Mall-Front-test/src/views/model/AppletConfig/hhindex.vue @@ -99,6 +99,7 @@ + @@ -158,10 +159,13 @@ + + + - - - + + + diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index e914046..e4becd1 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -20,7 +20,7 @@ ruoyi: # 开发环境配置.0 server: # 服务器的HTTP端口,默认为8080 - port: 8002 + port: 8003 servlet: # 应用的访问路径 context-path: / diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletHhrWorkOutController.java b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletHhrWorkOutController.java index 0ee6b3b..3dab594 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletHhrWorkOutController.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletHhrWorkOutController.java @@ -1,17 +1,24 @@ package com.ruoyi.applet.contoller; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.cyl.manager.oms.domain.Order; +import com.cyl.manager.oms.mapper.OrderMapper; import com.cyl.manager.ums.domain.Member; import com.cyl.manager.ums.mapper.MemberMapper; import com.cyl.manager.ums.pojo.query.MemberQuery; import com.cyl.manager.ums.pojo.vo.MemberDataStatisticsVO; import com.cyl.manager.ums.pojo.vo.MemberExtendVo; import com.cyl.manager.ums.service.MemberService; +import com.github.pagehelper.PageHelper; import com.ruoyi.applet.pojo.dto.ApiQueryIIdDTO; import com.ruoyi.applet.pojo.dto.ApiQueryIIdMyUserDTO; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.SortUtil; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.model.domain.AppBanner; import com.ruoyi.model.domain.AppUsers; +import com.ruoyi.model.domain.AppletAmountLog; import com.ruoyi.model.domain.AppletUsers; import com.ruoyi.model.service.*; import io.swagger.annotations.Api; @@ -46,6 +53,12 @@ public class ApiAppletHhrWorkOutController { @Resource private IAppUsersService appUsersService; + @Resource + private OrderMapper orderMapper; + + @Resource + private IAppletAmountLogService appletAmountLogService; + //合伙人工作台 - 绑定用户基础信息 @ApiOperation("合伙人工作台 - 绑定用户基础信息") @@ -85,22 +98,59 @@ public class ApiAppletHhrWorkOutController { AppUsers appUsers = appUsersService.selectAppUsersByUserId(dto.getAppUserId()); + if (StringUtils.isEmpty(appUsers.getInvitationCode())){ + return ResponseEntity.ok(new PageImpl<>(new ArrayList<>())); + } + +// MemberQuery query = new MemberQuery(); +// query.setInviteCode(appUsers.getInvitationCode()); +// List list = service.selectList(query, page); + + + if (page != null) { + PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize(), SortUtil.sort2string(page.getSort(),"id desc")); + } - MemberQuery query = new MemberQuery(); - query.setInviteCode(appUsers.getInvitationCode()); - List list = service.selectList(query, page); + List list = memberMapper.selectList(Wrappers.lambdaQuery() + .eq(Member::getInviteCode, appUsers.getInvitationCode())); List memberExtendVoList = new ArrayList<>(); list.forEach(member -> { MemberExtendVo memberExtendVo = new MemberExtendVo(); BeanUtils.copyProperties(member, memberExtendVo); MemberDataStatisticsVO mds = service.viewStatistics(member.getId()); + + if (mds.getOrderCount() == 0 && dto.getState() != 0 + || mds.getOrderCount() > 0 && dto.getState() == 0){ + return; + } + BeanUtils.copyProperties(mds, memberExtendVo); memberExtendVo.setPhoneHidden(service.getPhoneDecrypted(memberExtendVo.getPhoneEncrypted())); - //lzx-增加了一个邀请码的回显 - memberExtendVo.setInviteCode(member.getInviteCode()); + //查询最近下单时间 + Order order = orderMapper.selectOne(Wrappers.lambdaQuery() + .select(Order::getCreateTime) + .orderByDesc(Order::getCreateTime) + .last("limit 1")); + memberExtendVo.setOrderTime(order.getCreateTime()); + + //查询累计报酬 + List amountLogs = appletAmountLogService.lambdaQuery() + .select(AppletAmountLog::getAmount) + .eq(AppletAmountLog::getUserId, appUsers.getUserId()) + .eq(AppletAmountLog::getFormId, member.getId()) + .eq(AppletAmountLog::getType, 0) + .eq(AppletAmountLog::getMoneyType, 0) + .list(); + + // 统计金额总和 + BigDecimal totalAmount = amountLogs.stream() + .map(AppletAmountLog::getAmount) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + memberExtendVo.setUserAmount(totalAmount); memberExtendVoList.add(memberExtendVo); }); diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallUserTeacherController.java b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallUserTeacherController.java index eafffcc..c77c96b 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallUserTeacherController.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallUserTeacherController.java @@ -3,11 +3,15 @@ package com.ruoyi.applet.contoller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.cyl.manager.staff.domain.vo.StaffVO; +import com.cyl.manager.ums.domain.Member; import com.cyl.manager.ums.mapper.MemberMapper; +import com.cyl.manager.ums.service.MemberWechatService; import com.ruoyi.applet.mallpojo.TeacherListRequest; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.model.domain.*; import com.ruoyi.model.service.*; import io.swagger.annotations.Api; @@ -17,6 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.text.SimpleDateFormat; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -42,6 +47,9 @@ public class ApiMallUserTeacherController extends BaseController { @Autowired private MemberMapper memberMapper; + @Autowired + private MemberWechatService memberWechatService; + //mall-首页周边伴宠师 @ApiOperation("mall-首页周边伴宠师接口") @GetMapping("/getTeacherListIndex") @@ -337,10 +345,33 @@ public class ApiMallUserTeacherController extends BaseController { + //mall端-下单端用户通过邀请码绑定伴宠师 + @ApiOperation("mall端-下单端用户通过邀请码绑定伴宠师") + @GetMapping("/bindCode") + public AjaxResult bindCode(String code, String openId) { + if (StringUtils.isEmpty(openId)){ + throw new ServiceException("openId不能为空"); + } + Member member = memberWechatService.isRegister(openId); + if (member == null){ + throw new ServiceException("用户不存在"); + } + //判断当前用户有没有绑定 + if (StringUtils.isNotEmpty(member.getInviteCode())){ + throw new ServiceException("已经绑定过了"); + } + + AppUsers users = appUsersService.bindCode(code); + member.setInviteCode(code); + member.setSpreadTime(LocalDateTime.now()); + member.setSpreadUid(users.getUserId()); + memberMapper.updateById(member); + return AjaxResult.success(); + } diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/applet/service/impl/IApiMallOrderServiceImpl.java b/ruoyi-catdog/src/main/java/com/ruoyi/applet/service/impl/IApiMallOrderServiceImpl.java index a14ffab..13f5122 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/applet/service/impl/IApiMallOrderServiceImpl.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/applet/service/impl/IApiMallOrderServiceImpl.java @@ -212,13 +212,11 @@ public class IApiMallOrderServiceImpl implements IApiMallOrderService { item.setService(orderServiceInfo); - OmsOrderService omsOrderService = new OmsOrderService(); omsOrderService.setOrderId(item.getOrderId()); List orderServiceList = omsOrderServiceMapper.selectListBySql(omsOrderService); - // 使用一个 Set 来跟踪已经添加的 PetVO 的 id Set addedPetIds = new HashSet<>(); List petVOList = new ArrayList<>(); diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/model/domain/AppUsers.java b/ruoyi-catdog/src/main/java/com/ruoyi/model/domain/AppUsers.java index a36e24d..1e1db5b 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/model/domain/AppUsers.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/model/domain/AppUsers.java @@ -5,6 +5,7 @@ import java.time.LocalDateTime; import java.util.List; import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.annotation.Excel; import io.swagger.annotations.ApiModelProperty; @@ -19,6 +20,7 @@ public class AppUsers { private static final long serialVersionUID = 1L; /** 用户编号 */ + @TableId private Long userId; /** 创建人 */ @@ -98,6 +100,10 @@ public class AppUsers { @Excel(name = "邀请码") private String invitationCode; + /** 邀请人数 */ + @Excel(name = "邀请人数") + private Integer invitationNumber; + /** 保证金 */ @Excel(name = "保证金") private BigDecimal baoPrice; diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/model/domain/AppletAmountLog.java b/ruoyi-catdog/src/main/java/com/ruoyi/model/domain/AppletAmountLog.java index b5b99f3..c87d68f 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/model/domain/AppletAmountLog.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/model/domain/AppletAmountLog.java @@ -2,6 +2,8 @@ package com.ruoyi.model.domain; import java.math.BigDecimal; +import com.cyl.manager.oms.domain.Order; +import com.cyl.manager.ums.domain.Member; import lombok.Data; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; @@ -30,7 +32,7 @@ public class AppletAmountLog extends BaseEntity private BigDecimal amount; /** 类型 */ - @Excel(name = "类型") + @Excel(name = "类型 0收入 1支出") private Integer type; /** 删除标识 */ @@ -46,7 +48,7 @@ public class AppletAmountLog extends BaseEntity /** 钱包类型 */ - @Excel(name = "钱包类型") + @Excel(name = "钱包类型 0合伙人余额 1伴宠师余额 2保证金余额") private Integer moneyType; /** 提现者姓名 */ @@ -61,4 +63,10 @@ public class AppletAmountLog extends BaseEntity /** 审核状态(0待审核1通过2不通过) */ @Excel(name = "审核状态(0待审核1通过2不通过)") private Integer auditStatus; + + @Excel(name = "金额来源用户") + private Long formId; + + @Excel(name = "金额关联订单") + private Long orderId; } diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/model/domain/AppletConfig.java b/ruoyi-catdog/src/main/java/com/ruoyi/model/domain/AppletConfig.java index 300fccd..731caf7 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/model/domain/AppletConfig.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/model/domain/AppletConfig.java @@ -156,6 +156,10 @@ public class AppletConfig @Excel(name = "参数值-数值") private Integer paramValueNum; + /** 参数值-达成人数 */ + @Excel(name = "参数值-达成人数") + private Integer paramCondition; + /** 参数值-百分比 */ @Excel(name = "参数值-百分比") private BigDecimal paramValueNo; diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/model/service/IAppUsersService.java b/ruoyi-catdog/src/main/java/com/ruoyi/model/service/IAppUsersService.java index 0349bf0..4b309dd 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/model/service/IAppUsersService.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/model/service/IAppUsersService.java @@ -67,4 +67,8 @@ public interface IAppUsersService extends IService public List filterQualifiedUsers(filterQualifiedUsersVo filterVo); + + String getUserCode(Long appUserId); + + AppUsers bindCode(String code); } diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/model/service/IAppletConfigService.java b/ruoyi-catdog/src/main/java/com/ruoyi/model/service/IAppletConfigService.java index 382e351..e0b466f 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/model/service/IAppletConfigService.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/model/service/IAppletConfigService.java @@ -1,6 +1,8 @@ package com.ruoyi.model.service; import java.util.List; + +import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.model.domain.AppletConfig; /** @@ -9,7 +11,7 @@ import com.ruoyi.model.domain.AppletConfig; * @author ruoyi * @date 2025-03-28 */ -public interface IAppletConfigService +public interface IAppletConfigService extends IService { /** * 查询配置信息 @@ -18,6 +20,8 @@ public interface IAppletConfigService * @return 配置信息 */ public AppletConfig selectAppletConfigById(Long id); + + public AppletConfig selectAppletConfigByClassAndNum(String paramClass,Integer paramValueNum); /** * 查询配置信息列表 diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AApiAppletHhrWorkOutServiceImpl.java b/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AApiAppletHhrWorkOutServiceImpl.java index 369f0d6..a0f7501 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AApiAppletHhrWorkOutServiceImpl.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AApiAppletHhrWorkOutServiceImpl.java @@ -1,6 +1,10 @@ package com.ruoyi.model.service.impl; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.cyl.manager.oms.domain.Order; +import com.cyl.manager.oms.mapper.OrderMapper; import com.cyl.manager.ums.domain.Member; +import com.cyl.manager.ums.mapper.MemberMapper; import com.cyl.manager.ums.pojo.query.MemberQuery; import com.cyl.manager.ums.pojo.vo.MemberDataStatisticsVO; import com.cyl.manager.ums.pojo.vo.MemberExtendVo; @@ -9,9 +13,11 @@ import com.ruoyi.applet.utils.conf.AppletUtil; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.model.domain.AppUsers; +import com.ruoyi.model.domain.AppletAmountLog; import com.ruoyi.model.domain.AppletConfig; import com.ruoyi.model.service.IAApiAppletHhrWorkOutService; import com.ruoyi.model.service.IAppUsersService; +import com.ruoyi.model.service.IAppletAmountLogService; import com.ruoyi.model.service.IAppletConfigService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; @@ -23,7 +29,12 @@ import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.RequestBody; import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.time.temporal.TemporalAdjusters; import java.util.*; +import java.util.stream.Collectors; @Slf4j @Service @@ -36,10 +47,17 @@ public class AApiAppletHhrWorkOutServiceImpl implements IAApiAppletHhrWorkOutSer @Resource private IAppletConfigService appletConfigService; - @Resource private MemberService memberService; - + + @Resource + private MemberMapper memberMapper; + + @Resource + private OrderMapper orderMapper; + + @Resource + private IAppletAmountLogService appletAmountLogService; //合伙人工作台 - 绑定用户基础信息 @Override @@ -52,45 +70,39 @@ public class AApiAppletHhrWorkOutServiceImpl implements IAApiAppletHhrWorkOutSer Map map = new HashMap<>(); map.put("info",appUsers); //用户信息 // map.put("partner_level","初级合伙人"); //合伙人等级 - map.put("partner_day","138天"); //合伙人加入天数 + + // 计算合伙人入住天数 + long partnerDays = 0; + if (appUsers.getCreateTime() != null) { + LocalDateTime createTime = appUsers.getCreateTime(); + LocalDateTime now = LocalDateTime.now(); + partnerDays = ChronoUnit.DAYS.between(createTime, now); + } + map.put("partner_day", partnerDays + "天"); //合伙人加入天数 AppletConfig petPaymentHh = appletConfigService.selectAppletConfigByClassAndNum("pet_payment_hh", appUsers.getUserHhRole()); - map.put("partner_new_num",petPaymentHh.getParamValueText()); //合伙人当前合伙人比例 + if (petPaymentHh != null){ + map.put("partner_new_num",petPaymentHh.getParamValueText()); //合伙人当前合伙人比例 + map.put("partner_new_image",petPaymentHh.getParamValueImage()); //合伙人当前合伙人比例 + }else { + map.put("partner_new_num", 0); //合伙人当前合伙人比例 + } AppletConfig partner_upgrade_num = appletConfigService.selectAppletConfigByClassAndNum("pet_payment_hh", appUsers.getUserHhRole()+1); - map.put("partner_upgrade_num",partner_upgrade_num.getParamValueText()); //合伙人晋级之后的合伙人比例 -// map.put("user_code","jsk66623"); //邀请码 + + if (partner_upgrade_num != null){ + map.put("partner_upgrade_num", partner_upgrade_num.getParamValueText()); //合伙人晋级之后的合伙人比例 + }else { + map.put("partner_upgrade_num", -1); //合伙人晋级之后的合伙人比例 + } + + map.put("user_code", appUsersService.getUserCode(appUserId)); //邀请码 map.put("user_code_bj","https://image.hhlm1688.com/img/work/log/indexInfo/11.png"); //邀请码背景图 map.put("user_code_fx","https://image.hhlm1688.com/img/work/log/indexInfo/11.png"); //分享海报背景图 map.put("user_code_url","https://image.hhlm1688.com/img/work/log/indexInfo/11.png"); //分销链接背景图 - map.put("register_users","0"); //当月注册用户 - map.put("order_users","0"); //当月下单用户 - map.put("use_users","0"); //当月有效用户 - - map.put("order_users_money","0"); //本月订单金额 - map.put("use_users_money","0"); //本月有效订单金额 - - - map.put("register_users_sum","0"); //累积注册用户 - map.put("order_users_sum","0"); //累积下单用户 - map.put("use_users_sum","0"); //累积有效用户 - - - map.put("order_users_sum_money","0"); //累积订单金额 - map.put("use_users_sum_money","0"); //累积有效订单金额 - - - - map.put("money",appUsers.getMoney()); //钱包金额 - map.put("new_money","0"); //本月分成 - map.put("old_money","0"); //累积分成 - - - - map.put("upgrade_register_num","5"); //距离下一个等级需要注册多少人 map.put("upgrade_order_num","20"); //距离下一个等级需要下单人数 @@ -105,6 +117,215 @@ public class AApiAppletHhrWorkOutServiceImpl implements IAApiAppletHhrWorkOutSer + // 获取用户邀请码 + String invitationCode = appUsersService.getUserCode(appUserId); + +// List memberIds = memberMapper.selectList(Wrappers.lambdaQuery() +// .select(Member::getId) +// .eq(Member::getInviteCode, invitationCode)) +// .stream().map(n -> n.getId()) +// .collect(Collectors.toList()); + + // 获取当月开始和结束时间 + LocalDateTime monthStart = LocalDateTime.now().with(TemporalAdjusters.firstDayOfMonth()).withHour(0).withMinute(0).withSecond(0).withNano(0); + LocalDateTime monthEnd = LocalDateTime.now().with(TemporalAdjusters.lastDayOfMonth()).withHour(23).withMinute(59).withSecond(59); + + // 统计当月注册用户(通过邀请码注册的用户) + Integer monthRegisterUsers = memberMapper.selectCount( + Wrappers.lambdaQuery() + .eq(Member::getInviteCode, invitationCode) + .ge(Member::getCreateTime, monthStart) + .le(Member::getCreateTime, monthEnd) + ); + + // 统计累积注册用户 + Integer totalRegisterUsers = memberMapper.selectCount( + Wrappers.lambdaQuery() + .eq(Member::getInviteCode, invitationCode) + ); + + // 获取通过邀请码注册的所有用户ID列表 + List invitedMembers = memberMapper.selectList( + Wrappers.lambdaQuery() + .select(Member::getId) + .eq(Member::getInviteCode, invitationCode) + ); + + List memberIds = new ArrayList<>(); + for (Member member : invitedMembers) { + memberIds.add(member.getId()); + } + + // 统计当月下单用户 + Integer monthOrderUsers = 0; + BigDecimal monthOrderMoney = BigDecimal.ZERO; + if (!memberIds.isEmpty()) { + // 获取当月下单的唯一用户ID列表 + List monthOrderList = orderMapper.selectList( + Wrappers.lambdaQuery() + .select(Order::getMemberId) + .in(Order::getMemberId, memberIds) + .notIn(Order::getStatus, 0, 4) // 排除待支付和已关闭订单 + .ge(Order::getCreateTime, monthStart) + .le(Order::getCreateTime, monthEnd) + .groupBy(Order::getMemberId) + ); + monthOrderUsers = monthOrderList.size(); + + // 统计当月订单金额 + List monthOrders = orderMapper.selectList( + Wrappers.lambdaQuery() + .select(Order::getPayAmount) + .in(Order::getMemberId, memberIds) + .notIn(Order::getStatus, 0, 4) // 排除待支付和已关闭订单 + .ge(Order::getCreateTime, monthStart) + .le(Order::getCreateTime, monthEnd) + ); + + for (Order order : monthOrders) { + if (order.getPayAmount() != null) { + monthOrderMoney = monthOrderMoney.add(order.getPayAmount()); + } + } + } + + // 统计累积下单用户 + Integer totalOrderUsers = 0; + BigDecimal totalOrderMoney = BigDecimal.ZERO; + if (!memberIds.isEmpty()) { + // 获取累积下单的唯一用户ID列表 + List totalOrderList = orderMapper.selectList( + Wrappers.lambdaQuery() + .select(Order::getMemberId) + .in(Order::getMemberId, memberIds) + .notIn(Order::getStatus, 0, 4) // 排除待支付和已关闭订单 + .groupBy(Order::getMemberId) + ); + totalOrderUsers = totalOrderList.size(); + + // 统计累积订单金额 + List totalOrders = orderMapper.selectList( + Wrappers.lambdaQuery() + .select(Order::getPayAmount) + .in(Order::getMemberId, memberIds) + .notIn(Order::getStatus, 0, 4) // 排除待支付和已关闭订单 + ); + + for (Order order : totalOrders) { + if (order.getPayAmount() != null) { + totalOrderMoney = totalOrderMoney.add(order.getPayAmount()); + } + } + } + + // 统计当月有效用户(已完成订单的用户) + Integer monthValidUsers = 0; + BigDecimal monthValidMoney = BigDecimal.ZERO; + if (!memberIds.isEmpty()) { + // 获取当月有效订单的唯一用户ID列表 + List monthValidUserList = orderMapper.selectList( + Wrappers.lambdaQuery() + .select(Order::getMemberId) + .in(Order::getMemberId, memberIds) + .eq(Order::getStatus, 3) // 已完成状态 + .ge(Order::getCreateTime, monthStart) + .le(Order::getCreateTime, monthEnd) + .groupBy(Order::getMemberId) + ); + monthValidUsers = monthValidUserList.size(); + + // 统计当月有效订单金额 + List monthValidOrders = orderMapper.selectList( + Wrappers.lambdaQuery() + .select(Order::getPayAmount) + .in(Order::getMemberId, memberIds) + .eq(Order::getStatus, 3) + .ge(Order::getCreateTime, monthStart) + .le(Order::getCreateTime, monthEnd) + ); + + for (Order order : monthValidOrders) { + if (order.getPayAmount() != null) { + monthValidMoney = monthValidMoney.add(order.getPayAmount()); + } + } + } + + // 统计累积有效用户 + Integer totalValidUsers = 0; + BigDecimal totalValidMoney = BigDecimal.ZERO; + if (!memberIds.isEmpty()) { + // 获取累积有效订单的唯一用户ID列表 + List totalValidUserList = orderMapper.selectList( + Wrappers.lambdaQuery() + .select(Order::getMemberId) + .in(Order::getMemberId, memberIds) + .eq(Order::getStatus, 3) + .groupBy(Order::getMemberId) + ); + totalValidUsers = totalValidUserList.size(); + + // 统计累积有效订单金额 + List totalValidOrders = orderMapper.selectList( + Wrappers.lambdaQuery() + .select(Order::getPayAmount) + .in(Order::getMemberId, memberIds) + .eq(Order::getStatus, 3) + ); + + for (Order order : totalValidOrders) { + if (order.getPayAmount() != null) { + totalValidMoney = totalValidMoney.add(order.getPayAmount()); + } + } + } + + // 统计当月分成收入 + List monthIncomes = appletAmountLogService.list( + Wrappers.lambdaQuery() + .eq(AppletAmountLog::getUserId, appUserId) + .eq(AppletAmountLog::getType, 0) // 收入 + .eq(AppletAmountLog::getMoneyType, 0) // 合伙人余额 + .ge(AppletAmountLog::getCreateTime, monthStart) + .le(AppletAmountLog::getCreateTime, monthEnd) + ); + + BigDecimal monthIncome = monthIncomes.stream() + .map(AppletAmountLog::getAmount) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + // 统计累积分成收入 + List totalIncomes = appletAmountLogService.list( + Wrappers.lambdaQuery() + .eq(AppletAmountLog::getUserId, appUserId) + .eq(AppletAmountLog::getType, 0) // 收入 + .eq(AppletAmountLog::getMoneyType, 0) // 合伙人余额 + ); + + BigDecimal totalIncome = totalIncomes.stream() + .map(AppletAmountLog::getAmount) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + map.put("register_users", monthRegisterUsers); //当月注册用户 + map.put("order_users", monthOrderUsers); //当月下单用户 + map.put("use_users", monthValidUsers); //当月有效用户 + + map.put("order_users_money", monthOrderMoney); //本月订单金额 + map.put("use_users_money", monthValidMoney); //本月有效订单金额 + + map.put("register_users_sum", totalRegisterUsers); //累积注册用户 + map.put("order_users_sum", totalOrderUsers); //累积下单用户 + map.put("use_users_sum", totalValidUsers); //累积有效用户 + + map.put("order_users_sum_money", totalOrderMoney); //累积订单金额 + map.put("use_users_sum_money", totalValidMoney); //累积有效订单金额 + + map.put("money", appUsers.getMoney()); //钱包金额 + map.put("new_money", monthIncome); //本月分成 + map.put("old_money", totalIncome); //累积分成 + + + return AjaxResult.success(map); } diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AApiAppletLoginServiceImpl.java b/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AApiAppletLoginServiceImpl.java index 707cf09..918c43c 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AApiAppletLoginServiceImpl.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AApiAppletLoginServiceImpl.java @@ -88,9 +88,9 @@ public class AApiAppletLoginServiceImpl implements IAApiAppletLoginService { appUsers.setUserHhRole(0); //初始化合伙人角色 //初始化合伙人佣金 appUsers.setMoney(new BigDecimal(0)); - appUsers.setInvitationCode(String.valueOf(appletId)); +// appUsers.setInvitationCode(String.valueOf(appletId)); appUsersService.insertAppUsers(appUsers); - + appUsersService.getUserCode(appletId); LoginApplet loginApplet = new LoginApplet(); loginApplet.setAppletId(appletId); String appletToken = tokenService.createAppletToken(loginApplet); diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppUsersServiceImpl.java b/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppUsersServiceImpl.java index 08e2a67..7917665 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppUsersServiceImpl.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppUsersServiceImpl.java @@ -6,6 +6,7 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Random; import java.util.stream.Collectors; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; @@ -15,6 +16,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.cyl.manager.oms.domain.OmsOrderService; import com.cyl.manager.oms.mapper.OmsOrderServiceMapper; import com.ruoyi.applet.pojo.dto.filterQualifiedUsersVo; +import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.model.domain.AppletAddress; @@ -22,6 +24,7 @@ import com.ruoyi.model.domain.AppletOrder; import com.ruoyi.model.domain.AppletOutDate; import com.ruoyi.model.service.IAppletAddressService; import com.ruoyi.model.service.IAppletOutDateService; +import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.model.mapper.AppUsersMapper; @@ -35,6 +38,7 @@ import com.ruoyi.model.service.IAppUsersService; * @date 2025-03-27 */ @Service +@Log4j2 public class AppUsersServiceImpl extends ServiceImpl implements IAppUsersService { @Autowired @@ -237,4 +241,72 @@ public class AppUsersServiceImpl extends ServiceImpl i return qualifiedTechnicians; } + + /** + * 生成唯一的6位字母数字邀请码 + * @return 6位字母数字组合的邀请码 + */ + private String generateUniqueInvitationCode() { + String characters = "abcdefghijklmnopqrstuvwxyz0123456789"; + Random random = new Random(); + String code; + + do { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 6; i++) { + sb.append(characters.charAt(random.nextInt(characters.length()))); + } + code = sb.toString(); + } while (isInvitationCodeExists(code)); // 确保邀请码唯一 + + return code; + } + + /** + * 检查邀请码是否已存在 + * @param code 邀请码 + * @return true表示已存在,false表示不存在 + */ + private boolean isInvitationCodeExists(String code) { + return appUsersMapper.selectCount( + Wrappers.lambdaQuery() + .eq(AppUsers::getInvitationCode, code) + ) > 0; + } + + @Override + public String getUserCode(Long appUserId) { + + AppUsers byId = getById(appUserId); + + if (byId == null){ + log.error("用户不存在 ID:{}", appUserId); + return null; + } + + if (StringUtils.isNotEmpty(byId.getInvitationCode())){ + return byId.getInvitationCode(); + } + + //生成邀请码 + String invitationCode = generateUniqueInvitationCode(); + byId.setInvitationCode(invitationCode); + updateById(byId); + + return byId.getInvitationCode(); + } + + @Override + public AppUsers bindCode(String code) { + AppUsers users = lambdaQuery().eq(AppUsers::getInvitationCode, code).one(); + if (users == null){ + throw new ServiceException("无效的邀请码"); + } + users.setInvitationNumber(users.getInvitationNumber() + 1); + updateById(users); + + //TODO 检查是否满足升级条件 + + return users; + } } diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppletConfigServiceImpl.java b/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppletConfigServiceImpl.java index c4bba18..ee70a8b 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppletConfigServiceImpl.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppletConfigServiceImpl.java @@ -3,8 +3,10 @@ package com.ruoyi.model.service.impl; import java.util.List; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.model.mapper.AppletConfigMapper; @@ -18,7 +20,7 @@ import com.ruoyi.model.service.IAppletConfigService; * @date 2025-03-28 */ @Service -public class AppletConfigServiceImpl implements IAppletConfigService +public class AppletConfigServiceImpl extends ServiceImpl implements IAppletConfigService { @Autowired private AppletConfigMapper appletConfigMapper; @@ -32,13 +34,17 @@ public class AppletConfigServiceImpl implements IAppletConfigService @Override public AppletConfig selectAppletConfigById(Long id) { - return appletConfigMapper.selectAppletConfigById(id); + return appletConfigMapper.selectById(id); } @Override public AppletConfig selectAppletConfigByClassAndNum(String paramClass,Integer paramValueNum){ - return appletConfigMapper.selectAppletConfigByClassAndNum(paramClass,paramValueNum); +// return appletConfigMapper.selectAppletConfigByClassAndNum(paramClass,paramValueNum); + + return lambdaQuery().eq(AppletConfig::getParamClass, paramClass) + .eq(AppletConfig::getParamValueNum, paramValueNum) + .one(); } /** @@ -50,7 +56,15 @@ public class AppletConfigServiceImpl implements IAppletConfigService @Override public List selectAppletConfigList(AppletConfig appletConfig) { - return appletConfigMapper.selectAppletConfigList(appletConfig); + if (appletConfig == null){ + appletConfig = new AppletConfig(); + } + return appletConfigMapper.selectList(Wrappers.lambdaQuery() + .eq(StringUtils.isNotEmpty(appletConfig.getParamCode()), AppletConfig::getParamCode, appletConfig.getParamCode()) + .like(StringUtils.isNotEmpty(appletConfig.getParamValueText()), AppletConfig::getParamValueText, appletConfig.getParamValueText()) + .like(StringUtils.isNotEmpty(appletConfig.getParamValue()), AppletConfig::getParamValue, appletConfig.getParamValue()) + .eq(StringUtils.isNotEmpty(appletConfig.getParamClass()), AppletConfig::getParamClass, appletConfig.getParamClass()) + ); } /** @@ -63,7 +77,7 @@ public class AppletConfigServiceImpl implements IAppletConfigService public int insertAppletConfig(AppletConfig appletConfig) { appletConfig.setCreateTime(DateUtils.getNowDate()); - return appletConfigMapper.insertAppletConfig(appletConfig); + return appletConfigMapper.insert(appletConfig); } /** @@ -76,7 +90,7 @@ public class AppletConfigServiceImpl implements IAppletConfigService public int updateAppletConfig(AppletConfig appletConfig) { appletConfig.setUpdateTime(DateUtils.getNowDate()); - return appletConfigMapper.updateAppletConfig(appletConfig); + return appletConfigMapper.updateById(appletConfig); } /** diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5PetService.java b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5PetService.java index 77ecc74..1d000a1 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5PetService.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5PetService.java @@ -32,6 +32,9 @@ public class H5PetService { public PetVO selectPetById(Integer id){ Pet pet = petMapper.selectById(id); PetVO petVO = convert.do2vo(pet); + if(petVO == null){ + return null; + } if(!StringUtils.isEmpty(pet.getPersonality())){ List list = Arrays.asList(pet.getPersonality().split(",")); petVO.setPersonality(list); diff --git a/ruoyi-mall/src/main/java/com/cyl/manager/ums/pojo/vo/MemberExtendVo.java b/ruoyi-mall/src/main/java/com/cyl/manager/ums/pojo/vo/MemberExtendVo.java index 21034e7..36b1f42 100644 --- a/ruoyi-mall/src/main/java/com/cyl/manager/ums/pojo/vo/MemberExtendVo.java +++ b/ruoyi-mall/src/main/java/com/cyl/manager/ums/pojo/vo/MemberExtendVo.java @@ -1,5 +1,6 @@ package com.cyl.manager.ums.pojo.vo; +import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseAudit; import io.swagger.annotations.ApiModelProperty; @@ -8,6 +9,8 @@ import lombok.Data; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.Date; @Data public class MemberExtendVo extends BaseAudit { @@ -70,6 +73,7 @@ public class MemberExtendVo extends BaseAudit { @ApiModelProperty("推广员关联时间") @Excel(name = "推广员关联时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime spreadTime; @ApiModelProperty("等级") @@ -92,9 +96,14 @@ public class MemberExtendVo extends BaseAudit { @ApiModelProperty("售后数") private Integer aftersaleCount; - - //lzx-增加一个邀请码字段 @Excel(name = "用户填写的邀请码") private String inviteCode; + + + @ApiModelProperty("最近下单") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime orderTime; + @ApiModelProperty("累计报酬") + private BigDecimal userAmount; } diff --git a/ruoyi-mall/src/main/java/com/cyl/manager/ums/pojo/vo/MemberV2VO.java b/ruoyi-mall/src/main/java/com/cyl/manager/ums/pojo/vo/MemberV2VO.java index 3f74676..05e404a 100644 --- a/ruoyi-mall/src/main/java/com/cyl/manager/ums/pojo/vo/MemberV2VO.java +++ b/ruoyi-mall/src/main/java/com/cyl/manager/ums/pojo/vo/MemberV2VO.java @@ -115,4 +115,7 @@ public class MemberV2VO extends BaseAudit { /** 订单数量 */ private Integer orderNumber; + @Excel(name = "用户填写的邀请码") + private String inviteCode; + }