Procházet zdrojové kódy

自定义表单相关

zhouyy před 1 měsícem
rodič
revize
476fc4960c
14 změnil soubory, kde provedl 982 přidání a 56 odebrání
  1. 19 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/AIQuestionController.java
  2. 5 3
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/TableColumnController.java
  3. 5 2
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/AIQuestion.java
  4. 29 6
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/AIQuestionDetail.java
  5. 61 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/CustomMultipartFile.java
  6. 59 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ExcelMultipartFile.java
  7. 1 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/FormTransColumn.java
  8. 44 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/bo/QuestionBO.java
  9. 1 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/provider/CusTableColumnProvider.java
  10. 5 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/AIQuestionService.java
  11. 1 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/CusTableColumnService.java
  12. 298 2
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/AIQuestionServiceImpl.java
  13. 365 42
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/CusTableColumnServiceImpl.java
  14. 89 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/util/ExcelConverter.java

+ 19 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/AIQuestionController.java

@@ -1,9 +1,28 @@
 package com.management.platform.controller;
 
+import com.management.platform.entity.bo.QuestionBO;
+import com.management.platform.service.AIQuestionService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
 @RestController
 @RequestMapping("/aiQuestion")
 public class AIQuestionController {
+
+    @Resource
+    private AIQuestionService aiQuestionService;
+
+    @PostMapping("/ask")
+    public HttpRespMsg ask(QuestionBO questionBO
+            , HttpServletRequest request){
+        HttpRespMsg msg = new HttpRespMsg();
+        msg = aiQuestionService.ask(questionBO,request);
+        return msg;
+    }
+
 }

+ 5 - 3
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/TableColumnController.java

@@ -15,7 +15,7 @@ import javax.servlet.http.HttpServletRequest;
 
 @RestController
 @RequestMapping("/tableColumn")
