فهرست منبع

自定义表单相关

zhouyy 2 ماه پیش
والد
کامیت
1039d1086e
12فایلهای تغییر یافته به همراه536 افزوده شده و 24 حذف شده
  1. 6 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/TableColumnController.java
  2. 10 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/BusReportStore.java
  3. 8 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/CusReportForm.java
  4. 3 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/CusTableColumn.java
  5. 10 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/FormFieldHead.java
  6. 28 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/FormTransColumn.java
  7. 14 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/FormTransCondition.java
  8. 3 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/CusTableColumnMapper.java
  9. 7 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/FormTransColumnMapper.java
  10. 10 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/provider/CusTableColumnProvider.java
  11. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/CusTableColumnService.java
  12. 435 24
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/CusTableColumnServiceImpl.java

+ 6 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/TableColumnController.java

@@ -20,6 +20,12 @@ public class TableColumnController {
     @Resource
     private CusTableColumnService cusTableColumnService;
 
+    @PostMapping("/exportCusReportForm")
+    public HttpRespMsg exportCusReportForm(@RequestParam("formId") Integer formId,HttpServletRequest request){
+        HttpRespMsg msg = new HttpRespMsg();
+        msg = cusTableColumnService.exportCusReportForm(formId,request);
+        return msg;
+    }
     @PostMapping("/getFormJsonByFormId")
     public HttpRespMsg getFormJsonByFormId(@RequestParam("formId") Integer formId,HttpServletRequest request){
         HttpRespMsg msg = new HttpRespMsg();

+ 10 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/BusReportStore.java

@@ -82,4 +82,14 @@ public class BusReportStore extends Model<BusReportStore> {
 
     @TableField(exist = false)
     private String formSql;
+
+    @TableField(exist = false)
+    private List<ReportFormAccess> deptAccessList;
+
+
+    @TableField(exist = false)
+    private List<ReportFormAccess> userAccessList;
+
+    @TableField(exist = false)
+    private Integer privilege;
 }

+ 8 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/CusReportForm.java

@@ -79,4 +79,12 @@ public class CusReportForm extends Model<CusReportForm> {
     @TableField(exist = false)
     private String description;
 
+    /**承接前端需要转义的条件*/
+    @TableField(exist = false)
+    private String formTransConditionJson;
+
+//    /**承接前端需要转义的条件*/
+//    @TableField(exist = false)
+//    private List<FormTransCondition> formTransConditionList;
+
 }

+ 3 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/CusTableColumn.java

@@ -40,4 +40,7 @@ public class CusTableColumn extends Model<CusTableColumn> {
 //    private String DATA_TYPE;
     private String dataType;
 
+    /**转义类型 0不需要 1人名 2部门*/
+    private Integer transType=0;
+
 }

+ 10 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/FormFieldHead.java

@@ -0,0 +1,10 @@
+package com.management.platform.entity;
+
+import lombok.Data;
+
+@Data
+public class FormFieldHead {
+    private String columnVal;
+    private String columnName;
+    private String tableName;
+}

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

@@ -0,0 +1,28 @@
+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.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class FormTransColumn extends Model<FormTransColumn> {
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("tbl_name")
+    private String tblName;
+
+    @TableField("col_name")
+    private String colName;
+
+    @TableField("trans_type")
+    private Integer transType;
+}

+ 14 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/FormTransCondition.java

@@ -0,0 +1,14 @@
+package com.management.platform.entity;
+
+import lombok.Data;
+
+@Data
+public class FormTransCondition {
+    private String tblName;
+    private String tblAlias;
+    private String colName;
+    private String useVal;//模糊匹配的数据
+
+    /**1人名转义 2部门转义*/
+    private Integer transType;
+}

+ 3 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/CusTableColumnMapper.java

@@ -13,4 +13,7 @@ public interface CusTableColumnMapper extends BaseMapper<CusTableColumn> {
 
     @SelectProvider(type = CusTableColumnProvider.class,method = "getStructByTableName")
     List<CusTableColumn> getStructByTableName(String tableName);
+
+    @SelectProvider(type = CusTableColumnProvider.class,method = "getTableAliasByTableName")
+    String getTableAliasByTableName(String tableName);
 }

+ 7 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/FormTransColumnMapper.java

@@ -0,0 +1,7 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.FormTransColumn;
+
+public interface FormTransColumnMapper extends BaseMapper<FormTransColumn> {
+}

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

@@ -12,4 +12,14 @@ public class CusTableColumnProvider {
         ;
         return stringBuilder.toString();
     }
+
+    public String getTableAliasByTableName(String tableName){
+        StringBuilder stringBuilder = new StringBuilder();
+        stringBuilder
+                .append("SELECT TABLE_COMMENT FROM information_schema.`TABLES` WHERE TABLE_SCHEMA=(SELECT DATABASE()) AND TABLE_NAME = ")
+                .append("'")
+                .append(tableName).append("'")
+        ;
+        return stringBuilder.toString();
+    }
 }

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

@@ -37,4 +37,6 @@ public interface CusTableColumnService extends IService<CusTableColumn> {
     HttpRespMsg getResByFormJson(String formJson, HttpServletRequest request);
 
     HttpRespMsg getFormJsonByFormId(Integer formId, HttpServletRequest request);
+
+    HttpRespMsg exportCusReportForm(Integer formId, HttpServletRequest request);
 }

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

@@ -1,5 +1,6 @@
 package com.management.platform.service.impl;
 
+import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -9,17 +10,26 @@ import com.management.platform.entity.bo.FormStorePageBO;
 import com.management.platform.entity.vo.SysRichFunction;
 import com.management.platform.mapper.*;
 import com.management.platform.service.CusTableColumnService;
+import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.sql.DataSource;
+import java.io.FileOutputStream;
+import java.io.IOException;
 import java.sql.*;
 import java.util.Date;
 import java.util.*;
@@ -60,6 +70,15 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
     @Resource
     private CompanyMapper companyMapper;
 
+    @Resource
+    private FormTransColumnMapper formTransColumnMapper;
+
+    @Resource
+    private WxCorpInfoService wxCorpInfoService;
+
+    @Resource
+    private WxCorpInfoMapper wxCorpInfoMapper;
+
     @Autowired
     private DataSource dataSource;
 
@@ -67,6 +86,10 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
 
     public static final Pattern MAIN_TABLE_PATTERN = Pattern.compile(REGEX_MAIN_TABLE);
 
+    public static final String REGEX_JOIN_TABLE = "(?i)\\bleft join\\b\\s+([a-zA-Z_][a-zA-Z0-9_]*)\\s+(?:AS\\s+)?([a-zA-Z_][a-zA-Z0-9_]*)";
+
+    public static final Pattern JOIN_TABLE_PATTERN = Pattern.compile(REGEX_JOIN_TABLE);
+
     public static final String REGEX_DELETE_SIGN = "(?i)\\bdelete\\b";
 
     public static final Pattern DELETE_SGIN_PATTERN = Pattern.compile(REGEX_DELETE_SIGN);
@@ -79,6 +102,9 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
 
     public static final Pattern INSERT_SIGN_PATTERN = Pattern.compile(REGEX_INSERT_SIGN);
 
+    @Value(value = "${upload.path}")
+    private String path;
+
     @Override
     public HttpRespMsg getStructByTableName(String tableName, HttpServletRequest request) {
         HttpRespMsg msg = new HttpRespMsg();
@@ -88,16 +114,40 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
             msg.setError(MessageUtils.message("user.notExists"));
             return msg;
         }
-        BusObject busObject = busObjectMapper.selectOne(new LambdaQueryWrapper<BusObject>()
-                .eq(BusObject::getTblName, tableName)
-        );
-        if(null == busObject){
-            msg.setError("该表不存在");
-            return msg;
-        }
+//        BusObject busObject = busObjectMapper.selectOne(new LambdaQueryWrapper<BusObject>()
+//                .eq(BusObject::getTblName, tableName)
+//        );
+//        if(null == busObject){
+//            msg.setError("该表不存在");
+//            return msg;
+//        }
+        //直接读取表结构
+        String tableAlias = cusTableColumnMapper.getTableAliasByTableName(tableName);
+        BusObject busObject = new BusObject();
+        busObject.setTblName(tableName);
+        busObject.setName(tableAlias);
+
         Map<String,Object> resMap = new HashMap<>();
         resMap.put("busObject",busObject);
         List<CusTableColumn> columnList = cusTableColumnMapper.getStructByTableName(tableName);
+
+        //字段转义提示
+        if(1 == user.getUserNameNeedTranslate()){ //TODO user.getUserNameNeedTranslate()
+            List<FormTransColumn> formTransColumns = formTransColumnMapper.selectList(new LambdaQueryWrapper<FormTransColumn>()
+                    .eq(FormTransColumn::getTblName, tableName)
+            );
+            if(CollectionUtils.isNotEmpty(formTransColumns)){
+//                List<String> colList = formTransColumns.stream().map(FormTransColumn::getColName).collect(Collectors.toList());
+                Map<String, FormTransColumn> collect = formTransColumns.stream().collect(Collectors.toMap(FormTransColumn::getColName, t -> t));
+                for (CusTableColumn cusTableColumn : columnList) {
+                    FormTransColumn formTransColumn = collect.get(cusTableColumn.getColumnName());
+                    if(null != formTransColumn){
+                        cusTableColumn.setTransType(formTransColumn.getTransType());
+                    }
+                }
+            }
+        }
+
         resMap.put("columnList",columnList);
         msg.setData(resMap);
         return msg;
@@ -151,18 +201,34 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
                 List<CusReportForm> cusReportForms = cusReportFormMapper.selectList(new LambdaQueryWrapper<CusReportForm>()
                         .in(CusReportForm::getId, formIds)
                 );
+                Map<Integer, CusReportForm> reportFormMap = cusReportForms.stream().collect(Collectors.toMap(CusReportForm::getId,t->t));
                 List<ReportFormAccess> reportFormAccesses = reportFormAccessMapper.getAccessesByFormIds(user.getCompanyId(),formIds);
                 Map<Integer, List<ReportFormAccess>> accessGroupMap = reportFormAccesses.stream()
                         .collect(Collectors.groupingBy(ReportFormAccess::getRelateFormId));
-                for (CusReportForm cusReportForm : cusReportForms) {
-                    List<ReportFormAccess> accesses = accessGroupMap.get(cusReportForm.getId());
-                    if(CollectionUtils.isNotEmpty(accesses)){
-                        List<ReportFormAccess> userAccesses = accesses.stream().filter(t -> 1 == t.getAccessType()).collect(Collectors.toList());
-                        List<ReportFormAccess> deptAccesses = accesses.stream().filter(t -> 2 == t.getAccessType()).collect(Collectors.toList());
-                        cusReportForm.setUserAccessList(userAccesses);
-                        cusReportForm.setDeptAccessList(deptAccesses);
+                for (BusReportStore record : records) {
+                    if(null != record.getRelateFormId()){
+                        CusReportForm tmpForm = reportFormMap.get(record.getRelateFormId());
+                        if(null != tmpForm){
+                            record.setPrivilege(tmpForm.getPrivilege());
+                        }
+                        List<ReportFormAccess> accesses = accessGroupMap.get( record.getRelateFormId());
+                        if(CollectionUtils.isNotEmpty(accesses)){
+                            List<ReportFormAccess> userAccesses = accesses.stream().filter(t -> 1 == t.getAccessType()).collect(Collectors.toList());
+                            List<ReportFormAccess> deptAccesses = accesses.stream().filter(t -> 2 == t.getAccessType()).collect(Collectors.toList());
+                            record.setUserAccessList(userAccesses);
+                            record.setDeptAccessList(deptAccesses);
+                        }
                     }
                 }
+//                for (CusReportForm cusReportForm : cusReportForms) {
+//                    List<ReportFormAccess> accesses = accessGroupMap.get(cusReportForm.getId());
+//                    if(CollectionUtils.isNotEmpty(accesses)){
+//                        List<ReportFormAccess> userAccesses = accesses.stream().filter(t -> 1 == t.getAccessType()).collect(Collectors.toList());
+//                        List<ReportFormAccess> deptAccesses = accesses.stream().filter(t -> 2 == t.getAccessType()).collect(Collectors.toList());
+//                        cusReportForm.setUserAccessList(userAccesses);
+//                        cusReportForm.setDeptAccessList(deptAccesses);
+//                    }
+//                }
             }
             page.setRecords(records);
         }
@@ -184,17 +250,41 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
         }
 
         if(null == busReportStore.getId()){
+            Integer sameNameCheck = busReportStore.selectCount(new LambdaQueryWrapper<BusReportStore>()
+                    .eq(BusReportStore::getCompanyId, user.getCompanyId())
+                    .eq(BusReportStore::getStoreType, 1)
+                    .eq(BusReportStore::getStoreName, busReportStore.getStoreName())
+            );
+            if(null != sameNameCheck && 0 < sameNameCheck){
+                msg.setError("已存在同名文件夹");
+                return msg;
+            }
             BusReportStore lastStore = busReportStoreMapper.selectOne(new LambdaQueryWrapper<BusReportStore>()
                     .eq(BusReportStore::getCompanyId, user.getCompanyId())
                     .eq(BusReportStore::getParentStoreId, busReportStore.getParentStoreId())
                     .orderByDesc(BusReportStore::getOrderItem)
                     .last(" limit 1")
             );
-            busReportStore.setOrderItem(lastStore.getOrderItem()+1);
+            if(null == lastStore){
+                busReportStore.setOrderItem(1);
+            }else{
+                busReportStore.setOrderItem(lastStore.getOrderItem()+1);
+            }
             busReportStore.setCreateBy(user.getId());
             busReportStore.setCompanyId(user.getCompanyId());
             busReportStoreMapper.insert(busReportStore);
         }else{
+            Integer sameNameCheck = busReportStore.selectCount(new LambdaQueryWrapper<BusReportStore>()
+                    .eq(BusReportStore::getCompanyId, user.getCompanyId())
+                    .eq(BusReportStore::getStoreType, 1)
+                    .eq(BusReportStore::getStoreName, busReportStore.getStoreName())
+                    .ne(BusReportStore::getId,busReportStore.getId())
+            );
+            if(null != sameNameCheck && 0 < sameNameCheck){
+                msg.setError("已存在同名文件夹");
+                return msg;
+            }
+
             busReportStore.setUpdateBy(user.getId());
             busReportStore.setUpdateTime(new Date());
 
@@ -226,11 +316,82 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
             msg.setError("主业务表无法识别公司,请联系管理员");
             return msg;
         }
