Quellcode durchsuchen

Merge branch 'midjourney-alpha' into midjourney-detach

zwhui vor 2 Jahren
Ursprung
Commit
aa639f15f2

+ 11 - 0
midjourney/src/main/java/com/yhlxj/dao/mapper/midjourney/MidjourneySessionMapper.java

@@ -0,0 +1,11 @@
+package com.yhlxj.dao.mapper.midjourney;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yhlxj.dao.model.entity.MidjourneySession;
+
+/**
+ * @author chan
+ * @date 2024/3/19 10:43
+ */
+public interface MidjourneySessionMapper extends BaseMapper<MidjourneySession> {
+}

+ 11 - 0
midjourney/src/main/java/com/yhlxj/dao/mapper/midjourney/MidjourneyUserConversationRecordMapper.java

@@ -0,0 +1,11 @@
+package com.yhlxj.dao.mapper.midjourney;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yhlxj.dao.model.entity.MidjourneyUserConversationRecord;
+
+/**
+ * @author chan
+ * @date 2024/4/2 18:12
+ */
+public interface MidjourneyUserConversationRecordMapper extends BaseMapper<MidjourneyUserConversationRecord> {
+}

+ 7 - 125
midjourney/src/main/java/com/yhlxj/dao/model/dto/AlphaSubmitRequestDTO.java

@@ -1,11 +1,14 @@
 package com.yhlxj.dao.model.dto;
 
+import lombok.Data;
+
 import java.util.List;
 
 /**
  * @author chan
  * @date 2024/8/5 16:56
  */
