package jnpf.base.service.impl;
|
|
import com.google.common.base.CaseFormat;
|
import jnpf.base.model.ai.VisualAiModel;
|
import jnpf.base.service.VisualAiService;
|
import jnpf.constant.GenerateConstant;
|
import jnpf.constant.MsgCode;
|
import jnpf.constants.AiConstants;
|
import jnpf.exception.DataException;
|
import jnpf.model.ai.AiFormFieldModel;
|
import jnpf.model.ai.AiFormModel;
|
import jnpf.service.OpenAiService;
|
import jnpf.util.AiLimitUtil;
|
import jnpf.util.StringUtil;
|
import jnpf.util.UserProvider;
|
import jnpf.util.visiual.JnpfKeyConsts;
|
import org.apache.commons.collections4.CollectionUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.Objects;
|
import java.util.regex.Matcher;
|
import java.util.regex.Pattern;
|
|
/**
|
* 在线开发ai实现
|
*
|
* @author JNPF开发平台组
|
* @version v5.1.0
|
* @copyright 引迈信息技术有限公司
|
* @date 2024/12/2 10:05:25
|
*/
|
@Service
|
public class VisualAiServiceImpl implements VisualAiService {
|
@Autowired
|
private OpenAiService openAiService;
|
|
@Override
|
public VisualAiModel form(String keyword) {
|
if(!AiLimitUtil.tryAcquire(UserProvider.getUser().getUserId())){
|
throw new DataException(MsgCode.SYS182.get());
|
}
|
VisualAiModel visualAiModel = new VisualAiModel();
|
List<AiFormModel> aiModelList = new ArrayList<>();
|
List<AiFormModel> list = openAiService.generatorModelVO(keyword);
|
if (CollectionUtils.isNotEmpty(list)) {
|
for (int i = 0; i < list.size(); i++) {
|
AiFormModel aiFormModel = list.get(i);
|
if (Objects.equals(0, i)) {
|
String enCode = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, aiFormModel.getTableName());
|
visualAiModel.setFullName(aiFormModel.getTableTitle());
|
visualAiModel.setEnCode(enCode);
|
aiFormModel.setIsMain(true);
|
} else {
|
aiFormModel.setIsMain(false);
|
}
|
List<AiFormFieldModel> fields = new ArrayList<>();
|
List<AiFormFieldModel> fieldList = aiFormModel.getFields();
|
if (CollectionUtils.isNotEmpty(fieldList)) {
|
int index = 1;
|
for (int j = 0; j < fieldList.size(); j++) {
|
AiFormFieldModel aiFormFieldModel = fieldList.get(j);
|
String fieldName = aiFormFieldModel.getFieldName();
|
String jnpfKey = aiFormFieldModel.getFieldComponent();
|
if (containsChinese(fieldName) || GenerateConstant.containKeyword(fieldName)) {
|
String formatIndex = String.format("%03d", index);
|
String suffix = "_num" + formatIndex;
|
aiFormFieldModel.setFieldName(jnpfKey + suffix);
|
index++;
|
}
|
List<String> jnpfKeyList = new ArrayList<>();
|
for (String s : AiConstants.GEN_MODEL_COMPNENT.split("-")) {
|
if (StringUtil.isNotBlank(s)) jnpfKeyList.add(s.trim());
|
}
|
if (!jnpfKeyList.contains(jnpfKey)) {
|
aiFormFieldModel.setFieldComponent(JnpfKeyConsts.COM_INPUT);
|
}
|
//子表控件处理
|
if (!aiFormModel.getIsMain()) {
|
//子表不能有单选框,多选框-调整成下拉框
|
List<String> childNotRadio = new ArrayList<>();
|
childNotRadio.add(JnpfKeyConsts.RADIO);
|
childNotRadio.add(JnpfKeyConsts.CHECKBOX);
|
//子表不能有的其他控件
|
List<String> childNotOther = new ArrayList<>();
|
childNotOther.add(JnpfKeyConsts.TEXTAREA);
|
childNotOther.add(JnpfKeyConsts.LINK);
|
childNotOther.add(JnpfKeyConsts.BUTTON);
|
childNotOther.add(JnpfKeyConsts.ALERT);
|
childNotOther.add(JnpfKeyConsts.BARCODE);
|
childNotOther.add(JnpfKeyConsts.QR_CODE);
|
childNotOther.add(JnpfKeyConsts.EDITOR);
|
if (childNotRadio.contains(jnpfKey)) {
|
aiFormFieldModel.setFieldComponent(JnpfKeyConsts.SELECT);
|
} else if (childNotOther.contains(jnpfKey)) {
|
aiFormFieldModel.setFieldComponent(JnpfKeyConsts.COM_INPUT);
|
}
|
}
|
|
if (containsKeyWord(aiFormFieldModel.getFieldName())) {
|
fields.add(aiFormFieldModel);
|
}
|
}
|
}
|
aiFormModel.setFields(fields);
|
aiModelList.add(aiFormModel);
|
}
|
}
|
visualAiModel.setAiModelList(aiModelList);
|
return visualAiModel;
|
}
|
|
/**
|
* 判断是否包含中文(字段空或者包含中文字段名称重命名)
|
*
|
* @param str
|
* @return
|
*/
|
private static boolean containsChinese(String str) {
|
if (StringUtil.isEmpty(str)) return true;
|
Pattern pattern = Pattern.compile("[\u4E00-\u9FA5]");
|
Matcher matcher = pattern.matcher(str);
|
return matcher.find();
|
}
|
|
/**
|
* 字段是否包含特定(用于过滤掉不要的字段如:以_fk结尾是外键,本系统内已自动生成外键)
|
*
|
* @param str
|
* @return
|
*/
|
private static boolean containsKeyWord(String str) {
|
if (str.toLowerCase().endsWith("_fk")) {
|
return false;
|
}
|
return true;
|
}
|
}
|