You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

311 lines
14 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.zh.project0512.controller;
import com.alibaba.fastjson.JSONObject;
//import com.zh.project0512.service.IUserService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zh.project0512.mapper.QywxDepartmentUserLinkMapper;
import com.zh.project0512.mapper.RankMapper;
import com.zh.project0512.mapper.UserMapper;
import com.zh.project0512.model.AppMessage;
import com.zh.project0512.model.Task;
import com.zh.project0512.model.UserPointsRecords;
import com.zh.project0512.service.IRewardRuleService;
import com.zh.project0512.service.ITaskService;
import com.zh.project0512.service.IUserPointsRecordsService;
import com.zh.project0512.service.IVideoService;
import com.zh.project0512.utils.*;
import com.zh.project0512.utils.result.HttpStatusEnum;
import com.zh.project0512.utils.result.Result;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import net.coobird.thumbnailator.Thumbnails;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import ws.schild.jave.MultimediaObject;
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
* <p>
* 前端控制器
* </p>
*
* @author zh
* @since 2022-05-12
*/
@Tag(name = "工具中心")
@RestController
@RequestMapping("/util")
public class UtilsController {
// @Autowired
// private RedisTemplate<String, String> redisTemplate;
// @Autowired
// private AliyunOss aliyunOss;
@Value("${web.uploadPath}")
private String path;
@Value("${web.picSizeLimit}")
private long picSizeLimit;
@Value("${web.cdn}")
private String cdn;
@Operation(summary = "上传")
@PostMapping("/upload")
@ResponseBody
public Result upload(@RequestParam("file") MultipartFile file, @RequestParam(required = false) String name, Boolean compress) {
if (file.isEmpty()) {
return Result.fail(HttpStatusEnum.CUSTOM_EXCEPTION, "请选择文件");
}
String fileName = file.getOriginalFilename();//文件名
String randomName = UUID.randomUUID().toString().replace("-", "") + LocalDateTime.now().toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
String newFileName = randomName + fileName.substring(fileName.lastIndexOf("."));
String newFileNameSmall = randomName + "Small" + fileName.substring(fileName.lastIndexOf("."));
JSONObject res = new JSONObject();
int fileTypeNum = FileTypeUtil.getcontentTypeNum((fileName.substring(fileName.lastIndexOf("."))));
//String path = System.getProperty("user.home"); //文件存储位置 我放在了我的项目下
// //获取jar包所在目录
// ApplicationHome h = new ApplicationHome(getClass());
// File jarF = h.getSource();
// //在jar包所在目录下生成一个upload文件夹用来存储上传的图片
// String dirPath = jarF.getParentFile().toString()+"/upload/";
// System.out.println(dirPath);
// System.out.println(path);
// File dest = new File(dirPath+fileName);
try {
String filePath = path + "/" + newFileName;
File dest = new File(filePath);
if (compress != null && compress &&fileTypeNum ==2&& file.getSize() >= picSizeLimit) {
String filePathSmall = path + "/" + newFileNameSmall;
File beforeFile = new File(filePathSmall);
//生成目标图片
Thumbnails.of(file.getInputStream()).scale(1f).toFile(beforeFile);
//压缩图片至指定大小下
commpressPicCycle(filePathSmall, picSizeLimit, 0.8);
res.put("fileUrlSmall", "/upload/" + newFileNameSmall);
}
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();
}
file.transferTo(dest);
res.put("fileUrl", "/upload/" + newFileName);
res.put("fileName", fileName);
res.put("fileType", FileTypeUtil.getcontentType((fileName.substring(fileName.lastIndexOf(".")))));
res.put("fileTypeNum", fileTypeNum);
if (fileTypeNum == 1) {
res.put("duration", new MultimediaObject(dest).getInfo().getDuration());
}
return Result.success(res, "上传完成");
} catch (Exception e) {
e.printStackTrace();
}
return Result.fail(HttpStatusEnum.CUSTOM_EXCEPTION, "上传失败");
}
// @PostMapping("/uploadImg")
// public Result uploadImg(@RequestParam("file") MultipartFile file, @RequestParam(value = "name", defaultValue = "name") String name) {
// try {
// String homeImage = aliyunOss.checkImage(file);//此处是调用上传服务接口
// String fileUrl = aliyunOss.getImgUrl(homeImage);
// String fileType = FileTypeUtil.getcontentType((fileUrl.substring(fileUrl.lastIndexOf("."))));
// System.out.println(fileType == "video/mp4" ? 1 : (fileType == "image/jpg" ? 2 : (fileType == "text/plain" ? 3 : 0)));
// Result result = Result.success("上传成功!");
// return result;
// } catch (Exception e) {
// e.printStackTrace();
// return Result.fail(HttpStatusEnum.NOT_FOUND);
// }
// }
@Operation(summary = "编辑器内上传")
@PostMapping("/upload2")
@ResponseBody
public JSONObject upload2(@RequestParam("file") MultipartFile file, @RequestParam(required = false) String name) {
JSONObject res = new JSONObject();
res.put("errno", 1);
if (file.isEmpty()) {
res.put("message", "请选择文件");
return res;
}
String fileName = file.getOriginalFilename();//文件名
String newFileName = UUID.randomUUID().toString().replace("-", "") + LocalDateTime.now().toInstant(ZoneOffset.ofHours(8)).toEpochMilli() + fileName.substring(fileName.lastIndexOf("."));
File dest = new File(path + "/" + newFileName);
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();
}
try {
file.transferTo(dest);
res.replace("errno", 0);
JSONObject obj = new JSONObject();
obj.put("alt", fileName);
obj.put("url", cdn + "/upload/" + newFileName);
res.put("data", obj);
return res;
} catch (Exception e) {
e.printStackTrace();
}
res.put("message", "上传失败");
return res;
}
private static void commpressPicCycle(String desPath, long desFileSize, double accuracy) throws IOException {
File srcFileJPG = new File(desPath);
//如果小于指定大小不压缩;如果大于等于指定大小压缩
if (srcFileJPG.length() <= desFileSize) {
return;
}
// 计算宽高
BufferedImage bim = ImageIO.read(srcFileJPG);
int desWidth = new BigDecimal(bim.getWidth()).multiply(new BigDecimal(accuracy)).intValue();
int desHeight = new BigDecimal(bim.getHeight()).multiply(new BigDecimal(accuracy)).intValue();
Thumbnails.of(desPath).size(desWidth, desHeight).outputQuality(accuracy).toFile(desPath);
commpressPicCycle(desPath, desFileSize, accuracy);
}
@Autowired
private ITaskService taskService;
@Resource
QywxDepartmentUserLinkMapper qywxDepartmentUserLinkMapper;
@Resource
RankMapper rankMapper;
@Autowired
private IVideoService videoService;
@Autowired
private UserMapper userMapper;
@Autowired
private IRewardRuleService rewardRuleService;
@Autowired
private IUserPointsRecordsService userPointsRecordsService;
@Autowired
private HttpUtil httpUtil;
@PostMapping("/test")
@ResponseBody
public Result test() {
// 任务结束7天时自动结算积分
QueryWrapper<Task> qw = new QueryWrapper<>();
LocalDateTime now = LocalDateTime.now();
LocalDateTime weekAgo = now.minusWeeks(0);
AppMessage appMessage = new AppMessage().setTitle("任务积分结算");
String format = weekAgo.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
qw.eq("status",2).eq("date_format(end, '%Y-%m-%d')", format);
List<Task> taskList = taskService.list(qw);
String qywxAccessToken = httpUtil.qywxGetToken();
// 处理每个任务的传播值
for (Task t : taskList) {
Integer taskId = t.getId();
List<Map> videoEffectResult = videoService.videoEffectResult(taskId);
List<Map> rewardRule = rewardRuleService.listByTemplateId(t.getRewardRuleTemplateId());
List<UserPointsRecords> recordsList = new ArrayList<>();
System.out.println("videoEffectResult" + videoEffectResult);
// 处理任务中每个用户的传播值
for (Map m : videoEffectResult) {
BigDecimal bigDecimal = (BigDecimal) m.get("effectResultSum");
Integer effectResultSum = Integer.parseInt(bigDecimal.toString());
if (effectResultSum != null && effectResultSum != 0) {
int point = 0;
int userId = (Integer) m.get("userId");
String touser = (String) m.get("touser");
// 根据传播值计算规则算出奖励
for (Map r : rewardRule) {
if (effectResultSum > (Integer) r.get("limitNum")) {
point = (Integer) r.get("reward");
}
}
// (视频结算标识)并更新用户积分,发送企业消息和小程序内消息
userMapper.updPoints(userId, point);
appMessage.setDescription("恭喜您获得星途积分" + point + "。")
.setUrl("pages/quest/subpage/detail/detail?id=" + taskId)
.setReceiverId(userId);
// 企业微信消息通知
if (touser != null) {
appMessage.setTouser(touser);
List<JSONObject> content_item = new ArrayList<>();
content_item.add(new JSONObject().fluentPut("key", "到账结果").fluentPut("value", appMessage.getDescription()));
content_item.add(new JSONObject().fluentPut("key", "到账时间").fluentPut("value", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))));
httpUtil.qywxMessage(qywxAccessToken, touser, "任务积分结算", null, appMessage.getUrl(), content_item);
}
AppMessageUtil.sendMessage(appMessage);
recordsList.add(new UserPointsRecords().setSettlementMethod(1).setPoints(point).setType(1).setRemarks("任务完成结算:"+t.getTitle()).setCreateDate(now).setUserId(userId));
}
}
// 按任务生成积分流水记录
userPointsRecordsService.saveBatch(recordsList);
}
return Result.success();
}
public static void main(String[] args) {
String url ="测试https://v.kuaishou.com/lnmWDU 测试 复制此消息,打开【快手】直接观看!";
String s = RegexUtils.get("(https://)(.*?)(/)(.*?)(/)",url,0);
System.out.println(s);
// String url = "4.38 wfb:/ 复制打开抖音身 https://v.douyin.com/YT98hjf/,看看【酸味真火的作品】坚持总会有收获的# 意想不到的情侣健身 https://v.douyin.com/YT982Sf/";
// System.out.println( RegexUtils.get("(https://)(.*?)(/)(.*?)(/)",url,0));
// String a = m.find() ? m.group(1) : url;
// System.out.println(a);
// int b = StringUtils.countOccurrencesOf(a, "https://v.douyin");
// System.out.println(b);
// List<String> list1 = new ArrayList<String>();
// list1.add("1");
// list1.add("2");
// list1.add("3");
// list1.add("5");
// list1.add("6");
// List<String> list2 = new ArrayList<String>();
// list2.add("2");
// list2.add("3");
// list2.add("7");
// list2.add("8");
//// 交集
// List<String> intersection = list1.stream().filter(item -> list2.contains(item)).collect(Collectors.toList());
// System.out.println("---交集 intersection---");
// intersection.parallelStream().forEach(System.out::println);
//// 差集 (list1 - list2)
// List<String> reduce1 = list1.stream().filter(item -> !list2.contains(item)).collect(Collectors.toList());
// System.out.println("---差集 reduce1 (list1 - list2)---");
// reduce1.parallelStream().forEach(System.out::println);
//// 差集 (list2 - list1)
// List<String> reduce2 = list2.stream().filter(item -> !list1.contains(item)).collect(Collectors.toList());
// System.out.println("---差集 reduce2 (list2 - list1)---");
// reduce2.parallelStream().forEach(System.out::println);
//// 并集
// List<String> listAll = list1.parallelStream().collect(Collectors.toList());
// List<String> listAll2 = list2.parallelStream().collect(Collectors.toList());
// listAll.addAll(listAll2);
// System.out.println("---并集 listAll---");
// listAll.parallelStream().forEachOrdered(System.out::println);
//// 去重并集
// List<String> listAllDistinct = listAll.stream().distinct().collect(Collectors.toList());
// System.out.println("---得到去重并集 listAllDistinct---");
// listAllDistinct.parallelStream().forEachOrdered(System.out::println);
// System.out.println("---原来的List1---");
// list1.parallelStream().forEachOrdered(System.out::println);
// System.out.println("---原来的List2---");
// list2.parallelStream().forEachOrdered(System.out::println);
}
}