package com.highdatas.mdm.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.highdatas.mdm.entity.SysField; import com.highdatas.mdm.entity.TableSchemaResult; import com.highdatas.mdm.mapper.TableInfoMapper; import com.highdatas.mdm.pojo.CodeMsg; import com.highdatas.mdm.pojo.Page; import com.highdatas.mdm.pojo.Result; import com.highdatas.mdm.pojo.Segment; import com.highdatas.mdm.service.BaseDataService; import com.highdatas.mdm.service.ISysFieldService; import com.highdatas.mdm.util.Constant; import com.highdatas.mdm.util.ContentBuilder; import com.highdatas.mdm.util.DbUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; import java.util.stream.Collectors; /** * @author kimi * @description * @date 2019-12-17 12:09 */ @Service public class BaseDataServiceImpl implements BaseDataService{ @Autowired TableInfoMapper mapper; @Autowired ISysFieldService fieldService; public Result selectById(String tableName, String id) { try{ EntityWrapper sysFieldEntityWrapper = new EntityWrapper<>(); sysFieldEntityWrapper.eq("table_name", tableName); List sysFields = fieldService.selectList(sysFieldEntityWrapper); JSONObject object = new JSONObject(); String whereStr = DbUtils.combieOneSegment(Constant.ID, id); String fields = getFields(tableName); List> select = mapper.select(tableName, fields, whereStr); if (select == null || select.size() == 0) { return Result.error(CodeMsg.SELECT_ERROR_NOTFOUND); } else if (select.size() == 1) { object.fluentPut("grid", select.get(0)); object.fluentPut("fields", sysFields); return Result.success(object); }else { object.fluentPut("grid", select); object.fluentPut("fields", sysFields); return Result.success(object); } } catch (Exception e) { return Result.error(CodeMsg.SELECT_ERROR); } } public Result selectList(String tableName){ return selectList(tableName, Constant.WHERE_DEFAULT); } public Result selectList(String tableName, String whereSegment) { return selectList(tableName, null, whereSegment); } public Result selectList(String tableName,List fieldList, String whereSegment) { try{ EntityWrapper sysFieldEntityWrapper = new EntityWrapper<>(); sysFieldEntityWrapper.eq("table_name", tableName); List sysFields = fieldService.selectList(sysFieldEntityWrapper); JSONObject object = new JSONObject(); String fields; if (fieldList == null || fieldList.size() == 0) { fields = getFields(tableName); } else { fields = fieldList.stream().collect(Collectors.joining(Constant.COMMA)); } List> select = mapper.select(tableName, fields, whereSegment); object.fluentPut("grid", select); object.fluentPut("fields", sysFields); return Result.success(object); } catch (Exception e) { return Result.error(CodeMsg.SELECT_ERROR); } } public Result selectList(String tableName, List fields) { return selectList(tableName, fields, Constant.WHERE_DEFAULT); } public Long getCount(String tableName, String whereSegment) { try{ if (StringUtils.isEmpty(whereSegment)) { whereSegment = Constant.WHERE_DEFAULT; } Long count = mapper.getCount(tableName, whereSegment); return count; } catch (Exception e) { e.printStackTrace(); return null; } } public String getFields(String tableName) { List tableField = mapper.getTableField(tableName); ContentBuilder contentBuilder = new ContentBuilder(Constant.COMMA); for (TableSchemaResult tableSchemaResult : tableField) { String fieldName = tableSchemaResult.getFieldName(); if (fieldName.equalsIgnoreCase(Constant.DEAL)) { //DEAL 不给看 continue; } contentBuilder.append(fieldName); } return contentBuilder.toString(); } public Result selectListByPage(String tableName, Integer pageNo, Integer pageSize) { return selectListByPage(tableName,Constant.WHERE_DEFAULT,pageNo,pageSize); } public Result selectListByPage(String tableName, String whereSegment, Integer pageNo) { return selectListByPage(tableName,whereSegment,pageNo, null); } public Result selectListByPage(String tableName, Integer pageNo) { return selectListByPage(tableName,Constant.WHERE_DEFAULT,pageNo, null); } public Result selectListByPage(String tableName, String whereSegment, Integer pageNo, Integer pageSize) { return selectListByPage(tableName,null,whereSegment,pageNo,pageSize); } public Result selectListByPage(String tableName, List fieldList, String whereSegment, Integer pageNo) { return selectListByPage(tableName,null,whereSegment,pageNo, null); } public Result selectListByPage(String tableName, List fieldList, Integer pageNo) { return selectListByPage(tableName,null,Constant.WHERE_DEFAULT,pageNo); } public Result selectListByPage(String tableName,List fieldList, String whereSegment, Integer pageNo, Integer pageSize) { Long count = getCount(tableName, whereSegment); if (count == null) { return Result.error(CodeMsg.SELECT_ERROR); } Page page = new Page(count); if (pageSize != null && pageSize.compareTo(1) != -1) { page.setPageSize(pageSize); } if (page.getPageCount() < pageNo) { return Result.error(CodeMsg.SELECT_ERROR_NOTFOUND); } page.setPageNo(pageNo); String limitSQL = page.getLimitSQL(); String fields; if (fieldList == null || fieldList.size() == 0) { fields = getFields(tableName); fieldList = Arrays.stream(fields.split(Constant.COMMA_TRIM)).collect(Collectors.toList()); } else { fields = fieldList.stream().collect(Collectors.joining(Constant.COMMA)); } EntityWrapper sysFieldEntityWrapper = new EntityWrapper<>(); sysFieldEntityWrapper.eq("table_name", tableName); List sysFields = fieldService.selectList(sysFieldEntityWrapper); JSONObject resultobject = new JSONObject(); List> maps = mapper.selectByPage(tableName, fields, whereSegment, limitSQL); JSONObject object = new JSONObject(); object.fluentPut("total", page.getRecordCount()); object.fluentPut("passiveQueueSize", page.getPageSize()); object.fluentPut("pages", page.getPageCount()); object.fluentPut("current", page.getPageNo()); object.fluentPut("record", maps); resultobject.fluentPut("grid",object); resultobject.fluentPut("fields",sysFields); return Result.success(resultobject); } public Result insert(String tableName, String fields, String values) { try { String[] split = fields.split(Constant.SEMICOLON); List fieldNameList = Arrays.stream(split).map(s -> s.trim()).collect(Collectors.toList()); ContentBuilder builder = new ContentBuilder(Constant.COMMA); Object parse = JSON.parse(values); List ids = new ArrayList<>(); if (parse instanceof JSONObject){ JSONObject jsonObject = (JSONObject) parse; String id = appendOneValue(jsonObject, fieldNameList, builder); ids.add(id); String sqlValues = builder.toString(); mapper.insert(tableName, fields, sqlValues); return Result.success(CodeMsg.INSERT_SUCCESS); } else if (parse instanceof JSONArray) { JSONArray jsonArray = (JSONArray) parse; int size = jsonArray.size(); for (int i = 0; i < size; i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); ids.add(appendOneValue(jsonObject, fieldNameList, builder)); } String sqlValues = builder.toString(); mapper.insert(tableName, fields, sqlValues); return Result.success(ids); } else { return Result.error(CodeMsg.INSERT_ERROR); } } catch (Exception e) { e.printStackTrace(); return Result.error(CodeMsg.INSERT_ERROR); } } public Result insert(String tableName, String json) { try { List tableFieldList = mapper.getTableField(tableName); List fieldNameList = tableFieldList.stream().map(TableSchemaResult::getFieldName).collect(Collectors.toList()); String fields = tableFieldList.stream().map(TableSchemaResult::getFieldName).collect(Collectors.joining(Constant.COMMA)); ContentBuilder builder = new ContentBuilder(Constant.COMMA); Object parse = JSON.parse(json); List ids = new ArrayList<>(); if (parse instanceof JSONObject){ JSONObject jsonObject = (JSONObject) parse; ids.add(appendOneValue(jsonObject, fieldNameList, builder)); String sqlValues = builder.toString(); mapper.insert(tableName, fields, sqlValues); return Result.success(CodeMsg.INSERT_SUCCESS); } else if (parse instanceof JSONArray) { JSONArray jsonArray = (JSONArray) parse; int size = jsonArray.size(); for (int i = 0; i < size; i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); ids.add(appendOneValue(jsonObject, fieldNameList, builder)); } String sqlValues = builder.toString(); mapper.insert(tableName, fields, sqlValues); return Result.success(ids); } else { return Result.error(CodeMsg.INSERT_ERROR); } } catch (Exception e) { e.printStackTrace(); return Result.error(CodeMsg.INSERT_ERROR); } } private String appendOneValue(JSONObject jsonObject, List fieldNameList, ContentBuilder builder) { String id = null; builder.append("("); boolean first = true; for (int i = 0; i < fieldNameList.size(); i++) { String fieldName = fieldNameList.get(i); Object value = jsonObject.get(fieldName); if (fieldName.equalsIgnoreCase(Constant.ID) && value == null) { id = DbUtils.getUUID(); value = id; } if (value == null) { continue; } if (value instanceof String) { value = DbUtils.quotedStr(value); } if (first) { builder.appendOnly(String.valueOf(value)); first = false; } else { builder.append(value); } } //deal builder.append(1); builder.appendOnly(")"); return id; } public Result updateById(String tableName, String fieldsSegment, String id, boolean total) { String whereStr = DbUtils.combieOneSegment(Constant.ID, id); return update(tableName, fieldsSegment,whereStr, total); } public Result update(String tableName, String fieldsSegment, boolean total) { String whereSegment = Constant.WHERE_DEFAULT; return update(tableName, fieldsSegment,whereSegment, total); } public Result update(String tableName, String fieldsSegment, String whereSegment) { try { ContentBuilder builder = new ContentBuilder(Constant.COMMA); JSONObject jsonObject = JSONObject.parseObject(fieldsSegment); List tableFieldResultList = mapper.getTableField(tableName); for (TableSchemaResult tableSchemaResult : tableFieldResultList) { String dbType = tableSchemaResult.getDbType(); String fieldName = tableSchemaResult.getFieldName(); Object o = jsonObject.get(fieldName); String javaTypeStr = DbUtils.toSqlToJava(dbType); Segment segment; if ("string".equalsIgnoreCase(javaTypeStr.trim())) { segment = new Segment(fieldName, String.valueOf(o)); } else { segment = new Segment(fieldName, o); } builder.append(segment.toString()); } String updateSegment = builder.toString(); mapper.update(tableName, updateSegment, whereSegment); return Result.success(CodeMsg.UPDATE_SUCCESS); } catch (Exception e) { e.printStackTrace(); return Result.error(CodeMsg.UPDATE_ERROR); } } public Result update(String tableName, String fieldsSegment, String whereSegment, boolean total) { try { ContentBuilder builder = new ContentBuilder(Constant.COMMA); JSONObject jsonObject = JSONObject.parseObject(fieldsSegment); List tableFieldResultList = mapper.getTableField(tableName); if (total) { for (TableSchemaResult tableSchemaResult : tableFieldResultList) { String dbType = tableSchemaResult.getDbType(); String fieldName = tableSchemaResult.getFieldName(); Object o = jsonObject.get(fieldName); String javaTypeStr = DbUtils.toSqlToJava(dbType); Segment segment; if (o == null) { continue; } if ("string".equalsIgnoreCase(javaTypeStr.trim())) { segment = new Segment(fieldName, String.valueOf(o)); } else { if (fieldName.equalsIgnoreCase(Constant.DEAL)) { segment = new Segment(fieldName, 1); } else { segment = new Segment(fieldName, o); } } builder.append(segment.toString()); } } else { Set fieldSet = jsonObject.keySet(); for (String fieldName : fieldSet) { List collect = tableFieldResultList.stream().filter(tableSchemaResult -> tableSchemaResult.getFieldName().equalsIgnoreCase(fieldName)).collect(Collectors.toList()); TableSchemaResult tableSchemaResult = collect.get(0); String dbType = tableSchemaResult.getDbType(); Object o = jsonObject.get(fieldName); String javaTypeStr = DbUtils.toSqlToJava(dbType); Segment segment; if ("string".equalsIgnoreCase(javaTypeStr.trim())) { segment = new Segment(fieldName, String.valueOf(o)); } else { if (fieldName.equalsIgnoreCase(Constant.DEAL)) { segment = new Segment(fieldName, 1); } else { segment = new Segment(fieldName, o); } } builder.append(segment.toString()); } } String updateSegment = builder.toString(); mapper.update(tableName, updateSegment, whereSegment); return Result.success(CodeMsg.UPDATE_SUCCESS); } catch (Exception e) { e.printStackTrace(); return Result.error(CodeMsg.UPDATE_ERROR); } } public Result delete(String tableName) { return delete(tableName, Constant.WHERE_DEFAULT); } public Result deleteById(String tableName, String id) { String whereStr = DbUtils.combieOneSegment(Constant.ID, id); return delete(tableName, whereStr); } public Result delete(String tableName, String whereSegment) { try { mapper.delete(tableName, whereSegment); return Result.success(CodeMsg.DELETE_SUCCESS); } catch (Exception e) { e.printStackTrace(); return Result.error(CodeMsg.DELETE_ERROR); } } }