kimi
2020-05-18 c8aee7b9bfd79cfd741d7e5692520f4f51a31a86
src/main/java/com/highdatas/mdm/controller/FileController.java
@@ -1,7 +1,28 @@
package com.highdatas.mdm.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSONObject;
import com.highdatas.mdm.entity.*;
import com.highdatas.mdm.mapper.SysViewMapper;
import com.highdatas.mdm.mapper.TableInfoMapper;
import com.highdatas.mdm.pojo.CodeMsg;
import com.highdatas.mdm.pojo.Result;
import com.highdatas.mdm.pojo.Segment;
import com.highdatas.mdm.pojo.kettle.UnBigDataDataSourceInfo;
import com.highdatas.mdm.service.*;
import com.highdatas.mdm.util.*;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
/**
 * @author kimi
@@ -12,4 +33,180 @@
@RestController
@RequestMapping("/file")
public class FileController {
    @Autowired
    ISysAssembleDbService dbService;
    @Autowired
    ISysAssembleService assembleService;
    @Autowired
    ISysAssembleParamsService paramsService;
    @Autowired
    RedisClient redisClient;
    @Autowired
    ISysViewService viewService;
    @Autowired
    IMenuMappingService menuMappingService;
    @Autowired
    TableInfoMapper tableInfoMapper;
    @Autowired
    private SqlSessionTemplate sqlSessionTemplate;
    @Autowired
    UnBigDataDataSourceInfo unBigDataDataSourceInfo;
    @RequestMapping(value = "/loadSqlTable", method = RequestMethod.POST)
    @ResponseBody
    public Result loadSqlTable(@RequestParam("file")MultipartFile file,@RequestParam String dbId, HttpServletRequest request) {
        try {
            byte[] bytes = file.getBytes();
            String sql = new String (bytes);
            sql = DbUtils.replaceEscape(sql);
            String[] split = sql.split(Constant.SEMICOLON);
            if (split.length > 1) {
                return Result.error(new CodeMsg(6001 , "sql脚本上传错误,仅能支持一条语句"));
            }
            String sqlId = DbUtils.getUUID();
            boolean b = redisClient.putRedisVal(sqlId, sql);
            if (!b){
                return Result.error(new CodeMsg(6002, "sql保存失败"));
            }
            // 暂不校验是不是select语句了  后续需要再校验
            List<String> fieldsBySql = dbService.getFieldsBySql(dbId, sql);
            JSONObject object = new JSONObject();
            object.fluentPut("fields", fieldsBySql);
            object.fluentPut("sqlId",sqlId);
            return Result.success(object);
        }catch (Exception e) {
            e.printStackTrace();
            return Result.error(new CodeMsg(6002, e.getMessage()));
        }
    }
    @RequestMapping(value = "/loadPurgeSql", method = RequestMethod.POST)
    @ResponseBody
    public Result loadPurgeSql(@RequestParam("file")MultipartFile file,@RequestParam String id, HttpServletRequest request) {
        // 暂不校验是不是select语句了  后续需要再校验
        SysAssemble assemble = assembleService.selectById(id);
        if (assemble == null){
            return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
        }
        try {
            byte[] bytes = file.getBytes();
            String sql = new String (bytes);
            sql = DbUtils.replaceEscape(sql);
            //TODO 校验sql 暂不进行
            assemble.setPurgeSql(sql);
            boolean update = assemble.updateById();
            if (update) {
                return Result.success(assemble);
            }else {
                return Result.error(CodeMsg.UPDATE_ERROR);
            }
        }catch (Exception e) {
            e.printStackTrace();
            return Result.error(new CodeMsg(6002, e.getMessage()));
        }
    }
    @RequestMapping(value = "/loadParamsUpdateSql", method = RequestMethod.POST)
    @ResponseBody
    public Result loadParamsUpdateSql(@RequestParam("file")MultipartFile file,@RequestParam String id, HttpServletRequest request) {
        // 暂不校验是不是select语句了  后续需要再校验
        SysAssembleParams sysAssembleParams = paramsService.selectById(id);
        if (sysAssembleParams == null){
            return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
        }
        try {
            byte[] bytes = file.getBytes();
            String sql = new String (bytes);
            sql = DbUtils.replaceEscape(sql);
            //TODO 校验sql 暂不进行
            sysAssembleParams.setUpdateSql(sql).setUpdateTime(new Date()).updateById();
            return Result.success(sysAssembleParams);
        }catch (Exception e) {
            e.printStackTrace();
            return Result.error(new CodeMsg(6002, e.getMessage()));
        }
    }
    @RequestMapping(value = "/loadMappingFile", method = RequestMethod.POST)
    @ResponseBody
    public Result loadMappingFile(@RequestParam("file")MultipartFile file,@RequestParam String id, @RequestParam String menuId, @RequestParam String field, HttpServletRequest request) {
        SysView sysView = viewService.selectById(id);
        if (sysView == null){
            return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
        }
        String mappingTable = sysView.getMappingTable();
        if (StringUtils.isEmpty(mappingTable)){
            return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
        }
        boolean exists = unBigDataDataSourceInfo.checkTableExists(mappingTable);
        if (!exists) {
            ArrayList<String> fields = new ArrayList<>();
            fields.add(Constant.ID);
            fields.add(Constant.Code);
            fields.add("pre");
            fields.add("fix");
            boolean created = unBigDataDataSourceInfo.createTable(mappingTable, fields);
            if (!created) {
                return Result.error(CodeMsg.CREATE_ERROR);
            }
        }
        SqlSession session = null;
        try {
            String name = file.getOriginalFilename();
            List<ViewMappingItem> viewMappingByExcel = ExcelUtil.getViewMappingByExcel(file.getInputStream(), name);
            if (viewMappingByExcel.isEmpty()) {
                return Result.error(CodeMsg.EMPTY_ERROR);
            }
            Maintain maintainByMenu = viewService.getMaintainByMenu(sysView, menuId);
            if (maintainByMenu == null) {
                return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
            }
            String changeFieldName = viewService.changeFieldName(maintainByMenu.getTableName(), field);
            Segment segment = new Segment(Constant.Code, changeFieldName);
            tableInfoMapper.delete(mappingTable, segment.toString());
            session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);//关闭session的自动提交
            SysViewMapper mapper = session.getMapper(SysViewMapper.class);
            AtomicInteger idx = new AtomicInteger(0);
            ContentBuilder builder = new ContentBuilder(Constant.COMMA);
            for (ViewMappingItem viewMappingItem : viewMappingByExcel) {
                builder.clear();
                builder.append(DbUtils.quotedStr(changeFieldName));
                builder.append(DbUtils.quotedStr(viewMappingItem.getPre())).append(DbUtils.quotedStr(viewMappingItem.getFix()));
                mapper.insertViewMapping(mappingTable, builder.toString());
                int i = idx.get();
                if (i % 1000 == 0 || i == viewMappingByExcel.size()-1) {
                    //手动每1000个一提交,提交后无法回滚
                    session.commit();
                    session.clearCache();//注意,如果没有这个动作,可能会导致内存崩溃。
                }
                idx.getAndIncrement();
            }
        }catch (Exception e) {
            e.printStackTrace();
            if (session != null) {
                session.rollback();
            }
            return Result.error(new CodeMsg(6002, e.getMessage()));
        }finally {
            if (session != null) {
                session.close();
            }
        }
        return Result.success(null);
    }
}