VisualAiServiceImpl.java 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. package jnpf.base.service.impl;
  2. import com.google.common.base.CaseFormat;
  3. import jnpf.base.model.ai.VisualAiModel;
  4. import jnpf.base.service.VisualAiService;
  5. import jnpf.constant.GenerateConstant;
  6. import jnpf.constant.MsgCode;
  7. import jnpf.constants.AiConstants;
  8. import jnpf.exception.DataException;
  9. import jnpf.model.ai.AiFormFieldModel;
  10. import jnpf.model.ai.AiFormModel;
  11. import jnpf.service.OpenAiService;
  12. import jnpf.util.AiLimitUtil;
  13. import jnpf.util.StringUtil;
  14. import jnpf.util.UserProvider;
  15. import jnpf.util.visiual.JnpfKeyConsts;
  16. import org.apache.commons.collections4.CollectionUtils;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.stereotype.Service;
  19. import java.util.ArrayList;
  20. import java.util.List;
  21. import java.util.Objects;
  22. import java.util.regex.Matcher;
  23. import java.util.regex.Pattern;
  24. /**
  25. * 在线开发ai实现
  26. *
  27. * @author JNPF开发平台组
  28. * @version v5.1.0
  29. * @copyright 引迈信息技术有限公司
  30. * @date 2024/12/2 10:05:25
  31. */
  32. @Service
  33. public class VisualAiServiceImpl implements VisualAiService {
  34. @Autowired
  35. private OpenAiService openAiService;
  36. @Override
  37. public VisualAiModel form(String keyword) {
  38. if(!AiLimitUtil.tryAcquire(UserProvider.getUser().getUserId())){
  39. throw new DataException(MsgCode.SYS182.get());
  40. }
  41. VisualAiModel visualAiModel = new VisualAiModel();
  42. List<AiFormModel> aiModelList = new ArrayList<>();
  43. List<AiFormModel> list = openAiService.generatorModelVO(keyword);
  44. if (CollectionUtils.isNotEmpty(list)) {
  45. for (int i = 0; i < list.size(); i++) {
  46. AiFormModel aiFormModel = list.get(i);
  47. if (Objects.equals(0, i)) {
  48. String enCode = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, aiFormModel.getTableName());
  49. visualAiModel.setFullName(aiFormModel.getTableTitle());
  50. visualAiModel.setEnCode(enCode);
  51. aiFormModel.setIsMain(true);
  52. } else {
  53. aiFormModel.setIsMain(false);
  54. }
  55. List<AiFormFieldModel> fields = new ArrayList<>();
  56. List<AiFormFieldModel> fieldList = aiFormModel.getFields();
  57. if (CollectionUtils.isNotEmpty(fieldList)) {
  58. int index = 1;
  59. for (int j = 0; j < fieldList.size(); j++) {
  60. AiFormFieldModel aiFormFieldModel = fieldList.get(j);
  61. String fieldName = aiFormFieldModel.getFieldName();
  62. String jnpfKey = aiFormFieldModel.getFieldComponent();
  63. if (containsChinese(fieldName) || GenerateConstant.containKeyword(fieldName)) {
  64. String formatIndex = String.format("%03d", index);
  65. String suffix = "_num" + formatIndex;
  66. aiFormFieldModel.setFieldName(jnpfKey + suffix);
  67. index++;
  68. }
  69. List<String> jnpfKeyList = new ArrayList<>();
  70. for (String s : AiConstants.GEN_MODEL_COMPNENT.split("-")) {
  71. if (StringUtil.isNotBlank(s)) jnpfKeyList.add(s.trim());
  72. }
  73. if (!jnpfKeyList.contains(jnpfKey)) {
  74. aiFormFieldModel.setFieldComponent(JnpfKeyConsts.COM_INPUT);
  75. }
  76. //子表控件处理
  77. if (!aiFormModel.getIsMain()) {
  78. //子表不能有单选框,多选框-调整成下拉框
  79. List<String> childNotRadio = new ArrayList<>();
  80. childNotRadio.add(JnpfKeyConsts.RADIO);
  81. childNotRadio.add(JnpfKeyConsts.CHECKBOX);
  82. //子表不能有的其他控件
  83. List<String> childNotOther = new ArrayList<>();
  84. childNotOther.add(JnpfKeyConsts.TEXTAREA);
  85. childNotOther.add(JnpfKeyConsts.LINK);
  86. childNotOther.add(JnpfKeyConsts.BUTTON);
  87. childNotOther.add(JnpfKeyConsts.ALERT);
  88. childNotOther.add(JnpfKeyConsts.BARCODE);
  89. childNotOther.add(JnpfKeyConsts.QR_CODE);
  90. childNotOther.add(JnpfKeyConsts.EDITOR);
  91. if (childNotRadio.contains(jnpfKey)) {
  92. aiFormFieldModel.setFieldComponent(JnpfKeyConsts.SELECT);
  93. } else if (childNotOther.contains(jnpfKey)) {
  94. aiFormFieldModel.setFieldComponent(JnpfKeyConsts.COM_INPUT);
  95. }
  96. }
  97. if (containsKeyWord(aiFormFieldModel.getFieldName())) {
  98. fields.add(aiFormFieldModel);
  99. }
  100. }
  101. }
  102. aiFormModel.setFields(fields);
  103. aiModelList.add(aiFormModel);
  104. }
  105. }
  106. visualAiModel.setAiModelList(aiModelList);
  107. return visualAiModel;
  108. }
  109. /**
  110. * 判断是否包含中文(字段空或者包含中文字段名称重命名)
  111. *
  112. * @param str
  113. * @return
  114. */
  115. private static boolean containsChinese(String str) {
  116. if (StringUtil.isEmpty(str)) return true;
  117. Pattern pattern = Pattern.compile("[\u4E00-\u9FA5]");
  118. Matcher matcher = pattern.matcher(str);
  119. return matcher.find();
  120. }
  121. /**
  122. * 字段是否包含特定(用于过滤掉不要的字段如:以_fk结尾是外键,本系统内已自动生成外键)
  123. *
  124. * @param str
  125. * @return
  126. */
  127. private static boolean containsKeyWord(String str) {
  128. if (str.toLowerCase().endsWith("_fk")) {
  129. return false;
  130. }
  131. return true;
  132. }
  133. }