zoujiajian 1 년 전
부모
커밋
559e08edc2

+ 4 - 4
netflix-dao/src/main/java/com/cyksj/mapper/mini/MiniPopularizeUserMapper.java

@@ -12,9 +12,9 @@ import org.apache.ibatis.annotations.Update;
  * 创建时间:2025/4/10 15:17
  */
 public interface MiniPopularizeUserMapper extends BaseMapper<MiniPopularizeUser> {
-	@Update("update mini_popularize_user set num = num + #{num} where id = #{id}")
-	int incrNum(@Param("id") Long id, @Param("num") Integer num);
+	@Update("update mini_popularize_user set num = num + #{num} where user_id = #{userId}")
+	int incrNum(@Param("userId") Long userId, @Param("num") Integer num);
 
-	@Update("update mini_popularize_user set num = num - #{num} where id = #{id} and num = #{userNum} and num > 0")
-	int decLumaNum(@Param("id") Long id, @Param("num") Integer num, @Param("userNum") Integer userNum);
+	@Update("update mini_popularize_user set num = num - #{num} where user_id = #{userId} and num = #{userNum} and num > 0")
+	int decLumaNum(@Param("userId") Long userId, @Param("num") Integer num, @Param("userNum") Integer userNum);
 }

+ 21 - 3
netflix-dao/src/main/java/com/cyksj/model/entity/MiniPopularizeUserConversationChat.java

@@ -13,7 +13,7 @@ import lombok.*;
 @Builder
 @AllArgsConstructor
 @NoArgsConstructor
