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.LambdaQueryWrapper;
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.constant.MsgConstants;
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.*;
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.annotation.Logical;
import com.ruoyi.common.security.annotation.RequiresPermissions;
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.feignClient.OrderClient;
import com.ruoyi.order.api.model.TChargingOrder;
import com.ruoyi.order.api.model.TExchangeOrder;
import com.ruoyi.order.api.model.TGrantVip;
import com.ruoyi.other.api.domain.*;
import com.ruoyi.other.api.domain.TCoupon;
import com.ruoyi.other.api.domain.TVip;
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.LoginUser;
import com.ruoyi.system.api.model.LoginUserApplet;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.utils.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.annotation.Resource;
import javax.mail.*;
import javax.mail.internet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.net.URL;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.TimeUnit;
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 OrderClient orderClient;
@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 RedisTemplate redisTemplate;
@Resource
private VipClient vipClient;
@Resource
private TInviteUserService inviteUserService;
@Resource
private GiveVipUtil giveVipUtil;
/**
* 远程调用 发送邮件
* @return
*/
@PostMapping(value = "/uploadPdf")
public R uploadPdf(@RequestBody UploadPdfDTO dto) {
// 发送邮箱
// 收件人电子邮箱,TODO 换成自己的收件箱
String to = dto.getMailBox();
// 发件人电子邮箱,TODO 换成自己的发件箱
String from = "13281306557@163.com";
// 指定发送邮件的主机为
String host = "smtp.163.com";
Properties properties = new Properties();
properties.put("mail.smtp.host", "smtp.163.com");
properties.put("mail.smtp.socketFactory.port", "465");
properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.port", "465");
properties.put("mail.smtp.ssl.enable", "true"); // 明确开启SSL
// 获取默认session对象
Session session = Session.getDefaultInstance(properties,new Authenticator(){
@Override
public javax.mail.PasswordAuthentication getPasswordAuthentication()
{
//发件人邮件用户名、授权码,换成自己的发件箱及授权码
return new PasswordAuthentication("13281306557@163.com", "NUSdxDQqadYvVek2");
}
});
try{
// 创建默认的 MimeMessage 对象
MimeMessage message = new MimeMessage(session);
// Set From,设置发件人
InternetAddress fromMail = new InternetAddress(from);
//设置发件人名称,TODO 换成自己的发件箱
fromMail.setPersonal(MimeUtility.encodeText("明星新能源科技有限公司<13281306557@163.com>"));
message.setFrom(fromMail);
// Set To: 设置收件人
InternetAddress toMail = new InternetAddress(to);
// TODO 换成自己的收件箱
InternetAddress toMail2 = new InternetAddress(to);
//发多个邮箱
Address[] allRecipients = {toMail, toMail2};
message.setRecipients(Message.RecipientType.TO, allRecipients);
// Set Subject: 邮件主体
message.setSubject("明星电力");
// 设置消息体
message.setSentDate(new Date());
javax.mail.internet.MimeMultipart msgMultipart = new MimeMultipart("mixed");
// 指定为混合关系
message.setContent(msgMultipart);
// 邮件信息组装
//组装的顺序非常重要,一定要先组装文本域,再组装文件
javax.mail.internet.MimeBodyPart htmlPart = new javax.mail.internet.MimeBodyPart();
// 组装内容
htmlPart.setContent("开票", "text/html;charset=UTF-8");
msgMultipart.addBodyPart(htmlPart);
// 组装附件
javax.mail.internet.MimeBodyPart filePart = new MimeBodyPart();
String imageUrl = dto.getInvoiceUrl();
try {
// 下载数据
URL url = new URL(imageUrl);
InputStream inputStream = url.openStream();
byte[] imageBytes = IOUtils.toByteArray(inputStream);
// 创建临时文件
// 截取imageUrl后缀名
String fileExtension = imageUrl.substring(imageUrl.lastIndexOf("."));
File tempFile = File.createTempFile("tempImage", fileExtension);
try (FileOutputStream fos = new FileOutputStream(tempFile)) {
fos.write(imageBytes);
}
// 创建 FileDataSource
FileDataSource fileDataSource = new FileDataSource(tempFile);
System.out.println("FileDataSource created: " + fileDataSource.getName());
// 如果需要,可以使用 DataHandler 进行进一步处理
DataHandler dh = new DataHandler(fileDataSource);
// 清理:删除临时文件(如果不再需要)
tempFile.deleteOnExit(); // 可根据需要保留或删除
filePart.setDataHandler(dh);
// 附件区别内嵌内容的一个特点是有文件名,为防止中文乱码要编码
filePart.setFileName(MimeUtility.encodeText(dh.getName()));
msgMultipart.addBodyPart(filePart);
message.saveChanges();
//发送
//Transport.send(message, message.getAllRecipients());
Transport.send(message);
System.out.println("发送成功");
} catch (Exception e) {
e.printStackTrace();
}
}catch (MessagingException | UnsupportedEncodingException mex) {
mex.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return R.ok();
}
/**
* 远程调用 积分兑换订单 退款回退积分
* @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()));
}
@RequiresPermissions(value = {"/company"}, logical = Logical.OR)
@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);
}
@RequiresPermissions(value = {"/appUser/list", "/appUser/add", "/appUser/update", "/appUser/updateCompany"}, logical = Logical.OR)
@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());
}
@RequiresPermissions(value = {"/company/add", "/company/update"}, logical = Logical.OR)
@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();
}
@RequiresPermissions(value = {"/company/del"}, logical = Logical.OR)
@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();
}
@RequiresPermissions(value = {"/appUser/list"}, logical = Logical.OR)
@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