package com.ruoyi.account.controller;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.account.api.dto.*;
import com.ruoyi.account.api.model.*;
import com.ruoyi.account.service.*;
import com.ruoyi.account.util.*;
import com.ruoyi.account.util.carBrand.CarBrandUtil;
import com.ruoyi.account.wx.model.WeixinProperties;
import com.ruoyi.common.core.constant.Constants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.dto.PointChangeDto;
import com.ruoyi.common.core.enums.status.AppUserStatusEnum;
import com.ruoyi.common.core.utils.JwtUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.utils.bean.BeanUtils;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.domain.BasePojo;
import com.ruoyi.common.core.web.page.BasePage;
import com.ruoyi.common.log.annotation.Log;
import com.ruoyi.common.log.enums.BusinessType;
import com.ruoyi.common.log.enums.OperatorType;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.auth.AuthUtil;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.order.api.feignClient.ChargingOrderClient;
import com.ruoyi.order.api.feignClient.ExchangeOrderClient;
import com.ruoyi.order.api.model.TChargingOrder;
import com.ruoyi.order.api.model.TExchangeOrder;
import com.ruoyi.other.api.domain.*;
import com.ruoyi.other.api.domain.TCoupon;
import com.ruoyi.other.api.dto.UnitListQueryDto;
import com.ruoyi.other.api.feignClient.IntegralRuleClient;
import com.ruoyi.other.api.feignClient.OtherClient;
import com.ruoyi.other.api.feignClient.VipClient;
import com.ruoyi.system.api.model.LoginUserApplet;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* 前端控制器
*
*
* @author luodangjia
* @since 2024-08-06
*/
@Slf4j
@RestController
@RequestMapping("/t-app-user")
public class TAppUserController {
@Resource
private OtherClient otherClient;
@Resource
private TAppUserService appUserService;
@Resource
private TAppUserTagService appUserTagService;
@Resource
private TAppUserVipDetailService tAppUserVipDetailService;
@Resource
private ChargingOrderClient chargingOrderClient;
@Resource
private TAppUserCarService appUserCarService;
@Resource
private TAppUserIntegralChangeService integralChangeService;
@Resource
private SignDayUtil signDayUtil;
@Resource
private ExchangeOrderClient exchangeOrderClient;
@Autowired
private TokenService tokenService;
@Autowired
private RedisService redisService;
@Autowired
private WeixinProperties wxConfig;
@Autowired
private RestTemplate wxRestTemplate;
@Resource
private PointDetailUtil pointDetailUtil;
@Resource
private TAppUserSignService signService;
@Resource
private TAppCouponService appCouponService;
@Resource
private TAppUserCarService carService;
@Resource
private IntegralRuleClient integralRuleClient;
@Resource
private VipClient vipClient;
@Resource
private TInviteUserService inviteUserService;
@Resource
private GiveVipUtil giveVipUtil;
/**
* 远程调用 积分兑换订单 退款回退积分
* @return
*/
@PostMapping(value = "/refundPoints/{param}")
public R refundPoints(@PathVariable("param")String param) {
String[] split = param.split("-");
String userId = split[0];
String points = split[1];
TAppUser byId = appUserService.getById(userId);
byId.setPoints(byId.getPoints()+Integer.parseInt(points));
appUserService.updateById(byId);
return R.ok();
}
@ApiOperation(value = "查询当前用户是否为会员 0否1是", tags = {"小程序--查询当前用户是否为会员"})
@PostMapping(value = "/getUserInfo")
public AjaxResult getUserInfo() {
TAppUser byId = appUserService.getById(tokenService.getLoginUserApplet().getUserId());
if (byId.getVipEndTime() == null){
return AjaxResult.ok(0);
}else if (byId.getVipEndTime().isAfter(LocalDateTime.now())){
return AjaxResult.ok(1);
}else{
return AjaxResult.ok(0);
}
}
@ApiOperation(value = "管理后台-根据手机号查询用户ids", tags = {"管理后台-活动费用统计"})
@PostMapping(value = "/user/getUserIdsByPhone")
public R> getUserIdsByPhone(@RequestParam("phone") String phone) {
return R.ok(appUserService.list(new QueryWrapper().like("phone",phone)).stream().map(TAppUser::getId).collect(Collectors.toList()));
}
@ApiOperation(value = "单位管理列表", tags = {"用户管理-单位管理"})
@PostMapping(value = "/unit/page")
public R> unitPage(@RequestBody UnitListQueryDto unitListQueryDto) {
//拿到单位列表
R> pageR = otherClient.queryUnitPage(unitListQueryDto);
Page data = pageR.getData();
//拿到单位的用户数
for (TCompany record : data.getRecords()) {
record.setUserCount(appUserService.lambdaQuery().eq(TAppUser::getCompanyId, record.getId()).count());
}
return R.ok(data);
}
@ApiOperation(value = "单位下拉框", tags = {"用户管理-单位管理"})
@GetMapping(value = "/unit/select")
public R> unitSelect() {
UnitListQueryDto unitListQueryDto = new UnitListQueryDto();
unitListQueryDto.setPageCurr(1);
unitListQueryDto.setPageSize(9999);
//拿到单位列表
R> pageR = otherClient.queryUnitPage(unitListQueryDto);
return R.ok(pageR.getData().getRecords());
}
@ApiOperation(value = "单位管理添加或编辑", tags = {"用户管理-单位管理"})
@PostMapping(value = "/unit/addOrUpdate")
@Log(title = "【单位管理】添加或编辑单位", businessType = BusinessType.INSERT,operatorType = OperatorType.MANAGE)
public R add(@RequestBody TCompany tCompany) {
//拿到单位列表
otherClient.unitAddorUpadate(tCompany);
return R.ok();
}
@ApiOperation(value = "单位管理删除", tags = {"用户管理-单位管理"})
@DeleteMapping(value = "/unit/delete")
@Log(title = "【单位管理】删除单位", businessType = BusinessType.DELETE,operatorType = OperatorType.MANAGE)
public R add(@RequestParam String ids) {
List list = appUserService.lambdaQuery().in(TAppUser::getCompanyId, Arrays.asList(ids.split(","))).list();
if (!list.isEmpty()){
return R.fail("当前单位已存在用户,无法删除!");
}
String[] split = ids.split(",");
for (String s : split) {
otherClient.unitDelete(Integer.valueOf(s));
}
return R.ok();
}
@ApiOperation(value = "用户列表", tags = {"用户管理-用户列表"})
@PostMapping(value = "/user/page")
public R> userPage(@RequestBody UserListQueryDto userListQueryDto) {
List userIds = new ArrayList<>();
//如果要筛选标签。用标签获取useids
if (userListQueryDto.getUserTagId() != null){
userIds = appUserTagService.lambdaQuery().eq(TAppUserTag::getUserTagId, userListQueryDto.getUserTagId()).list().stream().map(TAppUserTag::getAppUserId).collect(Collectors.toList());
}
//列表查询
Page page = appUserService.lambdaQuery()
.like(userListQueryDto.getUserPhone() != null && !"".equals(userListQueryDto.getUserPhone()), TAppUser::getPhone, userListQueryDto.getUserPhone())
.eq(userListQueryDto.getCompanyId() != null, TAppUser::getCompanyId, userListQueryDto.getCompanyId())
.eq(userListQueryDto.getProvinceCode() != null && !"".equals(userListQueryDto.getProvinceCode()), TAppUser::getProvinceCode, userListQueryDto.getProvinceCode())
.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)
.orderByDesc(BasePojo::getCreateTime)
.page(Page.of(userListQueryDto.getPageCurr(), userListQueryDto.getPageSize()));
if (page.getRecords().isEmpty()){
return R.ok(page);
}
List vipIds = new ArrayList<>();
// vipIds = page.getRecords().stream().map(TAppUser::getVipId).collect(Collectors.toList());
//获取会员map
R