+@Data
 public class AlphaSubmitRequestDTO {
 
     private String prompt;
@@ -17,143 +20,22 @@ public class AlphaSubmitRequestDTO {
     private String roomId;
     private String channelId;
     private Metadata metadata;
+    private String eventType;
+    private String jobId;
 
-    // Getters and setters
-
-    public String getPrompt() {
-        return prompt;
-    }
-
-    public void setPrompt(String prompt) {
-        this.prompt = prompt;
-    }
-
-    public List<String> getPrompts() {
-        return prompts;
-    }
-
-    public void setPrompts(List<String> prompts) {
-        this.prompts = prompts;
-    }
-
-    public Flags getFlags() {
-        return flags;
-    }
-
-    public void setFlags(Flags flags) {
-        this.flags = flags;
-    }
-
-    public String getJobType() {
-        return jobType;
-    }
-
-    public void setJobType(String jobType) {
-        this.jobType = jobType;
-    }
-
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public int getIndex() {
-        return index;
-    }
-
-    public void setIndex(int index) {
-        this.index = index;
-    }
-
-    public String getRoomId() {
-        return roomId;
-    }
-
-    public void setRoomId(String roomId) {
-        this.roomId = roomId;
-    }
-
-    public String getChannelId() {
-        return channelId;
-    }
-
-    public void setChannelId(String channelId) {
-        this.channelId = channelId;
-    }
-
-    public Metadata getMetadata() {
-        return metadata;
-    }
-
-    public void setMetadata(Metadata metadata) {
-        this.metadata = metadata;
-    }
-
+    @Data
     public static class Flags {
         private String mode;
         private boolean isPrivate;
 
-        // Getters and setters
-
-        public String getMode() {
-            return mode;
-        }
-
-        public void setMode(String mode) {
-            this.mode = mode;
-        }
-
-        public boolean isPrivate() {
-            return isPrivate;
-        }
-
-        public void setPrivate(boolean isPrivate) {
-            this.isPrivate = isPrivate;
-        }
     }
 
+    @Data
     public static class Metadata {
         private List<String> imagePrompts;
         private List<String> imageReferences;
         private List<String> characterReferences;
         private boolean autoPrompt;
-
-        // Getters and setters
-
-        public List<String> getImagePrompts() {
-            return imagePrompts;
-        }
-
-        public void setImagePrompts(List<String> imagePrompts) {
-            this.imagePrompts = imagePrompts;
-        }
-
-        public List<String> getImageReferences() {
-            return imageReferences;
-        }
-
-        public void setImageReferences(List<String> imageReferences) {
-            this.imageReferences = imageReferences;
-        }
-
-        public List<String> getCharacterReferences() {
-            return characterReferences;
-        }
-
-        public void setCharacterReferences(List<String> characterReferences) {
-            this.characterReferences = characterReferences;
-        }
-
-        public boolean isAutoPrompt() {
-            return autoPrompt;
-        }
-
-        public void setAutoPrompt(boolean autoPrompt) {
-            this.autoPrompt = autoPrompt;
-        }
     }
 
 }

+ 88 - 0
midjourney/src/main/java/com/yhlxj/dao/model/entity/MidjourneySession.java

@@ -0,0 +1,88 @@
+package com.yhlxj.dao.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ejlchina.searcher.bean.SearchBean;
+import com.yhlxj.dao.model.BaseEntity;
+import lombok.Data;
+
+/**
+ * @author chan
+ * @date 2024/3/18 17:10
+ */
+@Data
+@TableName("midjourney_session")
+@SearchBean(tables = "midjourney_session")
+public class MidjourneySession extends BaseEntity {
+
+    /**
+     * 邮箱
+     */
+    private String email;
+
+    /**
+     * 密码
+     */
+    private String password;
+
+    /**
+     * 状态 1有效 1无效
+     */
+    private Integer status;
+
+    /**
+     * 是否为plus会员
+     */
+    @TableField("isPlus")
+    private Integer isPlus;
+
+    /**
+     * accountId
+     */
+    @TableField("accountId")
+    private Long accountId;
+
+    @TableField("isCar")
+    private Boolean isCar;
+
+    /**
+     * 车id
+     */
+    @TableField("carID")
+    private String carId;
+
+    /**
+     * 车名称
+     */
+    private String carName;
+
+    /**
+     * 官方session
+     */
+    @TableField("officialSession")
+    private String officialSession;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 排序
+     */
+    private Integer sort;
+
+    /**
+     * 快速时长
+     */
+    @TableField("fastTime")
+    private Long fastTime;
+
+    /**
+     * 任务数
+     */
+    @TableField("taskNum")
+    private Integer taskNum;
+
+
+}

+ 55 - 0
midjourney/src/main/java/com/yhlxj/dao/model/entity/MidjourneyUserConversationRecord.java

@@ -0,0 +1,55 @@
+package com.yhlxj.dao.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ejlchina.searcher.bean.SearchBean;
+import com.yhlxj.dao.model.BaseEntity;
+import lombok.Data;
+
+/**
+ * @author chan
+ * @date 2024/3/18 17:10
+ */
+@Data
+@TableName("midjourney_user_conversation_record")
+@SearchBean(tables = "midjourney_user_conversation_record")
+public class MidjourneyUserConversationRecord extends BaseEntity {
+
+
+    /**
+     * 凭证
+     */
+    private String userToken;
+
+    /**
+     * 会话id
+     */
+    private String conversationId;
+
+    /**
+     * 指令
+     */
+    private String prompt;
+
+    /**
+     * 动作
+     */
+    private String action;
+
+    private String mode;
+
+    /**
+     * 车次id
+     */
+    private String carId;
+
+    /**
+     * 车次名称
+     */
+    private String carName;
+
+    /**
+     * 状态
+     */
+    private String status;
+
+}

+ 1 - 0
midjourney/src/main/java/com/yhlxj/redis/RedisService.java

@@ -756,6 +756,7 @@ public class RedisService {
         MIDJOURNEY_PROGRESS("midjourney:task:progress:","task progress 任务进度", 60 * 60 * 1L),
         MIDJOURNEY_USER_TIME("midjourney:user:time:", "midjourney user time", 60 * 60 * 24L),
         MIDJOURNEY_USER_SUBMIT("midjourney:user:submit:", "midjourney user submit", 30L),
+        MIDJOURNEY_CAR_TASK("midjourney:car:task","midjourney car 任务数", 48 * 60 * 60L),
         ;
 
         private String name;

+ 5 - 0
midjourney/src/main/java/com/yhlxj/service/midjourney/MidjourneyService.java

@@ -2,6 +2,7 @@ package com.yhlxj.service.midjourney;
 
 
 import com.yhlxj.dao.mapper.midjourney.MidjourneyUserConversationMapper;
+import com.yhlxj.dao.model.dto.AlphaSubmitRequestDTO;
 import com.yhlxj.dao.model.dto.BlendDimensions;
 import com.yhlxj.dao.model.dto.SubmitUploadDTO;
 import com.yhlxj.dao.model.entity.MidjourneyUser;
@@ -48,4 +49,8 @@ public interface MidjourneyService {
     void syncPicture();
 
     Long checkUserLimit(MidjourneyUser user,Integer mode);
+
+    void saveConversationRecord(String userToken, String json,String carid,String status);
+
+    void userSubmitLimit(MidjourneyUser user,String action,Object customId,Boolean again);
 }

+ 66 - 8
midjourney/src/main/java/com/yhlxj/service/midjourney/impl/MidjourneyServiceImpl.java

@@ -11,6 +11,7 @@ import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.exception.BusinessRuntimeException;
@@ -20,14 +21,8 @@ import com.cyksj.common.util.Jsons;
 import com.cyksj.common.util.QueryWrapperUtils;
 import com.cyksj.common.util.StringUtil;
 import com.yhlxj.dao.mapper.GroupsRelationMapper;
-import com.yhlxj.dao.mapper.midjourney.MidjourneyApiChannelMapper;
-import com.yhlxj.dao.mapper.midjourney.MidjourneyUserConversationMapper;
-import com.yhlxj.dao.mapper.midjourney.MidjourneyUserMapper;
-import com.yhlxj.dao.mapper.midjourney.MidjourneyWhiteMapper;
-import com.yhlxj.dao.model.dto.BlendDimensions;
-import com.yhlxj.dao.model.dto.MessageButton;
-import com.yhlxj.dao.model.dto.MjVersionStatus;
-import com.yhlxj.dao.model.dto.SubmitUploadDTO;
+import com.yhlxj.dao.mapper.midjourney.*;
+import com.yhlxj.dao.model.dto.*;
 import com.yhlxj.dao.model.entity.*;
 import com.yhlxj.dao.model.enums.WsMessageTypeEnum;
 import com.yhlxj.dao.model.response.SubmitResult;
@@ -122,6 +117,10 @@ public class MidjourneyServiceImpl implements MidjourneyService {
 
     private final MidjourneyWhiteMapper midjourneyWhiteMapper;
 
+    private final MidjourneyUserConversationRecordMapper midjourneyUserConversationRecordMapper;
+
+    private final MidjourneySessionMapper midjourneySessionMapper;
+
     @Override
     public MidjourneyUser getUser(String userToken) {
         if(StringUtils.isBlank(userToken)){
@@ -651,6 +650,7 @@ public class MidjourneyServiceImpl implements MidjourneyService {
     /**
      * 用户生图次数限制
      */
+    @Override
     public void userSubmitLimit(MidjourneyUser user,String action,Object customId,Boolean again) {
         if (again) {
             return;
@@ -1446,4 +1446,62 @@ public class MidjourneyServiceImpl implements MidjourneyService {
        }
     }
 
+
+
+    @Override
+    public void saveConversationRecord(String userToken, String json,String carid,String status) {
+        JSONArray success = JSONUtil.parseObj(json).getJSONArray("success");
+        if (success.isEmpty()) {
+            return;
+        }
+        JSONObject jsons = success.getJSONObject(0);
+        LambdaQueryWrapper<MidjourneySession> wrapper = Wrappers.lambdaQuery(MidjourneySession.class).eq(MidjourneySession::getCarId, carid);
+        MidjourneySession midjourneySession = midjourneySessionMapper.selectOne(wrapper);
+        String jobId = jsons.getStr("job_id");
+        MidjourneyUserConversationRecord midjourneyUserConversationRecord = midjourneyUserConversationRecordMapper.selectOne(Wrappers.lambdaQuery(MidjourneyUserConversationRecord.class).eq(MidjourneyUserConversationRecord::getConversationId, jobId));
+        if (midjourneyUserConversationRecord == null) {
+            midjourneyUserConversationRecord = new MidjourneyUserConversationRecord();
+            midjourneyUserConversationRecord.setUserToken(userToken);
+            midjourneyUserConversationRecord.setCarId(midjourneySession.getCarId());
+            midjourneyUserConversationRecord.setCarName(midjourneySession.getCarName());
+            midjourneyUserConversationRecord.setConversationId(jobId);
+            midjourneyUserConversationRecord.setMode(JSONUtil.parseObj(jsons.getStr("flags")).getStr("mode"));
+            midjourneyUserConversationRecord.setAction(jsons.getStr("event_type"));
+            midjourneyUserConversationRecord.setPrompt(jsons.getStr("prompt"));
+            midjourneyUserConversationRecord.setStatus(status);
+            midjourneyUserConversationRecordMapper.insert(midjourneyUserConversationRecord);
+        }else {
+            midjourneyUserConversationRecord.setStatus(status);
+            midjourneyUserConversationRecordMapper.updateById(midjourneyUserConversationRecord);
+            return;
+        }
+
+        if (StringUtils.isNotBlank(midjourneySession.getCarId())) {
+            updateExperienceAndScore(midjourneySession.getCarId(), System.currentTimeMillis());
+        }
+
+    }
+
+
+    // 更新体验并计算评分
+    public void updateExperienceAndScore(String carId, long timestamp) {
+        // 定义键名
+        String key = RedisService.key.MIDJOURNEY_CAR_TASK.getName() + carId;
+
+        // 更新体验数据
+        redisService.zAdd(key, timestamp, String.valueOf(timestamp));
+
+        // 清理旧数据
+        cleanupOldExperiencesAndRecalculateScore(carId, timestamp);
+    }
+
+    // 清理旧数据和重新计算评分
+    public void cleanupOldExperiencesAndRecalculateScore(String carId, long currentTimestamp) {
+        long time = currentTimestamp - (5 * 60 * 1000); // 3小时前的时间戳
+
+        // 清理高级体验旧数据
+        redisService.zRemoveRangeByScore(RedisService.key.MIDJOURNEY_CAR_TASK.getName() + carId, 0, time);
+    }
+
+
 }

+ 29 - 6
midjourney/src/main/java/com/yhlxj/web/mirror/AlphaMidjourneyController.java

@@ -1,5 +1,9 @@
 package com.yhlxj.web.mirror;
 
+import cn.hutool.json.JSONUtil;
+import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
+import com.cyksj.common.util.IoKit;
+import com.cyksj.common.util.Jsons;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.yhlxj.dao.model.dto.AlphaSubmitRequestDTO;
@@ -9,12 +13,16 @@ import com.yhlxj.service.midjourney.MidjourneyService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
 
 /**
  * @author chan
@@ -26,6 +34,8 @@ import javax.servlet.http.HttpServletResponse;
 @RequestMapping("/applets/alpha-midjourney")
 public class AlphaMidjourneyController {
 
+    private static final GlobalThreadPoolTaskExecutor TASK_EXECUTOR = GlobalThreadPoolTaskExecutor.getInstance();
+
     private final HttpServletRequest request;
 
     private final HttpServletResponse response;
@@ -40,7 +50,7 @@ public class AlphaMidjourneyController {
     private static final String MODE_TURBO = "turbo";
 
     @RequestMapping("/auditLimit")
-    public AlphaAuditLimitResponse auditLimit(AlphaSubmitRequestDTO submitRequestDTO) {
+    public AlphaAuditLimitResponse auditLimit() {
         String userToken = getUserTokenFromRequest();
 
         if (userToken == null) {
@@ -61,6 +71,13 @@ public class AlphaMidjourneyController {
         if (StringUtils.isBlank(mode)) {
             return badRequestResponse("模式错误.请选择fast 或者 relax模式");
         }
+        try {
+            if (MODE_RELAX.equals(mode)) {
+                midjourneyService.userSubmitLimit(user,"imagine", "1234",false);
+            }
+        }catch (Exception e){
+            return badRequestResponse(e.getMessage());
+        }
 
         if (MODE_TURBO.equals(mode)) {
             return badRequestResponse("暂不支持turbo 模式.请选择fast 或者 relax模式");
@@ -71,7 +88,6 @@ public class AlphaMidjourneyController {
         } else if (MODE_RELAX.equals(mode) && user.getMjRelaxNum() < 1) {
             return badRequestResponse("您已经没有次数啦。模式:" + mode);
         }
-
         return new AlphaAuditLimitResponse();
     }
 
@@ -88,8 +104,12 @@ public class AlphaMidjourneyController {
     }
 
     @RequestMapping("/notifyUrl")
-    public Result<String> notifyUrl() {
-        log.info("提交成功 通知扣次数");
+    public Result<String> notifyUrl() throws IOException {
+        InputStream inputStream = request.getInputStream();
+        byte[] bytes = IoKit.toBytes(inputStream);
+        String json = new String(bytes, StandardCharsets.UTF_8);
+        inputStream.close();
+        log.info("提交成功 通知扣次数 {}", json);
         String userToken = getUserTokenFromRequest();
         String carid = request.getHeader("Carid");
 
@@ -99,8 +119,11 @@ public class AlphaMidjourneyController {
         }
         log.info("token:{}, mode:{}", userToken, mode);
         MidjourneyUser user = midjourneyService.getUser(userToken);
-
-
+        if(StringUtils.isNotBlank(carid)){
+            TASK_EXECUTOR.execute(() -> {
+                midjourneyService.saveConversationRecord(userToken, json, carid,"SUCCESS");
+            });
+        }
         midjourneyService.checkUserLimit(user, MODE_RELAX.equals(mode) ? 2 : 1);
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }