Browse Source

自定义表单相关

zhouyy 3 months ago
parent
commit
7a7321c526

+ 3 - 2
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/CusTableColumnController.java

@@ -35,10 +35,11 @@ public class CusTableColumnController {
 
     @PostMapping("/getResByFormJson")
     public HttpRespMsg getResByFormJson(@RequestParam("formJson") String formJson
-            ,@RequestParam("formTransConditionJson") String formTransConditionJson
+            ,@RequestParam(value = "formTransConditionJson",required = false)String formTransConditionJson
+            ,@RequestParam(value = "formFieldHead") String formFieldHead
             ,HttpServletRequest request){
         HttpRespMsg msg = new HttpRespMsg();
-        msg = cusTableColumnService.getResByFormJson(formJson,formTransConditionJson,request);
+        msg = cusTableColumnService.getResByFormJson(formJson,formTransConditionJson,formFieldHead,request);
         return msg;
     }
 

+ 1 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/CusTableColumnService.java

@@ -34,7 +34,7 @@ public interface CusTableColumnService extends IService<CusTableColumn> {
 
     HttpRespMsg getAllStoresTree(HttpServletRequest request);
 
-    HttpRespMsg getResByFormJson(String formJson, String formTransConditionJson,HttpServletRequest request);
+    HttpRespMsg getResByFormJson(String formJson, String formTransConditionJson,String formFieldHead,HttpServletRequest request);
 
     HttpRespMsg getFormJsonByFormId(Integer formId, HttpServletRequest request);
 

+ 107 - 5
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/AIQuestionServiceImpl.java

@@ -7,6 +7,7 @@ import com.management.platform.entity.*;
 import com.management.platform.entity.bo.QuestionBO;
 import com.management.platform.mapper.*;
 import com.management.platform.service.AIQuestionService;
+import com.management.platform.service.CusTableColumnService;
 import com.management.platform.service.ExcelExportService;
 import com.management.platform.util.ExcelConverter;
 import com.management.platform.util.HttpRespMsg;
@@ -14,6 +15,7 @@ import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.core.io.ByteArrayResource;
 import org.springframework.http.*;
+import org.springframework.mock.web.MockMultipartFile;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -26,6 +28,9 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.sql.DataSource;
 import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.sql.*;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -61,6 +66,9 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
     @Resource
     private CusReportFormMapper cusReportFormMapper;
 
+    @Resource
+    private CusTableColumnService cusTableColumnService;
+
     @Resource
     private DataSource dataSource;
 
@@ -108,6 +116,20 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
         return list;
     }
 
+    public MultipartFile getMultipartFileFromPath(String filePath) throws IOException {
+        Path path = Paths.get(filePath);
+        String fileName = path.getFileName().toString();
+        String contentType = Files.probeContentType(path);
+        byte[] content = Files.readAllBytes(path);
+
+        return new MockMultipartFile(
+                fileName,
+                fileName,
+                contentType,
+                content
+        );
+    }
+
     public ByteArrayResource getFileByteArrayResource(List<Map<String,Object>> columnList,String fileName) {
         ByteArrayResource byteArrayResource = null;
         try {
@@ -115,8 +137,8 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
             MultipartFile excelFile = ExcelConverter.convertToExcel(
                     columnList,
                     fileName);
-            //下载到本地
-            excelFile.transferTo(new java.io.File(fileName));
+            //下载到本地 TODO 生产环境注释
+            excelFile.transferTo(new java.io.File(path + fileName));
             byteArrayResource = new ByteArrayResource(excelFile.getBytes()) {
                 @Override
                 public String getFilename() {
@@ -136,7 +158,8 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
         //转换为MultipartFile 准备表单数据
         MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
         body.add("question", question);
-        ByteArrayResource fileByteArrayResource = getFileByteArrayResource(columnList, "提问数据.xlsx");
+        String fileName = "提问数据"+System.currentTimeMillis()+".xlsx";
+        ByteArrayResource fileByteArrayResource = getFileByteArrayResource(columnList, fileName);
         body.add("file",fileByteArrayResource);
         HttpHeaders headers = new HttpHeaders();
         headers.setContentType(MediaType.MULTIPART_FORM_DATA);
@@ -221,14 +244,67 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
              * 自定义报表
              * 查询formId对应的sql,获取返回结果 封装为表格
              */
-            CusReportForm cusReportForm = cusReportFormMapper.selectById(questionBO.getSourceContent());
+            HttpRespMsg respMsg = cusTableColumnService.getFormResByFormId(Integer.parseInt(questionBO.getSourceContent()), request);
+            if(respMsg.getCode().equals("200")){
+                List<Map<String,Object>> resColumnList = (List<Map<String, Object>>) respMsg.getData();
+                if(CollectionUtils.isNotEmpty(resColumnList)){
+                    ResponseEntity<String> responseEntity = getResponseEntityWithFileAI(resColumnList, questionBO.getContent());
+                    if(responseEntity.getStatusCode().is2xxSuccessful()){
+                        JSONObject jsonObject = JSONObject.parseObject(responseEntity.getBody());
+                        System.out.println("jsonObject=== "+jsonObject);
+                        queryRes = jsonObject.getString("data");
+                    }else{
+                        queryRes = "AI分析有误,稍后再试";
+                    }
+                }
+            }
+
+
+
 
         } else if (3 == questionBO.getQuestionDataSource()) {
             /**
              * 获取url 读取文件内容并返回
              */
-        }else{
+            String uploadUrl = "http://192.168.2.40:5000/analyzeByFile";
+            RestTemplate restTemplate = new RestTemplate();
+            //转换为MultipartFile 准备表单数据
+            MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
+            body.add("question", questionBO.getContent());
+            String fileName = "提问数据"+System.currentTimeMillis()+".xlsx";
+            ByteArrayResource byteArrayResource = null;
+            try {
+                MultipartFile multipartFileFromPath = getMultipartFileFromPath(questionBO.getUrl());
+                byteArrayResource = new ByteArrayResource(multipartFileFromPath.getBytes()) {
+                    @Override
+                    public String getFilename() {
+                        return multipartFileFromPath.getOriginalFilename();
+                    }
+                };
+            }catch (IOException e){
+                e.printStackTrace();
+            }
+            body.add("file",byteArrayResource);
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.MULTIPART_FORM_DATA);
+
+            HttpEntity<MultiValueMap<String, Object>> requestEntity =
+                    new HttpEntity<>(body, headers);
+            ResponseEntity<String> response = restTemplate.exchange(
+                    uploadUrl,
+                    HttpMethod.POST,
+                    requestEntity,
+                    String.class);
+            if(response.getStatusCode().is2xxSuccessful()){
+                JSONObject jsonObject = JSONObject.parseObject(response.getBody());
+                System.out.println("jsonObject=== "+jsonObject);
+                queryRes = jsonObject.getString("data");
+            }else{
+                queryRes = "AI分析有误,稍后再试";
+            }
 
+        }else{
+            // 自由对话 TODO 目前没接口
         }
 
         if(null == questionBO.getQuestionId()){
@@ -304,4 +380,30 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
 
         return httpRespMsg;
     }
+
+    public static List<Map<String, Object>> convertListWithAlias(ResultSet rs) {
+        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
+        try {
+            ResultSetMetaData md = rs.getMetaData();
+            int columnCount = md.getColumnCount();
+            while (rs.next()) {
+                Map<String, Object> rowData = new HashMap<String, Object>();
+                for (int i = 1; i <= columnCount; i++) {
+                    rowData.put(md.getColumnLabel(i), rs.getObject(i));
+                }
+                list.add(rowData);
+            }
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if (rs != null)
+                    rs.close();
+                rs = null;
+            } catch (SQLException e) {
+                e.printStackTrace();
+            }
+        }
+        return list;
+    }
 }

+ 326 - 263
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/CusTableColumnServiceImpl.java

@@ -347,7 +347,7 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
         if(StringUtils.isNotBlank(tableAlias) && StringUtils.isNotBlank(tableName)){
             String s = cusReportForm.getExecuteSql()+" and "+tableAlias+".company_id="+user.getCompanyId()+" ";
-            if(1 == wxCorpInfo.getSaasSyncContact()){
+            if(null != wxCorpInfo && 1 == wxCorpInfo.getSaasSyncContact()){
                 List<FormTransCondition> formTransConditions = JSONObject.parseArray(cusReportForm.getFormTransConditionJson(), FormTransCondition.class);
                 for (FormTransCondition formTransCondition : formTransConditions) {
                     String str = formTransCondition.getTblAlias()+"."+formTransCondition.getColName();
@@ -720,6 +720,9 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
 
         if(CollectionUtils.isNotEmpty(columnList)){
 
+            List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, user.getCompanyId()));
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
+
             List<FormTransColumn> checkColumns = formTransColumnMapper.selectList(new LambdaQueryWrapper<FormTransColumn>());
             Map<String, List<FormTransColumn>> tblColumnMap = new HashMap<>();
             if(CollectionUtils.isNotEmpty(checkColumns)){
@@ -727,261 +730,21 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
                         .collect(Collectors.groupingBy(FormTransColumn::getTblName));
             }
 
-            Map<String,List<String>> indexMap = new HashMap<>(2);
-            indexMap.put("userName",new ArrayList<>());
-            indexMap.put("deptName",new ArrayList<>());
-            Map<String,String> tableNameAliasMap = new HashMap<>();
-            Matcher mainMatcher = MAIN_TABLE_PATTERN.matcher(tableColumnSql);
-            if (mainMatcher.find()) {
-                tableNameAliasMap.put(mainMatcher.group(1),mainMatcher.group(2));
-            } else {
-                msg.setError("主业务表无法识别,请联系管理员");
+            try {
+                resColumnList = this.getTransResColumns(columnList, formFieldHeads, columnAliasMap, tableColumnFixTransMap
+                        , tblColumnMap, userList, wxCorpInfo, tableColumnSql, user);
+            } catch (Exception e) {
+                e.printStackTrace();
+                msg.setError(e.getMessage());
                 return msg;
             }
 
-            Matcher joinMatcher = JOIN_TABLE_PATTERN.matcher(tableColumnSql);
-            while (joinMatcher.find()){
-                tableNameAliasMap.put(joinMatcher.group(1),joinMatcher.group(2));
-            }
-            for (String tableName : tableNameAliasMap.keySet()) {
-                List<FormTransColumn> tmpColList = tblColumnMap.get(tableName);
-                String tableAlias = tableNameAliasMap.get(tableName);
-                if(CollectionUtils.isNotEmpty(tmpColList)){
-                    for (FormTransColumn formTransColumn : tmpColList) {
-                        String col = tableAlias+"."+formTransColumn.getColName();
-                        if(tableColumnSql.contains(col)){
-                            if(1 == formTransColumn.getTransType()){
-                                //当前位置的是人名,需要转义
-                                for (int i = 0; i < formFieldHeads.size(); i++) {
-                                    if(formFieldHeads.get(i).getTableName().equals(tableName)
-                                            &&formFieldHeads.get(i).getColumnName().equals(formTransColumn.getColName())
-                                    ){
-                                        List<String> tmpList = indexMap.get("userName");
-                                        tmpList.add(formFieldHeads.get(i).getColumnVal());
-                                    }
-                                }
-                            }
-                            else if (2 == formTransColumn.getTransType()) {
-                                //当前位置是部门,需要转义
-                                for (int i = 0; i < formFieldHeads.size(); i++) {
-                                    if(formFieldHeads.get(i).getTableName().equals(tableName)
-                                            &&formFieldHeads.get(i).getColumnName().equals(formTransColumn.getColName())
-                                    ){
-                                        List<String> tmpList = indexMap.get("deptName");
-                                        tmpList.add(formFieldHeads.get(i).getColumnVal());
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-            List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, user.getCompanyId()));
-            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
-            for (Map<String, Object> data : columnList) {
-                String valRes = "";
-                Map<String,Object> map = new HashMap<>();
-                for (String key : columnList.get(0).keySet()) {
-                    //固定值转换
-                    FormFieldHead formFieldHead = columnAliasMap.get(key);//字段对应别名和表
-                    List<ColumnFixTrans> transColList = tableColumnFixTransMap.get(formFieldHead.getTableName());//固定值字段集合
-                    List<ColumnFixTrans> currentFixValList = transColList.stream()
-                            .filter(t -> t.getColName().equals(formFieldHead.getColumnName()))
-                            .collect(Collectors.toList());//当前字段固定值对照值
-                    if(CollectionUtils.isNotEmpty(currentFixValList)){
-                        Map<String, String> valMeanMap = currentFixValList.stream()
-                                .collect(Collectors.toMap(ColumnFixTrans::getColVal, ColumnFixTrans::getValMean));
-                        Object value = data.get(key);
-                        String mean = valMeanMap.get(value.toString());
-                        valRes = mean;
-                    }else{
-                        //转义
-                        List<String> userNameIndexes = indexMap.get("userName");
-                        List<String> deptNameIndexes = indexMap.get("deptName");
-                        if(1 == user.getUserNameNeedTranslate()){
-                            Object value = data.get(key);
-                            if (value == null) {
-                            } else {
-                                String val = value.toString();
-                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                                    if(CollectionUtils.isNotEmpty(userNameIndexes) && userNameIndexes.contains(key)){
-                                        String name = val;
-                                        Optional<User> first = userList.stream().filter(u -> u.getName().equals(name)).findFirst();
-                                        if(first.isPresent()){
-                                            val = "$userName="+first.get().getCorpwxUserid()+"$";
-                                        }else {
-                                            val = "";
-                                        }
-                                    }
-
-                                }
-                                if(CollectionUtils.isNotEmpty(deptNameIndexes) && deptNameIndexes.contains(key)){
-                                    String name = val;
-                                    Optional<User> first = userList.stream().filter(u -> u.getName().equals(name)).findFirst();
-                                    if(first.isPresent()){
-                                        val = "$departmentName="+first.get().getCorpwxDeptid()+"$";
-                                    }else {
-                                        val = "";
-                                    }
-                                }
-                                valRes = val;
-                            }
-                        }else{
-                            Object value = data.get(key);
-                            if (value == null) {
-                                valRes = "";
-                            } else {
-                                valRes = value.toString();
-                            }
-                        }
-                    }
-                    map.put(key,valRes);
-                }
-                resColumnList.add(map);
-            }
-        }
 
-        msg.setData(resColumnList);
-        return msg;
-    }
-
-    /**移动报表到文件夹*/
-    @Override
-    public HttpRespMsg moveFormStore(Integer formId,Integer targetStoreId, HttpServletRequest request) {
-        HttpRespMsg msg = new HttpRespMsg();
-        User user = userMapper.selectById(request.getHeader("token"));
-        BusReportStore busReportStore = busReportStoreMapper.selectOne(new LambdaQueryWrapper<BusReportStore>()
-                .eq(BusReportStore::getCompanyId, user.getCompanyId())
-                .eq(BusReportStore::getRelateFormId, formId)
-        );
-
-        BusReportStore lastOneStore = busReportStoreMapper.selectOne(new LambdaQueryWrapper<BusReportStore>()
-                .eq(BusReportStore::getCompanyId, user.getCompanyId())
-                .eq(BusReportStore::getParentStoreId, busReportStore.getParentStoreId())
-                .orderByDesc(BusReportStore::getOrderItem)
-                .last(" limit 1 ")
-        );
-        if(null == lastOneStore){
-            busReportStore.setParentStoreId(targetStoreId);
-            busReportStore.setOrderItem(1);
-            busReportStore.setUpdateBy(user.getId());
-            busReportStore.setUpdateTime(new Date());
-        }else{
-            busReportStore.setParentStoreId(targetStoreId);
-            busReportStore.setOrderItem(lastOneStore.getOrderItem()+1);
-            busReportStore.setUpdateBy(user.getId());
-            busReportStore.setUpdateTime(new Date());
-        }
-
-        busReportStoreMapper.updateById(busReportStore);
-
-        return msg;
-    }
-
-    @Override
-    public HttpRespMsg getAllStoresTree(HttpServletRequest request) {
-        HttpRespMsg msg = new HttpRespMsg();
-        User user = userMapper.selectById(request.getHeader("token"));
-        List<BusReportStore> busReportStores = busReportStoreMapper.selectList(new LambdaQueryWrapper<BusReportStore>()
-                .eq(BusReportStore::getCompanyId, user.getCompanyId())
-                .ne(BusReportStore::getStoreType,2)
-        );
-        List<BusReportStore> listTree = this.listToTree(busReportStores);
-        msg.setData(listTree);
-        return msg;
-    }
-
-    @Override
-    public HttpRespMsg getResByFormJson(String formJson,String formTransConditionJson, HttpServletRequest request) {
-        HttpRespMsg msg = new HttpRespMsg();
-        List<Map<String,Object>> columnList = new ArrayList<>();
-        Matcher deleteMatcher = DELETE_SGIN_PATTERN.matcher(formJson);
-        Matcher updateMatcher = UPDATE_SIGN_PATTERN.matcher(formJson);
-        Matcher insertMatcher = INSERT_SIGN_PATTERN.matcher(formJson);
-        if (deleteMatcher.find() || updateMatcher.find() || insertMatcher.find()) {
-            msg.setError("包含非法字符,无法执行");
-            return msg;
-        }
-        User user = userMapper.selectById(request.getHeader("token"));
-        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
-        if(1 == wxCorpInfo.getSaasSyncContact()){
-            List<FormTransCondition> formTransConditions = JSONObject.parseArray(formTransConditionJson, FormTransCondition.class);
-            for (FormTransCondition formTransCondition : formTransConditions) {
-                String str = formTransCondition.getTblAlias()+"."+formTransCondition.getColName();
-                String replaceObj = str+" like concat('%','"+formTransCondition.getUseVal()+"','%')";
-                if(1 == formTransCondition.getTransType()){
-                    HashMap<String, List> result = null;
-                    try {
-                        result = wxCorpInfoService.getOpenId(wxCorpInfo.getCorpid(), formTransCondition.getUseVal(), null,1,200);
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                        msg.setError("企微转义有误,请联系管理员");
-                        return msg;
-                    }
-                    List users = result.get("user");
-                    List<User> realUser = userMapper.getUserByDepartment(null, user.getCompanyId(), null,null, null, null, null, users);
-                    String replaceStr = str+" in(";
-                    int count = 0;
-                    for (User tmpUser : realUser) {
-                        replaceStr += "'"+tmpUser.getName()+"'";
-                        count++;
-                        if(count<realUser.size()){
-                            replaceStr += ", ";
-                        }
-                    }
-                    replaceStr +=") ";
-                    formJson.replace(replaceObj,replaceStr);
-                } else if (2 == formTransCondition.getTransType()) {
-                    Integer deptWxId = null;
-                    try {
-                        deptWxId = wxCorpInfoService.searchCorpWxDeptId(wxCorpInfo.getCorpid(), formTransCondition.getUseVal());
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                        msg.setError("企微转义有误,请联系管理员");
-                        return msg;
-                    }
-                    if(null != deptWxId){
-                        String replaceStr = str+" ="+deptWxId+" ";
-                        formJson.replace(replaceObj,replaceStr);
-                    }
-                }
-            }
-        }
-        List<Map<String,Object>> resColumnList = new ArrayList<>();
-        try (Connection connection = dataSource.getConnection()) {
-            PreparedStatement preparedStatement = connection.prepareStatement(formJson);
-            ResultSet resultSet = preparedStatement.executeQuery();
-            columnList = this.convertListWithAlias(resultSet);
-        }catch (SQLException e) {
-            e.printStackTrace();
-            msg.setError("SQL语句有误,请联系管理员");
-            return msg;
-        }
-//        if(CollectionUtils.isNotEmpty(columnList)){
-//            //转换固定值
-//            List<FormFieldHead> formFieldHeads = JSONArray.parseArray(cusReportForm.getFormFieldHead(), FormFieldHead.class);
-//            List<ColumnFixTrans> columnFixTrans = columnFixTransMapper.selectList(null);
-//            Map<String, List<ColumnFixTrans>> tableColumnFixTransMap = columnFixTrans.stream()
-//                    .collect(Collectors.groupingBy(ColumnFixTrans::getTblName));// key tblName
-//
-//            //根据表头获取 'xxx' --> 别名.字段名 --> 表名.字段名
-//            Map<String, FormFieldHead> columnAliasMap = new HashMap<>();
-//            for (FormFieldHead formFieldHead : formFieldHeads) {
-//                columnAliasMap.put(formFieldHead.getColumnVal(),formFieldHead);
-//            }
-//
-//            List<FormTransColumn> checkColumns = formTransColumnMapper.selectList(new LambdaQueryWrapper<FormTransColumn>());
-//            Map<String, List<FormTransColumn>> tblColumnMap = new HashMap<>();
-//            if(CollectionUtils.isNotEmpty(checkColumns)){
-//                tblColumnMap = checkColumns.stream()
-//                        .collect(Collectors.groupingBy(FormTransColumn::getTblName));
-//            }
-//
 //            Map<String,List<String>> indexMap = new HashMap<>(2);
 //            indexMap.put("userName",new ArrayList<>());
 //            indexMap.put("deptName",new ArrayList<>());
 //            Map<String,String> tableNameAliasMap = new HashMap<>();
-//            Matcher mainMatcher = MAIN_TABLE_PATTERN.matcher(formJson);
+//            Matcher mainMatcher = MAIN_TABLE_PATTERN.matcher(tableColumnSql);
 //            if (mainMatcher.find()) {
 //                tableNameAliasMap.put(mainMatcher.group(1),mainMatcher.group(2));
 //            } else {
@@ -989,7 +752,7 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
 //                return msg;
 //            }
 //
-//            Matcher joinMatcher = JOIN_TABLE_PATTERN.matcher(formJson);
+//            Matcher joinMatcher = JOIN_TABLE_PATTERN.matcher(tableColumnSql);
 //            while (joinMatcher.find()){
 //                tableNameAliasMap.put(joinMatcher.group(1),joinMatcher.group(2));
 //            }
@@ -999,7 +762,7 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
 //                if(CollectionUtils.isNotEmpty(tmpColList)){
 //                    for (FormTransColumn formTransColumn : tmpColList) {
 //                        String col = tableAlias+"."+formTransColumn.getColName();
-//                        if(formJson.contains(col)){
+//                        if(tableColumnSql.contains(col)){
 //                            if(1 == formTransColumn.getTransType()){
 //                                //当前位置的是人名,需要转义
 //                                for (int i = 0; i < formFieldHeads.size(); i++) {
@@ -1027,7 +790,7 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
 //                }
 //            }
 //            List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, user.getCompanyId()));
-//
+//            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
 //            for (Map<String, Object> data : columnList) {
 //                String valRes = "";
 //                Map<String,Object> map = new HashMap<>();
@@ -1035,15 +798,20 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
 //                    //固定值转换
 //                    FormFieldHead formFieldHead = columnAliasMap.get(key);//字段对应别名和表
 //                    List<ColumnFixTrans> transColList = tableColumnFixTransMap.get(formFieldHead.getTableName());//固定值字段集合
-//                    List<ColumnFixTrans> currentFixValList = transColList.stream()
-//                            .filter(t -> t.getColName().equals(formFieldHead.getColumnName()))
-//                            .collect(Collectors.toList());//当前字段固定值对照值
+//                    List<ColumnFixTrans> currentFixValList = new ArrayList<>();
+//                    if(CollectionUtils.isNotEmpty(transColList)){
+//                        currentFixValList = transColList.stream()
+//                                .filter(t -> t.getColName().equals(formFieldHead.getColumnName()))
+//                                .collect(Collectors.toList());//当前字段固定值对照值
+//                    }
 //                    if(CollectionUtils.isNotEmpty(currentFixValList)){
 //                        Map<String, String> valMeanMap = currentFixValList.stream()
 //                                .collect(Collectors.toMap(ColumnFixTrans::getColVal, ColumnFixTrans::getValMean));
 //                        Object value = data.get(key);
-//                        String mean = valMeanMap.get(value.toString());
-//                        valRes = mean;
+//                        if(null != value){
+//                            String mean = valMeanMap.get(value.toString());
+//                            valRes = mean;
+//                        }
 //                    }else{
 //                        //转义
 //                        List<String> userNameIndexes = indexMap.get("userName");
@@ -1086,11 +854,164 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
 //                        }
 //                    }
 //                    map.put(key,valRes);
+//                    valRes = "";
 //                }
 //                resColumnList.add(map);
 //            }
-//        }
-        msg.setData(columnList);
+        }
+
+        msg.setData(resColumnList);
+        return msg;
+    }
+
+    /**移动报表到文件夹*/
+    @Override
+    public HttpRespMsg moveFormStore(Integer formId,Integer targetStoreId, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        BusReportStore busReportStore = busReportStoreMapper.selectOne(new LambdaQueryWrapper<BusReportStore>()
+                .eq(BusReportStore::getCompanyId, user.getCompanyId())
+                .eq(BusReportStore::getRelateFormId, formId)
+        );
+
+        BusReportStore lastOneStore = busReportStoreMapper.selectOne(new LambdaQueryWrapper<BusReportStore>()
+                .eq(BusReportStore::getCompanyId, user.getCompanyId())
+                .eq(BusReportStore::getParentStoreId, busReportStore.getParentStoreId())
+                .orderByDesc(BusReportStore::getOrderItem)
+                .last(" limit 1 ")
+        );
+        if(null == lastOneStore){
+            busReportStore.setParentStoreId(targetStoreId);
+            busReportStore.setOrderItem(1);
+            busReportStore.setUpdateBy(user.getId());
+            busReportStore.setUpdateTime(new Date());
+        }else{
+            busReportStore.setParentStoreId(targetStoreId);
+            busReportStore.setOrderItem(lastOneStore.getOrderItem()+1);
+            busReportStore.setUpdateBy(user.getId());
+            busReportStore.setUpdateTime(new Date());
+        }
+
+        busReportStoreMapper.updateById(busReportStore);
+
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg getAllStoresTree(HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        List<BusReportStore> busReportStores = busReportStoreMapper.selectList(new LambdaQueryWrapper<BusReportStore>()
+                .eq(BusReportStore::getCompanyId, user.getCompanyId())
+                .ne(BusReportStore::getStoreType,2)
+        );
+        List<BusReportStore> listTree = this.listToTree(busReportStores);
+        msg.setData(listTree);
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg getResByFormJson(String formSql,String formTransConditionJson,String formFieldHeads, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        List<Map<String,Object>> columnList = new ArrayList<>();
+        Matcher deleteMatcher = DELETE_SGIN_PATTERN.matcher(formSql);
+        Matcher updateMatcher = UPDATE_SIGN_PATTERN.matcher(formSql);
+        Matcher insertMatcher = INSERT_SIGN_PATTERN.matcher(formSql);
+        if (deleteMatcher.find() || updateMatcher.find() || insertMatcher.find()) {
+            msg.setError("包含非法字符,无法执行");
+            return msg;
+        }
+        User user = userMapper.selectById(request.getHeader("token"));
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        if(StringUtils.isNotBlank(formTransConditionJson)){
+            if(null != wxCorpInfo && 1 == wxCorpInfo.getSaasSyncContact()){
+                List<FormTransCondition> formTransConditions = JSONObject.parseArray(formTransConditionJson, FormTransCondition.class);
+                for (FormTransCondition formTransCondition : formTransConditions) {
+                    String str = formTransCondition.getTblAlias()+"."+formTransCondition.getColName();
+                    String replaceObj = str+" like concat('%','"+formTransCondition.getUseVal()+"','%')";
+                    if(1 == formTransCondition.getTransType()){
+                        HashMap<String, List> result = null;
+                        try {
+                            result = wxCorpInfoService.getOpenId(wxCorpInfo.getCorpid(), formTransCondition.getUseVal(), null,1,200);
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                            msg.setError("企微转义有误,请联系管理员");
+                            return msg;
+                        }
+                        List users = result.get("user");
+                        List<User> realUser = userMapper.getUserByDepartment(null, user.getCompanyId(), null,null, null, null, null, users);
+                        String replaceStr = str+" in(";
+                        int count = 0;
+                        for (User tmpUser : realUser) {
+                            replaceStr += "'"+tmpUser.getName()+"'";
+                            count++;
+                            if(count<realUser.size()){
+                                replaceStr += ", ";
+                            }
+                        }
+                        replaceStr +=") ";
+                        formSql.replace(replaceObj,replaceStr);
+                    } else if (2 == formTransCondition.getTransType()) {
+                        Integer deptWxId = null;
+                        try {
+                            deptWxId = wxCorpInfoService.searchCorpWxDeptId(wxCorpInfo.getCorpid(), formTransCondition.getUseVal());
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                            msg.setError("企微转义有误,请联系管理员");
+                            return msg;
+                        }
+                        if(null != deptWxId){
+                            String replaceStr = str+" ="+deptWxId+" ";
+                            formSql.replace(replaceObj,replaceStr);
+                        }
+                    }
+                }
+            }
+        }
+
+        List<Map<String,Object>> resColumnList = new ArrayList<>();
+        try (Connection connection = dataSource.getConnection()) {
+            PreparedStatement preparedStatement = connection.prepareStatement(formSql);
+            ResultSet resultSet = preparedStatement.executeQuery();
+            columnList = this.convertListWithAlias(resultSet);
+        }catch (SQLException e) {
+            e.printStackTrace();
+            msg.setError("SQL语句有误,请联系管理员");
+            return msg;
+        }
+        if(CollectionUtils.isNotEmpty(columnList)){
+            List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, user.getCompanyId()));
+            List<FormTransColumn> checkColumns = formTransColumnMapper.selectList(new LambdaQueryWrapper<FormTransColumn>());
+            Map<String, List<FormTransColumn>> tblColumnMap = new HashMap<>();
+            if(CollectionUtils.isNotEmpty(checkColumns)){
+                tblColumnMap = checkColumns.stream()
+                        .collect(Collectors.groupingBy(FormTransColumn::getTblName));
+            }
+            //转换固定值
+            Map<String, List<ColumnFixTrans>> tableColumnFixTransMap = new HashMap<>();
+            List<ColumnFixTrans> columnFixTrans = columnFixTransMapper.selectList(null);
+            tableColumnFixTransMap = columnFixTrans.stream()
+                    .collect(Collectors.groupingBy(ColumnFixTrans::getTblName));// key tblName
+            //根据表头获取 'xxx' --> 别名.字段名 --> 表名.字段名
+            List<FormFieldHead> formFieldHeadList = new ArrayList<>();
+            Map<String, FormFieldHead> columnAliasMap = new HashMap<>();
+            if(StringUtils.isNotBlank(formFieldHeads)){
+                formFieldHeadList = JSONArray.parseArray(formFieldHeads, FormFieldHead.class);
+                for (FormFieldHead formFieldHead : formFieldHeadList) {
+                    columnAliasMap.put(formFieldHead.getColumnVal(),formFieldHead);
+                }
+            }
+
+            try {
+                resColumnList = this.getTransResColumns(columnList, formFieldHeadList, columnAliasMap, tableColumnFixTransMap
+                        , tblColumnMap, userList, wxCorpInfo, formSql, user);
+            } catch (Exception e) {
+                e.printStackTrace();
+                msg.setError(e.getMessage());
+                return msg;
+            }
+        }
+        msg.setData(resColumnList);
         return msg;
     }
 
@@ -1267,15 +1188,23 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
                     //固定值转换
                     FormFieldHead formFieldHead = columnAliasMap.get(key);//字段对应别名和表
                     List<ColumnFixTrans> transColList = tableColumnFixTransMap.get(formFieldHead.getTableName());//固定值字段集合
-                    List<ColumnFixTrans> currentFixValList = transColList.stream()
-                            .filter(t -> t.getColName().equals(formFieldHead.getColumnName()))
-                            .collect(Collectors.toList());//当前字段固定值对照值
+                    List<ColumnFixTrans> currentFixValList = new ArrayList<>();
+                    if(CollectionUtils.isNotEmpty(transColList)){
+                        currentFixValList = transColList.stream()
+                                .filter(t -> t.getColName().equals(formFieldHead.getColumnName()))
+                                .collect(Collectors.toList());//当前字段固定值对照值
+                    }
+
                     if(CollectionUtils.isNotEmpty(currentFixValList)){
                         Map<String, String> valMeanMap = currentFixValList.stream()
                                 .collect(Collectors.toMap(ColumnFixTrans::getColVal, ColumnFixTrans::getValMean));
                         Object value = data.get(key);
-                        String mean = valMeanMap.get(value.toString());
-                        valRes = mean;
+                        if(null == value){
+//                            valRes = "";
+                        }else{
+                            String mean = valMeanMap.get(value.toString());
+                            valRes = mean;
+                        }
                     }else{
                         //转义
                         List<String> userNameIndexes = indexMap.get("userName");
@@ -1340,6 +1269,7 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
                     }
 
                     item.add(valRes);
+                    valRes = "";
                 }
                 resList.add(item);
             }
@@ -1455,4 +1385,137 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
         return list;
     }
 
+
+    //转换固定值并转义
+    public List<Map<String,Object>> getTransResColumns(List<Map<String,Object>> columnList
+            ,List<FormFieldHead> formFieldHeads
+            ,Map<String, FormFieldHead> columnAliasMap
+            ,Map<String, List<ColumnFixTrans>> tableColumnFixTransMap
+            ,Map<String, List<FormTransColumn>> tblColumnMap
+            ,List<User> companyUsers
+            ,WxCorpInfo wxCorpInfo
+            ,String sql
+            ,User user){
+        List<Map<String,Object>> resColumnList = new ArrayList<>();
+        if(CollectionUtils.isNotEmpty(columnList)){
+            Map<String,List<String>> indexMap = new HashMap<>(2);
+            indexMap.put("userName",new ArrayList<>());
+            indexMap.put("deptName",new ArrayList<>());
+            Map<String,String> tableNameAliasMap = new HashMap<>();
+            Matcher mainMatcher = MAIN_TABLE_PATTERN.matcher(sql);
+            if (mainMatcher.find()) {
+                tableNameAliasMap.put(mainMatcher.group(1),mainMatcher.group(2));
+            } else {
+                throw new RuntimeException("主业务表无法识别,请联系管理员");
+            }
+
+            Matcher joinMatcher = JOIN_TABLE_PATTERN.matcher(sql);
+            while (joinMatcher.find()){
+                tableNameAliasMap.put(joinMatcher.group(1),joinMatcher.group(2));
+            }
+            for (String tableName : tableNameAliasMap.keySet()) {
+                List<FormTransColumn> tmpColList = tblColumnMap.get(tableName);
+                String tableAlias = tableNameAliasMap.get(tableName);
+                if(CollectionUtils.isNotEmpty(tmpColList)){
+                    for (FormTransColumn formTransColumn : tmpColList) {
+                        String col = tableAlias+"."+formTransColumn.getColName();
+                        if(sql.contains(col)){
+                            if(1 == formTransColumn.getTransType()){
+                                //当前位置的是人名,需要转义
+                                for (int i = 0; i < formFieldHeads.size(); i++) {
+                                    if(formFieldHeads.get(i).getTableName().equals(tableName)
+                                            &&formFieldHeads.get(i).getColumnName().equals(formTransColumn.getColName())
+                                    ){
+                                        List<String> tmpList = indexMap.get("userName");
+                                        tmpList.add(formFieldHeads.get(i).getColumnVal());
+                                    }
+                                }
+                            }
+                            else if (2 == formTransColumn.getTransType()) {
+                                //当前位置是部门,需要转义
+                                for (int i = 0; i < formFieldHeads.size(); i++) {
+                                    if(formFieldHeads.get(i).getTableName().equals(tableName)
+                                            &&formFieldHeads.get(i).getColumnName().equals(formTransColumn.getColName())
+                                    ){
+                                        List<String> tmpList = indexMap.get("deptName");
+                                        tmpList.add(formFieldHeads.get(i).getColumnVal());
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            for (Map<String, Object> data : columnList) {
+                String valRes = "";
+                Map<String,Object> map = new HashMap<>();
+                for (String key : columnList.get(0).keySet()) {
+                    //固定值转换
+                    FormFieldHead formFieldHead = columnAliasMap.get(key);//字段对应别名和表
+                    List<ColumnFixTrans> transColList = tableColumnFixTransMap.get(formFieldHead.getTableName());//固定值字段集合
+                    List<ColumnFixTrans> currentFixValList = new ArrayList<>();
+                    if(CollectionUtils.isNotEmpty(transColList)){
+                        currentFixValList = transColList.stream()
+                                .filter(t -> t.getColName().equals(formFieldHead.getColumnName()))
+                                .collect(Collectors.toList());//当前字段固定值对照值
+                    }
+                    if(CollectionUtils.isNotEmpty(currentFixValList)){
+                        Map<String, String> valMeanMap = currentFixValList.stream()
+                                .collect(Collectors.toMap(ColumnFixTrans::getColVal, ColumnFixTrans::getValMean));
+                        Object value = data.get(key);
+                        if(null != value){
+                            String mean = valMeanMap.get(value.toString());
+                            valRes = mean;
+                        }
+                    }else{
+                        //转义
+                        List<String> userNameIndexes = indexMap.get("userName");
+                        List<String> deptNameIndexes = indexMap.get("deptName");
+                        if(1 == user.getUserNameNeedTranslate()){
+                            Object value = data.get(key);
+                            if (value == null) {
+                            } else {
+                                String val = value.toString();
+                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    if(CollectionUtils.isNotEmpty(userNameIndexes) && userNameIndexes.contains(key)){
+                                        String name = val;
+                                        Optional<User> first = companyUsers.stream().filter(u -> u.getName().equals(name)).findFirst();
+                                        if(first.isPresent()){
+                                            val = "$userName="+first.get().getCorpwxUserid()+"$";
+                                        }else {
+                                            val = "";
+                                        }
+                                    }
+
+                                }
+                                if(CollectionUtils.isNotEmpty(deptNameIndexes) && deptNameIndexes.contains(key)){
+                                    String name = val;
+                                    Optional<User> first = companyUsers.stream().filter(u -> u.getName().equals(name)).findFirst();
+                                    if(first.isPresent()){
+                                        val = "$departmentName="+first.get().getCorpwxDeptid()+"$";
+                                    }else {
+                                        val = "";
+                                    }
+                                }
+                                valRes = val;
+                            }
+                        }else{
+                            Object value = data.get(key);
+                            if (value == null) {
+                                valRes = "";
+                            } else {
+                                valRes = value.toString();
+                            }
+                        }
+                    }
+                    map.put(key,valRes);
+                    valRes = "";
+                }
+                resColumnList.add(map);
+            }
+        }
+        return resColumnList;
+    }
+
 }