Merge branch 'dev/dev_xp' into dev/dev
This commit is contained in:
6
pom.xml
6
pom.xml
@@ -276,6 +276,12 @@
|
|||||||
<artifactId>gson</artifactId>
|
<artifactId>gson</artifactId>
|
||||||
<version>2.10.1</version>
|
<version>2.10.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.itextpdf</groupId>
|
||||||
|
<artifactId>itextpdf</artifactId>
|
||||||
|
<version>5.5.13.2</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
package com.ai.da.common.constant;
|
package com.ai.da.common.constant;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class CommonConstant {
|
public class CommonConstant {
|
||||||
// 单位 秒 10分钟过期
|
// 单位 秒 10分钟过期
|
||||||
// public static final Long TASK_EXPIRE_TIME = 24 * 60 * 60L;
|
// public static final Long TASK_EXPIRE_TIME = 24 * 60 * 60L;
|
||||||
@@ -31,6 +34,29 @@ public class CommonConstant {
|
|||||||
|
|
||||||
public static final String PYTHON_PORT_9997 = "9997";
|
public static final String PYTHON_PORT_9997 = "9997";
|
||||||
|
|
||||||
|
public static final List<String> AGES_EN = Arrays.asList("Below 20", "20-30", "30-40", "40+");
|
||||||
|
|
||||||
|
public static final List<String> AGES_CN = Arrays.asList("20岁以下", "20-30岁", "30-40岁", "40+岁");
|
||||||
|
public static final List<String> IF_HELPFUL_EN = Arrays.asList("Easy to learn and use", "Easy to get trend information",
|
||||||
|
"Lots of creative design proposals","The AIGC functions for moodboard is helpful","The AIGC functions for design sketches is helpful",
|
||||||
|
"Easy to select the right color","The Chatbot function is helpful","The print position function is helpful",
|
||||||
|
"The drawing function is helpful","The export function is useful","Easy to edit the design","Others");
|
||||||
|
|
||||||
|
public static final List<String> IF_HELPFUL_CN = Arrays.asList("易于学习和使用", "容易获取趋势信息",
|
||||||
|
"提供大量创意设计方案","AIGC功能对灵感板有帮助","AIGC功能对设计草图有帮助",
|
||||||
|
"容易选择合适的颜色","聊天机器人功能有帮助","打印位置功能有帮助",
|
||||||
|
"绘图功能有帮助","导出功能有用","设计编辑简单","其他");
|
||||||
|
|
||||||
|
public static final List<String> IF_IMPROVE_EN = Arrays.asList("Proposed designs are boring, need more interesting designs",
|
||||||
|
"Difficult to make changes on design","Only 2D output, no 3D results","Difficult to apply keywords for AIGC generation",
|
||||||
|
"Clothing is not in the right proportion","Not compatible with pattern making solutions","Improved user interface for better navigation",
|
||||||
|
"Lack of responsive customer support","Insufficient tutorial or guidance for new users","Limited personalization options for designs","Others");
|
||||||
|
|
||||||
|
public static final List<String> IF_IMPROVE_CN = Arrays.asList("提供的设计很无聊,需要更多有趣的设计",
|
||||||
|
"设计修改困难","只有2D输出,没有3D结果","难以选择合适的关键词应用于AIGC生成",
|
||||||
|
"服装比例不正确","与打版解决方案不兼容","改进用户界面以便更好导航",
|
||||||
|
"客户支持响应不及时","对新用户的教程或指导不足","设计个性化选项有限","其他");
|
||||||
|
|
||||||
|
public static final List<String> IS_SUBSCRIBE = Arrays.asList("yes", "no");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -255,6 +255,22 @@ public class S3Util {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getPreSignedUrl(String path, int expiry, boolean resetCache) {
|
||||||
|
if (resetCache || LocalCacheUtils.getPresignedUrlCache(path) == null) {
|
||||||
|
if (!path.contains("/")) {
|
||||||
|
throw new BusinessException("The path is error!");
|
||||||
|
}
|
||||||
|
int index = path.indexOf("/");
|
||||||
|
String bucketName = path.substring(0, index);
|
||||||
|
String fileName = path.substring(index + 1);
|
||||||
|
String presignedUrl = getPreSignatureUrl(bucketName, fileName, expiry);
|
||||||
|
LocalCacheUtils.setPresignedUrlCache(path, presignedUrl);
|
||||||
|
return presignedUrl;
|
||||||
|
} else {
|
||||||
|
return LocalCacheUtils.getPresignedUrlCache(path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param keyName key名称: test/2022/06/123.pdf
|
* @param keyName key名称: test/2022/06/123.pdf
|
||||||
* @param signatureDurationTime 有效期 单位:秒
|
* @param signatureDurationTime 有效期 单位:秒
|
||||||
|
|||||||
@@ -7,6 +7,9 @@ import com.ai.da.mapper.primary.DesignMapper;
|
|||||||
import com.ai.da.mapper.primary.TrialOrderMapper;
|
import com.ai.da.mapper.primary.TrialOrderMapper;
|
||||||
import com.ai.da.mapper.primary.entity.TrialOrder;
|
import com.ai.da.mapper.primary.entity.TrialOrder;
|
||||||
import com.ai.da.model.dto.UserDesignStatisticDTO;
|
import com.ai.da.model.dto.UserDesignStatisticDTO;
|
||||||
|
import com.ai.da.model.vo.QuestionnaireFeedbackVO;
|
||||||
|
import com.ai.da.model.vo.QuestionnaireVO;
|
||||||
|
import com.ai.da.service.ConvenientInquiryService;
|
||||||
import io.netty.util.internal.StringUtil;
|
import io.netty.util.internal.StringUtil;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
@@ -30,6 +33,10 @@ public class ConvenientInquiryController {
|
|||||||
@Resource
|
@Resource
|
||||||
private DesignMapper designMapper;
|
private DesignMapper designMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ConvenientInquiryService convenientInquiryService;
|
||||||
|
|
||||||
|
|
||||||
@ApiOperation("获取当前所有试用用户")
|
@ApiOperation("获取当前所有试用用户")
|
||||||
@GetMapping("/getTrial")
|
@GetMapping("/getTrial")
|
||||||
public Response<List<TrialOrder>> getTrial(){
|
public Response<List<TrialOrder>> getTrial(){
|
||||||
@@ -60,4 +67,18 @@ public class ConvenientInquiryController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//调查问卷
|
||||||
|
@ApiOperation("获取调查问卷统计详情")
|
||||||
|
@GetMapping("/getQuestionnaireStatistic")
|
||||||
|
public Response<QuestionnaireFeedbackVO> getQuestionnaire(){
|
||||||
|
return Response.success(convenientInquiryService.getQuestionnaireInfo());
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation("获取所有调查问卷")
|
||||||
|
@GetMapping("/getAllQuestionnaire")
|
||||||
|
public Response<List<QuestionnaireVO>> getAllQuestionnaire(){
|
||||||
|
return Response.success(convenientInquiryService.getAllQuestionnaire());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
package com.ai.da.model.vo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class QuestionnaireFeedbackVO {
|
||||||
|
private Info age;
|
||||||
|
private Info question1;
|
||||||
|
private Info question2;
|
||||||
|
private Info question3;
|
||||||
|
private List<String> otherDesignTools;
|
||||||
|
|
||||||
|
public QuestionnaireFeedbackVO() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public QuestionnaireFeedbackVO(Info age, Info question1, Info question2, Info question3, List<String> otherDesignTools) {
|
||||||
|
this.age = age;
|
||||||
|
this.question1 = question1;
|
||||||
|
this.question2 = question2;
|
||||||
|
this.question3 = question3;
|
||||||
|
this.otherDesignTools = otherDesignTools;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Info{
|
||||||
|
public List<String> name;
|
||||||
|
public List<Integer> values;
|
||||||
|
public List<String> otherReason;
|
||||||
|
|
||||||
|
public Info() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Info(List<String> name, List<Integer> values) {
|
||||||
|
this.name = name;
|
||||||
|
this.values = values;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Info(List<String> name, List<Integer> values, List<String> otherReason) {
|
||||||
|
this.name = name;
|
||||||
|
this.values = values;
|
||||||
|
this.otherReason = otherReason;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package com.ai.da.service;
|
||||||
|
|
||||||
|
import com.ai.da.mapper.primary.entity.Questionnaire;
|
||||||
|
import com.ai.da.model.vo.QuestionnaireFeedbackVO;
|
||||||
|
import com.ai.da.model.vo.QuestionnaireVO;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface ConvenientInquiryService extends IService<Questionnaire> {
|
||||||
|
|
||||||
|
QuestionnaireFeedbackVO getQuestionnaireInfo();
|
||||||
|
|
||||||
|
List<QuestionnaireVO> getAllQuestionnaire();
|
||||||
|
}
|
||||||
@@ -0,0 +1,217 @@
|
|||||||
|
package com.ai.da.service.impl;
|
||||||
|
|
||||||
|
import com.ai.da.common.constant.CommonConstant;
|
||||||
|
import com.ai.da.common.context.UserContext;
|
||||||
|
import com.ai.da.mapper.primary.QuestionnaireMapper;
|
||||||
|
import com.ai.da.mapper.primary.entity.Account;
|
||||||
|
import com.ai.da.mapper.primary.entity.Questionnaire;
|
||||||
|
import com.ai.da.model.vo.QuestionnaireFeedbackVO;
|
||||||
|
import com.ai.da.model.vo.QuestionnaireVO;
|
||||||
|
import com.ai.da.service.AccountService;
|
||||||
|
import com.ai.da.service.ConvenientInquiryService;
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.itextpdf.text.DocumentException;
|
||||||
|
import com.itextpdf.text.Font;
|
||||||
|
import com.itextpdf.text.pdf.BaseFont;
|
||||||
|
import io.netty.util.internal.StringUtil;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import com.itextpdf.text.Document;
|
||||||
|
import com.itextpdf.text.Paragraph;
|
||||||
|
import com.itextpdf.text.pdf.PdfWriter;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class ConvenientInquiryServiceImpl extends ServiceImpl<QuestionnaireMapper, Questionnaire> implements ConvenientInquiryService {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private AccountService accountService;
|
||||||
|
|
||||||
|
|
||||||
|
public QuestionnaireFeedbackVO getQuestionnaireInfo() {
|
||||||
|
String title = "AiDA_3.0 Feedback Survey--06/2024";
|
||||||
|
List<Questionnaire> questionnaires = queryByTitle(title);
|
||||||
|
List<Integer> ageValue = new ArrayList<>(Collections.nCopies(4, 0));
|
||||||
|
List<Integer> question1Value = new ArrayList<>(Collections.nCopies(12, 0));
|
||||||
|
List<Integer> question2Value = new ArrayList<>(Collections.nCopies(11, 0));
|
||||||
|
List<Integer> question3Value = new ArrayList<>(Collections.nCopies(2, 0));
|
||||||
|
List<String> question4Value = new ArrayList<>();
|
||||||
|
ArrayList<String> othersReason1 = new ArrayList<>();
|
||||||
|
ArrayList<String> othersReason2 = new ArrayList<>();
|
||||||
|
ArrayList<String> othersReason3 = new ArrayList<>();
|
||||||
|
|
||||||
|
for (Questionnaire questionnaire : questionnaires) {
|
||||||
|
QuestionnaireVO questionnaireVO = JSON.parseObject(questionnaire.getQuestionnaireInfo(), QuestionnaireVO.class);
|
||||||
|
// 统计年龄区间
|
||||||
|
String age = questionnaireVO.getAge();
|
||||||
|
if (age.contains("20-30")) {
|
||||||
|
Integer num = ageValue.get(1);
|
||||||
|
ageValue.set(1, ++num);
|
||||||
|
} else if (age.contains("30-40")) {
|
||||||
|
Integer num = ageValue.get(2);
|
||||||
|
ageValue.set(2, ++num);
|
||||||
|
} else if (age.contains("40+")) {
|
||||||
|
Integer num = ageValue.get(3);
|
||||||
|
ageValue.set(3, ++num);
|
||||||
|
} else {
|
||||||
|
Integer num = ageValue.get(0);
|
||||||
|
ageValue.set(0, ++num);
|
||||||
|
}
|
||||||
|
|
||||||
|
// How has AiDA been helpful to you? 统计
|
||||||
|
List<String> helpful = questionnaireVO.getHelpful();
|
||||||
|
helpful.forEach(item -> {
|
||||||
|
if (item.matches("\\d+")) {
|
||||||
|
Integer num = question1Value.get(Integer.parseInt(item) - 1);
|
||||||
|
question1Value.set(Integer.parseInt(item) - 1, ++num);
|
||||||
|
} else {
|
||||||
|
Integer num = question1Value.get(11);
|
||||||
|
question1Value.set(11, ++num);
|
||||||
|
othersReason1.add(item);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// What do you think AiDA should improve? 统计
|
||||||
|
List<String> improve = questionnaireVO.getImprove();
|
||||||
|
improve.forEach(item -> {
|
||||||
|
if (item.matches("\\d+")) {
|
||||||
|
Integer num = question2Value.get(Integer.parseInt(item) - 1);
|
||||||
|
question2Value.set(Integer.parseInt(item) - 1, ++num);
|
||||||
|
} else {
|
||||||
|
Integer num = question2Value.get(10);
|
||||||
|
question2Value.set(10, ++num);
|
||||||
|
othersReason2.add(item);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Will you subscribe to AiDA 3.0?
|
||||||
|
String isSubscribe = questionnaireVO.getIsSubscribe();
|
||||||
|
if (isSubscribe.equals("yes")) {
|
||||||
|
Integer num = question3Value.get(0);
|
||||||
|
question3Value.set(0, ++num);
|
||||||
|
} else {
|
||||||
|
Integer num = question3Value.get(1);
|
||||||
|
question3Value.set(1, ++num);
|
||||||
|
othersReason3.add(String.join(",", questionnaireVO.getReasonForNotSubscribe()));
|
||||||
|
}
|
||||||
|
if (!StringUtil.isNullOrEmpty(questionnaireVO.getDesignTools())) {
|
||||||
|
question4Value.add(questionnaireVO.getDesignTools());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String language = UserContext.getUserHolder().getLanguage();
|
||||||
|
List<String> ageName;
|
||||||
|
List<String> question1Name;
|
||||||
|
List<String> question2Name;
|
||||||
|
if (language.equals("English")) {
|
||||||
|
ageName = CommonConstant.AGES_EN;
|
||||||
|
question1Name = CommonConstant.IF_HELPFUL_EN;
|
||||||
|
question2Name = CommonConstant.IF_IMPROVE_EN;
|
||||||
|
} else {
|
||||||
|
ageName = CommonConstant.AGES_CN;
|
||||||
|
question1Name = CommonConstant.IF_HELPFUL_CN;
|
||||||
|
question2Name = CommonConstant.IF_IMPROVE_CN;
|
||||||
|
}
|
||||||
|
return new QuestionnaireFeedbackVO(
|
||||||
|
new QuestionnaireFeedbackVO.Info(ageName, ageValue),
|
||||||
|
new QuestionnaireFeedbackVO.Info(question1Name, question1Value, othersReason1),
|
||||||
|
new QuestionnaireFeedbackVO.Info(question2Name, question2Value, othersReason2),
|
||||||
|
new QuestionnaireFeedbackVO.Info(CommonConstant.IS_SUBSCRIBE, question3Value, othersReason3),
|
||||||
|
question4Value
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Questionnaire> queryByTitle(String title) {
|
||||||
|
QueryWrapper<Questionnaire> queryWrapper = new QueryWrapper<>();
|
||||||
|
queryWrapper.eq("title", title);
|
||||||
|
return baseMapper.selectList(queryWrapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<QuestionnaireVO> getAllQuestionnaire() {
|
||||||
|
String title = "AiDA_3.0 Feedback Survey--06/2024";
|
||||||
|
List<Questionnaire> questionnaires = queryByTitle(title);
|
||||||
|
ArrayList<QuestionnaireVO> questionnaireVOS = new ArrayList<>();
|
||||||
|
|
||||||
|
questionnaires.forEach(item -> {
|
||||||
|
QuestionnaireVO questionnaireVO = JSON.parseObject(item.getQuestionnaireInfo(), QuestionnaireVO.class);
|
||||||
|
questionnaireVOS.add(questionnaireVO);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
return questionnaireVOS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 输出为pdf 需要自己组装pdf内容
|
||||||
|
// 解决iText不显示中文问题
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try {
|
||||||
|
// 创建文档
|
||||||
|
Document document = new Document();
|
||||||
|
PdfWriter.getInstance(document, new FileOutputStream("output.pdf"));
|
||||||
|
document.open();
|
||||||
|
|
||||||
|
// 加载字体文件
|
||||||
|
InputStream inputStream = ConvenientInquiryServiceImpl.class.getResourceAsStream("/font/msyhl.ttc");
|
||||||
|
byte[] fontBytes = toByteArray(inputStream);
|
||||||
|
inputStream.close();
|
||||||
|
|
||||||
|
// 创建BaseFont和Font对象
|
||||||
|
BaseFont baseFont = BaseFont.createFont("msyhl.ttc,1", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, true, fontBytes, null);
|
||||||
|
Font yaHeiFont = new Font(baseFont, 12, Font.NORMAL);
|
||||||
|
|
||||||
|
// 添加带有中文字体的段落
|
||||||
|
document.add(new Paragraph("你好,世界!", yaHeiFont));
|
||||||
|
|
||||||
|
document.close();
|
||||||
|
} catch (DocumentException | IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将InputStream转换为字节数组
|
||||||
|
public static byte[] toByteArray(InputStream input) throws IOException {
|
||||||
|
ByteArrayOutputStream output = new ByteArrayOutputStream();
|
||||||
|
byte[] buffer = new byte[1024];
|
||||||
|
int n = 0;
|
||||||
|
while (-1 != (n = input.read(buffer))) {
|
||||||
|
output.write(buffer, 0, n);
|
||||||
|
}
|
||||||
|
return output.toByteArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 近期新增用户
|
||||||
|
* @param startTime 开始时间
|
||||||
|
* @param endTime 结束时间
|
||||||
|
* @param userType 用户类型 visitor\trial\official
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public List<Account> recentNewUser(String startTime, String endTime, String userType){
|
||||||
|
if (StringUtil.isNullOrEmpty(startTime) && StringUtil.isNullOrEmpty(endTime) && StringUtil.isNullOrEmpty(userType)){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
int type = userType.equals("visitor") ? 0 : userType.equals("trial") ? 1 : 2;
|
||||||
|
return accountService.getByDateAndUserType(startTime, endTime, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 近期活跃用户
|
||||||
|
public List<Account> recentActiveUser(String startTime, String endTime){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
BIN
src/main/resources/font/msyhl.ttc
Normal file
BIN
src/main/resources/font/msyhl.ttc
Normal file
Binary file not shown.
Reference in New Issue
Block a user