TASK:batch toProductImage;chatStream;

This commit is contained in:
shahaibo
2025-06-05 13:35:13 +08:00
parent f2c268683c
commit 12dbe90150
10 changed files with 210 additions and 173 deletions

View File

@@ -1878,47 +1878,53 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
prompt = pythonService.promptTranslate(prompt);
}
int fullBatches = toProductImageDTO.getToProductImageVOList().size() / cloudTaskDTO.getNums(); // 可整除的次数
int remainder = toProductImageDTO.getToProductImageVOList().size() % cloudTaskDTO.getNums(); // 剩下的余数
Map<ToProductImageVO, Integer> toProductImageVOIntegerMap = allocateElements(toProductImageDTO.getToProductImageVOList(), cloudTaskDTO.getNums());
for (int i1 = 0; i1 < fullBatches; i1++) {
// TODO prompt微调
// String newPrompt = pythonService.getPrompt(prompt);
// BigDecimal randomFromRange = getRandomFromRange(toProductImageDTO.getImageStrengthMin(), toProductImageDTO.getImageStrengthMax());
for (ToProductImageVO toProductImageVO : toProductImageDTO.getToProductImageVOList()) {
String taskId;
if (toProductImageVO.getElementType().equals("DesignOutfit")) {
for (ToProductImageVO toProductImageVO : toProductImageDTO.getToProductImageVOList()) {
String taskId;
if (toProductImageVO.getElementType().equals("DesignOutfit")) {
TDesignPythonOutfit tDesignPythonOutfit = designPythonOutfitMapper.selectById(toProductImageVO.getElementId());
Long designItemId = tDesignPythonOutfit.getDesignItemId();
QueryWrapper<DesignItemDetail> designItemDetailQueryWrapper = new QueryWrapper<>();
designItemDetailQueryWrapper.lambda().eq(DesignItemDetail::getDesignItemId, designItemId);
designItemDetailQueryWrapper.lambda().ne(DesignItemDetail::getType, "Body");
List<DesignItemDetail> designItemDetails = designItemDetailMapper.selectList(designItemDetailQueryWrapper);
String collect = designItemDetails.stream().map(DesignItemDetail::getType).collect(Collectors.joining(","));
Long designId = tDesignPythonOutfit.getDesignId();
Design design = designMapper.selectById(designId);
String productType = "overall";
if (design.getSingleOverall().equals("single")) {
productType = "single";
sb.append(collect);
}else {
if (collect.contains("Tops")) {
sb.append("a handsome man,");
}else {
sb.append("a beautiful women,");
}
sb.append("wearing ").append(collect);
}
if (StringUtils.isEmpty(prompt)) {
sb.append(",high quality clothing details,8K realistic,HDR");
}else {
sb.append(",high quality clothing details,").append(prompt).append(",8K realistic,HDR");
}
// 走模型
List<BatchParamDTO> paramList = new ArrayList<>();
List<String> promptList = pythonService.getPrompt(sb.toString(), toProductImageVOIntegerMap.get(toProductImageVO));
for (int i1 = 0; i1 < toProductImageVOIntegerMap.get(toProductImageVO); i1++) {
BatchParamDTO batchParamDTO = new BatchParamDTO();
taskId = UUID.randomUUID() + "-" + i + "-" + userHolder.getId();
TDesignPythonOutfit tDesignPythonOutfit = designPythonOutfitMapper.selectById(toProductImageVO.getElementId());
batchParamDTO.setTasks_id(taskId);
batchParamDTO.setPrompt(promptList.get(i1));
BigDecimal randomFromRange = getRandomFromRange(toProductImageDTO.getImageStrengthMin(), toProductImageDTO.getImageStrengthMax());
batchParamDTO.setImage_strength(randomFromRange);
batchParamDTO.setImage_url(tDesignPythonOutfit.getDesignUrl());
batchParamDTO.setProduct_type(productType);
paramList.add(batchParamDTO);
Long designItemId = tDesignPythonOutfit.getDesignItemId();
QueryWrapper<DesignItemDetail> designItemDetailQueryWrapper = new QueryWrapper<>();
designItemDetailQueryWrapper.lambda().eq(DesignItemDetail::getDesignItemId, designItemId);
designItemDetailQueryWrapper.lambda().ne(DesignItemDetail::getType, "Body");
List<DesignItemDetail> designItemDetails = designItemDetailMapper.selectList(designItemDetailQueryWrapper);
String collect = designItemDetails.stream().map(DesignItemDetail::getType).collect(Collectors.joining(","));
Long designId = tDesignPythonOutfit.getDesignId();
Design design = designMapper.selectById(designId);
String productType = "overall";
if (design.getSingleOverall().equals("single")) {
productType = "single";
sb.append(collect);
}else {
if (collect.contains("Tops")) {
sb.append("a handsome man,");
}else {
sb.append("a beautiful women,");
}
sb.append("wearing ").append(collect);
}
if (StringUtils.isEmpty(prompt)) {
sb.append(",high quality clothing details,8K realistic,HDR");
}else {
sb.append(",high quality clothing details,").append(prompt).append(",8K realistic,HDR");
}
// 走模型
pythonService.toProductImageBatch(tDesignPythonOutfit.getDesignUrl(), taskId, sb.toString(), toProductImageDTO.getImageStrength(), productType);
ToProductImageResult toProductImageResult = new ToProductImageResult();
toProductImageResult.setElementId(tDesignPythonOutfit.getId());
toProductImageResult.setElementType("DesignOutfit");
@@ -1931,20 +1937,37 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
if (userLikeGroupId != null) {
toProductImageResult.setUserLikeGroupId(userLikeGroupId);
}
toProductImageResult.setImageStrength(toProductImageDTO.getImageStrength());
toProductImageResult.setImageStrength(randomFromRange);
toProductImageResultMapper.insert(toProductImageResult);
result.add(toProductImageResult);
// 添加需要扣除的积分到预扣除区
creditsService.addRecordToCreditsDeduction(userHolder.getId(), taskId, CreditsEventsEnum.TO_PRODUCT_IMAGE);
i ++;
}
pythonService.toProductImageBatch(batchTaskId, paramList, userHolder.getId().toString());
}else {
if (StringUtils.isEmpty(prompt)) {
sb.append(",high quality clothing details,8K realistic,HDR");
}else {
if (StringUtils.isEmpty(prompt)) {
sb.append(",high quality clothing details,8K realistic,HDR");
}else {
sb.append(",high quality clothing details,").append(prompt).append(",8K realistic,HDR");
}
sb.append(",high quality clothing details,").append(prompt).append(",8K realistic,HDR");
}
taskId = UUID.randomUUID() + "-" + i + "-" + userHolder.getId();
ToProductElement toProductElement = toProductElementMapper.selectById(toProductImageVO.getElementId());
// 走模型
List<BatchParamDTO> paramList = new ArrayList<>();
List<String> promptList = pythonService.getPrompt(sb.toString(), toProductImageVOIntegerMap.get(toProductImageVO));
for (int i1 = 0; i1 < toProductImageVOIntegerMap.get(toProductImageVO); i1++) {
BatchParamDTO batchParamDTO = new BatchParamDTO();
taskId = UUID.randomUUID() + "-" + i + "-" + userHolder.getId();
ToProductElement toProductElement = toProductElementMapper.selectById(toProductImageVO.getElementId());
// 走模型
pythonService.toProductImageBatch(toProductElement.getUrl(), taskId, sb.toString(), toProductImageDTO.getImageStrength(), "overall");
batchParamDTO.setTasks_id(taskId);
batchParamDTO.setPrompt(promptList.get(i1));
BigDecimal randomFromRange = getRandomFromRange(toProductImageDTO.getImageStrengthMin(), toProductImageDTO.getImageStrengthMax());
batchParamDTO.setImage_strength(randomFromRange);
batchParamDTO.setImage_url(toProductElement.getUrl());
batchParamDTO.setProduct_type("overall");
paramList.add(batchParamDTO);
ToProductImageResult toProductImageResult = new ToProductImageResult();
toProductImageResult.setElementId(toProductElement.getId());
toProductImageResult.setElementType("ProductElement");
@@ -1957,108 +1980,16 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
if (userLikeGroupId != null) {
toProductImageResult.setUserLikeGroupId(userLikeGroupId);
}
toProductImageResult.setImageStrength(toProductImageDTO.getImageStrength());
toProductImageResult.setImageStrength(randomFromRange);
toProductImageResultMapper.insert(toProductImageResult);
result.add(toProductImageResult);
// 添加需要扣除的积分到预扣除区
creditsService.addRecordToCreditsDeduction(userHolder.getId(), taskId, CreditsEventsEnum.TO_PRODUCT_IMAGE);
i ++;
}
i ++;
sb = new StringBuilder("The best quality, masterpiece, real image.");
// 添加需要扣除的积分到预扣除区
creditsService.addRecordToCreditsDeduction(userHolder.getId(), taskId, CreditsEventsEnum.TO_PRODUCT_IMAGE);
}
}
if (remainder > 0) {
// TODO: 随机
// String newPrompt = pythonService.getPrompt(prompt);
// BigDecimal randomFromRange = getRandomFromRange(toProductImageDTO.getImageStrengthMin(), toProductImageDTO.getImageStrengthMax());
List<ToProductImageVO> tempList = new ArrayList<>(toProductImageDTO.getToProductImageVOList());
Collections.shuffle(tempList); // 打乱顺序
// 取前 remainder 个
List<ToProductImageVO> randomPick = tempList.subList(0, remainder);
for (ToProductImageVO toProductImageVO : randomPick) {
String taskId;
if (toProductImageVO.getElementType().equals("DesignOutfit")) {
taskId = UUID.randomUUID() + "-" + i + "-" + userHolder.getId();
TDesignPythonOutfit tDesignPythonOutfit = designPythonOutfitMapper.selectById(toProductImageVO.getElementId());
Long designItemId = tDesignPythonOutfit.getDesignItemId();
QueryWrapper<DesignItemDetail> designItemDetailQueryWrapper = new QueryWrapper<>();
designItemDetailQueryWrapper.lambda().eq(DesignItemDetail::getDesignItemId, designItemId);
designItemDetailQueryWrapper.lambda().ne(DesignItemDetail::getType, "Body");
List<DesignItemDetail> designItemDetails = designItemDetailMapper.selectList(designItemDetailQueryWrapper);
String collect = designItemDetails.stream().map(DesignItemDetail::getType).collect(Collectors.joining(","));
Long designId = tDesignPythonOutfit.getDesignId();
Design design = designMapper.selectById(designId);
String productType = "overall";
if (design.getSingleOverall().equals("single")) {
productType = "single";
sb.append(collect);
}else {
if (collect.contains("Tops")) {
sb.append("a handsome man,");
}else {
sb.append("a beautiful women,");
}
sb.append("wearing ").append(collect);
}
if (StringUtils.isEmpty(prompt)) {
sb.append(",high quality clothing details,8K realistic,HDR");
}else {
sb.append(",high quality clothing details,").append(prompt).append(",8K realistic,HDR");
}
// 走模型
pythonService.toProductImageBatch(tDesignPythonOutfit.getDesignUrl(), taskId, sb.toString(), toProductImageDTO.getImageStrength(), productType);
ToProductImageResult toProductImageResult = new ToProductImageResult();
toProductImageResult.setElementId(tDesignPythonOutfit.getId());
toProductImageResult.setElementType("DesignOutfit");
toProductImageResult.setCreateTime(LocalDateTime.now());
toProductImageResult.setToProductImageRecordId(toProductImageRecord.getId());
toProductImageResult.setIsLike(0);
toProductImageResult.setTaskId(taskId);
toProductImageResult.setProjectId(projectId);
toProductImageResult.setTaskIdBatch(batchTaskId);
if (userLikeGroupId != null) {
toProductImageResult.setUserLikeGroupId(userLikeGroupId);
}
toProductImageResult.setImageStrength(toProductImageDTO.getImageStrength());
toProductImageResultMapper.insert(toProductImageResult);
result.add(toProductImageResult);
}else {
if (StringUtils.isEmpty(prompt)) {
sb.append(",high quality clothing details,8K realistic,HDR");
}else {
sb.append(",high quality clothing details,").append(prompt).append(",8K realistic,HDR");
}
taskId = UUID.randomUUID() + "-" + i + "-" + userHolder.getId();
ToProductElement toProductElement = toProductElementMapper.selectById(toProductImageVO.getElementId());
// 走模型
pythonService.toProductImageBatch(toProductElement.getUrl(), taskId, sb.toString(), toProductImageDTO.getImageStrength(), "overall");
ToProductImageResult toProductImageResult = new ToProductImageResult();
toProductImageResult.setElementId(toProductElement.getId());
toProductImageResult.setElementType("ProductElement");
toProductImageResult.setCreateTime(LocalDateTime.now());
toProductImageResult.setToProductImageRecordId(toProductImageRecord.getId());
toProductImageResult.setIsLike(0);
toProductImageResult.setTaskId(taskId);
toProductImageResult.setProjectId(projectId);
toProductImageResult.setTaskIdBatch(batchTaskId);
if (userLikeGroupId != null) {
toProductImageResult.setUserLikeGroupId(userLikeGroupId);
}
toProductImageResult.setImageStrength(toProductImageDTO.getImageStrength());
toProductImageResultMapper.insert(toProductImageResult);
result.add(toProductImageResult);
}
i ++;
sb = new StringBuilder("The best quality, masterpiece, real image.");
// 添加需要扣除的积分到预扣除区
creditsService.addRecordToCreditsDeduction(userHolder.getId(), taskId, CreditsEventsEnum.TO_PRODUCT_IMAGE);
pythonService.toProductImageBatch(batchTaskId, paramList, userHolder.getId().toString());
}
sb = new StringBuilder("The best quality, masterpiece, real image.");
}
CloudTask cloudTask = CopyUtil.copyObject(cloudTaskDTO, CloudTask.class);
@@ -2229,6 +2160,34 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
return null;
}
public static Map<ToProductImageVO, Integer> allocateElements(List<ToProductImageVO> voList, int totalResults) {
// 计算基础分配值和余数
int baseAllocation = totalResults / voList.size();
int remainder = totalResults % voList.size();
// 初始化分配结果(每个元素先分配基础值)
Map<ToProductImageVO, Integer> allocationMap = new HashMap<>();
for (ToProductImageVO vo : voList) {
allocationMap.put(vo, baseAllocation);
}
// 如果有余数,随机分配额外的一个结果
if (remainder > 0) {
// 创建元素ID的可变副本并打乱顺序
List<ToProductImageVO> shuffledIds = new ArrayList<>(voList);
Collections.shuffle(shuffledIds);
// 将前N个元素各增加1N=余数)
for (int i = 0; i < remainder; i++) {
ToProductImageVO toProductImageVO = shuffledIds.get(i);
allocationMap.put(toProductImageVO, allocationMap.get(toProductImageVO) + 1);
}
}
return allocationMap;
}
private DesignCollectionDTO transDesignParam(Long projectId) {
DesignCollectionDTO designCollectionDTO = new DesignCollectionDTO();
List<CollectionElement> collectionElementList = collectionElementService.getByProjectId(projectId);

View File

@@ -1049,12 +1049,14 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
return vos;
}
public Boolean disOrLikePose(Long transformedId, String likeOrDislike, Long projectId){
public Object disOrLikePose(Long transformedId, String likeOrDislike, Long projectId){
PoseTransformation poseTransformation = poseTransformationMapper.selectById(transformedId);
Long collectionSortId = null;
if (Objects.nonNull(poseTransformation)){
if (likeOrDislike.equals("like")){
poseTransformation.setIsLiked((byte)1);
designService.addCollectionSort(poseTransformation.getId(), CollectionType.POSE_TRANSFORM.getValue(), projectId);
CollectionSort collectionSort = designService.addCollectionSort(poseTransformation.getId(), CollectionType.POSE_TRANSFORM.getValue(), projectId);
collectionSortId = collectionSort.getId();
}else if (likeOrDislike.equals("dislike")){
poseTransformation.setIsLiked((byte)0);
designService.deleteCollectionSort(poseTransformation.getId(), CollectionType.POSE_TRANSFORM.getValue(), projectId);
@@ -1064,6 +1066,9 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
}else {
return false;
}
if (null != collectionSortId) {
return collectionSortId;
}
return true;
}

View File

@@ -298,17 +298,19 @@ public class LLMServiceImpl implements LLMService {
break;
}
if ("text".equals(type) || "think".equals(type)) {
if (StringUtils.isEmpty(contentType)) {
contentType = type;
}
if (!contentType.equals(type)) {
systemMessage.setSeq(getNextSeq(projectId));
systemMessage.setCreateTime(LocalDateTime.now());
systemMessage.setContent(responseContentBuilder.toString());
chatMessageMapper.insert(systemMessage);
systemMessage.setId(null);
responseContentBuilder = new StringBuilder();
contentType = type;
if (StringUtils.isEmpty(contentType) || !contentType.equals(type)) {
if ("text".equals(type)) {
responseContentBuilder.append("[TEXT]");
}else {
responseContentBuilder.append("[THINK]");
}
// systemMessage.setSeq(getNextSeq(projectId));
// systemMessage.setCreateTime(LocalDateTime.now());
// systemMessage.setContent(responseContentBuilder.toString());
// chatMessageMapper.insert(systemMessage);
// systemMessage.setId(null);
// responseContentBuilder = new StringBuilder();
// contentType = type;
}
responseContentBuilder.append(content);
emitter.send(json.toJSONString());

View File

@@ -583,7 +583,7 @@ public class UserLikeGroupServiceImpl extends ServiceImpl<UserLikeGroupMapper, U
}
@Override
public Boolean productImageLike(ProductImageLikeDTO productImageLikeDTO) {
public Long productImageLike(ProductImageLikeDTO productImageLikeDTO) {
List<Long> toProductImageResultId = productImageLikeDTO.getToProductImageResultId();
QueryWrapper<ToProductImageResult> qw = new QueryWrapper<>();
qw.lambda().in(ToProductImageResult::getId, toProductImageResultId);
@@ -591,12 +591,15 @@ public class UserLikeGroupServiceImpl extends ServiceImpl<UserLikeGroupMapper, U
toProductImageResult.setIsLike(1);
toProductImageResultMapper.update(toProductImageResult, qw);
ToProductImageResult toProductImageResult1 = toProductImageResultMapper.selectById(toProductImageResultId.get(0));
Long collectionSortId = null;
if (toProductImageResult1.getResultType().equals("Relight")) {
designService.addCollectionSort(toProductImageResult1.getId(), CollectionType.RELIGHT.getValue(), productImageLikeDTO.getProjectId());
CollectionSort collectionSort = designService.addCollectionSort(toProductImageResult1.getId(), CollectionType.RELIGHT.getValue(), productImageLikeDTO.getProjectId());
collectionSortId = collectionSort.getId();
}else {
designService.addCollectionSort(toProductImageResult1.getId(), CollectionType.TO_PRODUCT_IMAGE.getValue(), productImageLikeDTO.getProjectId());
CollectionSort collectionSort = designService.addCollectionSort(toProductImageResult1.getId(), CollectionType.TO_PRODUCT_IMAGE.getValue(), productImageLikeDTO.getProjectId());
collectionSortId = collectionSort.getId();
}
return Boolean.TRUE;
return collectionSortId;
}
@Resource
private RedisUtil redisUtil;