Compare commits
4 Commits
dev/3.1_re
...
release/3.
| Author | SHA1 | Date | |
|---|---|---|---|
| 3273a61066 | |||
| d055331690 | |||
| 0073f910a7 | |||
| 6dcbfa025a |
@@ -18,8 +18,8 @@ public class ModelConstants {
|
|||||||
|
|
||||||
// 模型名称常量
|
// 模型名称常量
|
||||||
public static final String PRINTBOARD_ADVANCED_T2I = "qwen-image";
|
public static final String PRINTBOARD_ADVANCED_T2I = "qwen-image";
|
||||||
public static final String MOODBOARD_ADVANCED = "doubao-seedream-3-0-t2i-250415";
|
public static final String MOODBOARD_ADVANCED = "doubao-seedream-4-5-251128";
|
||||||
public static final String PRINTBOARD_HIGH_T2I = "doubao-seedream-3-0-t2i-250415";
|
public static final String PRINTBOARD_HIGH_T2I = "doubao-seedream-4-0-250828-high";
|
||||||
public static final String PRINTBOARD_HIGH_I2I = "doubao-seedream-4-0-250828-fast";
|
public static final String PRINTBOARD_HIGH_I2I = "doubao-seedream-4-0-250828-fast";
|
||||||
public static final String PRINTBOARD_ADVANCED_I2I = "doubao-seedream-4-0-250828";
|
public static final String PRINTBOARD_ADVANCED_I2I = "doubao-seedream-4-0-250828";
|
||||||
public static final String IMAGEN_MODEL = "imagen-4.0-generate-001";
|
public static final String IMAGEN_MODEL = "imagen-4.0-generate-001";
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import com.ai.da.model.dto.*;
|
|||||||
import com.ai.da.model.dto.ContestantDTO;
|
import com.ai.da.model.dto.ContestantDTO;
|
||||||
import com.ai.da.model.vo.CheckOTPVO;
|
import com.ai.da.model.vo.CheckOTPVO;
|
||||||
import com.ai.da.model.vo.ContestantCountVO;
|
import com.ai.da.model.vo.ContestantCountVO;
|
||||||
|
import com.ai.da.model.vo.PageVisitCountVO;
|
||||||
import com.ai.da.service.GlobalAwardService;
|
import com.ai.da.service.GlobalAwardService;
|
||||||
import com.ai.da.service.upload.UploadService;
|
import com.ai.da.service.upload.UploadService;
|
||||||
import com.ai.da.service.upload.UploadTask;
|
import com.ai.da.service.upload.UploadTask;
|
||||||
@@ -198,6 +199,19 @@ public class GlobalAwardController {
|
|||||||
return Response.success(globalAwardService.getContestantCount());
|
return Response.success(globalAwardService.getContestantCount());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PostMapping("/page/visit")
|
||||||
|
@ApiOperation(value = "记录比赛页面访问量", notes = "记录比赛页面的访问量,包含两种统计方式:每次访问/刷新计一次,以及5秒内刷新只计一次")
|
||||||
|
public Response<Void> recordPageVisit(@ApiParam(value = "会话ID,用于5秒内去重判断", required = false) @RequestParam(value = "sessionId", required = false) String sessionId) {
|
||||||
|
globalAwardService.recordPageVisit(sessionId);
|
||||||
|
return Response.success();
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/page/visit/count")
|
||||||
|
@ApiOperation(value = "获取比赛页面访问量", notes = "获取比赛页面的两种访问量:rawVisitCount(每次访问/刷新计一次)和 uniqueVisitCount(5秒内刷新只计一次)")
|
||||||
|
public Response<PageVisitCountVO> getPageVisitCount() {
|
||||||
|
return Response.success(globalAwardService.getPageVisitCount());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
23
src/main/java/com/ai/da/model/vo/PageVisitCountVO.java
Normal file
23
src/main/java/com/ai/da/model/vo/PageVisitCountVO.java
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
package com.ai.da.model.vo;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class PageVisitCountVO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 每次访问或刷新都计一次(不去重)
|
||||||
|
*/
|
||||||
|
private Long rawVisitCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 5秒内刷新只算一次(去重后的真实访客数)
|
||||||
|
*/
|
||||||
|
private Long uniqueVisitCount;
|
||||||
|
}
|
||||||
@@ -2912,72 +2912,71 @@ public class PythonService {
|
|||||||
|
|
||||||
private PrintToPython resolveDesignSinglePrint(List<DesignSinglePrint> printObject, String partialDesign) {
|
private PrintToPython resolveDesignSinglePrint(List<DesignSinglePrint> printObject, String partialDesign) {
|
||||||
PrintToPython printToPython = new PrintToPython();
|
PrintToPython printToPython = new PrintToPython();
|
||||||
// DesignPythonItemPrint printSingle = new DesignPythonItemPrint();
|
|
||||||
DesignPythonItemPrint printOverall = new DesignPythonItemPrint();
|
DesignPythonItemPrint printOverall = new DesignPythonItemPrint();
|
||||||
// printToPython.setSingle(printSingle);
|
|
||||||
printToPython.setOverall(printOverall);
|
printToPython.setOverall(printOverall);
|
||||||
printToPython.setPartial(StringUtil.isNullOrEmpty(partialDesign) ? null : partialDesign);
|
printToPython.setPartial(StringUtil.isNullOrEmpty(partialDesign) ? null : partialDesign);
|
||||||
if (Objects.isNull(printObject) || printObject.isEmpty()) {
|
if (Objects.isNull(printObject) || printObject.isEmpty()) {
|
||||||
return printToPython;
|
return printToPython;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 没有印花时的参数设置
|
// 1. 先对 printObject 按 priority 排序(升序)
|
||||||
// if (printObject.getIfSingle().equals(Boolean.FALSE) && CollectionUtil.isEmpty(printObject.getPrints())) {
|
List<DesignSinglePrint> sortedPrints = printObject.stream()
|
||||||
// return new DesignPythonItemPrint(new ArrayList<>(), false);
|
.sorted(Comparator.comparingInt(DesignSinglePrint::getPriority))
|
||||||
// }
|
.toList();
|
||||||
// DesignPythonItemPrint print = CopyUtil.copyObject(printObject, DesignPythonItemPrint.class);
|
|
||||||
|
|
||||||
int size = printObject.size();
|
// 2. 分别收集单印和非单印的数据
|
||||||
// 占位符填充数组
|
List<DesignSinglePrint> singlePrints = sortedPrints.stream()
|
||||||
List<List<Float>> locationS = new ArrayList<>(Collections.nCopies(size, null));
|
.filter(DesignSinglePrint::getIfSingle)
|
||||||
List<List<Float>> scaleS = new ArrayList<>(Collections.nCopies(size, null));
|
.toList();
|
||||||
List<Double> angleS = new ArrayList<>(Collections.nCopies(size, null));
|
|
||||||
ArrayList<String> pathsS = new ArrayList<>(Collections.nCopies(size, null));
|
|
||||||
|
|
||||||
List<List<Float>> locationO = new ArrayList<>(Collections.nCopies(size, null));
|
List<DesignSinglePrint> overallPrints = sortedPrints.stream()
|
||||||
List<List<Float>> scaleO = new ArrayList<>(Collections.nCopies(size, null));
|
.filter(p -> !p.getIfSingle())
|
||||||
List<Double> angleO = new ArrayList<>(Collections.nCopies(size, null));
|
.toList();
|
||||||
ArrayList<String> pathsO = new ArrayList<>(Collections.nCopies(size, null));
|
|
||||||
|
|
||||||
// 设置印花的位置、大小、旋转角度
|
// 3. 处理单印数据
|
||||||
// 优先级越大,越靠近顶层,在传输给python的数组中,越靠前
|
if (!singlePrints.isEmpty()) {
|
||||||
// List<DesignSinglePrint> prints = printObject.getPrints();
|
List<List<Float>> locationS = new ArrayList<>();
|
||||||
printObject.forEach(p -> {
|
List<List<Float>> scaleS = new ArrayList<>();
|
||||||
p.getLocation().set(0, p.getLocation().get(0));
|
List<Double> angleS = new ArrayList<>();
|
||||||
p.getLocation().set(1, p.getLocation().get(1));
|
List<String> pathsS = new ArrayList<>();
|
||||||
Integer priority = p.getPriority();
|
|
||||||
setUriToMinioPath(p);
|
for (DesignSinglePrint p : singlePrints) {
|
||||||
// todo 下标越界问题
|
setUriToMinioPath(p);
|
||||||
if (p.getIfSingle()) {
|
locationS.add(p.getLocation());
|
||||||
locationS.set(priority - 1, p.getLocation());
|
scaleS.add(p.getScale());
|
||||||
scaleS.set(priority - 1, p.getScale());
|
angleS.add(p.getAngle());
|
||||||
angleS.set(priority - 1, p.getAngle());
|
pathsS.add(p.getMinIOPath());
|
||||||
pathsS.set(priority - 1, p.getMinIOPath());
|
|
||||||
} else {
|
|
||||||
locationO.set(priority - 1, p.getLocation());
|
|
||||||
scaleO.set(priority - 1, p.getScale());
|
|
||||||
angleO.set(priority - 1, p.getAngle());
|
|
||||||
pathsO.set(priority - 1, p.getMinIOPath());
|
|
||||||
}
|
}
|
||||||
// log.info("本次print打点locations###{}###fileVO{}", p.getLocation(), JSON.toJSONString(fileVO));
|
|
||||||
});
|
|
||||||
/*locationS.removeAll(Collections.singleton(null));
|
|
||||||
scaleS.removeAll(Collections.singleton(null));
|
|
||||||
angleS.removeAll(Collections.singleton(null));
|
|
||||||
pathsS.removeAll(Collections.singleton(null));
|
|
||||||
printSingle.setLocation(locationS);
|
|
||||||
printSingle.setPrint_scale_list(scaleS);
|
|
||||||
printSingle.setPrint_angle_list(angleS);
|
|
||||||
printSingle.setPrint_path_list(pathsS);*/
|
|
||||||
|
|
||||||
locationO.removeAll(Collections.singleton(null));
|
// 注意:如果 printOverall 中需要设置单印数据,请在这里添加相应的 setter
|
||||||
scaleO.removeAll(Collections.singleton(null));
|
// 根据您的原始代码,似乎只设置了 overall(非单印)的数据
|
||||||
angleO.removeAll(Collections.singleton(null));
|
// 如果需要设置单印,请取消下面的注释并添加对应的字段
|
||||||
pathsO.removeAll(Collections.singleton(null));
|
// printOverall.setSingleLocation(locationS);
|
||||||
printOverall.setLocation(locationO);
|
// printOverall.setSingleScale(scaleS);
|
||||||
printOverall.setPrint_scale_list(scaleO);
|
// printOverall.setSingleAngle(angleS);
|
||||||
printOverall.setPrint_angle_list(angleO);
|
// printOverall.setSinglePath(pathsS);
|
||||||
printOverall.setPrint_path_list(pathsO);
|
}
|
||||||
|
|
||||||
|
// 4. 处理非单印数据(整体印花)
|
||||||
|
if (!overallPrints.isEmpty()) {
|
||||||
|
List<List<Float>> locationO = new ArrayList<>();
|
||||||
|
List<List<Float>> scaleO = new ArrayList<>();
|
||||||
|
List<Double> angleO = new ArrayList<>();
|
||||||
|
List<String> pathsO = new ArrayList<>();
|
||||||
|
|
||||||
|
for (DesignSinglePrint p : overallPrints) {
|
||||||
|
setUriToMinioPath(p);
|
||||||
|
locationO.add(p.getLocation());
|
||||||
|
scaleO.add(p.getScale());
|
||||||
|
angleO.add(p.getAngle());
|
||||||
|
pathsO.add(p.getMinIOPath());
|
||||||
|
}
|
||||||
|
|
||||||
|
printOverall.setLocation(locationO);
|
||||||
|
printOverall.setPrint_scale_list(scaleO);
|
||||||
|
printOverall.setPrint_angle_list(angleO);
|
||||||
|
printOverall.setPrint_path_list(pathsO);
|
||||||
|
}
|
||||||
|
|
||||||
return printToPython;
|
return printToPython;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package com.ai.da.service;
|
|||||||
import com.ai.da.model.dto.ContestantDTO;
|
import com.ai.da.model.dto.ContestantDTO;
|
||||||
import com.ai.da.model.vo.CheckOTPVO;
|
import com.ai.da.model.vo.CheckOTPVO;
|
||||||
import com.ai.da.model.vo.ContestantCountVO;
|
import com.ai.da.model.vo.ContestantCountVO;
|
||||||
|
import com.ai.da.model.vo.PageVisitCountVO;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -46,6 +47,22 @@ public interface GlobalAwardService {
|
|||||||
* @return 参赛者数量和最大参赛者编号
|
* @return 参赛者数量和最大参赛者编号
|
||||||
*/
|
*/
|
||||||
ContestantCountVO getContestantCount();
|
ContestantCountVO getContestantCount();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 记录比赛页面的访问量
|
||||||
|
* <ul>
|
||||||
|
* <li>rawVisitCount: 每次访问或刷新都计一次(不去重)</li>
|
||||||
|
* <li>uniqueVisitCount: 5秒内刷新只算一次(基于会话去重)</li>
|
||||||
|
* </ul>
|
||||||
|
* @param sessionId 会话ID(用于5秒去重判断)
|
||||||
|
*/
|
||||||
|
void recordPageVisit(String sessionId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取比赛页面的两种访问量
|
||||||
|
* @return 原始访问量和去重访问量
|
||||||
|
*/
|
||||||
|
PageVisitCountVO getPageVisitCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1553,11 +1553,11 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
|||||||
if (imagePath != null) {
|
if (imagePath != null) {
|
||||||
requestBuilder.image(finalImagePath1);
|
requestBuilder.image(finalImagePath1);
|
||||||
}
|
}
|
||||||
if (useModel.equals(ModelConstants.PRINTBOARD_HIGH_I2I)) {
|
if (useModel.equals(ModelConstants.PRINTBOARD_HIGH_I2I)|| useModel.equals(ModelConstants.PRINTBOARD_HIGH_T2I)) {
|
||||||
GenerateImagesRequest.OptimizePromptOptions optimizePromptOptions = new GenerateImagesRequest.OptimizePromptOptions();
|
GenerateImagesRequest.OptimizePromptOptions optimizePromptOptions = new GenerateImagesRequest.OptimizePromptOptions();
|
||||||
optimizePromptOptions.setMode("fast");
|
optimizePromptOptions.setMode("fast");
|
||||||
requestBuilder.optimizePromptOptions(optimizePromptOptions);
|
requestBuilder.optimizePromptOptions(optimizePromptOptions);
|
||||||
//由于PRINTBOARD_HIGH_I2I与PRINTBOARD_ADVANCED_I2I使用模型一致,为了区别积分扣除,PRINTBOARD_HIGH_I2I加入了-fast,但传入模型时需要去掉-fast,用PRINTBOARD_ADVANCED_I2I的常量做替代
|
//由于PRINTBOARD_HIGH_T2I,PRINTBOARD_HIGH_I2I与PRINTBOARD_ADVANCED_I2I使用模型一致,为了区别积分扣除,PRINTBOARD_HIGH_I2I加入了-fast或者-high,但传入模型时需要去掉-fast或者-high,用PRINTBOARD_ADVANCED_I2I的常量做替代
|
||||||
requestBuilder.model(ModelConstants.PRINTBOARD_ADVANCED_I2I);
|
requestBuilder.model(ModelConstants.PRINTBOARD_ADVANCED_I2I);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import com.ai.da.model.dto.ContestantDTO;
|
|||||||
import com.ai.da.model.dto.PublishSysNotificationDTO;
|
import com.ai.da.model.dto.PublishSysNotificationDTO;
|
||||||
import com.ai.da.model.vo.CheckOTPVO;
|
import com.ai.da.model.vo.CheckOTPVO;
|
||||||
import com.ai.da.model.vo.ContestantCountVO;
|
import com.ai.da.model.vo.ContestantCountVO;
|
||||||
|
import com.ai.da.model.vo.PageVisitCountVO;
|
||||||
import com.ai.da.service.GlobalAwardService;
|
import com.ai.da.service.GlobalAwardService;
|
||||||
import com.ai.da.service.MessageCenterService;
|
import com.ai.da.service.MessageCenterService;
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
@@ -619,6 +620,37 @@ public class GlobalAwardServiceImpl implements GlobalAwardService {
|
|||||||
private String nullSafe(String value) {
|
private String nullSafe(String value) {
|
||||||
return value != null ? value : "N/A";
|
return value != null ? value : "N/A";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final String RAW_VISIT_COUNT_KEY = "GLOBAL_AWARD:visit:raw";
|
||||||
|
private static final String UNIQUE_VISIT_SET_KEY = "GLOBAL_AWARD:visit:unique";
|
||||||
|
private static final String SESSION_VISIT_KEY_PREFIX = "GLOBAL_AWARD:visit:session:";
|
||||||
|
private static final long SESSION_DEDUP_SECONDS = 5L;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void recordPageVisit(String sessionId) {
|
||||||
|
redisUtil.increaseCount(RAW_VISIT_COUNT_KEY);
|
||||||
|
|
||||||
|
if (StringUtils.isNotBlank(sessionId)) {
|
||||||
|
String sessionKey = SESSION_VISIT_KEY_PREFIX + sessionId;
|
||||||
|
if (!redisUtil.hasKey(sessionKey)) {
|
||||||
|
redisUtil.increaseCount(UNIQUE_VISIT_SET_KEY);
|
||||||
|
redisUtil.addToString(sessionKey, "1", SESSION_DEDUP_SECONDS);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
redisUtil.increaseCount(UNIQUE_VISIT_SET_KEY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PageVisitCountVO getPageVisitCount() {
|
||||||
|
Long raw = redisUtil.getIncrementCount(RAW_VISIT_COUNT_KEY);
|
||||||
|
Long unique = redisUtil.getIncrementCount(UNIQUE_VISIT_SET_KEY);
|
||||||
|
return PageVisitCountVO.builder()
|
||||||
|
.rawVisitCount(raw != null ? raw : 0L)
|
||||||
|
.uniqueVisitCount(unique != null ? unique : 0L)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user