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; } }