ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/UserListQueryDto.java
New file @@ -0,0 +1,14 @@ package com.ruoyi.account.api.dto; import com.ruoyi.common.core.web.page.BasePage; import lombok.Data; @Data public class UserListQueryDto extends BasePage { String userPhone; String cityCode; Integer status; Integer userTagId; Integer vipTypeId; Integer companyId; } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUser.java
@@ -104,4 +104,14 @@ private LocalDateTime lastLoginTime; @ApiModelProperty(value = "标签名称") @TableField(exist = false) private String tagName; @ApiModelProperty(value = "vip名称") @TableField(exist = false) private String vipName; } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserVipDetail.java
New file @@ -0,0 +1,57 @@ package com.ruoyi.account.api.model; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; import java.time.LocalDateTime; /** * <p> * * </p> * * @author luodangjia * @since 2024-08-08 */ @Data @EqualsAndHashCode(callSuper = false) @TableName("t_app_user_vip_detail") @ApiModel(value="TAppUserVipDetail对象", description="") public class TAppUserVipDetail implements Serializable { private static final long serialVersionUID = 1L; @TableId("id") private Long id; @ApiModelProperty(value = "用户id") @TableField("app_user_id") private Long appUserId; @ApiModelProperty(value = "剩余充电次数") @TableField("charge_num") private Integer chargeNum; @ApiModelProperty(value = "会员id") @TableField("vip_id") private Integer vipId; @ApiModelProperty(value = "会员开始时间") @TableField("start_time") private LocalDateTime startTime; @ApiModelProperty(value = "会员结束时间") @TableField("end_time") private LocalDateTime endTime; @TableField("create_time") private LocalDateTime createTime; } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/OtherFallbackFactory.java
@@ -6,12 +6,14 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.other.api.domain.TCompany; import com.ruoyi.other.api.domain.TUserTag; import com.ruoyi.other.api.feignClient.GoodsClient; import com.ruoyi.other.api.feignClient.OtherClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; /** * 商品服务降级处理 @@ -57,6 +59,21 @@ public R deleteTag(Integer id) { return R.fail("查询标签:" + throwable.getMessage()); } @Override public R<Map<Integer, String>> getTagMap(List<Integer> ids) { return R.fail("查询标签map:" + throwable.getMessage()); } @Override public R<TUserTag> getByIdTag(Integer id) { return R.fail("查询标签:" + throwable.getMessage()); } @Override public R<Map<Integer, String>> getVipMap(List<Integer> ids) { return R.fail("获取会员map:" + throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/OtherClient.java
@@ -7,12 +7,14 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.other.api.domain.TCompany; import com.ruoyi.other.api.domain.TUserTag; import com.ruoyi.other.api.factory.GoodsFallbackFactory; import com.ruoyi.other.api.factory.OtherFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import java.util.List; import java.util.Map; /** * 商品服务 @@ -38,6 +40,26 @@ //用户新增标签 @PostMapping(value = "/t-user-tag/addorUpdateTag") R addorUpdateTag(@RequestBody TUserTag tUserTag); //删除用户标签 @PostMapping(value = "/t-user-tag/delete") R deleteTag(@RequestParam Integer id); //获取标签Map @PostMapping(value = "/t-user-tag/getTagMap") R<Map<Integer, String>> getTagMap(@RequestBody List<Integer> ids); //获取标签 @PostMapping(value = "/t-user-tag/getById") R<TUserTag> getByIdTag(@RequestParam Integer id); @PostMapping(value = "/vip/getVipMap") R<Map<Integer, String>> getVipMap(@RequestBody List<Integer> ids); } ruoyi-service/ruoyi-account/pom.xml
@@ -112,6 +112,12 @@ <version>3.6.2</version> <scope>compile</scope> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> <scope>compile</scope> </dependency> </dependencies> ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
@@ -4,11 +4,17 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.account.api.dto.UnitListQueryDto; import com.ruoyi.account.api.dto.UserListQueryDto; import com.ruoyi.account.api.model.TAppUser; import com.ruoyi.account.api.model.TAppUserTag; import com.ruoyi.account.api.model.TAppUserVipDetail; import com.ruoyi.account.service.TAppUserService; import com.ruoyi.account.service.TAppUserTagService; import com.ruoyi.account.service.TAppUserVipDetailService; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.security.annotation.RequiresPermissions; import com.ruoyi.other.api.domain.TCompany; import com.ruoyi.other.api.domain.TUserTag; import com.ruoyi.other.api.feignClient.OtherClient; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -16,6 +22,13 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.time.Duration; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * <p> @@ -33,7 +46,11 @@ private OtherClient otherClient; @Resource private TAppUserService appUserService; @Resource private TAppUserTagService appUserTagService; @Resource private TAppUserVipDetailService tAppUserVipDetailService; @ApiOperation(value = "单位管理列表", tags = {"用户管理-单位管理"}) @PostMapping(value = "/unit/page") public R<Page<TCompany>> unitPage(@RequestBody UnitListQueryDto unitListQueryDto) { @@ -63,21 +80,103 @@ } @ApiOperation(value = "用户列表", tags = {"用户管理-用户管理"}) @ApiOperation(value = "用户列表", tags = {"用户管理-用户列表"}) @PostMapping(value = "/user/page") public R<Page<TCompany>> userPage(@RequestBody UnitListQueryDto unitListQueryDto) { public R<Page<TAppUser>> userPage(@RequestBody UserListQueryDto userListQueryDto) { List<Long> userIds = new ArrayList<>(); //拿到标签tag //如果要筛选标签。用标签获取useids if (userListQueryDto.getUserTagId() != null){ userIds = appUserTagService.lambdaQuery().eq(TAppUserTag::getUserTagId, userListQueryDto.getUserTagId()).list().stream().map(TAppUserTag::getAppUserId).collect(Collectors.toList()); } //拿到会员map //列表查询 Page<TAppUser> page = appUserService.lambdaQuery() .like(userListQueryDto.getUserPhone() != null && !"".equals(userListQueryDto.getUserPhone()), TAppUser::getPhone, userListQueryDto.getUserPhone()) .eq(userListQueryDto.getCompanyId() != null, TAppUser::getCompanyId, userListQueryDto.getCompanyId()) .eq(userListQueryDto.getCityCode() != null && !"".equals(userListQueryDto.getCityCode()), TAppUser::getCityCode, userListQueryDto.getCityCode()) .eq(userListQueryDto.getStatus() != null, TAppUser::getStatus, userListQueryDto.getStatus()) .eq(userListQueryDto.getVipTypeId() != null, TAppUser::getVipId, userListQueryDto.getVipTypeId()) .in(!userIds.isEmpty(),TAppUser::getId,userIds) .page(Page.of(userListQueryDto.getPageCurr(), userListQueryDto.getPageSize())); if (page.getRecords().isEmpty()){ return R.ok(page); } List<Integer> vipIds = new ArrayList<>(); vipIds = page.getRecords().stream().map(TAppUser::getVipId).collect(Collectors.toList()); //获取会员map R<Map<Integer, String>> vipMap = otherClient.getVipMap(vipIds); //循环处理 for (TAppUser appUser : page.getRecords()) { //拿到最新的tagId TAppUserTag one = appUserTagService.lambdaQuery().eq(TAppUserTag::getAppUserId, appUser.getId()).orderByDesc(TAppUserTag::getCreateTime).last("limit 1").one(); //设置最新的tagName R<TUserTag> byIdTag = otherClient.getByIdTag(one.getUserTagId()); if (byIdTag.getData()!=null) { appUser.setTagName(byIdTag.getData().getName()); } //匹配vipMap的值 appUser.setVipName(vipMap.getData().get(appUser.getVipId())); } return R.ok(page); } @ApiOperation(value = "用户添加编辑", tags = {"用户管理-用户列表"}) @PostMapping(value = "/user/addOrUpdate") public R addOrUpdate(@RequestBody TAppUser tAppUser) { if (tAppUser.getId() != null){ //为编辑操作,要进行vip的逻辑处理 TAppUser nowUser = appUserService.getById(tAppUser.getId()); //会员结束时间不为空 if (tAppUser.getVipEndTime()!=null&&tAppUser.getVipEndTime()!=nowUser.getVipEndTime()){ //计算改变后的结束时间和当前结束时间差距了多少时间 Duration duration = Duration.between(tAppUser.getVipEndTime(), nowUser.getVipEndTime()); List<TAppUserVipDetail> detailList = tAppUserVipDetailService.lambdaQuery().eq(TAppUserVipDetail::getAppUserId, tAppUser.getId()).gt(TAppUserVipDetail::getEndTime, LocalDateTime.now()).orderByAsc(TAppUserVipDetail::getStartTime).list(); //如果是增加,则将明细表里当前会员的结束时间往后移,并将其余未开始会员的开始时间和结束时间往后移 if (tAppUser.getVipEndTime().isAfter(nowUser.getVipEndTime())){ for (int i = 0; i < detailList.size(); i++) { TAppUserVipDetail tAppUserVipDetail = detailList.get(i); if (i == 0 ){ tAppUserVipDetail.setEndTime(tAppUser.getVipEndTime().plus(duration)); }else { tAppUserVipDetail.setStartTime(tAppUserVipDetail.getStartTime().plus(duration)); tAppUserVipDetail.setEndTime(tAppUserVipDetail.getEndTime().plus(duration)); } } }else { //如果是减少,将当前会员结束时间减少,并将其余会员开始和结束时间都往前移动 for (int i = 0; i < detailList.size(); i++) { TAppUserVipDetail tAppUserVipDetail = detailList.get(i); if (i == 0 ){ tAppUserVipDetail.setEndTime(tAppUser.getVipEndTime().minus(duration)); }else { tAppUserVipDetail.setStartTime(tAppUserVipDetail.getStartTime().minus(duration)); tAppUserVipDetail.setEndTime(tAppUserVipDetail.getEndTime().minus(duration)); } } } } } appUserService.saveOrUpdate(tAppUser); return R.ok(); } // @ApiOperation(value = "用户详情", tags = {"用户管理-用户列表"}) // @PostMapping(value = "/user/detail/{id}") // public R userDetail(@PathVariable Long id) { // TAppUser user = appUserService.getById(id); // if (user.getVipId()!=null) { // R<Map<Integer, String>> vipMap = otherClient.getVipMap(Arrays.asList(user.getVipId())); // user.setVipName(vipMap.getData().get(user.getVipId())); // } // //获取累计充电数量 // // } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/mapper/TAppUserVipDetailMapper.java
New file @@ -0,0 +1,16 @@ package com.ruoyi.account.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.account.api.model.TAppUserVipDetail; /** * <p> * Mapper 接口 * </p> * * @author luodangjia * @since 2024-08-08 */ public interface TAppUserVipDetailMapper extends BaseMapper<TAppUserVipDetail> { } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/TAppUserVipDetailService.java
New file @@ -0,0 +1,16 @@ package com.ruoyi.account.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.account.api.model.TAppUserVipDetail; /** * <p> * 服务类 * </p> * * @author luodangjia * @since 2024-08-08 */ public interface TAppUserVipDetailService extends IService<TAppUserVipDetail> { } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserVipDetailServiceImpl.java
New file @@ -0,0 +1,21 @@ package com.ruoyi.account.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.api.model.TAppUserVipDetail; import com.ruoyi.account.mapper.TAppUserVipDetailMapper; import com.ruoyi.account.service.TAppUserVipDetailService; import org.springframework.stereotype.Service; /** * <p> * 服务实现类 * </p> * * @author luodangjia * @since 2024-08-08 */ @Service public class TAppUserVipDetailServiceImpl extends ServiceImpl<TAppUserVipDetailMapper, TAppUserVipDetail> implements TAppUserVipDetailService { } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TUserTagController.java
@@ -13,6 +13,9 @@ import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * <p> @@ -28,6 +31,7 @@ @Resource private TUserTagService tUserTagService; //标签分页 @PostMapping(value = "/page") public R<Page<TUserTag>> page(@RequestBody TagListQueryDto tagListQueryDto) { Page<TUserTag> page = tUserTagService.lambdaQuery() @@ -37,20 +41,40 @@ return R.ok(page); } //标签新增修改 @PostMapping(value = "/addorUpdateTag") public R addorUpdateTag(@RequestBody TUserTag tUserTag) { tUserTag.setCreateTime(LocalDateTime.now()); tUserTagService.saveOrUpdate(tUserTag); return R.ok(); } //标签删除 @PostMapping(value = "/delete") public R delete(@RequestParam Integer id) { tUserTagService.removeById(id); return R.ok(); } //获取标签map @PostMapping(value = "/getTagMap") public R<Map<Integer, String>> getTagMap(@RequestBody List<Integer> ids) { List<TUserTag> list = tUserTagService.lambdaQuery().in(!ids.isEmpty(), TUserTag::getId, ids).list(); Map<Integer, String> idNameMap = list.stream() .collect(Collectors.toMap( TUserTag::getId, TUserTag::getName )); return R.ok(idNameMap); } @PostMapping(value = "/getById") public R<TUserTag> getById(@RequestParam Integer id) { return R.ok(tUserTagService.getById(id)); } } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java
@@ -5,6 +5,7 @@ import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.other.api.domain.TIntegralRule; import com.ruoyi.other.api.domain.TUserTag; import com.ruoyi.other.api.domain.TVip; import com.ruoyi.other.service.TVipService; import io.swagger.annotations.ApiImplicitParam; @@ -13,6 +14,10 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * <p> @@ -60,5 +65,18 @@ return AjaxResult.ok(vipService.pageList(pageCurr,pageSize)); } //获取会员Map @PostMapping(value = "/getVipMap") public R<Map<Integer, String>> getVipMap(@RequestBody List<Integer> ids) { List<TVip> list = vipService.lambdaQuery().in(!ids.isEmpty(), TVip::getId, ids).list(); Map<Integer, String> idNameMap = list.stream() .collect(Collectors.toMap( TVip::getId, TVip::getName )); return R.ok(idNameMap); } }