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 aiModelList = new ArrayList<>(); List 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 fields = new ArrayList<>(); List 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 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 childNotRadio = new ArrayList<>(); childNotRadio.add(JnpfKeyConsts.RADIO); childNotRadio.add(JnpfKeyConsts.CHECKBOX); //子表不能有的其他控件 List 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; } }