许鹏程
2023-06-30 b09803bb3baffb75a3b739924b29ba9ada481403
src/main/java/com/product/module/data/service/SystemDataUpLoadService.java
@@ -1,6 +1,9 @@
package com.product.module.data.service;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
@@ -21,7 +24,6 @@
import com.product.core.service.support.QueryFilterService;
import com.product.core.spring.context.SpringMVCContextHolder;
import com.product.core.transfer.Transactional;
import com.product.core.util.ReflectUtil;
import com.product.file.service.FileManagerService;
import com.product.module.data.config.CmnCode;
import com.product.module.data.config.CmnConst;
@@ -37,259 +39,263 @@
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.*;
@Service
public class SystemDataUpLoadService extends AbstractBaseService implements ISystemDataUpLoadService {
    @Autowired
    private BaseDao baseDao;
    @Autowired
    private FileManagerService fileManagerService;
    @Autowired
    private QueryFilterService queryFilterService;
   @Autowired
   private BaseDao baseDao;
   @Autowired
   private FileManagerService fileManagerService;
   @Autowired
   private QueryFilterService queryFilterService;
    @Autowired
    private PermissionService permissionService;
   @Autowired
   private PermissionService permissionService;
    public List<Map<String, Object>> getPrompt() throws BaseException {
        StringBuilder sql = new StringBuilder();
        sql.append(" select prompt_name `value` ,prompt_name `label` ,'prompt' type FROM product_sys_prompt ");
        sql.append(" union all ");
        sql.append(" select concat('《',dict_name,'》') dict_name,dict_name,'dict' type FROM product_sys_dict where is_used=1 group by dict_name ");
        FieldSetEntity f = new FieldSetEntity();
        f.setTableName("x");
        f.setValue("desc", "高级参照,普通参照");
        DataTableEntity dt = baseDao.listTable(sql.toString(), new Object[]{});
        List<Map<String, Object>> result = Lists.newArrayList();
        if (!BaseUtil.dataTableIsEmpty(dt)) {
            List<Map<String, Object>> promptList = Lists.newArrayList();
            List<Map<String, Object>> dictList = Lists.newArrayList();
            Map<String, Object> item;
            for (int i = 0; i < dt.getRows(); i++) {
                String type = dt.getString(i, "type");
                String value = dt.getString(i, "value");
                String label = dt.getString(i, "label");
                item = Maps.newHashMap();
                item.put("value", value);
                item.put("label", label);
                if ("prompt".equals(type)) {
                    promptList.add(item);
                } else {
                    dictList.add(item);
                }
            }
            item = Maps.newHashMap();
            item.put("label", "高级参照");
            item.put("children", promptList);
            item.put("value", "~高级参照~");
            result.add(item);
            item = Maps.newHashMap();
            item.put("label", "普通参照");
            item.put("children", dictList);
            item.put("value", "~普通参照~");
            result.add(item);
        }
        return result;
    }
   public List<Map<String, Object>> getPrompt() throws BaseException {
      StringBuilder sql = new StringBuilder();
      sql.append(" select prompt_name `value` ,prompt_name `label` ,'prompt' type FROM product_sys_prompt ");
      sql.append(" union all ");
      sql.append(" select concat('《',dict_name,'》') dict_name,dict_name,'dict' type FROM product_sys_dict where is_used=1 group by dict_name ");
      FieldSetEntity f = new FieldSetEntity();
      f.setTableName("x");
      f.setValue("desc", "高级参照,普通参照");
      DataTableEntity dt = baseDao.listTable(sql.toString(), new Object[]{});
      List<Map<String, Object>> result = Lists.newArrayList();
      if (!BaseUtil.dataTableIsEmpty(dt)) {
         List<Map<String, Object>> promptList = Lists.newArrayList();
         List<Map<String, Object>> dictList = Lists.newArrayList();
         Map<String, Object> item;
         for (int i = 0; i < dt.getRows(); i++) {
            String type = dt.getString(i, "type");
            String value = dt.getString(i, "value");
            String label = dt.getString(i, "label");
            item = Maps.newHashMap();
            item.put("value", value);
            item.put("label", label);
            if ("prompt".equals(type)) {
               promptList.add(item);
            } else {
               dictList.add(item);
            }
         }
         item = Maps.newHashMap();
         item.put("label", "高级参照");
         item.put("children", promptList);
         item.put("value", "~高级参照~");
         result.add(item);
         item = Maps.newHashMap();
         item.put("label", "普通参照");
         item.put("children", dictList);
         item.put("value", "~普通参照~");
         result.add(item);
      }
      return result;
   }
    /**
     * 模板上传
     *
     * @param rpe
     * @return
     */
    @Override
    @Transactional
    public JSONObject uploadTemplate(RequestParameterEntity rpe) {
        FieldSetEntity paramFse = rpe.getFormData();
        String sourceFileName = paramFse.getString(CmnConst.FIELD_TEMPLATE_INFO);
        if (StringUtils.isEmpty(sourceFileName) || !sourceFileName.endsWith(".xlsx")) {
            throw new BaseException(CmnCode.UPLOAD_TEMPLATE_NOT_ALLOWED_FORMAT.getValue(), CmnCode.UPLOAD_TEMPLATE_NOT_ALLOWED_FORMAT.getText());
        }
   /**
    * 模板上传
    *
    * @param rpe
    * @return
    */
   @Override
   @Transactional
   public JSONObject uploadTemplate(RequestParameterEntity rpe) {
      FieldSetEntity paramFse = rpe.getFormData();
      String sourceFileName = paramFse.getString(CmnConst.FIELD_TEMPLATE_INFO);
      if (StringUtils.isEmpty(sourceFileName) || !sourceFileName.endsWith(".xlsx")) {
         throw new BaseException(CmnCode.UPLOAD_TEMPLATE_NOT_ALLOWED_FORMAT.getValue(), CmnCode.UPLOAD_TEMPLATE_NOT_ALLOWED_FORMAT.getText());
      }
        FieldSetEntity fse = fileManagerService.uploadFile(rpe);
        JSONObject resultObj = new JSONObject();
        resultObj.put(CmnConst.FIELD_TEMPLATE_INFO, fse.getString(CmnConst.FIELD_TEMPLATE_INFO));
        return resultObj;
    }
      FieldSetEntity fse = fileManagerService.uploadFile(rpe);
      JSONObject resultObj = new JSONObject();
      resultObj.put(CmnConst.FIELD_TEMPLATE_INFO, fse.getString(CmnConst.FIELD_TEMPLATE_INFO));
      return resultObj;
   }
    /**
     * 解析模板,获取Excel表头信息
     *
     * @param fse
     * @return
     */
    public JSONObject analysisTemplate(FieldSetEntity fse) {
        String attachmentUUID = fse.getString(CmnConst.FIELD_TEMPLATE_INFO);
        DataTableEntity modelDte = null;
   /**
    * 解析模板,获取Excel表头信息
    *
    * @param fse
    * @return
    */
   public JSONObject analysisTemplate(FieldSetEntity fse) {
      String attachmentUUID = fse.getString(CmnConst.FIELD_TEMPLATE_INFO);
      DataTableEntity modelDte = null;
        String modelUUID = fse.getUUID();
        boolean needAnalysisFlag = true;
        if (!StringUtils.isEmpty(modelUUID)) {
            FieldSetEntity preModelFse = baseDao.getFieldSetEntity(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL, modelUUID, true);
            String preAttachmentUUID = preModelFse.getString(CmnConst.FIELD_TEMPLATE_INFO);
            modelDte = baseDao.listTable(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL, "upload_sign=?", new Object[]{preModelFse.getString(CmnConst.FIELD_UPLOAD_SIGN)}, null, null, Integer.MAX_VALUE, 1, true);
            if (preAttachmentUUID.equals(attachmentUUID)) {
                // 同样的文件,不需要重新解析
                needAnalysisFlag = false;
            }
        }
      String modelUUID = fse.getUUID();
      boolean needAnalysisFlag = true;
      if (!StringUtils.isEmpty(modelUUID)) {
         FieldSetEntity preModelFse = baseDao.getFieldSetEntity(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL, modelUUID, true);
         String preAttachmentUUID = preModelFse.getString(CmnConst.FIELD_TEMPLATE_INFO);
         modelDte = baseDao.listTable(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL, "upload_sign=?", new Object[]{preModelFse.getString(CmnConst.FIELD_UPLOAD_SIGN)}, null, null, Integer.MAX_VALUE, 1, true);
         if (preAttachmentUUID.equals(attachmentUUID)) {
            // 同样的文件,不需要重新解析
            needAnalysisFlag = false;
         }
      }
        FieldSetEntity attachmentFse = baseDao.getFieldSetEntity(CmnConst.TABLE_PRODUCT_SYS_ATTACHMENT, attachmentUUID, false);
        if (needAnalysisFlag) {
            // 需要重新解析
            String relativePath = attachmentFse.getString(CmnConst.FIELD_ATTACHMENT_URL);
            String templateName = attachmentFse.getString(CmnConst.FIELD_ATTACHMENT_TITLE);
            String path = Global.getSystemConfig("local.dir", "") + File.separator + relativePath + File.separator + templateName;
            File templateFile = new File(path);
            // 创建文件流操作对象
            try (InputStream inputStream = new FileInputStream(templateFile)) {
                Map<String, List<List<String>>> map = EasyExcelUtil.readExcelByStringFromInputStream(inputStream, null);
                DataTableEntity subDte;
                Map<String, FieldSetEntity> subMap;
                FieldSetEntity mainFse;
                FieldSetEntity subFse;
                List<List<String>> list;
                int index = 0;
                for (Map.Entry<String, List<List<String>>> entry : map.entrySet()) {
                    list = entry.getValue();
                    if (list.isEmpty()) {
                        continue;
                    }
                    subDte = new DataTableEntity();
                    mainFse = null;
                    for (String excelHeader : list.get(0)) {
                        if (StringUtils.isEmpty(excelHeader)) {
                            throw new BaseException(CmnCode.UPLOAD_TEMPLATE_EXISTS_EMPTY_COL.getValue(), CmnCode.UPLOAD_TEMPLATE_EXISTS_EMPTY_COL.getText());
                        }
                        subFse = null;
                        if (modelDte != null && modelDte.getRows() > index) {
                            mainFse = modelDte.getFieldSetEntity(index);
                            subMap = dte2Map(mainFse.getSubDataTable(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL_SUB), CmnConst.FIELD_EXCEL_HEADER);
                            if (subMap.containsKey(excelHeader)) {
                                // 原有的字段
                                subFse = subMap.get(excelHeader);
                            }
                        }
                        if (subFse == null) {
                            // 本身没有的字段
                            subFse = new FieldSetEntity();
                            subFse.setTableName(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL_SUB);
                            subFse.setValue(CmnConst.FIELD_EXCEL_HEADER, excelHeader);
                        }
                        subDte.addFieldSetEntity(subFse);
                    }
                    if (mainFse == null) {
                        mainFse = new FieldSetEntity();
                        mainFse.setTableName(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL);
                        if (modelDte == null) {
                            modelDte = new DataTableEntity();
                        }
                        modelDte.addFieldSetEntity(mainFse);
                    } else {
                        mainFse.removeSubData(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL_SUB);
                    }
                    mainFse.addSubDataTable(subDte);
                    index++;
                }
            } catch (Exception e) {
                e.printStackTrace();
                throw new BaseException(CmnCode.UPLOAD_TEMPLATE_GET_INFO_FAIL.getValue(), CmnCode.UPLOAD_TEMPLATE_GET_INFO_FAIL.getText());
            }
        }
      FieldSetEntity attachmentFse = baseDao.getFieldSetEntity(CmnConst.TABLE_PRODUCT_SYS_ATTACHMENT, attachmentUUID, false);
      if (needAnalysisFlag) {
         // 需要重新解析
         String relativePath = attachmentFse.getString(CmnConst.FIELD_ATTACHMENT_URL);
         String templateName = attachmentFse.getString(CmnConst.FIELD_ATTACHMENT_TITLE);
         String path = Global.getSystemConfig("local.dir", "") + File.separator + relativePath + File.separator + templateName;
         File templateFile = new File(path);
         // 创建文件流操作对象
         try (InputStream inputStream = new FileInputStream(templateFile)) {
            Map<String, List<List<String>>> map = EasyExcelUtil.readExcelByStringFromInputStream(inputStream, null);
            DataTableEntity subDte;
            Map<String, FieldSetEntity> subMap;
            FieldSetEntity mainFse;
            FieldSetEntity subFse;
            List<List<String>> list;
            int index = 0;
            for (Map.Entry<String, List<List<String>>> entry : map.entrySet()) {
               list = entry.getValue();
               if (list.isEmpty()) {
                  continue;
               }
               subDte = new DataTableEntity();
               mainFse = null;
               for (String excelHeader : list.get(list.size() - 1)) {
                  if (StringUtils.isEmpty(excelHeader)) {
                     throw new BaseException(CmnCode.UPLOAD_TEMPLATE_EXISTS_EMPTY_COL.getValue(), CmnCode.UPLOAD_TEMPLATE_EXISTS_EMPTY_COL.getText());
                  }
                  subFse = null;
                  if (modelDte != null && modelDte.getRows() > index) {
                     mainFse = modelDte.getFieldSetEntity(index);
                     subMap = dte2Map(mainFse.getSubDataTable(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL_SUB), CmnConst.FIELD_EXCEL_HEADER);
                     if (subMap.containsKey(excelHeader)) {
                        // 原有的字段
                        subFse = subMap.get(excelHeader);
                     }
                  }
                  if (subFse == null) {
                     // 本身没有的字段
                     subFse = new FieldSetEntity();
                     subFse.setTableName(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL_SUB);
                     subFse.setValue(CmnConst.FIELD_EXCEL_HEADER, excelHeader);
                  }
                  subDte.addFieldSetEntity(subFse);
               }
               if (mainFse == null) {
                  mainFse = new FieldSetEntity();
                  mainFse.setTableName(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL);
                  if (modelDte == null) {
                     modelDte = new DataTableEntity();
                  }
                  modelDte.addFieldSetEntity(mainFse);
               } else {
                  mainFse.removeSubData(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL_SUB);
               }
               mainFse.setValue("start_row_index", list.size() - 1);
               mainFse.addSubDataTable(subDte);
               index++;
            }
         } catch (Exception e) {
            e.printStackTrace();
            throw new BaseException(CmnCode.UPLOAD_TEMPLATE_GET_INFO_FAIL.getValue(), CmnCode.UPLOAD_TEMPLATE_GET_INFO_FAIL.getText());
         }
      }
        JSONObject resultObj = new JSONObject();
        resultObj.put("sheet_info", BaseUtil.dataTableEntityToJson(modelDte));
        resultObj.put(CmnConst.FIELD_UPLOAD_SIGN, SpringMVCContextHolder.getCurrentUser().getClient_uuid() + "_" + attachmentFse.getString(CmnConst.FIELD_ATTACHMENT_TITLE) + "_" + System.currentTimeMillis());
        return resultObj;
    }
      JSONObject resultObj = new JSONObject();
      resultObj.put("sheet_info", BaseUtil.dataTableEntityToJson(modelDte));
      resultObj.put(CmnConst.FIELD_UPLOAD_SIGN, SpringMVCContextHolder.getCurrentUser().getClient_uuid() + "_" + attachmentFse.getString(CmnConst.FIELD_ATTACHMENT_TITLE) + "_" + System.currentTimeMillis());
      return resultObj;
   }
    /**
     * 保存
     *
     * @param fse
     */
    @Override
    @Transactional
    public void saveTemplate(FieldSetEntity fse) {
        if (StringUtils.isEmpty(fse.getUUID())) {
            addTemplate(fse);
        } else {
            updateTemplate(fse);
        }
    }
   /**
    * 保存
    *
    * @param fse
    */
   @Override
   @Transactional
   public void saveTemplate(FieldSetEntity fse) {
      if (StringUtils.isEmpty(fse.getUUID())) {
         addTemplate(fse);
      } else {
         updateTemplate(fse);
      }
   }
    /**
     * 新增模板
     *
     * @param fse
     */
    private void addTemplate(FieldSetEntity fse) {
        SystemUser curUser = SpringMVCContextHolder.getCurrentUser();
        String orgLevelUUID = curUser.getOrg_level_uuid();
        String clientUUID = curUser.getClient_uuid();
        String attachmentUUID = fse.getString(CmnConst.FIELD_TEMPLATE_INFO);
        FieldSetEntity attachmentFse = baseDao.getFieldSetEntity(CmnConst.TABLE_PRODUCT_SYS_ATTACHMENT, attachmentUUID, false);
        String uploadSign = clientUUID + "_" + attachmentFse.getString(CmnConst.FIELD_ATTACHMENT_TITLE) + "_" + System.currentTimeMillis();
        int sheetOrder = 1;
        fse.setValue(CmnConst.FIELD_SHEET_ORDER, sheetOrder);
        fse.setValue(CmnConst.FIELD_UPLOAD_SIGN, uploadSign);
        // 保存数据导入模板信息
        DataTableEntity modelDte = fse.getSubDataTable(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL);
        if (!BaseUtil.dataTableIsEmpty(modelDte)) {
            FieldSetEntity tempFse;
            for (int i = 0; i < modelDte.getRows(); i++) {
                tempFse = modelDte.getFieldSetEntity(i);
                tempFse.setValue(CmnConst.FIELD_UPLOAD_SIGN, uploadSign);
                tempFse.setValue(CmnConst.FIELD_SHEET_ORDER, ++sheetOrder);
                BaseUtil.addOrgLeveLUUID(tempFse, Collections.singletonList(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL_SUB), orgLevelUUID, curUser);
                baseDao.saveFieldSetEntity(tempFse);
            }
            fse.removeSubData(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL);
        }
        BaseUtil.addOrgLeveLUUID(fse, Collections.singletonList(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL_SUB), orgLevelUUID, curUser);
        baseDao.saveFieldSetEntity(fse);
   /**
    * 新增模板
    *
    * @param fse
    */
   private void addTemplate(FieldSetEntity fse) {
      SystemUser curUser = SpringMVCContextHolder.getCurrentUser();
      String orgLevelUUID = curUser.getOrg_level_uuid();
      String clientUUID = curUser.getClient_uuid();
      String attachmentUUID = fse.getString(CmnConst.FIELD_TEMPLATE_INFO);
      FieldSetEntity attachmentFse = baseDao.getFieldSetEntity(CmnConst.TABLE_PRODUCT_SYS_ATTACHMENT, attachmentUUID, false);
      String uploadSign = clientUUID + "_" + attachmentFse.getString(CmnConst.FIELD_ATTACHMENT_TITLE) + "_" + System.currentTimeMillis();
      int sheetOrder = 1;
      fse.setValue(CmnConst.FIELD_SHEET_ORDER, sheetOrder);
      fse.setValue(CmnConst.FIELD_UPLOAD_SIGN, uploadSign);
      // 保存数据导入模板信息
      DataTableEntity modelDte = fse.getSubDataTable(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL);
      if (!BaseUtil.dataTableIsEmpty(modelDte)) {
         FieldSetEntity tempFse;
         for (int i = 0; i < modelDte.getRows(); i++) {
            tempFse = modelDte.getFieldSetEntity(i);
            tempFse.setValue(CmnConst.FIELD_UPLOAD_SIGN, uploadSign);
            tempFse.setValue(CmnConst.FIELD_SHEET_ORDER, ++sheetOrder);
            BaseUtil.addOrgLeveLUUID(tempFse, Collections.singletonList(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL_SUB), orgLevelUUID, curUser);
            baseDao.saveFieldSetEntity(tempFse);
         }
         fse.removeSubData(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL);
      }
      BaseUtil.addOrgLeveLUUID(fse, Collections.singletonList(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL_SUB), orgLevelUUID, curUser);
      baseDao.saveFieldSetEntity(fse);
        String mvcUUID = fse.getString(CmnConst.FIELD_FUNCTION_UUID);
        String buttonTitle = fse.getString(CmnConst.FILED_BUTTON_TITLE);
        // todo 待测试,创建mvc相关内容
        dealMvcInfo(mvcUUID, buttonTitle, uploadSign);
    }
      String mvcUUID = fse.getString(CmnConst.FIELD_FUNCTION_UUID);
      String buttonTitle = fse.getString(CmnConst.FILED_BUTTON_TITLE);
      // todo 待测试,创建mvc相关内容
      dealMvcInfo(mvcUUID, buttonTitle, uploadSign);
   }
    /**
     * 处理mvc中导入配置信息
     *
     * @param mvcUUID
     * @param buttonTitle
     */
    private void dealMvcInfo(String mvcUUID, String buttonTitle, String uploadSign) {
        FieldSetEntity firstPageFse = getFirstPageFse(mvcUUID);
        if (firstPageFse == null) {
            throw new BaseException(CmnCode.GET_MVC_FIRST_PAGE_INFO_FAIL.getValue(), CmnCode.GET_MVC_FIRST_PAGE_INFO_FAIL.getText());
        }
        FieldSetEntity preImportButtonFse = getImportButtonFse(firstPageFse, mvcUUID);
   /**
    * 处理mvc中导入配置信息
    *
    * @param mvcUUID
    * @param buttonTitle
    */
   private void dealMvcInfo(String mvcUUID, String buttonTitle, String uploadSign) {
      FieldSetEntity firstPageFse = getFirstPageFse(mvcUUID);
      if (firstPageFse == null) {
         throw new BaseException(CmnCode.GET_MVC_FIRST_PAGE_INFO_FAIL.getValue(), CmnCode.GET_MVC_FIRST_PAGE_INFO_FAIL.getText());
      }
      FieldSetEntity preImportButtonFse = getImportButtonFse(firstPageFse, mvcUUID);
        SystemUser curUser = SpringMVCContextHolder.getCurrentUser();
        if (preImportButtonFse == null) {
            // 本身没有导入按钮,自动创建 todo
      SystemUser curUser = SpringMVCContextHolder.getCurrentUser();
      if (preImportButtonFse == null) {
         // 本身没有导入按钮,自动创建 todo
            // 按钮
            FieldSetEntity importButtonFse = new FieldSetEntity();
            importButtonFse.setTableName(CmnConst.TABLE_PRODUCT_SYS_BUTTONS);
            importButtonFse.setValue(CmnConst.FILED_FUNCTION_UUID, mvcUUID);
            importButtonFse.setValue(CmnConst.FILED_BUTTON_NAME, "default_import");
            importButtonFse.setValue(CmnConst.FILED_BUTTON_TITLE, buttonTitle);
            importButtonFse.setValue(CmnConst.FILED_STATUS_UUID, 1);
            importButtonFse.setValue(CmnConst.FILED_CATEGORY_UUID, "import");
            importButtonFse.setValue(CmnConst.FILED_CLIENT_TYPE_UUID, "Web");
            importButtonFse.setValue(CmnConst.FILED_ROUTE_NAME, BaseUtil.getPageCode());
            importButtonFse.setValue("params", "{\"upload_sign\":\"" + uploadSign + "\"}");
            importButtonFse.setValue("button_category_uuid", "import");
            importButtonFse.setValue("button_type", 2);
            importButtonFse.setValue("is_main", 0);
            BaseUtil.createCreatorAndCreationTime(curUser, importButtonFse);
            baseDao.saveFieldSetEntity(importButtonFse);
         // 按钮
         FieldSetEntity importButtonFse = new FieldSetEntity();
         importButtonFse.setTableName(CmnConst.TABLE_PRODUCT_SYS_BUTTONS);
         importButtonFse.setValue(CmnConst.FILED_FUNCTION_UUID, mvcUUID);
         importButtonFse.setValue(CmnConst.FILED_BUTTON_NAME, "default_import");
         importButtonFse.setValue(CmnConst.FILED_BUTTON_TITLE, buttonTitle);
         importButtonFse.setValue(CmnConst.FILED_STATUS_UUID, 1);
         importButtonFse.setValue(CmnConst.FILED_CATEGORY_UUID, "import");
         importButtonFse.setValue(CmnConst.FILED_CLIENT_TYPE_UUID, "Web");
         importButtonFse.setValue(CmnConst.FILED_ROUTE_NAME, BaseUtil.getPageCode());
         importButtonFse.setValue("params", "{\"upload_sign\":\"" + uploadSign + "\"}");
         importButtonFse.setValue("button_category_uuid", "import");
         importButtonFse.setValue("button_type", 2);
         importButtonFse.setValue("is_main", 0);
         BaseUtil.createCreatorAndCreationTime(curUser, importButtonFse);
         baseDao.saveFieldSetEntity(importButtonFse);
//            // 页面
//            FieldSetEntity importPageFse = new FieldSetEntity();
@@ -301,17 +307,17 @@
//            BaseUtil.createCreatorAndCreationTime(curUser, importPageFse);
//            baseDao.saveFieldSetEntity(importPageFse);
            // 连线-列表界面-导入按钮
            FieldSetEntity importLinkFse1 = new FieldSetEntity();
            importLinkFse1.setTableName(CmnConst.TABLE_PRODUCT_SYS_MVC_LINK);
            importLinkFse1.setValue(CmnConst.FILED_FUNCTION_UUID, mvcUUID);
            importLinkFse1.setValue(CmnConst.FIELD_LINK_TYPE, 0);
            importLinkFse1.setValue(CmnConst.FIELD_LINE_FROM, firstPageFse.getUUID());
            importLinkFse1.setValue(CmnConst.FIELD_FROM_TYPE, 2);
            importLinkFse1.setValue(CmnConst.FIELD_LINE_TO, importButtonFse.getUUID());
            importLinkFse1.setValue(CmnConst.FIELD_TO_TYPE, 1);
            BaseUtil.createCreatorAndCreationTime(curUser, importLinkFse1);
            baseDao.saveFieldSetEntity(importLinkFse1);
         // 连线-列表界面-导入按钮
         FieldSetEntity importLinkFse1 = new FieldSetEntity();
         importLinkFse1.setTableName(CmnConst.TABLE_PRODUCT_SYS_MVC_LINK);
         importLinkFse1.setValue(CmnConst.FILED_FUNCTION_UUID, mvcUUID);
         importLinkFse1.setValue(CmnConst.FIELD_LINK_TYPE, 0);
         importLinkFse1.setValue(CmnConst.FIELD_LINE_FROM, firstPageFse.getUUID());
         importLinkFse1.setValue(CmnConst.FIELD_FROM_TYPE, 2);
         importLinkFse1.setValue(CmnConst.FIELD_LINE_TO, importButtonFse.getUUID());
         importLinkFse1.setValue(CmnConst.FIELD_TO_TYPE, 1);
         BaseUtil.createCreatorAndCreationTime(curUser, importLinkFse1);
         baseDao.saveFieldSetEntity(importLinkFse1);
//            // 连线-导入按钮-导入页面
//            FieldSetEntity importLinkFse2 = new FieldSetEntity();
//            importLinkFse2.setTableName(CmnConst.TABLE_PRODUCT_SYS_MVC_LINK);
@@ -323,507 +329,539 @@
//            importLinkFse2.setValue(CmnConst.FIELD_TO_TYPE, 2);
//            BaseUtil.createCreatorAndCreationTime(curUser, importLinkFse2);
//            baseDao.saveFieldSetEntity(importLinkFse2);
        } else {
            // 本身存在导入按钮,直接替换相应的数据 todo
            preImportButtonFse.setValue("", "");
            BaseUtil.updatedRegeneratorAndUpdateTime(curUser, preImportButtonFse);
            baseDao.saveFieldSetEntity(preImportButtonFse);
        }
    }
      } else {
         // 本身存在导入按钮,直接替换相应的数据 todo
         preImportButtonFse.setValue("", "");
         BaseUtil.updatedRegeneratorAndUpdateTime(curUser, preImportButtonFse);
         baseDao.saveFieldSetEntity(preImportButtonFse);
      }
   }
    /**
     * 提取指定mvc中【入口】后第一个页面
     *
     * @param mvcUUID
     * @return
     */
    private FieldSetEntity getFirstPageFse(String mvcUUID) {
        StringBuilder sql = new StringBuilder(256);
        sql.append("select p.* from (")
                .append("\n    select * FROM product_sys_function_buttons where is_main=1 and function_uuid=?")
                .append("\n) b")
                .append("\ninner join product_sys_link l on b.uuid=l.line_from")
                .append("\ninner join product_sys_mvc_page p on l.line_to=p.uuid");
        FieldSetEntity firstPageFse = baseDao.getFieldSetEntityBySQL(sql.toString(), new Object[]{mvcUUID}, false);
        return firstPageFse;
    }
   /**
    * 提取指定mvc中【入口】后第一个页面
    *
    * @param mvcUUID
    * @return
    */
   private FieldSetEntity getFirstPageFse(String mvcUUID) {
      StringBuilder sql = new StringBuilder(256);
      sql.append("select p.* from (")
            .append("\n    select * FROM product_sys_function_buttons where is_main=1 and function_uuid=?")
            .append("\n) b")
            .append("\ninner join product_sys_link l on b.uuid=l.line_from")
            .append("\ninner join product_sys_mvc_page p on l.line_to=p.uuid");
      FieldSetEntity firstPageFse = baseDao.getFieldSetEntityBySQL(sql.toString(), new Object[]{mvcUUID}, false);
      return firstPageFse;
   }
    /**
     * 入口后第一个页面之后的导入
     *
     * @param firstPageFse
     * @param mvcUUID
     * @return
     */
    private FieldSetEntity getImportButtonFse(FieldSetEntity firstPageFse, String mvcUUID) {
        StringBuilder sql = new StringBuilder(256);
        sql.append("select b.* from (")
                .append("\n    select * FROM product_sys_mvc_page where uuid=?")
                .append("\n) p")
                .append("\ninner join product_sys_link l on p.uuid=l.line_to")
                .append("\ninner join (")
                .append("\n    select * FROM product_sys_function_buttons where function_uuid=? and button_category_uuid='import'")
                .append("\n) b on l.line_from=b.uuid");
        FieldSetEntity preImportButtonFse = baseDao.getFieldSetEntityBySQL(sql.toString(), new Object[]{firstPageFse.getUUID(), mvcUUID}, false);
        return preImportButtonFse;
    }
   /**
    * 入口后第一个页面之后的导入
    *
    * @param firstPageFse
    * @param mvcUUID
    * @return
    */
   private FieldSetEntity getImportButtonFse(FieldSetEntity firstPageFse, String mvcUUID) {
      StringBuilder sql = new StringBuilder(256);
      sql.append("select b.* from (")
            .append("\n    select * FROM product_sys_mvc_page where uuid=?")
            .append("\n) p")
            .append("\ninner join product_sys_link l on p.uuid=l.line_to")
            .append("\ninner join (")
            .append("\n    select * FROM product_sys_function_buttons where function_uuid=? and button_category_uuid='import'")
            .append("\n) b on l.line_from=b.uuid");
      FieldSetEntity preImportButtonFse = baseDao.getFieldSetEntityBySQL(sql.toString(), new Object[]{firstPageFse.getUUID(), mvcUUID}, false);
      return preImportButtonFse;
   }
    /**
     * 修改模板
     *
     * @param fse
     */
    private void updateTemplate(FieldSetEntity fse) {
        SystemUser curUser = SpringMVCContextHolder.getCurrentUser();
   /**
    * 修改模板
    *
    * @param fse
    */
   private void updateTemplate(FieldSetEntity fse) {
      SystemUser curUser = SpringMVCContextHolder.getCurrentUser();
        // 保存数据导入模板信息
        DataTableEntity modelDte = fse.getSubDataTable(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL);
        if (!BaseUtil.dataTableIsEmpty(modelDte)) {
            FieldSetEntity tempFse;
            for (int i = 0; i < modelDte.getRows(); i++) {
                tempFse = modelDte.getFieldSetEntity(i);
                BaseUtil.updatedRegeneratorAndUpdateTime(curUser, tempFse);
                baseDao.saveFieldSetEntity(tempFse);
            }
        }
        fse.removeSubData(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL);
        BaseUtil.updatedRegeneratorAndUpdateTime(curUser, fse);
        baseDao.saveFieldSetEntity(fse);
    }
      // 保存数据导入模板信息
      DataTableEntity modelDte = fse.getSubDataTable(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL);
      if (!BaseUtil.dataTableIsEmpty(modelDte)) {
         FieldSetEntity tempFse;
         for (int i = 0; i < modelDte.getRows(); i++) {
            tempFse = modelDte.getFieldSetEntity(i);
            BaseUtil.updatedRegeneratorAndUpdateTime(curUser, tempFse);
            baseDao.saveFieldSetEntity(tempFse);
         }
      }
      fse.removeSubData(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL);
      BaseUtil.updatedRegeneratorAndUpdateTime(curUser, fse);
      baseDao.saveFieldSetEntity(fse);
   }
    /**
     * 查询模板配置详情
     *
     * @param fse
     * @return
     */
    public FieldSetEntity findTemplate(FieldSetEntity fse) {
        String uploadSign = fse.getString(CmnConst.FIELD_UPLOAD_SIGN);
        DataTableEntity dt = baseDao.listTable(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL, "upload_sign=?", new Object[]{uploadSign}, null, "sheet_order", Integer.MAX_VALUE, 1, true);
        if (!BaseUtil.dataTableIsEmpty(dt)) {
            FieldSetEntity fs = new FieldSetEntity();
            fs.setTableName(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL);
            DataTableEntity sub = new DataTableEntity();
            for (int i = 0; i < dt.getRows(); i++) {
                if (i == 0) {
                    fs.setValue(CmnConst.FIELD_TITLE, dt.getString(0, CmnConst.FIELD_TITLE));
                    fs.setValue(CmnConst.FIELD_FUNCTION_UUID, dt.getString(0, CmnConst.FIELD_FUNCTION_UUID));
                    fs.setValue(CmnConst.FILED_BUTTON_TITLE, dt.getString(0, CmnConst.FILED_BUTTON_TITLE));
                    fs.setValue(CmnConst.UUID, dt.getString(0, CmnConst.UUID));
                    fs.setValue(CmnConst.FIELD_UPLOAD_SIGN, dt.getString(0, CmnConst.FIELD_UPLOAD_SIGN));
                    fs.setValue(CmnConst.FIELD_TEMPLATE_INFO, dt.getString(0, CmnConst.FIELD_TEMPLATE_INFO));
                }
                String before_func = dt.getString(i, CmnConst.FIELD_BEFORE_FUNC);
                String after_func = dt.getString(i, CmnConst.FIELD_AFTER_FUNC);
                String table_name = dt.getString(i, CmnConst.TABLE_NAME);
                FieldSetEntity f = new FieldSetEntity();
                f.setTableName("sheet_info");
                f.setValue(CmnConst.FIELD_BEFORE_FUNC, before_func);
                f.setValue(CmnConst.FIELD_AFTER_FUNC, after_func);
                f.setValue(CmnConst.UUID, dt.getString(i, CmnConst.UUID));
                f.setValue(CmnConst.TABLE_NAME, table_name);
                f.setSubData(dt.getFieldSetEntity(i).getSubData());
                sub.addFieldSetEntity(f);
            }
            fs.addSubDataTable(sub);
            return fs;
        }
        return null;
    }
   /**
    * 查询模板配置详情
    *
    * @param fse
    * @return
    */
   public FieldSetEntity findTemplate(FieldSetEntity fse) {
      String uploadSign = fse.getString(CmnConst.FIELD_UPLOAD_SIGN);
      DataTableEntity dt = baseDao.listTable(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL, "upload_sign=?", new Object[]{uploadSign}, null, "sheet_order", Integer.MAX_VALUE, 1, true);
      if (!BaseUtil.dataTableIsEmpty(dt)) {
         FieldSetEntity fs = new FieldSetEntity();
         fs.setTableName(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL);
         DataTableEntity sub = new DataTableEntity();
         for (int i = 0; i < dt.getRows(); i++) {
            if (i == 0) {
               fs.setValue(CmnConst.FIELD_TITLE, dt.getString(0, CmnConst.FIELD_TITLE));
               fs.setValue(CmnConst.FIELD_FUNCTION_UUID, dt.getString(0, CmnConst.FIELD_FUNCTION_UUID));
               fs.setValue(CmnConst.FILED_BUTTON_TITLE, dt.getString(0, CmnConst.FILED_BUTTON_TITLE));
               fs.setValue(CmnConst.UUID, dt.getString(0, CmnConst.UUID));
               fs.setValue(CmnConst.FIELD_UPLOAD_SIGN, dt.getString(0, CmnConst.FIELD_UPLOAD_SIGN));
               fs.setValue(CmnConst.FIELD_TEMPLATE_INFO, dt.getString(0, CmnConst.FIELD_TEMPLATE_INFO));
            }
            String before_func = dt.getString(i, CmnConst.FIELD_BEFORE_FUNC);
            String after_func = dt.getString(i, CmnConst.FIELD_AFTER_FUNC);
            String table_name = dt.getString(i, CmnConst.TABLE_NAME);
            FieldSetEntity f = new FieldSetEntity();
            f.setTableName("sheet_info");
            f.setValue(CmnConst.FIELD_BEFORE_FUNC, before_func);
            f.setValue(CmnConst.FIELD_AFTER_FUNC, after_func);
            f.setValue(CmnConst.UUID, dt.getString(i, CmnConst.UUID));
            f.setValue(CmnConst.TABLE_NAME, table_name);
            f.setSubData(dt.getFieldSetEntity(i).getSubData());
            sub.addFieldSetEntity(f);
         }
         fs.addSubDataTable(sub);
         return fs;
      }
      return null;
   }
    /**
     * 模板台账-左边树结构
     *
     * @param fse
     * @return
     */
    public DataTableEntity listTemplate(FieldSetEntity fse) {
        int pageSize = fse.getInteger(CmnConst.PAGESIZE) == null ? Integer.MAX_VALUE : fse.getInteger(CmnConst.PAGESIZE);
        int curPage = fse.getInteger(CmnConst.CPAGE) == null ? 1 : fse.getInteger(CmnConst.CPAGE);
        SystemUser user = SpringMVCContextHolder.getCurrentUser();
        StringBuilder filter = new StringBuilder(128);
        filter.append("org_level_uuid=? and length(title)>0");
        String queryFilter = queryFilterService.getQueryFilter(fse);
        if (!StringUtils.isEmpty(queryFilter)) {
            filter.append(" and ").append(queryFilter);
        }
        List<Object> paramList = Lists.newArrayList();
        paramList.add(user.getOrg_level_uuid());
        String[] filterParamArr = !StringUtils.isEmpty(fse.getString("~select_params~")) ? fse.getString("~select_params~").split(",") : null;
        if (filterParamArr != null) {
            Collections.addAll(paramList, filterParamArr);
        }
        return baseDao.listTable(fse.getTableName(), filter.toString(), paramList.toArray(), null, fse.getString(""), pageSize, curPage);
    }
   /**
    * 模板台账-左边树结构
    *
    * @param fse
    * @return
    */
   public DataTableEntity listTemplate(FieldSetEntity fse) {
      int pageSize = fse.getInteger(CmnConst.PAGESIZE) == null ? Integer.MAX_VALUE : fse.getInteger(CmnConst.PAGESIZE);
      int curPage = fse.getInteger(CmnConst.CPAGE) == null ? 1 : fse.getInteger(CmnConst.CPAGE);
      SystemUser user = SpringMVCContextHolder.getCurrentUser();
      StringBuilder filter = new StringBuilder(128);
      filter.append("org_level_uuid=? and length(title)>0");
      String queryFilter = queryFilterService.getQueryFilter(fse);
      if (!StringUtils.isEmpty(queryFilter)) {
         filter.append(" and ").append(queryFilter);
      }
      List<Object> paramList = Lists.newArrayList();
      paramList.add(user.getOrg_level_uuid());
      String[] filterParamArr = !StringUtils.isEmpty(fse.getString("~select_params~")) ? fse.getString("~select_params~").split(",") : null;
      if (filterParamArr != null) {
         Collections.addAll(paramList, filterParamArr);
      }
      return baseDao.listTable(fse.getTableName(), filter.toString(), paramList.toArray(), null, fse.getString(""), pageSize, curPage);
   }
    /**
     * 数据上传模板删除
     *
     * @param fse
     * @throws BaseException
     */
    @Override
    @Transactional
    public void deleteModel(FieldSetEntity fse) throws BaseException {
        String uploadSign = fse.getString(CmnConst.FIELD_UPLOAD_SIGN);
        DataTableEntity modelDte = baseDao.listTable(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL, "upload_sign=?", new Object[]{uploadSign});
        if (BaseUtil.dataTableIsEmpty(modelDte)) {
            throw new BaseException(CmnCode.UPLOAD_TEMPLATE_DELETE_FAIL.getValue(), CmnCode.UPLOAD_TEMPLATE_DELETE_FAIL.getText());
        }
        FieldSetEntity mainModelFse = null;
        FieldSetEntity tempFse;
        List<String> uuidParamList = Lists.newArrayList();
        for (int i = 0; i < modelDte.getRows(); i++) {
            tempFse = modelDte.getFieldSetEntity(i);
            uuidParamList.add(tempFse.getUUID());
            if (!StringUtils.isEmpty(tempFse.getString(CmnConst.FIELD_FUNCTION_UUID))) {
                mainModelFse = tempFse;
            }
        }
        if (mainModelFse == null) {
            throw new BaseException(CmnCode.UPLOAD_TEMPLATE_GET_MAIN_INFO_FAIL.getValue(), CmnCode.UPLOAD_TEMPLATE_GET_MAIN_INFO_FAIL.getText());
        }
   /**
    * 数据上传模板删除
    *
    * @param fse
    * @throws BaseException
    */
   @Override
   @Transactional
   public void deleteModel(FieldSetEntity fse) throws BaseException {
      String uploadSign = fse.getString(CmnConst.FIELD_UPLOAD_SIGN);
      DataTableEntity modelDte = baseDao.listTable(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL, "upload_sign=?", new Object[]{uploadSign});
      if (BaseUtil.dataTableIsEmpty(modelDte)) {
         throw new BaseException(CmnCode.UPLOAD_TEMPLATE_DELETE_FAIL.getValue(), CmnCode.UPLOAD_TEMPLATE_DELETE_FAIL.getText());
      }
      FieldSetEntity mainModelFse = null;
      FieldSetEntity tempFse;
      List<String> uuidParamList = Lists.newArrayList();
      for (int i = 0; i < modelDte.getRows(); i++) {
         tempFse = modelDte.getFieldSetEntity(i);
         uuidParamList.add(tempFse.getUUID());
         if (!StringUtils.isEmpty(tempFse.getString(CmnConst.FIELD_FUNCTION_UUID))) {
            mainModelFse = tempFse;
         }
      }
      if (mainModelFse == null) {
         throw new BaseException(CmnCode.UPLOAD_TEMPLATE_GET_MAIN_INFO_FAIL.getValue(), CmnCode.UPLOAD_TEMPLATE_GET_MAIN_INFO_FAIL.getText());
      }
        // 删除mvc相关的表信息
        String mvcUUID = mainModelFse.getString(CmnConst.FIELD_FUNCTION_UUID);
        FieldSetEntity firstPageFse = getFirstPageFse(mvcUUID);
        // 导入按钮
        FieldSetEntity importButtonFse = baseDao.getFieldSetEntityByFilter(CmnConst.TABLE_PRODUCT_SYS_BUTTONS, "function_uuid=? and button_name='default_import'", new Object[]{mvcUUID}, false);
        if (importButtonFse != null) {
            // 连线-导入按钮-导入页面
      // 删除mvc相关的表信息
      String mvcUUID = mainModelFse.getString(CmnConst.FIELD_FUNCTION_UUID);
      FieldSetEntity firstPageFse = getFirstPageFse(mvcUUID);
      // 导入按钮
      FieldSetEntity importButtonFse = baseDao.getFieldSetEntityByFilter(CmnConst.TABLE_PRODUCT_SYS_BUTTONS, "function_uuid=? and button_name='default_import'", new Object[]{mvcUUID}, false);
      if (importButtonFse != null) {
         // 连线-导入按钮-导入页面
//            FieldSetEntity secondLinkFse = baseDao.getFieldSetEntityByFilter(CmnConst.TABLE_PRODUCT_SYS_MVC_LINK, "function_uuid=? and link_type=0 and from_type=1 and line_from=?", new Object[]{mvcUUID, importButtonFse.getUUID()}, false);
            // 删除-导入页面
         // 删除-导入页面
//            baseDao.delete(CmnConst.TABLE_PRODUCT_SYS_MVC_PAGE, new Object[]{secondLinkFse.getString(CmnConst.FIELD_LINE_TO)});
            // 删除-连线-导入按钮-导入页面
         // 删除-连线-导入按钮-导入页面
//            baseDao.delete(CmnConst.TABLE_PRODUCT_SYS_MVC_LINK, "function_uuid=? and link_type=0 and from_type=1 and line_from=?", new Object[]{mvcUUID, importButtonFse.getUUID()});
            // 删除-连线-列表界面-导入按钮
            baseDao.delete(CmnConst.TABLE_PRODUCT_SYS_MVC_LINK, "function_uuid=? and link_type=0 and from_type=2 and to_type=1 and line_from=? and line_to=?", new Object[]{mvcUUID, firstPageFse.getUUID(), importButtonFse.getUUID()});
            // 删除-导入按钮
            baseDao.delete(CmnConst.TABLE_PRODUCT_SYS_BUTTONS, new Object[]{importButtonFse.getUUID()});
         // 删除-连线-列表界面-导入按钮
         baseDao.delete(CmnConst.TABLE_PRODUCT_SYS_MVC_LINK, "function_uuid=? and link_type=0 and from_type=2 and to_type=1 and line_from=? and line_to=?", new Object[]{mvcUUID, firstPageFse.getUUID(), importButtonFse.getUUID()});
         // 删除-导入按钮
         baseDao.delete(CmnConst.TABLE_PRODUCT_SYS_BUTTONS, new Object[]{importButtonFse.getUUID()});
        }
        // 删除附件
        FieldSetEntity attachmentFse = baseDao.getFieldSetEntity(CmnConst.TABLE_PRODUCT_SYS_ATTACHMENT, mainModelFse.getString(CmnConst.FIELD_TEMPLATE_INFO), false);
        if (attachmentFse != null) {
            String relativePath = attachmentFse.getString(CmnConst.FIELD_ATTACHMENT_URL);
            String templateName = attachmentFse.getString(CmnConst.FIELD_ATTACHMENT_TITLE);
            String path = Global.getSystemConfig("local.dir", "") + File.separator + relativePath + File.separator + templateName;
            File templateFile = new File(path);
            templateFile.delete();
            // 删除附件表
            baseDao.delete(CmnConst.TABLE_PRODUCT_SYS_ATTACHMENT, new Object[]{attachmentFse.getUUID()});
        }
        // 删除模板子表
        String filter = BaseUtil.buildQuestionMarkFilter(CmnConst.FIELD_MODEL_UUID, uuidParamList.size(), true);
        baseDao.delete(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL_SUB, filter, uuidParamList.toArray());
        // 删除模板主表
        baseDao.delete(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL, uuidParamList.toArray());
    }
      }
      // 删除附件
      FieldSetEntity attachmentFse = baseDao.getFieldSetEntity(CmnConst.TABLE_PRODUCT_SYS_ATTACHMENT, mainModelFse.getString(CmnConst.FIELD_TEMPLATE_INFO), false);
      if (attachmentFse != null) {
         String relativePath = attachmentFse.getString(CmnConst.FIELD_ATTACHMENT_URL);
         String templateName = attachmentFse.getString(CmnConst.FIELD_ATTACHMENT_TITLE);
         String path = Global.getSystemConfig("local.dir", "") + File.separator + relativePath + File.separator + templateName;
         File templateFile = new File(path);
         templateFile.delete();
         // 删除附件表
         baseDao.delete(CmnConst.TABLE_PRODUCT_SYS_ATTACHMENT, new Object[]{attachmentFse.getUUID()});
      }
      // 删除模板子表
      String filter = BaseUtil.buildQuestionMarkFilter(CmnConst.FIELD_MODEL_UUID, uuidParamList.size(), true);
      baseDao.delete(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL_SUB, filter, uuidParamList.toArray());
      // 删除模板主表
      baseDao.delete(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL, uuidParamList.toArray());
   }
    /**
     * 模板下载
     *
     * @param fse
     * @param response
     * @throws IOException
     */
    public void downloadTemplate(FieldSetEntity fse, HttpServletResponse response) throws IOException {
        String upload_sign = fse.getString("upload_sign");
        FieldSetEntity templateFse = baseDao.getFieldSetEntityByFilter(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL, "upload_sign=? AND length(title)>0", new Object[]{upload_sign}, false);
        String attachmentUUID = templateFse.getString(CmnConst.FIELD_TEMPLATE_INFO);
        fse.setValue(CmnConst.UUID, attachmentUUID);
        fileManagerService.getFileContent(fse, response);
    }
   /**
    * 模板下载
    *
    * @param fse
    * @param response
    * @throws IOException
    */
   public void downloadTemplate(FieldSetEntity fse, HttpServletResponse response) throws IOException {
      String upload_sign = fse.getString("upload_sign");
      FieldSetEntity templateFse = baseDao.getFieldSetEntityByFilter(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL, "upload_sign=? AND length(title)>0", new Object[]{upload_sign}, false);
      String attachmentUUID = templateFse.getString(CmnConst.FIELD_TEMPLATE_INFO);
      fse.setValue(CmnConst.UUID, attachmentUUID);
      fileManagerService.getFileContent(fse, response);
   }
    /**
     * 业务功能导入-上传文件
     *
     * @param rpe
     * @return
     */
    @Override
    @Transactional
    public String recordDataImport(RequestParameterEntity rpe) {
        FieldSetEntity ff = fileManagerService.uploadFile(rpe);
        FieldSetEntity fse=rpe.getFormData();
        fse.setValue(CmnConst.FIELD_IS_SUCCESS, 0);
        SystemUser curUser = SpringMVCContextHolder.getCurrentUser();
        fse.setValue(CmnConst.FIELD_ORG_LEVEL_UUID, curUser.getOrg_level_uuid());
        BaseUtil.createCreatorAndCreationTime(curUser, fse);
        fse.setValue("import_info",ff.getString("import_info"));
        baseDao.saveFieldSetEntity(fse);
        return fse.getUUID();
    }
   /**
    * 业务功能导入-上传文件
    *
    * @param rpe
    * @return
    */
   @Override
   @Transactional
   public String recordDataImport(RequestParameterEntity rpe) {
      FieldSetEntity ff = fileManagerService.uploadFile(rpe);
      FieldSetEntity fse = rpe.getFormData();
      fse.setValue(CmnConst.FIELD_IS_SUCCESS, 0);
      SystemUser curUser = SpringMVCContextHolder.getCurrentUser();
      fse.setValue(CmnConst.FIELD_ORG_LEVEL_UUID, curUser.getOrg_level_uuid());
      BaseUtil.createCreatorAndCreationTime(curUser, fse);
      fse.setValue("import_info", ff.getString("import_info"));
      baseDao.saveFieldSetEntity(fse);
      return fse.getUUID();
   }
    /**
     * 业务功能导入-解析并保存到数据库
     *
     * @param fse
     * @return
     */
    @Override
    @Transactional
    public void recordDataSave(FieldSetEntity fse) {
        SystemUser curUser = SpringMVCContextHolder.getCurrentUser();
   /**
    * 业务功能导入-解析并保存到数据库
    *
    * @param fse
    * @return
    */
   @Override
   @Transactional
   public void recordDataSave(FieldSetEntity fse) {
      SystemUser curUser = SpringMVCContextHolder.getCurrentUser();
        FieldSetEntity logFse = baseDao.getFieldSetEntity(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_RECORD, fse.getUUID(), false);
        if (logFse == null) {
            throw new BaseException(CmnCode.UPLOAD_TEMPLATE_GET_UPLOAD_RECORD_FAIL.getValue(), CmnCode.UPLOAD_TEMPLATE_GET_UPLOAD_RECORD_FAIL.getText());
        }
      FieldSetEntity logFse = baseDao.getFieldSetEntity(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_RECORD, fse.getUUID(), false);
      if (logFse == null) {
         throw new BaseException(CmnCode.UPLOAD_TEMPLATE_GET_UPLOAD_RECORD_FAIL.getValue(), CmnCode.UPLOAD_TEMPLATE_GET_UPLOAD_RECORD_FAIL.getText());
      }
        // 获取模板信息
        DataTableEntity templateDte = baseDao.listTable(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL, "upload_sign=?", new Object[]{logFse.getString(CmnConst.FIELD_UPLOAD_SIGN)}, null, "sheet_order", Integer.MAX_VALUE, 1, true);
      // 获取模板信息
      DataTableEntity templateDte = baseDao.listTable(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL, "upload_sign=?", new Object[]{logFse.getString(CmnConst.FIELD_UPLOAD_SIGN)}, null, "sheet_order", Integer.MAX_VALUE, 1, true);
        // 获取导入文件信息
        FieldSetEntity attachmentFse = baseDao.getFieldSetEntity(CmnConst.TABLE_PRODUCT_SYS_ATTACHMENT, logFse.getString(CmnConst.FIELD_IMPORT_INFO), false);
        String relativePath = attachmentFse.getString(CmnConst.FIELD_ATTACHMENT_URL);
        String templateName = attachmentFse.getString(CmnConst.FIELD_ATTACHMENT_TITLE);
        Map<String, List<List<String>>>  dataMap= new HashMap<>();
        try{
            String filePath = Global.getSystemConfig("local.dir", "") + File.separator + relativePath + File.separator + templateName;
              dataMap = EasyExcelUtil.readExcelByString(filePath);
        }catch (Exception e){
            e.printStackTrace();
        }
        // 封装到dte中
        List<DataTableEntity> beforeSaveDataList = Lists.newArrayList();
        List<String> titleList;
        List<List<String>> dataList;
        List<String> rowList;
        String singleValue;// 单元格内的值
        int index = 0;
        FieldSetEntity curTemplateFse;
        Map<String, FieldSetEntity> curSubMap;
        List<Map<String, FieldSetEntity>> fieldInfoList = Lists.newArrayList();
        FieldSetEntity curFieldFse;
        FieldSetEntity recordFse;// 业务表fse
        DataTableEntity recordDte;// 业务表dte
        for (Map.Entry<String, List<List<String>>> entry : dataMap.entrySet()) {
            dataList = entry.getValue();
            if (dataList.isEmpty()) {
                continue;
            }
      // 获取导入文件信息
      FieldSetEntity attachmentFse = baseDao.getFieldSetEntity(CmnConst.TABLE_PRODUCT_SYS_ATTACHMENT, logFse.getString(CmnConst.FIELD_IMPORT_INFO), false);
      String relativePath = attachmentFse.getString(CmnConst.FIELD_ATTACHMENT_URL);
      String templateName = attachmentFse.getString(CmnConst.FIELD_ATTACHMENT_TITLE);
      Map<String, List<List<String>>> dataMap = new HashMap<>();
      try {
         String filePath = Global.getSystemConfig("local.dir", "") + File.separator + relativePath + File.separator + templateName;
         dataMap = EasyExcelUtil.readExcelByString(filePath);
      } catch (Exception e) {
         e.printStackTrace();
      }
      // 封装到dte中
      List<DataTableEntity> beforeSaveDataList = Lists.newArrayList();
      List<String> titleList;
      List<List<String>> dataList;
      List<String> rowList;
      String singleValue;// 单元格内的值
      int index = 0;
      FieldSetEntity curTemplateFse;
      Map<String, FieldSetEntity> curSubMap;
      List<List<List<String>>> headerDataList = Lists.newArrayList();
      List<Map<String, FieldSetEntity>> fieldInfoList = Lists.newArrayList();
      FieldSetEntity curFieldFse;
      FieldSetEntity recordFse;// 业务表fse
      DataTableEntity recordDte;// 业务表dte
      for (Map.Entry<String, List<List<String>>> entry : dataMap.entrySet()) {
         dataList = entry.getValue();
         if (dataList.isEmpty()) {
            continue;
         }
            recordDte = new DataTableEntity();
            curTemplateFse = templateDte.getFieldSetEntity(index);
            curSubMap = dte2Map(curTemplateFse.getSubDataTable(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL_SUB), CmnConst.FIELD_EXCEL_HEADER);
            fieldInfoList.add(curSubMap);
            titleList = dataList.get(0);
            // 字段对应的excel 表头索引
            Map<String, String> fieldIndex = Maps.newHashMap();
            for (int i = 1; i < dataList.size(); i++) {
                rowList = dataList.get(i);
                recordFse = new FieldSetEntity();
                recordFse.setTableName(curTemplateFse.getString(CmnConst.FIELD_TABLE_NAME));
                //字段对应的列
                int j = 0;
                for (; j < titleList.size(); j++) {
                    if (rowList.size() < (j + 1)) {
                        singleValue = null;
                    } else {
                        singleValue = rowList.get(j);
                    }
                    curFieldFse = curSubMap.get(titleList.get(j));
                    recordFse.setValue(curFieldFse.getString(CmnConst.FIELD_FIELD_NAME), singleValue);
                    if (i == 1 || rowList.size() > fieldIndex.size()) {
                        fieldIndex.put(curFieldFse.getString(CmnConst.FIELD_FIELD_NAME), String.valueOf(j));
                    }
                }
                recordFse.setValue("~colName~", titleList);
                recordFse.setValue("~fieldIndex~", fieldIndex);
                // fieldSet 对应的行
                recordFse.setValue("~row~", i);
                recordDte.addFieldSetEntity(recordFse);
            }
            beforeSaveDataList.add(recordDte);
            index++;
        }
         recordDte = new DataTableEntity();
         curTemplateFse = templateDte.getFieldSetEntity(index);
         curSubMap = dte2Map(curTemplateFse.getSubDataTable(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL_SUB), CmnConst.FIELD_EXCEL_HEADER);
         fieldInfoList.add(curSubMap);
         // 字段对应的excel 表头索引
         Map<String, String> fieldIndex = Maps.newHashMap();
         //表头开始行 cheng update 2023年6月30日15:48:22 多行头时,表头开始行不一定是第一行
         int startRowIndex = 1;
         if (!StringUtils.isEmpty(curTemplateFse.getString("start_row_index")) && NumberUtil.isNumber(curTemplateFse.getString("start_row_index"))) {
            startRowIndex = Integer.parseInt(curTemplateFse.getString("start_row_index")) + 1;
            if (startRowIndex < 1) {
               startRowIndex = 1;
            }
         }
        // 数据解析保存
        String orgLevelUUID = curUser.getOrg_level_uuid();
        String actualValue;
        FieldMetaEntity meta;
        Object[] fieldArr;
        DataTableEntity tempDte;
        String fieldName;
        for (int i = 0; i < beforeSaveDataList.size(); i++) {
            tempDte = beforeSaveDataList.get(i);
         titleList = dataList.get(startRowIndex);
         if (startRowIndex > 0) {
            headerDataList.add(dataList.subList(0, startRowIndex));
         } else {
            headerDataList.add(new ArrayList<>());
         }
         for (int i = startRowIndex; i < dataList.size(); i++) {
            rowList = dataList.get(i);
            recordFse = new FieldSetEntity();
            recordFse.setTableName(curTemplateFse.getString(CmnConst.FIELD_TABLE_NAME));
            //字段对应的列
            int j = 0;
            for (; j < titleList.size(); j++) {
               if (rowList.size() < (j + 1)) {
                  singleValue = null;
               } else {
                  singleValue = rowList.get(j);
               }
               curFieldFse = curSubMap.get(titleList.get(j));
               recordFse.setValue(curFieldFse.getString(CmnConst.FIELD_FIELD_NAME), singleValue);
               if (i == 1 || rowList.size() > fieldIndex.size()) {
                  fieldIndex.put(curFieldFse.getString(CmnConst.FIELD_FIELD_NAME), String.valueOf(j));
               }
            }
            recordFse.setValue("~colName~", titleList);
            recordFse.setValue("~fieldIndex~", fieldIndex);
            // fieldSet 对应的行
            recordFse.setValue("~row~", i);
            recordDte.addFieldSetEntity(recordFse);
         }
         beforeSaveDataList.add(recordDte);
         index++;
      }
            // 保存前处理
            try {
                tempDte = spDeal(templateDte.getFieldSetEntity(i).getString(CmnConst.FIELD_BEFORE_FUNC), tempDte);
                if (BaseUtil.dataTableIsEmpty(tempDte)) {
                    throw new BaseException(CmnCode.UPLOAD_TEMPLATE_BEFORE_FUNC_EXEC_NO_DATA.getValue(), CmnCode.UPLOAD_TEMPLATE_BEFORE_FUNC_EXEC_NO_DATA.getText());
                }
            } catch (BaseException e) {
                throw e;
            } catch (Exception e) {
                e.printStackTrace();
                throw new BaseException(CmnCode.UPLOAD_TEMPLATE_BEFORE_FUNC_EXEC_FAIL.getValue(), CmnCode.UPLOAD_TEMPLATE_BEFORE_FUNC_EXEC_FAIL.getText());
            }
      // 数据解析保存
      String orgLevelUUID = curUser.getOrg_level_uuid();
      String actualValue;
      FieldMetaEntity meta;
      Object[] fieldArr;
      DataTableEntity tempDte;
      String fieldName;
      for (int i = 0; i < beforeSaveDataList.size(); i++) {
         tempDte = beforeSaveDataList.get(i);
            meta = tempDte.getMeta();
            fieldArr = meta.getFields();
         // 保存前处理
         try {
            tempDte = spDeal(templateDte.getFieldSetEntity(i).getString(CmnConst.FIELD_BEFORE_FUNC), tempDte, headerDataList.get(i));
            if (BaseUtil.dataTableIsEmpty(tempDte)) {
               throw new BaseException(CmnCode.UPLOAD_TEMPLATE_BEFORE_FUNC_EXEC_NO_DATA.getValue(), CmnCode.UPLOAD_TEMPLATE_BEFORE_FUNC_EXEC_NO_DATA.getText());
            }
         } catch (BaseException e) {
            throw e;
         } catch (Exception e) {
            e.printStackTrace();
            throw new BaseException(CmnCode.UPLOAD_TEMPLATE_BEFORE_FUNC_EXEC_FAIL.getValue(), CmnCode.UPLOAD_TEMPLATE_BEFORE_FUNC_EXEC_FAIL.getText());
         }
            curTemplateFse = templateDte.getFieldSetEntity(i);
            curSubMap = dte2Map(curTemplateFse.getSubDataTable(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL_SUB), CmnConst.FIELD_FIELD_NAME);
            boolean isMultiFlag;
            StringBuilder errorMsg = new StringBuilder(8);
            for (int j = 0; j < tempDte.getRows(); j++) {
                recordFse = tempDte.getFieldSetEntity(j);
                for (Object fieldNameObj : fieldArr) {
                    if (fieldNameObj == null) {
                        continue;
                    }
                    fieldName = fieldNameObj.toString();
                    singleValue = recordFse.getString(fieldName);
         meta = tempDte.getMeta();
         fieldArr = meta.getFields();
                    curFieldFse = curSubMap.get(fieldName);
                    if (curFieldFse != null) {
                        // 提取真实值
                        if (!StringUtils.isEmpty(curFieldFse.getString(CmnConst.FIELD_PROMPT_NAME))) {
                            isMultiFlag = curFieldFse.getString(CmnConst.FIELD_IS_MULTI) == null ? false : "1".equals(curFieldFse.getString(CmnConst.FIELD_IS_MULTI));
                            // 根据参照名称,参照类型,显示域的值,获取隐藏域的值
                            actualValue = getRealValue(curFieldFse.getString(CmnConst.FIELD_PROMPT_NAME), singleValue, isMultiFlag);
                        } else {
                            actualValue = singleValue;
                        }
                        recordFse.setValue(curFieldFse.getString(CmnConst.FIELD_FIELD_NAME), actualValue);
                    }
                }
                try {
                    BaseUtil.createCreatorAndCreationTime(curUser, recordFse);
                    baseDao.saveFieldSetEntity(recordFse);
                } catch (BaseException e) {
                    e.printStackTrace();
         curTemplateFse = templateDte.getFieldSetEntity(i);
         curSubMap = dte2Map(curTemplateFse.getSubDataTable(CmnConst.TABLE_PRODUCT_SYS_DATA_UPLOAD_MODEL_SUB), CmnConst.FIELD_FIELD_NAME);
         boolean isMultiFlag;
         StringBuilder errorMsg = new StringBuilder(8);
         for (int j = 0; j < tempDte.getRows(); j++) {
            recordFse = tempDte.getFieldSetEntity(j);
            for (Object fieldNameObj : fieldArr) {
               if (fieldNameObj == null) {
                  continue;
               }
               fieldName = fieldNameObj.toString();
               singleValue = recordFse.getString(fieldName);
               curFieldFse = curSubMap.get(fieldName);
               if (curFieldFse != null) {
                  // 提取真实值
                  if (!StringUtils.isEmpty(curFieldFse.getString(CmnConst.FIELD_PROMPT_NAME))) {
                     isMultiFlag = curFieldFse.getString(CmnConst.FIELD_IS_MULTI) == null ? false : "1".equals(curFieldFse.getString(CmnConst.FIELD_IS_MULTI));
                     // 根据参照名称,参照类型,显示域的值,获取隐藏域的值
                     actualValue = getRealValue(curFieldFse.getString(CmnConst.FIELD_PROMPT_NAME), singleValue, isMultiFlag);
                  } else {
                     actualValue = singleValue;
                  }
                  recordFse.setValue(curFieldFse.getString(CmnConst.FIELD_FIELD_NAME), actualValue);
               }
            }
            try {
               BaseUtil.createCreatorAndCreationTime(curUser, recordFse);
               baseDao.saveFieldSetEntity(recordFse);
            } catch (BaseException e) {
               e.printStackTrace();
//                    errorMsg.append("导入数据错误:\n\t");
                    errorMsg.append(String.format("第%s个sheet,第%s行,%s", i + 1, j + 1, e.getMessageInfo() != null ? e.getMessageInfo() : "")).append("\n");
               errorMsg.append(String.format("第%s个sheet,第%s行,%s", i + 1, j + 1, e.getMessageInfo() != null ? e.getMessageInfo() : "")).append("\n");
//                    throw new BaseException(CmnCode.UPLOAD_TEMPLATE_IMPORT_DATA_FAIL.getValue(), String.format("%s: 第%s个sheet,第%s行", CmnCode.UPLOAD_TEMPLATE_IMPORT_DATA_FAIL.getText(), i + 1, j + 1), e);
                } catch (Exception e) {
                    errorMsg.append(String.format("第%s个sheet,第%s行,%s", i + 1, j + 1, e.getMessage() != null ? e.getMessage() : "")).append("\n");
            } catch (Exception e) {
               errorMsg.append(String.format("第%s个sheet,第%s行,%s", i + 1, j + 1, e.getMessage() != null ? e.getMessage() : "")).append("\n");
//                    throw new BaseException(CmnCode.UPLOAD_TEMPLATE_IMPORT_DATA_FAIL.getValue(), String.format("%s: 第%s个sheet,第%s行", CmnCode.UPLOAD_TEMPLATE_IMPORT_DATA_FAIL.getText(), i + 1, j + 1));
                }
            }
            if (errorMsg.length() > 0) {
                throw new BaseException(CmnCode.UPLOAD_TEMPLATE_IMPORT_DATA_FAIL.getValue(), errorMsg.toString());
            }
            }
         }
         if (errorMsg.length() > 0) {
            throw new BaseException(CmnCode.UPLOAD_TEMPLATE_IMPORT_DATA_FAIL.getValue(), errorMsg.toString());
         }
            // 保存后处理
            try {
                spDeal(templateDte.getFieldSetEntity(i).getString(CmnConst.FIELD_AFTER_FUNC), tempDte);
            } catch (BaseException e) {
                SpringMVCContextHolder.getSystemLogger().error(e);
            } catch (Exception e) {
                throw new BaseException(CmnCode.UPLOAD_TEMPLATE_AFTER_FUNC_EXEC_FAIL.getValue(), CmnCode.UPLOAD_TEMPLATE_AFTER_FUNC_EXEC_FAIL.getText());
            }
        }
         // 保存后处理
         try {
            spDeal(templateDte.getFieldSetEntity(i).getString(CmnConst.FIELD_AFTER_FUNC), tempDte, headerDataList.get(i));
         } catch (BaseException e) {
            SpringMVCContextHolder.getSystemLogger().error(e);
         } catch (Exception e) {
            throw new BaseException(CmnCode.UPLOAD_TEMPLATE_AFTER_FUNC_EXEC_FAIL.getValue(), CmnCode.UPLOAD_TEMPLATE_AFTER_FUNC_EXEC_FAIL.getText());
         }
      }
        // 更新记录表情况
        logFse.setValue(CmnConst.FIELD_IS_SUCCESS, 1);
        BaseUtil.updatedRegeneratorAndUpdateTime(curUser, fse);
        baseDao.saveFieldSetEntity(logFse);
    }
      // 更新记录表情况
      logFse.setValue(CmnConst.FIELD_IS_SUCCESS, 1);
      BaseUtil.updatedRegeneratorAndUpdateTime(curUser, fse);
      baseDao.saveFieldSetEntity(logFse);
   }
    /**
     * dte按照指定fse中的值作为key转换为map
     *
     * @param dte
     * @param keyFieldName
     * @return
     */
    private Map<String, FieldSetEntity> dte2Map(DataTableEntity dte, String keyFieldName) {
        Map<String, FieldSetEntity> resultMap = Maps.newHashMap();
        FieldSetEntity tempFse;
        for (int i = 0; i < dte.getRows(); i++) {
            tempFse = dte.getFieldSetEntity(i);
            resultMap.put(tempFse.getString(keyFieldName), tempFse);
        }
        return resultMap;
    }
   /**
    * dte按照指定fse中的值作为key转换为map
    *
    * @param dte
    * @param keyFieldName
    * @return
    */
   private Map<String, FieldSetEntity> dte2Map(DataTableEntity dte, String keyFieldName) {
      Map<String, FieldSetEntity> resultMap = Maps.newHashMap();
      FieldSetEntity tempFse;
      for (int i = 0; i < dte.getRows(); i++) {
         tempFse = dte.getFieldSetEntity(i);
         resultMap.put(tempFse.getString(keyFieldName), tempFse);
      }
      return resultMap;
   }
    /**
     * 事件前或者事件后调用逻辑方法的特殊处理
     *
     * @param functionContent
     * @param dte
     */
    private DataTableEntity spDeal(String functionContent, DataTableEntity dte) throws BaseException {
        if (functionContent == null) {
            return dte;
        }
        functionContent = functionContent.trim();
        if (StringUtils.isEmpty(functionContent)) {
            return dte;
        }
        String className = functionContent.substring(0, functionContent.indexOf("."));
        String methodName = functionContent.substring(functionContent.indexOf(".") + 1, functionContent.indexOf("("));
        Object resultObj = ReflectUtil.invoke(className, methodName, new Object[]{dte});
        return (DataTableEntity) resultObj;
    }
   /**
    * 事件前或者事件后调用逻辑方法的特殊处理
    *
    * @param functionContent
    * @param dte
    * @param headerDataList
    * @return
    */
   private DataTableEntity spDeal(String functionContent, DataTableEntity dte, List<List<String>> headerDataList) throws BaseException {
      if (functionContent == null) {
         return dte;
      }
      functionContent = functionContent.trim();
      if (StringUtils.isEmpty(functionContent)) {
         return dte;
      }
      String className = functionContent.substring(0, functionContent.indexOf("."));
      String methodName = functionContent.substring(functionContent.indexOf(".") + 1, functionContent.indexOf("("));
      //根据className获取类
      Object bean = SpringUtil.getBean(className);
      //使用huTool的反射工具类获取方法,方法的参数类型为DataTableEntity、List<List<String>>
      Method method = ReflectUtil.getMethod(bean.getClass(), methodName, DataTableEntity.class, List.class);
      if (method != null) {
         //判断method返回值为DataTableEntity
         boolean isBackDataTable = !method.getReturnType().equals(DataTableEntity.class);
         //判断第二个参数的泛型类型
         Type[] types = method.getGenericParameterTypes();
         Type type = types[1];
         //判断类型是否为List<List<String>>,如果是则调用方法
         if (isBackDataTable && type.getTypeName().equals("java.util.List<java.util.List<java.lang.String>>")) {
            return ReflectUtil.invoke(bean, methodName, dte, headerDataList);
         }
      }
    /**
     * 获取真实值
     *
     * @param promptName
     * @param showValue
     * @return
     */
    private String getRealValue(String promptName, String showValue, boolean isMultiFlag) {
        String realValue = showValue;
        DataTableEntity promptDte;
        FieldSetEntity promptFse;
        if (promptName.startsWith("《")) {
            // 普通参照
            promptName = promptName.replace("《", "").replace("》", "");
            promptDte = DataPoolCacheImpl.getInstance().getCacheData(CmnConst.CACHE_COMMON_PROMPT, new String[]{promptName});
            if (!BaseUtil.dataTableIsEmpty(promptDte)) {
                Set<String> showSet = SetUtils.string2Set(showValue, ",");
                Set<String> realSet = Sets.newLinkedHashSet();
                for (int i = 0; i < promptDte.getRows(); i++) {
                    promptFse = promptDte.getFieldSetEntity(i);
                    if (isMultiFlag) {
                        if (showSet.contains(promptFse.getString(CmnConst.FIELD_DICT_LABEL))) {
                            realSet.add(promptFse.getString(CmnConst.FIELD_DICT_VALUE));
                        }
                    } else {
                        if (showValue.equals(promptFse.getString(CmnConst.FIELD_DICT_LABEL))) {
                            realValue = promptFse.getString(CmnConst.FIELD_DICT_VALUE);
                            break;
                        }
                    }
                }
                if (!realSet.isEmpty()) {
                    realValue = SetUtils.set2String(realSet, ",");
                }
            }
        } else {
            // 高级参照
            promptFse = BaseUtil.getSingleInfoByCache(CmnConst.CACHE_ADVANCED_PROMPT, new String[]{promptName});
            String sourceTableName = promptFse.getString(CmnConst.FILED_SOURCE_TABLE);
            String filter = promptFse.getString(CmnConst.FILED_FILTER);
            String showFieldName = promptFse.getString(CmnConst.FILED_VIEW_FIELD);
            Set<String> showSet = SetUtils.string2Set(showValue, ",");
            String promptFilter = BaseUtil.buildQuestionMarkFilter(showFieldName, isMultiFlag ? showSet.size() : 1, true);
            StringBuilder sql = new StringBuilder(256);
            String realFieldName = promptFse.getString(CmnConst.FILED_VALUE_FIELD);
            sql.append("select GROUP_CONCAT(").append(realFieldName).append(") real_value from ").append(sourceTableName).append(" where ").append(promptFilter);
            if (!StringUtils.isEmpty(filter)) {
                filter = SystemParamReplace.systemParamsReplace(filter);
                sql.append(" and ").append(filter);
            }
            // 补充特定字段数据过滤
            if (!StringUtils.isEmpty(promptFse.getString("org_filter_field")) || !StringUtils.isEmpty(promptFse.getString("user_filter_field"))) {
                String dataFilter = permissionService.getDataFilter(sourceTableName,
                        promptFse.getString("user_filter_field"), promptFse.getString("org_filter_field"));
                if (!StringUtils.isEmpty(dataFilter)) {
                    sql.append(" and ").append(dataFilter);
                }
            }
            FieldSetEntity sourceFse = baseDao.getFieldSetEntityBySQL(sql.toString(), showSet.toArray(), false);
            if (sourceFse != null) {
                realValue = sourceFse.getString("real_value");
            }
        }
        return realValue;
    }
      return ReflectUtil.invoke(bean, methodName, dte);
   }
   /**
    * 获取真实值
    *
    * @param promptName
    * @param showValue
    * @return
    */
   private String getRealValue(String promptName, String showValue, boolean isMultiFlag) {
      String realValue = showValue;
      DataTableEntity promptDte;
      FieldSetEntity promptFse;
      if (promptName.startsWith("《")) {
         // 普通参照
         promptName = promptName.replace("《", "").replace("》", "");
         promptDte = DataPoolCacheImpl.getInstance().getCacheData(CmnConst.CACHE_COMMON_PROMPT, new String[]{promptName});
         if (!BaseUtil.dataTableIsEmpty(promptDte)) {
            Set<String> showSet = SetUtils.string2Set(showValue, ",");
            Set<String> realSet = Sets.newLinkedHashSet();
            for (int i = 0; i < promptDte.getRows(); i++) {
               promptFse = promptDte.getFieldSetEntity(i);
               if (isMultiFlag) {
                  if (showSet.contains(promptFse.getString(CmnConst.FIELD_DICT_LABEL))) {
                     realSet.add(promptFse.getString(CmnConst.FIELD_DICT_VALUE));
                  }
               } else {
                  if (showValue.equals(promptFse.getString(CmnConst.FIELD_DICT_LABEL))) {
                     realValue = promptFse.getString(CmnConst.FIELD_DICT_VALUE);
                     break;
                  }
               }
            }
            if (!realSet.isEmpty()) {
               realValue = SetUtils.set2String(realSet, ",");
            }
         }
      } else {
         // 高级参照
         promptFse = BaseUtil.getSingleInfoByCache(CmnConst.CACHE_ADVANCED_PROMPT, new String[]{promptName});
         String sourceTableName = promptFse.getString(CmnConst.FILED_SOURCE_TABLE);
         String filter = promptFse.getString(CmnConst.FILED_FILTER);
         String showFieldName = promptFse.getString(CmnConst.FILED_VIEW_FIELD);
         Set<String> showSet = SetUtils.string2Set(showValue, ",");
         String promptFilter = BaseUtil.buildQuestionMarkFilter(showFieldName, isMultiFlag ? showSet.size() : 1, true);
         StringBuilder sql = new StringBuilder(256);
         String realFieldName = promptFse.getString(CmnConst.FILED_VALUE_FIELD);
         sql.append("select GROUP_CONCAT(").append(realFieldName).append(") real_value from ").append(sourceTableName).append(" where ").append(promptFilter);
         if (!StringUtils.isEmpty(filter)) {
            filter = SystemParamReplace.systemParamsReplace(filter);
            sql.append(" and ").append(filter);
         }
         // 补充特定字段数据过滤
         if (!StringUtils.isEmpty(promptFse.getString("org_filter_field")) || !StringUtils.isEmpty(promptFse.getString("user_filter_field"))) {
            String dataFilter = permissionService.getDataFilter(sourceTableName,
                  promptFse.getString("user_filter_field"), promptFse.getString("org_filter_field"));
            if (!StringUtils.isEmpty(dataFilter)) {
               sql.append(" and ").append(dataFilter);
            }
         }
         FieldSetEntity sourceFse = baseDao.getFieldSetEntityBySQL(sql.toString(), showSet.toArray(), false);
         if (sourceFse != null) {
            realValue = sourceFse.getString("real_value");
         }
      }
      return realValue;
   }
}