+//        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()) {
+//
+//                }
+//            }
+
             cusReportForm.setExecuteSql(s);
+
+            PreparedStatement preparedStatement = null;
+            ResultSet resultSet = null;
+            try (Connection connection = dataSource.getConnection()) {
+                preparedStatement = connection.prepareStatement(s);
+                resultSet = preparedStatement.executeQuery();
+            }catch (SQLException e) {
+                e.printStackTrace();
+                msg.setError("SQL语句有误,请联系管理员");
+                return msg;
+            }finally {
+                try {
+                    if (resultSet != null)
+                        resultSet.close();
+                    resultSet = null;
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+                try {
+                    if (preparedStatement != null)
+                        preparedStatement.close();
+                    preparedStatement = null;
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            }
+
             if(null == cusReportForm.getId()){
 
+                Integer sameNameCheck = cusReportFormMapper.selectCount(new LambdaQueryWrapper<CusReportForm>()
+                        .eq(CusReportForm::getCompanyId, user.getCompanyId())
+                        .eq(CusReportForm::getReportFormName, cusReportForm.getReportFormName())
+                );
+                if(null != sameNameCheck && 0 < sameNameCheck){
+                    msg.setError("已存在同名报表");
+                    return msg;
+                }
+
                 Company company = companyMapper.selectById(user.getCompanyId());
                 if(1 == company.getVersionControl()){
                     Integer count = busReportStoreMapper.selectCount(new LambdaQueryWrapper<BusReportStore>()
@@ -345,6 +506,15 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
                         .eq(BusReportStore::getRelateFormId, cusReportForm.getId())
                 );
                 if(null != busReportStore){
+                    Integer sameNameCheck = cusReportFormMapper.selectCount(new LambdaQueryWrapper<CusReportForm>()
+                            .eq(CusReportForm::getCompanyId, user.getCompanyId())
+                            .eq(CusReportForm::getReportFormName, cusReportForm.getReportFormName())
+                            .ne(CusReportForm::getId,cusReportForm.getId())
+                    );
+                    if(null != sameNameCheck && 0 < sameNameCheck){
+                        msg.setError("已存在同名报表");
+                        return msg;
+                    }
                     busReportStore.setStoreName(cusReportForm.getReportFormName());
                     busReportStore.setRelateFormId(cusReportForm.getId());
                     busReportStore.setUpdateBy(user.getId());
@@ -356,22 +526,45 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
                     cusReportFormMapper.updateById(cusReportForm);
 
                     List<ReportFormAccess> toAddList = new ArrayList<>();
-                    List<ReportFormAccess> deptAccessList = cusReportForm.getDeptAccessList();
-                    if(CollectionUtils.isNotEmpty(deptAccessList)){
-                        for (ReportFormAccess reportFormAccess : deptAccessList) {
+//                    List<ReportFormAccess> deptAccessList = cusReportForm.getDeptAccessList();
+//                    if(CollectionUtils.isNotEmpty(deptAccessList)){
+//                        for (ReportFormAccess reportFormAccess : deptAccessList) {
+//                            reportFormAccess.setRelateFormId(cusReportForm.getId());
+//                            reportFormAccess.setCompanyId(user.getCompanyId());
+//                            reportFormAccess.setAccessType(2);
+//                            toAddList.add(reportFormAccess);
+//                        }
+//                    }
+
+//                    List<ReportFormAccess> userAccessList = cusReportForm.getUserAccessList();
+//                    if(CollectionUtils.isNotEmpty(userAccessList)){
+//                        for (ReportFormAccess reportFormAccess : userAccessList) {
+//                            reportFormAccess.setRelateFormId(cusReportForm.getId());
+//                            reportFormAccess.setCompanyId(user.getCompanyId());
+//                            reportFormAccess.setAccessType(1);
+//                            toAddList.add(reportFormAccess);
+//                        }
+//                    }
+
+                    if(StringUtils.isNotBlank(cusReportForm.getDepartmentIds())){
+                        String[] departmentIds = cusReportForm.getDepartmentIds().split(",");
+                        for (String deptId: departmentIds) {
+                            ReportFormAccess reportFormAccess = new ReportFormAccess();
                             reportFormAccess.setRelateFormId(cusReportForm.getId());
                             reportFormAccess.setCompanyId(user.getCompanyId());
                             reportFormAccess.setAccessType(2);
+                            reportFormAccess.setDepartmentId(Integer.parseInt(deptId));
                             toAddList.add(reportFormAccess);
                         }
                     }
-
-                    List<ReportFormAccess> userAccessList = cusReportForm.getUserAccessList();
-                    if(CollectionUtils.isNotEmpty(userAccessList)){
-                        for (ReportFormAccess reportFormAccess : userAccessList) {
+                    if(StringUtils.isNotBlank(cusReportForm.getUserIds())){
+                        String[] userIds = cusReportForm.getUserIds().split(",");
+                        for (String userId: userIds) {
+                            ReportFormAccess reportFormAccess = new ReportFormAccess();
                             reportFormAccess.setRelateFormId(cusReportForm.getId());
                             reportFormAccess.setCompanyId(user.getCompanyId());
                             reportFormAccess.setAccessType(1);
+                            reportFormAccess.setUserId(userId);
                             toAddList.add(reportFormAccess);
                         }
                     }
@@ -466,7 +659,7 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
         try (Connection connection = dataSource.getConnection()) {
             PreparedStatement preparedStatement = connection.prepareStatement(tableColumnSql);
             ResultSet resultSet = preparedStatement.executeQuery();
-            columnList = this.convertList(resultSet);
+            columnList = this.convertListWithAlias(resultSet);
         }catch (SQLException e) {
             e.printStackTrace();
             msg.setError("SQL语句有误,请联系管理员");
@@ -536,7 +729,7 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
         try (Connection connection = dataSource.getConnection()) {
             PreparedStatement preparedStatement = connection.prepareStatement(formJson);
             ResultSet resultSet = preparedStatement.executeQuery();
-            columnList = this.convertList(resultSet);
+            columnList = this.convertListWithAlias(resultSet);
         }catch (SQLException e) {
             e.printStackTrace();
             msg.setError("SQL语句有误,请联系管理员");
@@ -557,6 +750,196 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
         return msg;
     }
 
+    @Override
+    public HttpRespMsg exportCusReportForm(Integer formId, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        CusReportForm cusReportForm = cusReportFormMapper.selectById(formId);
+        /**
+         * 获取表名和别名
+         *  1、获取主表和别名
+         *  2、若存在left join 获取从表和别名
+         * */
+        if(null == cusReportForm){
+            msg.setError("未找到该报表,请联系管理员");
+            return msg;
+        }
+
+        User user = userMapper.selectById(request.getHeader("token"));
+
+        List<FormTransColumn> columnList = formTransColumnMapper.selectList(new LambdaQueryWrapper<FormTransColumn>());
+        Map<String, List<FormTransColumn>> tblColumnMap = new HashMap<>();
+        if(CollectionUtils.isNotEmpty(columnList)){
+            tblColumnMap = columnList.stream()
+                    .collect(Collectors.groupingBy(FormTransColumn::getTblName));
+        }
+        List<Map<String, Object>> dataList = new ArrayList<>();
+        String tableColumnSql = cusReportForm.getExecuteSql();
+
+        List<FormFieldHead> formFieldHeads = JSONArray.parseArray(cusReportForm.getFormFieldHead(), FormFieldHead.class);
+
+        List<Map<String,String>> tableNameAliasList = new ArrayList<>();
+        Matcher mainMatcher = MAIN_TABLE_PATTERN.matcher(tableColumnSql);
+        if (mainMatcher.find()) {
+            Map<String,String> tableNameMap = new HashMap<>();
+            tableNameMap.put("tableName",mainMatcher.group(1));
+            tableNameMap.put("tableAlias",mainMatcher.group(2));
+            tableNameAliasList.add(tableNameMap);
+        } else {
+            msg.setError("主业务表无法识别公司,请联系管理员");
+            return msg;
+        }
+
+        Matcher joinMatcher = JOIN_TABLE_PATTERN.matcher(tableColumnSql);
+        while (joinMatcher.find()){
+            Map<String,String> tableNameMap = new HashMap<>();
+            tableNameMap.put("tableName",joinMatcher.group(1));
+            tableNameMap.put("tableAlias",joinMatcher.group(2));
+            tableNameAliasList.add(tableNameMap);
+        }
+
+
+        Map<String,List<String>> indexMap = new HashMap<>(2);
+        indexMap.put("userName",new ArrayList<>());
+        indexMap.put("deptName",new ArrayList<>());
+        for (Map<String, String> tableNameMap : tableNameAliasList) {
+            List<FormTransColumn> tmpColList = tblColumnMap.get(tableNameMap.get("tableName"));
+            String tableAlias = tableNameMap.get("tableAlias");
+            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(tableNameMap.get("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(tableNameMap.get("tableName"))
+                                        &&formFieldHeads.get(i).getColumnName().equals(formTransColumn.getColName())
+                                ){
+                                    List<String> tmpList = indexMap.get("deptName");
+                                    tmpList.add(formFieldHeads.get(i).getColumnVal());
+                                }
+                            }
+                        }
+                    }
+                }
+            }else{
+
+            }
+        }
+
+        try (Connection connection = dataSource.getConnection()) {
+            PreparedStatement preparedStatement = connection.prepareStatement(tableColumnSql);
+            ResultSet resultSet = preparedStatement.executeQuery();
+            dataList = convertListWithAlias(resultSet);
+        }catch (SQLException e) {
+            e.printStackTrace();
+            msg.setError("SQL语句有误,请联系管理员");
+            return msg;
+        }
+
+        if(CollectionUtils.isNotEmpty(dataList)){
+            // 创建工作簿和工作表
+            Workbook workbook = new XSSFWorkbook();
+            Sheet sheet = workbook.createSheet("Sheet01");
+
+            // 创建表头
+            Row headerRow = sheet.createRow(0);
+            int colNum = 0;
+            for (String key : dataList.get(0).keySet()) {
+                Cell cell = headerRow.createCell(colNum++);
+                cell.setCellValue(key);
+            }
+
+            // 填充数据
+            int rowNum = 1;
+            for (Map<String, Object> data : dataList) {
+                Row row = sheet.createRow(rowNum++);
+                colNum = 0;
+                for (String key : dataList.get(0).keySet()) {
+                    List<String> userNameIndexes = indexMap.get("userName");
+                    List<String> deptNameIndexes = indexMap.get("deptName");
+                    if(1 == user.getUserNameNeedTranslate()){
+                        Cell cell = row.createCell(colNum++);
+                        Object value = data.get(key);
+                        if (value == null) {
+                            cell.setCellValue(""); // 将null值替换为空格
+                        } else {
+                            String val = value.toString();
+                            if(CollectionUtils.isNotEmpty(userNameIndexes)){
+                                if(userNameIndexes.contains(key)){
+                                    List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>()
+                                            .eq(User::getName, val).last(" limit 1 ")
+                                    );
+                                    if(CollectionUtils.isNotEmpty(users)){
+                                        val = "$username="+users.get(0).getCorpwxUserid()+"$";
+                                    }
+
+                                }
+                            }
+
+                            if(CollectionUtils.isNotEmpty(deptNameIndexes)){
+                                if(deptNameIndexes.contains(key)){
+                                    List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>()
+                                            .eq(User::getName, val).last(" limit 1 ")
+                                    );
+                                    if(CollectionUtils.isNotEmpty(users)){
+                                        val = "$departmentName="+users.get(0).getCorpwxDeptid()+"$";
+                                    }
+                                }
+                            }
+                            cell.setCellValue(val);
+                        }
+
+                    }else{
+                        Cell cell = row.createCell(colNum++);
+                        Object value = data.get(key);
+                        if (value == null) {
+                            cell.setCellValue(""); // 将null值替换为空格
+                        } else {
+                            cell.setCellValue(value.toString());
+                        }
+                    }
+                }
+            }
+
+            // 自动调整列宽
+            for (int i = 0; i < dataList.get(0).size(); i++) {
+                sheet.autoSizeColumn(i);
+            }
+
+            //生成Excel文件
+            String fileUrlSuffix = cusReportForm.getReportFormName()+System.currentTimeMillis() + ".xlsx";
+            try (FileOutputStream fos = new FileOutputStream(path + fileUrlSuffix)){
+                workbook.write(fos);
+                msg.data = "/upload/" + fileUrlSuffix;
+            } catch (NullPointerException e) {
+                msg.setError(MessageUtils.message("access.verErrorOrDataLack"));
+                return msg;
+            } catch (IOException e) {
+                msg.setError(MessageUtils.message("file.generateError"));
+                return msg;
+            } finally {
+                try {
+                    workbook.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+        return msg;
+    }
+
     private List<BusReportStore> listToTree(List<BusReportStore> treeNodeList){
         if(null == treeNodeList){
             return null;
@@ -605,4 +988,32 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
         }
         return list;
     }
+
+
+    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;
+    }
+
 }