-public class TableColumnController {
+public class CusTableColumnController {
 
     @Resource
     private CusTableColumnService cusTableColumnService;
@@ -34,9 +34,11 @@ public class TableColumnController {
     }
 
     @PostMapping("/getResByFormJson")
-    public HttpRespMsg getResByFormJson(@RequestParam("formJson") String formJson,HttpServletRequest request){
+    public HttpRespMsg getResByFormJson(@RequestParam("formJson") String formJson
+            ,@RequestParam("formTransConditionJson") String formTransConditionJson
+            ,HttpServletRequest request){
         HttpRespMsg msg = new HttpRespMsg();
-        msg = cusTableColumnService.getResByFormJson(formJson,request);
+        msg = cusTableColumnService.getResByFormJson(formJson,formTransConditionJson,request);
         return msg;
     }
 

+ 5 - 2
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/AIQuestion.java

@@ -1,7 +1,9 @@
 package com.management.platform.entity;
 
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
@@ -14,11 +16,12 @@ import java.util.Date;
 @Data
 @EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
+@TableName("ai_question")
 public class AIQuestion extends Model<AIQuestion> {
     private static final long serialVersionUID=1L;
 
-    @TableId("id")
-    private Integer id;
+    @TableId(value = "question_id",type = IdType.AUTO)
+    private Integer questionId;
 
     @TableField("company_id")
     private Integer companyId;

+ 29 - 6
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/AIQuestionDetail.java

@@ -1,7 +1,9 @@
 package com.management.platform.entity;
 
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
@@ -14,17 +16,18 @@ import java.util.Date;
 @Data
 @EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
+@TableName("ai_question_detail")
 public class AIQuestionDetail extends Model<AIQuestionDetail> {
     private static final long serialVersionUID=1L;
 
-    @TableId("detail_id")
+    @TableId(value = "detail_id",type = IdType.AUTO)
     private Integer detailId;
 
     @TableField("company_id")
     private Integer companyId;
 
-    @TableField("q_id")
-    private Integer qId;
+    @TableField("question_id")
+    private Integer questionId;
 
     /**对话类型 0ai 1客户*/
     @TableField("type")
@@ -38,14 +41,34 @@ public class AIQuestionDetail extends Model<AIQuestionDetail> {
     @TableField("seq")
     private Integer seq;
 
-    /**上传文件名*/
-    @TableField("document_name")
-    private String documentName;
+    /**数据来源 1系统表 2自定义报表 3本地上传 4自由对话*/
+    @TableField("question_data_source")
+    private Integer questionDataSource;
+
+    /**来源内容 系统表存表名 报表存formId 文件存文件名*/
+    @TableField("source_content")
+    private String sourceContent;
 
     /**文件路径*/
     @TableField("url")
     private String url;
 
+    /**
+     * 系统表查询的开始时间
+     */
+    @TableField("start_time")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date startTime;
+
+    /**
+     * 系统表查询的结束时间
+     */
+    @TableField("end_time")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date endTime;
+
 
     /**
      * 创建时间

+ 61 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/CustomMultipartFile.java

@@ -0,0 +1,61 @@
+package com.management.platform.entity;
+
+import org.springframework.web.multipart.MultipartFile;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class CustomMultipartFile implements MultipartFile {
+
+    private final byte[] content;
+    private final String name;
+    private final String originalFilename;
+    private final String contentType;
+
+    public CustomMultipartFile(byte[] content, String name, String originalFilename, String contentType) {
+        this.content = content;
+        this.name = name;
+        this.originalFilename = originalFilename;
+        this.contentType = contentType;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public String getOriginalFilename() {
+        return originalFilename;
+    }
+
+    @Override
+    public String getContentType() {
+        return contentType;
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return content == null || content.length == 0;
+    }
+
+    @Override
+    public long getSize() {
+        return content.length;
+    }
+
+    @Override
+    public byte[] getBytes() throws IOException {
+        return content;
+    }
+
+    @Override
+    public InputStream getInputStream() throws IOException {
+        return new ByteArrayInputStream(content);
+    }
+
+    @Override
+    public void transferTo(java.io.File dest) throws IOException, IllegalStateException {
+        new java.io.FileOutputStream(dest).write(content);
+    }
+}

+ 59 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ExcelMultipartFile.java

@@ -0,0 +1,59 @@
+package com.management.platform.entity;
+
+import org.springframework.web.multipart.MultipartFile;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class ExcelMultipartFile implements MultipartFile {
+
+    private final byte[] excelBytes;
+    private final String fileName;
+
+    public ExcelMultipartFile(byte[] excelBytes, String fileName) {
+        this.excelBytes = excelBytes;
+        this.fileName = fileName;
+    }
+
+    @Override
+    public String getName() {
+        return "file";
+    }
+
+    @Override
+    public String getOriginalFilename() {
+        return fileName;
+    }
+
+    @Override
+    public String getContentType() {
+        return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return excelBytes == null || excelBytes.length == 0;
+    }
+
+    @Override
+    public long getSize() {
+        return excelBytes.length;
+    }
+
+    @Override
+    public byte[] getBytes() throws IOException {
+        return excelBytes;
+    }
+
+    @Override
+    public InputStream getInputStream() throws IOException {
+        return new ByteArrayInputStream(excelBytes);
+    }
+
+    @Override
+    public void transferTo(java.io.File dest) throws IOException, IllegalStateException {
+        try (java.io.FileOutputStream fos = new java.io.FileOutputStream(dest)) {
+            fos.write(excelBytes);
+        }
+    }
+}

+ 1 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/FormTransColumn.java

@@ -11,6 +11,7 @@ import lombok.experimental.Accessors;
 @Data
 @EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
+/**需转义字段*/
 public class FormTransColumn extends Model<FormTransColumn> {
     private static final long serialVersionUID=1L;
 

+ 44 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/bo/QuestionBO.java

@@ -0,0 +1,44 @@
+package com.management.platform.entity.bo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Date;
+
+@Data
+public class QuestionBO {
+
+    /**问题id*/
+    private Integer questionId;
+
+    /**数据来源 1系统表 2自定义报表 3本地上传 4自由对话*/
+    private Integer questionDataSource;
+
+    /**来源内容 系统表存表名 报表存formId 文件存文件名*/
+    private String sourceContent;
+//    private String tblName;
+//
+//    private Integer formId;
+
+    private String url;
+
+    /**提问内容*/
+    private String content;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm",timezone = "GMT+8")
+    private Date startTime;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm",timezone = "GMT+8")
+    private Date endTime;
+
+
+    private MultipartFile file;
+
+
+
+
+}

+ 1 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/provider/CusTableColumnProvider.java

@@ -14,6 +14,7 @@ public class CusTableColumnProvider {
                 .append(tableName).append("'")
                 .append(" AND COLUMN_NAME not like '%_id%' AND COLUMN_NAME not like '%id%' ")
                 .append(" AND COLUMN_NAME not like '%seq%'")
+                .append(" AND COLUMN_NAME not like '%plate%'")
         ;
 
         if(CollectionUtils.isNotEmpty(busObjRelations)){

+ 5 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/AIQuestionService.java

@@ -2,6 +2,11 @@ package com.management.platform.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.management.platform.entity.AIQuestion;
+import com.management.platform.entity.bo.QuestionBO;
+import com.management.platform.util.HttpRespMsg;
+
+import javax.servlet.http.HttpServletRequest;
 
 public interface AIQuestionService extends IService<AIQuestion> {
+    HttpRespMsg ask(QuestionBO questionBO, HttpServletRequest request);
 }

+ 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, HttpServletRequest request);
+    HttpRespMsg getResByFormJson(String formJson, String formTransConditionJson,HttpServletRequest request);
 
     HttpRespMsg getFormJsonByFormId(Integer formId, HttpServletRequest request);
 

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

@@ -1,11 +1,307 @@
 package com.management.platform.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.management.platform.entity.AIQuestion;
-import com.management.platform.mapper.AIQuestionMapper;
+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.ExcelExportService;
+import com.management.platform.util.ExcelConverter;
+import com.management.platform.util.HttpRespMsg;
+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.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.sql.DataSource;
+import java.io.IOException;
+import java.sql.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.stream.Collectors;
 
 @Service
 public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuestion>  implements AIQuestionService {
+
+    @Resource
+    private AIQuestionMapper aiQuestionMapper;
+
+    @Resource
+    private AIQuestionDetailMapper aiQuestionDetailMapper;
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Resource
+    private BusObjRelationMapper busObjRelationMapper;
+
+    @Resource
+    private CusTableColumnMapper cusTableColumnMapper;
+
+    @Resource
+    private ExcelExportService excelExportService;
+
+    @Resource
+    private WxCorpInfoMapper wxCorpInfoMapper;
+
+    @Resource
+    private CusReportFormMapper cusReportFormMapper;
+
+    @Resource
+    private DataSource dataSource;
+
+    @Value(value = "${upload.path}")
+    private String path;
+
+    /**将备注名作为别名 并剔除掉 shortName*/
+    public static List<Map<String, Object>> convertListWithComment(ResultSet rs,Map<String, String> columnCommentMap) {
+        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++) {
+                    String columnName = md.getColumnName(i);
+                    String columnComment = columnCommentMap.get(columnName);
+                    if(columnComment.length()>10){
+                        Matcher matcher = CusTableColumnServiceImpl.COMMENT_SIGN_PATTERN.matcher(columnComment);
+                        if(matcher.find()){
+                            columnComment = matcher.group(1);
+                        }
+                    }else{
+                        int index = columnComment.indexOf("shortName");
+                        if(-1 != index){
+                            String trim = columnComment.substring(0, i).trim();
+                            columnComment = trim;
+                        }
+                    }
+                    rowData.put(columnComment,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;
+    }
+
+    public ByteArrayResource getFileByteArrayResource(List<Map<String,Object>> columnList,String fileName) {
+        ByteArrayResource byteArrayResource = null;
+        try {
+            // 2. 转换为Excel格式的MultipartFile
+            MultipartFile excelFile = ExcelConverter.convertToExcel(
+                    columnList,
+                    fileName);
+            //下载到本地
+            excelFile.transferTo(new java.io.File(fileName));
+            byteArrayResource = new ByteArrayResource(excelFile.getBytes()) {
+                @Override
+                public String getFilename() {
+                    return excelFile.getOriginalFilename();
+                }
+            };
+        }catch (IOException e){
+            e.printStackTrace();
+        }
+        return byteArrayResource;
+    }
+
+    @Async
+    public ResponseEntity<String> getResponseEntityWithFileAI(List<Map<String,Object>> columnList,String question){
+        String uploadUrl = "http://192.168.2.40:5000/analyzeByFile";
+        RestTemplate restTemplate = new RestTemplate();
+        //转换为MultipartFile 准备表单数据
+        MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
+        body.add("question", question);
+        ByteArrayResource fileByteArrayResource = getFileByteArrayResource(columnList, "提问数据.xlsx");
+        body.add("file",fileByteArrayResource);
+        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);
+        return response;
+    }
+
+
+    @Override
+    @Transactional
+    public HttpRespMsg ask(QuestionBO questionBO, HttpServletRequest request) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+
+        String queryRes = "";
+        if(1 == questionBO.getQuestionDataSource()){
+            /**
+             * 系统表
+             * 查询表结构 获取字段对应备注
+             * 查询内容并添加create_time 范围
+             * select 字段名 as '别名' 作为表头
+             */
+
+            String tableName = questionBO.getSourceContent();
+
+            //排除relation表中的关联字段
+            List<BusObjRelation> busObjRelations = busObjRelationMapper.selectList(new LambdaQueryWrapper<BusObjRelation>()
+                    .eq(BusObjRelation::getFromTbl, tableName)
+            );
+            List<CusTableColumn> checkColumns = cusTableColumnMapper.getStructByTableName(tableName,busObjRelations);
+            //映射字段和comment
+            Map<String, String> columnCommentMap = checkColumns.stream().collect(Collectors.toMap(CusTableColumn::getColumnName, CusTableColumn::getColumnComment));
+
+            StringBuilder stringBuilder = new StringBuilder();
+            stringBuilder.append(" select ");
+            for (String key : columnCommentMap.keySet()) {
+                stringBuilder.append(" ").append(key).append(",");
+            }
+            stringBuilder.delete(stringBuilder.length() - 1, stringBuilder.length());
+            stringBuilder.append(" from ")
+                    .append(tableName)
+                    .append(" where company_id =")
+                    .append(user.getCompanyId());
+            if(null != questionBO.getStartTime() && null != questionBO.getEndTime()){
+                stringBuilder.append(" and create_time between ")
+                        .append(questionBO.getStartTime())
+                        .append(" and ")
+                        .append(questionBO.getEndTime());
+            }
+
+            List<Map<String,Object>> columnList = new ArrayList<>();
+            try (Connection connection = dataSource.getConnection()) {
+                PreparedStatement preparedStatement = connection.prepareStatement(stringBuilder.toString());
+                ResultSet resultSet = preparedStatement.executeQuery();
+                columnList = this.convertListWithComment(resultSet,columnCommentMap);
+            }catch (SQLException e) {
+                e.printStackTrace();
+                httpRespMsg.setError("查询系统表有误,请联系管理员");
+                return httpRespMsg;
+            }
+
+            if(CollectionUtils.isNotEmpty(columnList)){
+                ResponseEntity<String> responseEntity = getResponseEntityWithFileAI(columnList, 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 (2 == questionBO.getQuestionDataSource()) {
+            /**
+             * 自定义报表
+             * 查询formId对应的sql,获取返回结果 封装为表格
+             */
+            CusReportForm cusReportForm = cusReportFormMapper.selectById(questionBO.getSourceContent());
+
+        } else if (3 == questionBO.getQuestionDataSource()) {
+            /**
+             * 获取url 读取文件内容并返回
+             */
+        }else{
+
+        }
+
+        if(null == questionBO.getQuestionId()){
+            //提问获取回答,再插入
+            AIQuestion aiQuestion = new AIQuestion();
+            aiQuestion.setCompanyId(user.getCompanyId());
+            aiQuestion.setCreatorId(user.getId());
+            aiQuestionMapper.insert(aiQuestion);
+
+            Integer questionId = aiQuestion.getQuestionId();
+            AIQuestionDetail cusAsk = new AIQuestionDetail();
+            cusAsk.setCreatorId(user.getId());
+            cusAsk.setCompanyId(user.getCompanyId());
+            cusAsk.setSeq(1);
+            cusAsk.setQuestionId(questionId);
+            cusAsk.setType(1);
+            cusAsk.setContent(questionBO.getContent());
+            cusAsk.setQuestionDataSource(questionBO.getQuestionDataSource());
+            cusAsk.setSourceContent(questionBO.getSourceContent());
+            cusAsk.setStartTime(questionBO.getStartTime());
+            cusAsk.setEndTime(questionBO.getEndTime());
+            aiQuestionDetailMapper.insert(cusAsk);
+
+            AIQuestionDetail aiAnswer = new AIQuestionDetail();
+            aiAnswer.setCreatorId(user.getId());
+            aiAnswer.setCompanyId(user.getCompanyId());
+            aiAnswer.setSeq(2);
+            aiAnswer.setQuestionId(questionId);
+            aiAnswer.setType(0);
+            aiAnswer.setContent(queryRes);
+            aiAnswer.setQuestionDataSource(questionBO.getQuestionDataSource());
+            aiAnswer.setSourceContent(questionBO.getSourceContent());
+            aiAnswer.setStartTime(questionBO.getStartTime());
+            aiAnswer.setEndTime(questionBO.getEndTime());
+            aiQuestionDetailMapper.insert(aiAnswer);
+        } else {
+            Integer questionId = questionBO.getQuestionId();
+            AIQuestionDetail lastOne = aiQuestionDetailMapper.selectOne(new LambdaQueryWrapper<AIQuestionDetail>()
+                    .eq(AIQuestionDetail::getCompanyId, user.getCompanyId())
+                    .eq(AIQuestionDetail::getQuestionId, questionId)
+                    .orderByDesc(AIQuestionDetail::getSeq)
+                    .last(" limit 1 ")
+            );
+            Integer startSeq = lastOne.getSeq();
+            AIQuestionDetail cusAsk = new AIQuestionDetail();
+            cusAsk.setCreatorId(user.getId());
+            cusAsk.setCompanyId(user.getCompanyId());
+            cusAsk.setSeq(startSeq+1);
+            cusAsk.setQuestionId(questionId);
+            cusAsk.setType(1);
+            cusAsk.setContent(questionBO.getContent());
+            cusAsk.setQuestionDataSource(questionBO.getQuestionDataSource());
+            cusAsk.setSourceContent(questionBO.getSourceContent());
+            cusAsk.setStartTime(questionBO.getStartTime());
+            cusAsk.setEndTime(questionBO.getEndTime());
+            aiQuestionDetailMapper.insert(cusAsk);
+
+            AIQuestionDetail aiAnswer = new AIQuestionDetail();
+            aiAnswer.setCreatorId(user.getId());
+            aiAnswer.setCompanyId(user.getCompanyId());
+            aiAnswer.setSeq(startSeq+2);
+            aiAnswer.setQuestionId(questionId);
+            aiAnswer.setType(0);
+            aiAnswer.setContent(queryRes);
+            aiAnswer.setQuestionDataSource(questionBO.getQuestionDataSource());
+            aiAnswer.setSourceContent(questionBO.getSourceContent());
+            aiAnswer.setStartTime(questionBO.getStartTime());
+            aiAnswer.setEndTime(questionBO.getEndTime());
+            aiQuestionDetailMapper.insert(aiAnswer);
+
+        }
+
+
+        return httpRespMsg;
+    }
 }

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

@@ -1,7 +1,9 @@
 package com.management.platform.service.impl;
 
 import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -342,42 +344,52 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
             msg.setError("主业务表无法识别,请联系管理员");
             return msg;
         }
-//        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        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()+" ";
-
-//            List<FormTransCondition> formTransConditions = JSONObject.parseArray(cusReportForm.getFormTransConditionJson(), 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 +=") ";
-//
-//                    s.replace(replaceObj,replaceStr);
-//
-//                } else if (2 == formTransCondition.getTransType()) {
-//
-//                }
-//            }
+            if(1 == wxCorpInfo.getSaasSyncContact()){
+                List<FormTransCondition> formTransConditions = JSONObject.parseArray(cusReportForm.getFormTransConditionJson(), 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 +=") ";
+                        s.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+" ";
+                            s.replace(replaceObj,replaceStr);
+                        }
+                    }
+                }
+            }
 
             cusReportForm.setExecuteSql(s);
 
@@ -676,6 +688,8 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
     public HttpRespMsg getFormResByFormId(Integer formId, HttpServletRequest request) {
         HttpRespMsg msg = new HttpRespMsg();
         List<Map<String,Object>> columnList = new ArrayList<>();
+        List<Map<String,Object>> resColumnList = new ArrayList<>();
+        User user = userMapper.selectById(request.getHeader("token"));
         CusReportForm cusReportForm = cusReportFormMapper.selectById(formId);
         if(null == cusReportForm){
             msg.setError("未找到该报表,请联系管理员");
@@ -691,7 +705,143 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
             msg.setError("SQL语句有误,请联系管理员");
             return msg;
         }
-        msg.setData(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);
+        }
+
+        if(CollectionUtils.isNotEmpty(columnList)){
+
+            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(tableColumnSql);
+            if (mainMatcher.find()) {
+                tableNameAliasMap.put(mainMatcher.group(1),mainMatcher.group(2));
+            } else {
+                msg.setError("主业务表无法识别,请联系管理员");
+                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;
     }
 
@@ -742,7 +892,7 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
     }
 
     @Override
-    public HttpRespMsg getResByFormJson(String formJson, HttpServletRequest request) {
+    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);
@@ -752,6 +902,52 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
             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();
@@ -761,6 +957,139 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
             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);
+//            if (mainMatcher.find()) {
+//                tableNameAliasMap.put(mainMatcher.group(1),mainMatcher.group(2));
+//            } else {
+//                msg.setError("主业务表无法识别,请联系管理员");
+//                return msg;
+//            }
+//
+//            Matcher joinMatcher = JOIN_TABLE_PATTERN.matcher(formJson);
+//            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(formJson.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()));
+//
+//            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(columnList);
         return msg;
     }
@@ -901,12 +1230,6 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
         Map<String, FormFieldHead> columnAliasMap = new HashMap<>();
         for (FormFieldHead formFieldHead : formFieldHeads) {
             columnAliasMap.put(formFieldHead.getColumnVal(),formFieldHead);
-//            ColumnAliasVO tmpVO = new ColumnAliasVO();
-//            String key = formFieldHead.getColumnVal();
-//            tmpVO.setColumnCHN(key);
-//            tmpVO.setColumnTblName(formFieldHead.getTableName()+"."+formFieldHead.getColumnName());
-//            tmpVO.setColumnAliasName(tableNameAliasMap.get(formFieldHead.getTableName())+"."+formFieldHead.getColumnName());
-//            columnAliasMap.put(key,tmpVO);
         }
 
         if(CollectionUtils.isNotEmpty(dataList)){

+ 89 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/util/ExcelConverter.java

@@ -0,0 +1,89 @@
+package com.management.platform.util;
+
+import com.management.platform.entity.ExcelMultipartFile;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class ExcelConverter {
+
+    private static void autoSizeColumns(Sheet sheet, int columnCount) {
+        for (int i = 0; i < columnCount; i++) {
+            sheet.autoSizeColumn(i);
+        }
+    }
+
+    public static MultipartFile convertToExcel(
+            List<Map<String, Object>> data,
+            String fileName) throws IOException {
+
+        // 1. 创建工作簿和工作表
+        try (Workbook workbook = new XSSFWorkbook()) {
+            Sheet sheet = workbook.createSheet("Sheet1");
+
+            // 2. 创建表头
+            if (!data.isEmpty()) {
+                createHeaderRow(sheet, data.get(0).keySet());
+
+                // 3. 填充数据行
+                fillDataRows(sheet, data);
+            }
+
+            // 调整列宽
+            autoSizeColumns(sheet, data.get(0).keySet().size());
+
+            // 4. 将工作簿写入字节数组
+            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+            workbook.write(outputStream);
+
+            // 5. 创建并返回MultipartFile
+            return new ExcelMultipartFile(
+                    outputStream.toByteArray(),
+                    fileName.endsWith(".xlsx") ? fileName : fileName + ".xlsx");
+        }
+    }
+
+    private static void createHeaderRow(Sheet sheet, Set<String> headers) {
+        Row headerRow = sheet.createRow(0);
+        int colNum = 0;
+
+        CellStyle headerStyle = sheet.getWorkbook().createCellStyle();
+        Font headerFont = sheet.getWorkbook().createFont();
+        headerFont.setBold(true);
+        headerStyle.setFont(headerFont);
+
+        for (String header : headers) {
+            Cell cell = headerRow.createCell(colNum++);
+            cell.setCellValue(header);
+            cell.setCellStyle(headerStyle);
+        }
+    }
+
+    private static void fillDataRows(Sheet sheet, List<Map<String, Object>> data) {
+        Set<String> headers = data.get(0).keySet();
+        int rowNum = 1;
+
+        for (Map<String, Object> rowData : data) {
+            Row row = sheet.createRow(rowNum++);
+            int colNum = 0;
+
+            for (String header : headers) {
+                Object value = rowData.get(header);
+                Cell cell = row.createCell(colNum++);
+
+                if (value == null) {
+                    cell.setCellValue("");
+                } else {
+                    cell.setCellValue(value.toString());
+                }
+            }
+        }
+    }
+
+}