ny
昨天 b6f169fe43a2b13f351aefc152374fc7f0bc8cb7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
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;
    }
}