Explorar o código

变更记录生成sql文件

fengyanjie %!s(int64=4) %!d(string=hai) anos
pai
achega
6fb604aa17

+ 3 - 2
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/controller/ChangeRecordController.java

@@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 
 @RestController
@@ -41,8 +42,8 @@ public class ChangeRecordController {
     }
 
     @PostMapping("/download")
-    public MapResponse download(@RequestBody List<Integer> idList) {
-        return service.download(idList);
+    public void download(@RequestBody List<Integer> idList, HttpServletResponse response) {
+        service.download(response, idList);
     }
 
 }

+ 94 - 11
dmp-rwd-edit/src/main/java/com/persagy/dmp/rwd/edit/service/ChangeRecordService.java

@@ -8,6 +8,7 @@ import com.google.gson.JsonSyntaxException;
 import com.google.gson.reflect.TypeToken;
 import com.persagy.common.criteria.CriteriaUtils;
 import com.persagy.common.criteria.JacksonCriteria;
+import com.persagy.common.date.DateUtils;
 import com.persagy.common.json.JacksonMapper;
 import com.persagy.common.web.MapResponse;
 import com.persagy.common.web.PagedResponse;
@@ -23,7 +24,10 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
+import javax.servlet.http.HttpServletResponse;
 import javax.transaction.Transactional;
+import java.io.*;
+import java.net.URLEncoder;
 import java.util.*;
 
 @Slf4j
@@ -105,6 +109,7 @@ public class ChangeRecordService {
         JacksonCriteria criteria = JacksonCriteria.newInstance();
         HttpUtils.HttpResult result;
         if (infoCode != null) {
+            criteria.add("type", "common");
             criteria.add("classCode", code);
             criteria.add("code", infoCode);
             StringBuilder url = new StringBuilder(dmpServer);
@@ -173,11 +178,49 @@ public class ChangeRecordService {
         return response;
     }
 
-    public MapResponse download(List<Integer> idList) {
-        MapResponse response = new MapResponse();
+    public void download(HttpServletResponse resp, List<Integer> idList) {
+        String fileName = DateUtils.format(new Date()) + ".sql";
         List<String> sqlList = getSqlList(idList);
-        response.add("data", sqlList);
-        return response;
+
+        OutputStream out = null;
+        try {
+            InputStream stream = getStream(sqlList);
+            resp.reset();// 清空输出流
+            String resultFileName = URLEncoder.encode(fileName, "UTF-8");
+            resp.setCharacterEncoding("UTF-8");
+            resp.setHeader("Content-disposition", "attachment; filename=" + resultFileName);// 设定输出文件头
+            resp.setContentType("application/txt");// 定义输出类型
+            out = resp.getOutputStream();
+            byte[] buff = new byte[4096];
+            int size = 0;
+            while ((size = stream.read(buff)) != -1) {
+                out.write(buff, 0, size);
+            }
+            out.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if (out != null) {
+                    out.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    public InputStream getStream(List<String> list) throws IOException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        DataOutputStream out = new DataOutputStream(baos);
+        for (String sql : list) {
+            out.writeBytes(sql + "\r\n");
+        }
+        byte[] bytes = baos.toByteArray();
+        ByteArrayInputStream tInputStringStream = new ByteArrayInputStream(bytes);
+        baos.close();
+        out.close();
+        return tInputStringStream;
     }
 
     private List<String> getSqlList(List<Integer> idList) {
@@ -185,24 +228,47 @@ public class ChangeRecordService {
         List<ChangeRecord> data = repository.findAllById(idList);
         for (ChangeRecord changeRecord : data) {
             StringBuilder sql = new StringBuilder();
+            Map<String, Object> map = json2map(JacksonMapper.toSimpleJson(changeRecord.getValue()));
             switch (changeRecord.getOperationType()) {
                 case create:
                     sql.append("insert into");
-                    sql.append(" ");//表名
+                    if (changeRecord.getInfoCode() == null) {
+                        sql.append(" RWD_DEF_CLASS");
+                    } else {
+                        sql.append(" RWD_DEF_FUNCID");
+                    }
+                    sql.append(" (");//表名
+                    map.keySet().forEach(item -> {
+                        sql.append(humpToUnderline(item) + ",");
+                    });
+                    sql.deleteCharAt(sql.length() - 1);
+                    sql.append(") values (");
+                    map.values().forEach(item -> {
+                        sql.append("'" + item + "',");
+                    });
+                    sql.deleteCharAt(sql.length() - 1);
+                    sql.append(")");
                     break;
                 case update:
                     sql.append("update");
-                    sql.append(" ");//表名
+                    if (changeRecord.getInfoCode() == null) {
+                        sql.append(" RWD_DEF_CLASS");
+                    } else {
+                        sql.append(" RWD_DEF_FUNCID");
+                    }
                     sql.append(" set");
-                    Map<String, Object> map = json2map(JacksonMapper.toSimpleJson(changeRecord.getValue()));
                     for (Map.Entry<String, Object> entry : map.entrySet()) {
-                        sql.append(" " + entry.getKey() + " = '" + entry.getValue() + "',");
+                        sql.append(" " + humpToUnderline(entry.getKey()) + " = '" + entry.getValue() + "',");
                     }
                     sql.deleteCharAt(sql.length() - 1);
                     break;
                 case delete:
                     sql.append("delete from");
-                    sql.append(" ");//表名
+                    if (changeRecord.getInfoCode() == null) {
+                        sql.append(" RWD_DEF_CLASS");
+                    } else {
+                        sql.append(" RWD_DEF_FUNCID");
+                    }
                     break;
             }
             sql.append(" where 1=1");
@@ -211,14 +277,14 @@ public class ChangeRecordService {
             } else {
                 sql.append(" and class_code = '" + changeRecord.getCode() + "'");
                 sql.append(" and code = '" + changeRecord.getInfoCode() + "'");
-                sql.append(";");
             }
+            sql.append(";");
             sqlList.add(sql.toString());
         }
         return sqlList;
     }
 
-    public static Map<String, Object> json2map(String str_json) {
+    private static Map<String, Object> json2map(String str_json) {
         Map<String, Object> res = null;
         try {
             Gson gson = new Gson();
@@ -229,5 +295,22 @@ public class ChangeRecordService {
         return res;
     }
 
+    /***
+     * 驼峰命名转为下划线命名
+     */
+    private String humpToUnderline(String para) {
+        StringBuilder sb = new StringBuilder(para);
+        int temp = 0;//定位
+        if (!para.contains("_")) {
+            for (int i = 0; i < para.length(); i++) {
+                if (Character.isUpperCase(para.charAt(i))) {
+                    sb.insert(i + temp, "_");
+                    temp += 1;
+                }
+            }
+        }
+        return sb.toString().toUpperCase();
+    }
+
 }