shichongfu
2023-04-25 ce0b49552668d3331055e2b1a1447a743dc54939
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
package com.product.org.admin.service;
 
import com.product.common.lang.StringUtils;
import com.product.core.service.support.QueryFilterService;
 
import com.product.module.sys.entity.SystemUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import com.product.core.dao.BaseDao;
import com.product.core.entity.DataTableEntity;
import com.product.core.entity.FieldSetEntity;
import com.product.core.exception.BaseException;
import com.product.core.permission.PermissionService;
import com.product.core.service.support.AbstractBaseService;
import com.product.core.spring.context.SpringMVCContextHolder;
import com.product.core.transfer.Transactional;
import com.product.org.admin.config.CmnConst;
import com.product.org.admin.config.SystemCode;
import com.product.org.admin.service.idel.IProcedureService;
import com.product.org.admin.util.DatabaseUtil;
import com.product.util.BaseUtil;
 
/**
 * Copyright © LX-BASE
 * 
 * @Title: ProcedureService
 * @Project: LX-BASE-SERVER
 * @Date: 2020-05-29 11:42:06
 * @Author: Xin.Luo
 * @Description: 存储过程管理Service层
 */
@Service
public class ProcedureService extends AbstractBaseService implements IProcedureService {
    @Autowired
    public BaseDao baseDao;
 
    @Override
    public BaseDao getBaseDao() {
        return baseDao;
    }
 
    @Override
    public void setBaseDao(BaseDao baseDao) {
        this.baseDao = baseDao;
    }
 
    @Autowired
    PermissionService permissionService;
 
    @Autowired
    QueryFilterService queryFilterService;
    
    @Autowired
    ProcedureService thisProcedureService;
 
    /**
     *     解析SQL
     */
    @Override
    @Transactional
    public FieldSetEntity runProcedure(FieldSetEntity fse) throws BaseException {
        //获取SQL
        String procedureSql = fse.getString(CmnConst.PROCEDURE_SQL);
        String uuid = fse.getString("uuid");
//        String org_level_uuid = fse.getString("org_level_uuid");
        //转大写
        String procedureSqlBig = procedureSql.toUpperCase();
        //验证SQL是否包含存储过程关键字
        if (procedureSqlBig.indexOf("CREATE") == -1 || procedureSqlBig.indexOf("PROCEDURE") == -1 || procedureSqlBig.indexOf(CmnConst.BEGIN) == -1 || procedureSqlBig.indexOf(CmnConst.END) == -1) {
            throw new BaseException(SystemCode.SYSTEM_SQL_START_FAIL.getValue(), SystemCode.SYSTEM_SQL_START_FAIL.getText());
        }
        String headStr = procedureSql.substring(0, procedureSqlBig.indexOf("PROCEDURE") + 10);
        String str = procedureSql.substring(procedureSqlBig.indexOf("PROCEDURE"), procedureSqlBig.indexOf(CmnConst.BEGIN));
        procedureSql = procedureSql.substring(procedureSqlBig.indexOf(CmnConst.BEGIN), procedureSqlBig.length());
        // 提取表名
        String procedureName = str.substring(str.indexOf(' '), str.indexOf('('));
        String parameter = str.substring(str.indexOf('(') + 1);
        procedureName = procedureName.replace(" ", "");// 清除空格
        procedureName = procedureName.replace("`", "");// 清除`号
        FieldSetEntity fSet;
        if (StringUtils.isEmpty(uuid)) {
            fSet = baseDao.getFieldSetEntityByFilter(CmnConst.PRODUCT_SYS_DATAMODEL_PROCEDURE, CmnConst.PROCEDURE_NAME + " = ? ", new String[] { procedureName }, false);
        } else {
            fSet = baseDao.getFieldSetEntityByFilter(CmnConst.PRODUCT_SYS_DATAMODEL_PROCEDURE, CmnConst.PROCEDURE_NAME + " = ? AND uuid != ?", new String[] { procedureName, uuid }, false);
        }
        if (fSet != null) {
            throw new BaseException(SystemCode.SYSTEM_PROCEDURE_REUSE_FAIL.getValue(), SystemCode.SYSTEM_PROCEDURE_REUSE_FAIL.getText());
        }
        // 如果选择公司那存储过程名称要变
        /*
        if (!StringUtils.isEmpty(org_level_uuid)) {
            FieldSetEntity fseOrg = baseDao.getFieldSetEntity(CmnConst.PRODUCT_SYS_ORG_LEVELS, org_level_uuid, false);
            if (fseOrg != null) {
                // 添加对应公司
                procedureName = procedureName + "_" + fseOrg.getInteger("org_level_id");
            }
        }
        */
        procedureSql = headStr + procedureName + "(" + parameter + procedureSql;
        if (DatabaseUtil.runProcedure(procedureSql, procedureName)) {
            FieldSetEntity fSetEntity = new FieldSetEntity();
            fSetEntity.setTableName(CmnConst.PRODUCT_SYS_DATAMODEL_PROCEDURE);
            fSetEntity.setValue(CmnConst.PROCEDURE_NAME, procedureName);
            fSetEntity.setValue(CmnConst.PROCEDURE_SQL, procedureSql);
            // 事务调用
            IProcedureService service = (IProcedureService) getProxyInstance(thisProcedureService);
            service.getParameter(parameter, fSetEntity);
            return fSetEntity;
        } else {
            throw new BaseException(SystemCode.SYSTEM_SQL_START_FAIL.getValue(), SystemCode.SYSTEM_SQL_START_FAIL.getText());
        }
    }
 