-public class MiniPopularizeUserConversationChat extends BaseEntity{
+public class MiniPopularizeUserConversationChat extends BaseEntity {
 	private String conversationId;
 
 	private Long userId;
@@ -26,8 +26,13 @@ public class MiniPopularizeUserConversationChat extends BaseEntity{
 
 	private Status status;
 
+	/**
+	 *
+	 */
+	private Role role;
+
 	@Getter
-	public enum Type{
+	public enum Type {
 		image("图像"),
 		text("文本"),
 		;
@@ -39,7 +44,7 @@ public class MiniPopularizeUserConversationChat extends BaseEntity{
 	}
 
 	@Getter
-	public enum Status{
+	public enum Status {
 		success("成功"),
 		fail("失败"),
 		processing("生成中"),
@@ -50,4 +55,17 @@ public class MiniPopularizeUserConversationChat extends BaseEntity{
 			this.desc = desc;
 		}
 	}
+
+	@Getter
+	public enum Role {
+		user("用户"),
+		assistant("助手"),
+		sys("系统")
+		;
+		String desc;
+
+		Role(String desc) {
+			this.desc = desc;
+		}
+	}
 }

+ 9 - 4
netflix-service/src/main/java/com/cyksj/server/listener/ConsoleStreamListener.java

@@ -25,6 +25,9 @@ public class ConsoleStreamListener extends AbstractStreamListener {
 
 	final MiniPopularizeCommonService miniPopularizeCommonService;
 
+	//是否需要恢复次数
+	final Boolean recoverNum;
+
 	@Override
 	public void onMsg(Object message) {
 		Message delta = (Message) message;
@@ -47,8 +50,9 @@ public class ConsoleStreamListener extends AbstractStreamListener {
 
 			if (content.contains("失败")) {
 				//将用户使用次数返回
-				miniPopularizeCommonService.recoverUserLimit(userId);
+				miniPopularizeCommonService.recoverUserLimit(userId, recoverNum);
 				miniPopularizeCommonService.saveImgRecord(setImagRecord(imgRecordId, img, MiniPopularizeUserConversationChat.Status.fail, content));
+				miniPopularizeCommonService.recordChatEndOfAnswer(conversationId, "图片生成异常", MiniPopularizeUserConversationChat.Role.assistant);
 			}
 		}
 		SendMessageUtil.sendMessage(userId, message);
@@ -57,13 +61,13 @@ public class ConsoleStreamListener extends AbstractStreamListener {
 	@Override
 	public void onError(Throwable throwable, String response) {
 		//将用户使用次数返回
-		miniPopularizeCommonService.recoverUserLimit(userId);
+		miniPopularizeCommonService.recoverUserLimit(userId, recoverNum);
 		log.error("gpt对话异常,异常key:{}", response);
-		Message message = Message.ofAssistant("图生成异常");
+		Message message = Message.ofAssistant("图生成异常");
 		SendMessageUtil.sendMessage(userId, message);
 		message = Message.ofAssistant("[DONE]");
 		SendMessageUtil.sendMessage(userId, message);
-//        asyncService.endOfAnswer(conversationId, "图像生成异常");
+		miniPopularizeCommonService.recordChatEndOfAnswer(conversationId, "图片生成异常", MiniPopularizeUserConversationChat.Role.sys);
 	}
 
 	public MiniPopularizeUserConversationChat setImagRecord(Long imagRecordId, String img, MiniPopularizeUserConversationChat.Status status, String content) {
@@ -72,6 +76,7 @@ public class ConsoleStreamListener extends AbstractStreamListener {
 				.img(img)
 				.type(MiniPopularizeUserConversationChat.Type.image)
 				.content(content)
+				.role(MiniPopularizeUserConversationChat.Role.assistant)
 				.status(status).build();
 		build.setId(imagRecordId);
 		return build;

+ 3 - 1
netflix-service/src/main/java/com/cyksj/service/mini/MiniPopularizeCommonService.java

@@ -10,7 +10,9 @@ import com.cyksj.model.entity.MiniPopularizeUserConversationChat;
  */
 public interface MiniPopularizeCommonService {
 
-	void recoverUserLimit(Long id);
+	void recoverUserLimit(Long userId, Boolean recoverNum);
 
 	void saveImgRecord(MiniPopularizeUserConversationChat record);
+
+	void recordChatEndOfAnswer(String conversationId, String content, MiniPopularizeUserConversationChat.Role role);
 }

+ 17 - 3
netflix-service/src/main/java/com/cyksj/service/mini/impl/MiniPopularizeCommonServiceImpl.java

@@ -25,9 +25,12 @@ public class MiniPopularizeCommonServiceImpl implements MiniPopularizeCommonServ
 	private final MiniPopularizeUserConversationChatMapper conversationChatMapper;
 
 	@Override
-	public void recoverUserLimit(Long id) {
-		redisService.incr(RedisService.key.MINI_POPULARIZE_GPT_NUM.getName() + id, 1L);
-		miniPopularizeUserMapper.incrNum(id, 1);
+	public void recoverUserLimit(Long userId, Boolean recoverNum) {
+		if (!recoverNum) {
+			return;
+		}
+		redisService.incr(RedisService.key.MINI_POPULARIZE_GPT_NUM.getName() + userId, 1L);
+		miniPopularizeUserMapper.incrNum(userId, 1);
 	}
 
 	@Override
@@ -37,4 +40,15 @@ public class MiniPopularizeCommonServiceImpl implements MiniPopularizeCommonServ
 			conversationChatMapper.updateById(record);
 		} else conversationChatMapper.insert(record);
 	}
+
+	@Override
+	public void recordChatEndOfAnswer(String conversationId, String content, MiniPopularizeUserConversationChat.Role role) {
+		MiniPopularizeUserConversationChat chat = MiniPopularizeUserConversationChat
+				.builder()
+				.conversationId(conversationId)
+				.content(content)
+				.type(MiniPopularizeUserConversationChat.Type.text)
+				.role(role).build();
+		conversationChatMapper.insert(chat);
+	}
 }

+ 13 - 10
netflix-service/src/main/java/com/cyksj/service/mini/impl/MiniPopularizeFrontServiceImpl.java

@@ -31,6 +31,7 @@ import org.springframework.transaction.annotation.Transactional;
 import java.io.IOException;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
  * 项目名: yhlxj2
@@ -66,11 +67,12 @@ public class MiniPopularizeFrontServiceImpl implements MiniPopularizeFrontServic
 	@Transactional(rollbackFor = Throwable.class)
 	public void createPictures(MiniAiPicturesReq miniAiPicturesReq) throws IOException {
 		String conversationId = miniAiPicturesReq.getConversationId();
+		AtomicBoolean recoverNum = new AtomicBoolean(true);
 		Long userId = miniAiPicturesReq.getUserId();
 		conversationId = checkUser(MiniPopularizeUserConversation.builder()
 				.userId(userId)
 				.content(miniAiPicturesReq.getTips())
-				.build(), conversationId);
+				.build(), conversationId, recoverNum);
 		miniAiPicturesReq.setConversationId(conversationId);
 		Long configId = miniAiPicturesReq.getId();
 		if (configId != null) {
@@ -90,6 +92,7 @@ public class MiniPopularizeFrontServiceImpl implements MiniPopularizeFrontServic
 				.conversationId(conversationId)
 				.content(miniAiPicturesReq.getTips())
 				.type(MiniPopularizeUserConversationChat.Type.text)
+				.role(MiniPopularizeUserConversationChat.Role.user)
 				.userId(userId)
 				.build();
 		conversationChatMapper.insert(chat);
@@ -107,6 +110,7 @@ public class MiniPopularizeFrontServiceImpl implements MiniPopularizeFrontServic
 				.miniPopularizeCommonService(miniPopularizeCommonService)
 				.conversationId(conversationId)
 				.imgRecordId(imageRecord.getId())
+				.recoverNum(recoverNum.get())
 				.build();
 		streamChatCompletion(miniAiPicturesReq, listener);
 	}
@@ -118,7 +122,7 @@ public class MiniPopularizeFrontServiceImpl implements MiniPopularizeFrontServic
 		return user;
 	}
 
-	private String checkUser(MiniPopularizeUserConversation conversation, String conversationId) {
+	private String checkUser(MiniPopularizeUserConversation conversation, String conversationId, AtomicBoolean recoverNum) {
 		if (conversationId != null) {
 			MiniPopularizeUserConversationChat miniPopularizeUserConversationChat = conversationChatMapper.selectOne(Wrappers.lambdaQuery(MiniPopularizeUserConversationChat.class)
 					.eq(MiniPopularizeUserConversationChat::getConversationId, conversationId)
@@ -126,15 +130,11 @@ public class MiniPopularizeFrontServiceImpl implements MiniPopularizeFrontServic
 					.orderByDesc(MiniPopularizeUserConversationChat::getId)
 					.last("limit 1"));
 			if (miniPopularizeUserConversationChat == null || !miniPopularizeUserConversationChat.getUserId().equals(conversation.getUserId())) {
-				conversationId = null;
+				throw BusinessRuntimeException.getInstance("系统错误,无法在原图上进行修改");
 			} else if (miniPopularizeUserConversationChat.getStatus() != MiniPopularizeUserConversationChat.Status.success) {
 				throw BusinessRuntimeException.getInstance("图片还未生成,无法进行修改");
 			}
-
-			if (conversationId == null) {
-				conversationId = miniPopularizeUserConversationChat.getConversationId();
-				conversation.setConversationId(conversationId);
-			}
+			recoverNum.set(false);
 		}
 		Long userId = conversation.getUserId();
 		if (conversationId == null) {
@@ -148,7 +148,7 @@ public class MiniPopularizeFrontServiceImpl implements MiniPopularizeFrontServic
 			if (num < 0) {
 				redisService.incr(RedisService.key.MINI_POPULARIZE_GPT_NUM.getName() + userId, 1L);
 			}
-			int i = miniPopularizeUserMapper.decLumaNum(user.getId(), 1, user.getNum());
+			int i = miniPopularizeUserMapper.decLumaNum(userId, 1, user.getNum());
 			if (i == 0) {
 				redisService.incr(RedisService.key.MINI_POPULARIZE_GPT_NUM.getName() + userId, 1L);
 				throw BusinessRuntimeException.getInstance("网络异常,请稍后再试");
@@ -209,10 +209,13 @@ public class MiniPopularizeFrontServiceImpl implements MiniPopularizeFrontServic
 	private void contentMsg(JSONArray messages, String conversationId) {
 		List<MiniPopularizeUserConversationChat> miniPopularizeUserConversationChats = conversationChatMapper.selectList(Wrappers.lambdaQuery(MiniPopularizeUserConversationChat.class)
 				.eq(MiniPopularizeUserConversationChat::getConversationId, conversationId));
-		miniPopularizeUserConversationChats.forEach(chat->{
+		miniPopularizeUserConversationChats.forEach(chat -> {
 			if (chat.getStatus() != null && chat.getStatus() == MiniPopularizeUserConversationChat.Status.processing) {
 				return;
 			}
+			if (chat.getRole() != null && chat.getRole() == MiniPopularizeUserConversationChat.Role.sys) {
+				return;
+			}
 			String content = chat.getContent();
 			if (chat.getType() == MiniPopularizeUserConversationChat.Type.text) {
 				messages.add(JSONUtil.createObj().set("role", "user").set("content", content));