    /**
     * 存储过程语句提取参数
     * 
     * @param parameter  参数字符串
     * @param fSetEntity 存储过程Field
     */
    @Override
    public void getParameter(String parameter, FieldSetEntity fSetEntity) {
        // 提取参数
        if (parameter.indexOf("in") != -1 || parameter.indexOf("out") != -1 || parameter.indexOf("IN") != -1 || parameter.indexOf("OUT") != -1) {
            String[] para = parameter.split(" ");
            DataTableEntity paraData = new DataTableEntity();
            for (int i = 0; i < para.length; ++i) {
                String p = para[i];
                String para_name;
                if ((i + 1) < para.length) {
                    para_name = para[++i];
                } else {
                    break;
                }
                FieldSetEntity field = new FieldSetEntity();
                field.setTableName(CmnConst.PRODUCT_SYS_DATAMODEL_PROCEDURE);
                String para_desc = "";
                switch (p.toUpperCase()) {
                case "IN":
                    para_desc = "输入参数";
                    break;
                case "OUT":
                    para_desc = "输出参数";
                    break;
                case "INOUT":
                    para_desc = "输入输出参数";
                    break;
                default:
                    break;
                }
                if (!StringUtils.isEmpty(para_desc)) {
                    field.setValue("para_name", para_name);
                    field.setValue("para_desc", para_desc);
                    paraData.addFieldSetEntity(field);
                }
            }
            paraData.setMeta(paraData.getFieldSetEntity(0).getMeta());
            fSetEntity.addSubDataTable(paraData);
        }
    }
 
    @Override
    @Transactional
    public String saveProcedure(FieldSetEntity fieldSetEntity) throws BaseException {
        String uuid = fieldSetEntity.getString("uuid");
        if (uuid == null || uuid.isEmpty()) {
            return baseDao.add(fieldSetEntity);
        } else {
            baseDao.update(fieldSetEntity);
            DataTableEntity dataTable = fieldSetEntity.getSubDataTable(CmnConst.PRODUCT_SYS_DATAMODEL_PROCEDURE_SUB);
            // 判断是否有子表
            if (!BaseUtil.dataTableIsEmpty(dataTable)) {
                // 删除修改之前存储过程参数子表
                baseDao.delete(CmnConst.PRODUCT_SYS_DATAMODEL_PROCEDURE_SUB, CmnConst.PROCEDURE_UUID + " = ?", new String[] { uuid });
                baseDao.add(dataTable);
            }
            return uuid;
        }
 
    }
 
    /**
     *     存储过程保存
     */
    @Override
    @Transactional
    public boolean saveProcedureSub(DataTableEntity dataTableEntity) throws BaseException {
        return baseDao.add(dataTableEntity);
    }
 
    /**
     *     存储过程删除
     */
    @Override
    @Transactional
    public boolean deleteProcedure(FieldSetEntity fs) throws BaseException {
        String uuid = fs.getString(CmnConst.UUID);
        if (BaseUtil.strIsNull(uuid)) {
            SpringMVCContextHolder.getSystemLogger().error(SystemCode.SYSTEM_FORM_NODATA.getValue(), SystemCode.SYSTEM_FORM_NODATA.getText());
            throw new BaseException(SystemCode.SYSTEM_FORM_NODATA.getValue(), SystemCode.SYSTEM_FORM_NODATA.getText(), this.getClass(), "public boolean deleteProcedure(FieldSetEntity fs) throws BaseException");
        }
        FieldSetEntity fsn = baseDao.getFieldSetEntity(CmnConst.PRODUCT_SYS_DATAMODEL_PROCEDURE, uuid, false);
        // 删除储存过程表
        baseDao.delete(CmnConst.PRODUCT_SYS_DATAMODEL_PROCEDURE, CmnConst.UUID + " = ?", new String[] { uuid });
        // 删除参数表
        baseDao.delete(CmnConst.PRODUCT_SYS_DATAMODEL_PROCEDURE_SUB, CmnConst.PROCEDURE_UUID + " = ?",
                new String[] { uuid });
        // 数据库删除存储过程
        DatabaseUtil.deleteProcedure(fsn.getString(CmnConst.PROCEDURE_NAME));
 
        return true;
    }
 
    /**
     *     存储过程详情
     */
    @Override
    public FieldSetEntity getProcedureInfo(String uuid) throws BaseException {
        // 获取存储过程
        FieldSetEntity fieldSetEntity = baseDao.getFieldSetEntity(CmnConst.PRODUCT_SYS_DATAMODEL_PROCEDURE, uuid, false);
        // 获取输入输出参数表
        DataTableEntity data = baseDao.listTable(CmnConst.PRODUCT_SYS_DATAMODEL_PROCEDURE_SUB, CmnConst.PROCEDURE_UUID + " = ?", new String[] { uuid });
        fieldSetEntity.addSubDataTable(data);
        return fieldSetEntity;
    }
 
    /**
     *     存储过程列表
     */
    @Override
    public DataTableEntity getProcedureAll(FieldSetEntity fse) throws BaseException {
        SystemUser currentUser = SpringMVCContextHolder.getCurrentUser();
        String queryFilter = permissionService.getDataFilter(CmnConst.ORG_LEVEL_UUID);
        if (currentUser.getUserType() == 1) {
            queryFilter = CmnConst.CREATED_BY + " = " + SpringMVCContextHolder.getCurrentUser().getUser_id();
        }
        if (!BaseUtil.dataTableIsEmpty(fse.getSubDataTable("systemSeniorQueryString"))) {
            queryFilter = queryFilter + " AND " + queryFilterService.getQueryFilter(fse);
        }
 
        // 获取存储过程列表
        DataTableEntity data = baseDao.listTable(fse.getTableName(), queryFilter, null, null, null, fse.getInteger("pagesize"), fse.getInteger("cpage"));
        baseDao.loadPromptData(data);
        return data;
    }
}