Package org.jeecgframework.web.cgform.controller.autolist

Source Code of org.jeecgframework.web.cgform.controller.autolist.CgAutoListController

package org.jeecgframework.web.cgform.controller.autolist;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.jeecgframework.web.cgform.common.CgAutoListConstant;
import org.jeecgframework.web.cgform.common.SysVar;
import org.jeecgframework.web.cgform.engine.FreemarkerHelper;
import org.jeecgframework.web.cgform.entity.config.CgFormFieldEntity;
import org.jeecgframework.web.cgform.service.autolist.CgTableServiceI;
import org.jeecgframework.web.cgform.service.autolist.ConfigServiceI;
import org.jeecgframework.web.cgform.service.config.CgFormFieldServiceI;
import org.jeecgframework.web.cgform.util.QueryParamUtil;
import org.jeecgframework.web.system.service.SystemService;

import org.apache.log4j.Logger;
import org.jeecgframework.core.common.controller.BaseController;
import org.jeecgframework.core.common.model.json.AjaxJson;
import org.jeecgframework.core.common.model.json.DataGrid;
import org.jeecgframework.core.constant.Globals;
import org.jeecgframework.core.util.ResourceUtil;
import org.jeecgframework.core.util.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
*
* @Title:CgAutoListController
* @description:动态列表控制器[根据表名读取配置文件,进行动态数据展现]
* @author 赵俊夫
* @date Jul 5, 2013 2:55:36 PM
* @version V1.0
*/
@Controller
@RequestMapping("/cgAutoListController")
public class CgAutoListController extends BaseController{
  @Autowired
  private ConfigServiceI configService;
  @Autowired
  private CgTableServiceI cgTableService;
  @Autowired
  private SystemService systemService;
  @Autowired
  private CgFormFieldServiceI cgFormFieldService;
  private static Logger log = Logger.getLogger(CgAutoListController.class);
  /**
   * 动态列表展现入口
   * @param id 动态配置ID
   * @param request
   * @param response
   */
  @RequestMapping(params = "list")
  public void list(String id, HttpServletRequest request,
      HttpServletResponse response) {
    long start = System.currentTimeMillis();
    //step.1 根据表名获取该表单的配置参数
    String jversion = cgFormFieldService.getCgFormVersionByTableName(id);
    Map<String, Object> configs = configService.queryConfigs(id,jversion);
    //step.2 获取列表ftl模板路径
    FreemarkerHelper viewEngine = new FreemarkerHelper();
    Map<String, Object> paras = new HashMap<String, Object>();
    //step.3 封装页面数据
    loadVars(configs,paras,request);
    //step.4 组合模板+数据参数,进行页面展现
    String html = viewEngine.parseTemplate("/org/jeecgframework/web/cgform/engine/autolist/autolist.ftl", paras);
    try {
      response.setContentType("text/html");
      response.setHeader("Cache-Control", "no-store");
      PrintWriter writer = response.getWriter();
      writer.println(html);
      writer.flush();
    } catch (IOException e) {
      e.printStackTrace();
    }
    long end = System.currentTimeMillis();
    log.debug("动态列表生成耗时:"+(end-start)+" ms");
  }

  /**
   * 动态列表数据查询
   * @param configId 配置id 修正使用id会造成主键查询的冲突
   * @param page 分页页面
   * @param rows 分页大小
   * @param request
   * @param response
   * @param dataGrid
   */
  @SuppressWarnings("unchecked")
  @RequestMapping(params = "datagrid")
  public void datagrid(String configId,String page,String field,String rows,String sort,String order, HttpServletRequest request,
      HttpServletResponse response, DataGrid dataGrid) {
    long start = System.currentTimeMillis();
    //step.1 获取动态配置
    String jversion = cgFormFieldService.getCgFormVersionByTableName(configId);
    Map<String, Object>  configs = configService.queryConfigs(configId,jversion);
    String table = (String) configs.get(CgAutoListConstant.TABLENAME);
    Map params =  new HashMap<String,Object>();
    //step.2 获取查询条件以及值
    List<CgFormFieldEntity> beans = (List<CgFormFieldEntity>) configs.get(CgAutoListConstant.FILEDS);
    for(CgFormFieldEntity b:beans){
//      if(CgAutoListConstant.BOOL_TRUE.equals(b.getIsQuery())){
        QueryParamUtil.loadQueryParams(request,b,params);
//      }
    }
    int p = page==null?1:Integer.parseInt(page);
    int r = rows==null?99999:Integer.parseInt(rows);
    //step.3 进行查询返回结果
    List<Map<String, Object>> result=cgTableService.querySingle(table, field.toString(), params,sort,order, p,r );
    Long size = cgTableService.getQuerySingleSize(table, field, params);
    dealDic(result,beans);
    response.setContentType("application/json");
    response.setHeader("Cache-Control", "no-store");
    PrintWriter writer;
    try {
      writer = response.getWriter();
      writer.println(QueryParamUtil.getJson(result,size));
      writer.flush();
    } catch (IOException e) {
      e.printStackTrace();
    }
    long end = System.currentTimeMillis();
    log.debug("动态列表查询耗时:"+(end-start)+" ms");
  }
  /**
   * 处理数据字典
   * @param result 查询的结果集
   * @param beans 字段配置
   */
  @SuppressWarnings("unchecked")
  private void dealDic(List<Map<String, Object>> result,
      List<CgFormFieldEntity> beans) {
    for(CgFormFieldEntity bean:beans){
      String dicT = bean.getDictTable();//字典表
      String dicF = bean.getDictField();//字典字段
      String dicText= bean.getDictText();//字典文本
      if(StringUtil.isEmpty(dicT)&& StringUtil.isEmpty(dicF)){
        //不需要处理字典
        continue;
      }else{
        if(!bean.getShowType().equals("popup")){
          List<Map<String, Object>> dicDatas = queryDic(dicT, dicF,dicText);
          for(Map r:result){
            String value = String.valueOf(r.get(bean.getFieldName()));
            for(Map m:dicDatas){
              String typecode = String.valueOf(m.get("typecode"));
              String typename = String.valueOf(m.get("typename"));
              if(value.equalsIgnoreCase(typecode)){
                r.put(bean.getFieldName(),typename);
              }
            }
          }
        }
      }
    }
  }

  /**
   * 删除动态表
   * @param configId 配置id
   * @param id 主键
   * @param request
   * @return
   */
  @RequestMapping(params = "del")
  @ResponseBody
  public AjaxJson del(String configId,String id,
      HttpServletRequest request) {
    AjaxJson j = new AjaxJson();
    String jversion = cgFormFieldService.getCgFormVersionByTableName(configId);
    String table = (String) configService.queryConfigs(configId,jversion).get(CgAutoListConstant.TABLENAME);
    cgTableService.delete(table, id);
    String message = "删除成功";
    systemService.addLog(message, Globals.Log_Type_DEL,
        Globals.Log_Leavel_INFO);
    j.setMsg(message);
    return j;
  }
  /**
   * 删除动态表-批量
   * @param configId 配置id
   * @param id 主键
   * @param request
   * @return
   */
  @RequestMapping(params = "delBatch")
  @ResponseBody
  public AjaxJson delBatch(String configId,String ids,
      HttpServletRequest request) {
    AjaxJson j = new AjaxJson();
    String jversion = cgFormFieldService.getCgFormVersionByTableName(configId);
    String table = (String) configService.queryConfigs(configId,jversion).get(CgAutoListConstant.TABLENAME);
    String message = "删除成功";
    try {
      String[] id = ids.split(",");
      cgTableService.deleteBatch(table, id);
    } catch (Exception e) {
      message = e.getMessage();
    }
    systemService.addLog(message, Globals.Log_Type_DEL,
        Globals.Log_Leavel_INFO);
    j.setMsg(message);
    return j;
  }
 
  /**
   * 装载要传入到ftl中的变量
   * @param configs 从数据库中取出来的配置
   * @param paras 要传入ftl的参数(需要对configs进行一些改造)
   * @param request
   * @return 要传入ftl的参数(该方法直接操作paras容器,当然可以使用此返回值)
   */
  @SuppressWarnings("unchecked")
  private Map loadVars(Map<String, Object> configs,Map<String, Object> paras, HttpServletRequest request) {
    paras.putAll(configs);
    List<Map> fieldList = new ArrayList<Map>();
    List<Map> queryList = new ArrayList<Map>();
    StringBuilder fileds = new StringBuilder();
    StringBuilder initQuery = new StringBuilder();
    for (CgFormFieldEntity bean : (List<CgFormFieldEntity>) configs.get(CgAutoListConstant.FILEDS)) {
      Map fm = new HashMap<String, Object>();
      fm.put(CgAutoListConstant.FILED_ID, bean.getFieldName());
      fm.put(CgAutoListConstant.FIELD_TITLE, bean.getContent());
      String isShowList = bean.getIsShowList();
      if(StringUtil.isEmpty(isShowList)){
        if("id".equalsIgnoreCase(bean.getFieldName())){
          isShowList = CgAutoListConstant.BOOL_FALSE;
        }else{
          isShowList = CgAutoListConstant.BOOL_TRUE;
        }
      }
      fm.put(CgAutoListConstant.FIELD_ISSHOW, isShowList);
      fm.put(CgAutoListConstant.FIELD_QUERYMODE, bean.getQueryMode());
      fm.put(CgAutoListConstant.FIELD_SHOWTYPE, bean.getShowType());
      fm.put(CgAutoListConstant.FIELD_TYPE, bean.getType());
      fm.put(CgAutoListConstant.FIELD_LENGTH, bean.getFieldLength()==null?"120":bean.getFieldLength());
      fm.put(CgAutoListConstant.FIELD_HREF, bean.getFieldHref()==null?"":bean.getFieldHref());
      loadDic(fm,bean);
      fieldList.add(fm);
      if (CgAutoListConstant.BOOL_TRUE.equals(bean.getIsQuery())) {
        Map fmq = new HashMap<String, Object>();
        fmq.put(CgAutoListConstant.FILED_ID, bean.getFieldName());
        fmq.put(CgAutoListConstant.FIELD_TITLE, bean.getContent());
        fmq.put(CgAutoListConstant.FIELD_QUERYMODE, bean.getQueryMode());
        fmq.put(CgAutoListConstant.FIELD_TYPE, bean.getType());
        fmq.put(CgAutoListConstant.FIELD_SHOWTYPE, bean.getShowType());
        fmq.put(CgAutoListConstant.FIELD_DICTFIELD, bean.getDictField());
        fmq.put(CgAutoListConstant.FIELD_DICTTABLE, bean.getDictTable());
        fmq.put(CgAutoListConstant.FIELD_ISQUERY,"Y");
        loadDefaultValue(fmq,bean,request);
        loadDic(fmq,bean);
        queryList.add(fmq);
      }
      loadUrlDataFilter(queryList,bean,request);
      loadInitQuery(initQuery,bean,request);
      fileds.append(bean.getFieldName()).append(",");
    }
    loadAuth(paras, request);
    loadIframeConfig(paras, request);
    paras.put(CgAutoListConstant.CONFIG_FIELDLIST, fieldList);
    paras.put(CgAutoListConstant.CONFIG_QUERYLIST, queryList);
    paras.put(CgAutoListConstant.FILEDS, fileds);
    paras.put(CgAutoListConstant.INITQUERY, initQuery);
    return paras;
  }
  /**
   * 加载iframe设置
   * @param paras
   * @param request
   */
  private void loadIframeConfig(Map<String, Object> paras,
      HttpServletRequest request) {
    //如果列表以iframe形式的话,需要加入样式文件
    StringBuilder sb= new StringBuilder("");
    if(request.getQueryString().contains("isIframe")){
      sb.append("<script type=\"text/javascript\" src=\"plug-in/jquery/jquery-1.8.3.js\"></script>");
      sb.append("<script type=\"text/javascript\" src=\"plug-in/tools/dataformat.js\"></script>");
      sb.append("<link id=\"easyuiTheme\" rel=\"stylesheet\" href=\"plug-in/easyui/themes/default/easyui.css\" type=\"text/css\"></link>");
      sb.append("<link rel=\"stylesheet\" href=\"plug-in/easyui/themes/icon.css\" type=\"text/css\"></link>");
      sb.append("<link rel=\"stylesheet\" type=\"text/css\" href=\"plug-in/accordion/css/accordion.css\">");
      sb.append("<link rel=\"stylesheet\" type=\"text/css\" href=\"plug-in/accordion/css/icons.css\">");
      sb.append("<script type=\"text/javascript\" src=\"plug-in/easyui/jquery.easyui.min.1.3.2.js\"></script>");
      sb.append("<script type=\"text/javascript\" src=\"plug-in/easyui/locale/easyui-lang-zh_CN.js\"></script>");
      sb.append("<script type=\"text/javascript\" src=\"plug-in/tools/syUtil.js\"></script>");
      sb.append("<script type=\"text/javascript\" src=\"plug-in/My97DatePicker/WdatePicker.js\"></script>");
      sb.append("<link rel=\"stylesheet\" href=\"plug-in/tools/css/common.css\" type=\"text/css\"></link>");
      sb.append("<script type=\"text/javascript\" src=\"plug-in/lhgDialog/lhgdialog.min.js\"></script>");
      sb.append("<script type=\"text/javascript\" src=\"plug-in/tools/curdtools.js\"></script>");
      sb.append("<script type=\"text/javascript\" src=\"plug-in/tools/easyuiextend.js\"></script>");
    }else{
    }
    paras.put(CgAutoListConstant.CONFIG_IFRAME, sb.toString());
  }
  /**
   * 加载按钮权限
   * @param paras
   * @param request
   */
  private void loadAuth(Map<String, Object> paras, HttpServletRequest request) {
    List<String> nolist = (List<String>) request.getAttribute("noauto_operationCodes");
    if(ResourceUtil.getSessionUserName().getUserName().equals("admin")|| !Globals.BUTTON_AUTHORITY_CHECK){
      nolist = null;
    }
    String nolistStr = "";
    if(nolist!=null){
      for(String no:nolist){
        nolistStr+=no;
        nolistStr+=",";
      }
    }
    paras.put(CgAutoListConstant.CONFIG_NOLIST, nolist==null?new ArrayList<String>(0):nolist);
    paras.put(CgAutoListConstant.CONFIG_NOLISTSTR, nolistStr==null?"":nolistStr);
  }
  /**
   * 加载列表初始查询条件-
   * @param initQuery
   * @param bean
   * @param request
   */
  private void loadInitQuery(StringBuilder initQuery, CgFormFieldEntity bean,
      HttpServletRequest request) {
    if(bean.getFieldName().equalsIgnoreCase("id")){
      return;
    }
    String paramV = request.getParameter(bean.getFieldName());
    String paramVbegin = request.getParameter(bean.getFieldName()+"_begin");
    String paramVend = request.getParameter(bean.getFieldName()+"_end");
    paramV = SysVar.getSysVar(paramV);
    paramVbegin = SysVar.getSysVar(paramVbegin);
    paramVend = SysVar.getSysVar(paramVend);
    if(!StringUtil.isEmpty(paramV)){
      initQuery.append("&"+bean.getFieldName()+"="+paramV);
    }
    if(!StringUtil.isEmpty(paramVbegin)){
      initQuery.append("&"+bean.getFieldName()+"_begin="+paramVbegin);
    }
    if(!StringUtil.isEmpty(paramVend)){
      initQuery.append("&"+bean.getFieldName()+"_end="+paramVend);
    }
  }

  /**
   * 加载URL中的过滤参数[在未配置查询字段的情况下,作为hidden控件使用]
   * @param queryList
   * @param bean
   * @param request
   */
  @SuppressWarnings("unchecked")
  private void loadUrlDataFilter(List<Map> queryList, CgFormFieldEntity bean,
      HttpServletRequest request) {
    String paramV = request.getParameter(bean.getFieldName());
    String paramVbegin = request.getParameter(bean.getFieldName()+"_begin");
    String paramVend = request.getParameter(bean.getFieldName()+"_end");
    if(bean.getFieldName().equalsIgnoreCase("id")){
      return;
    }
    for(Map mq:queryList){
      if(mq.containsValue(bean.getFieldName())){
        return;
      }
    }
    if(!StringUtil.isEmpty(paramV) || !StringUtil.isEmpty(paramVbegin) ||!StringUtil.isEmpty(paramVend)){
      Map fmq = new HashMap<String, Object>();
      fmq.put(CgAutoListConstant.FILED_ID, bean.getFieldName());
      fmq.put(CgAutoListConstant.FIELD_TITLE, bean.getContent());
      fmq.put(CgAutoListConstant.FIELD_QUERYMODE, bean.getQueryMode());
      fmq.put(CgAutoListConstant.FIELD_TYPE, bean.getType());
      fmq.put(CgAutoListConstant.FIELD_ISQUERY,"N");
      paramV = SysVar.getSysVar(paramV);
      fmq.put(CgAutoListConstant.FIELD_VALUE, paramV);
      paramVbegin = SysVar.getSysVar(paramVbegin);
      paramVend = SysVar.getSysVar(paramVend);
      fmq.put(CgAutoListConstant.FIELD_VALUE_BEGIN, StringUtil.isEmpty(paramVbegin)?"":paramVbegin);
      fmq.put(CgAutoListConstant.FIELD_VALUE_END, StringUtil.isEmpty(paramVend)?"":paramVend);
      queryList.add(fmq);
    }
  }

  /**
   * 加载URL中的过滤参数[在已配置查询字段的情况下,给该查询字段加上默认值]
   * @param fmq
   * @param bean
   * @param request
   */
  @SuppressWarnings("unchecked")
  private void loadDefaultValue(Map fmq, CgFormFieldEntity bean,
      HttpServletRequest request) {
    if(bean.getQueryMode().equalsIgnoreCase("single")){
      String paramV = request.getParameter(bean.getFieldName());
      if(!StringUtil.isEmpty(paramV)){
        paramV = SysVar.getSysVar(paramV);
        fmq.put(CgAutoListConstant.FIELD_VALUE, paramV);
      }
    }else if(bean.getQueryMode().equalsIgnoreCase("group")){
      String paramVbegin = request.getParameter(bean.getFieldName()+"_begin");
      String paramVend = request.getParameter(bean.getFieldName()+"_end");
      paramVbegin = SysVar.getSysVar(paramVbegin);
      paramVend = SysVar.getSysVar(paramVend);
      fmq.put(CgAutoListConstant.FIELD_VALUE_BEGIN, StringUtil.isEmpty(paramVbegin)?"":paramVbegin);
      fmq.put(CgAutoListConstant.FIELD_VALUE_END, StringUtil.isEmpty(paramVend)?"":paramVend);
    }
  }

  /**
   * 装载数据字典
   * @param m  要放入freemarker的数据
   * @param bean 读取出来的动态配置数据
   */
  @SuppressWarnings("unchecked")
  private void loadDic(Map m, CgFormFieldEntity bean) {
    String dicT = bean.getDictTable();//字典表
    String dicF = bean.getDictField();//字典字段
    String dicText = bean.getDictText();//字典文本
    if(StringUtil.isEmpty(dicT)&& StringUtil.isEmpty(dicF)){
      //如果这两个字段都为空,则没有数据字典
      m.put(CgAutoListConstant.FIELD_DICTLIST, new ArrayList(0));
      return;
    }
    if(!bean.getShowType().equals("popup")){
      List<Map<String, Object>> dicDatas = queryDic(dicT, dicF,dicText);
      m.put(CgAutoListConstant.FIELD_DICTLIST, dicDatas);
    }else{
      m.put(CgAutoListConstant.FIELD_DICTLIST, new ArrayList(0));
    }
  }
  /**
   * 查询数据字典
   * @param dicT 数据字典表
   * @param dicF  数据字典字段
   * @param dicText 数据字典显示文本
   * @return
   */
  private List<Map<String, Object>> queryDic(String dicT, String dicF,String dicText) {
    StringBuilder dicSql = new StringBuilder();
    if(StringUtil.isEmpty(dicT)){//step.1 如果没有字典表则使用系统字典表
      dicT = CgAutoListConstant.SYS_DIC;
      dicSql.append(" SELECT TYPECODE,TYPENAME FROM");
      dicSql.append(" "+dicT);
      dicSql.append(" "+"WHERE TYPEGROUPID = ");
      dicSql.append(" "+"(SELECT ID FROM "+CgAutoListConstant.SYS_DICGROUP+" WHERE TYPEGROUPCODE = '"+dicF+"' )");
    }else{//step.2 如果给定了字典表则使用该字典表,这个功能需要在表单配置追加字段
      //table表查询
      dicSql.append("SELECT DISTINCT ").append(dicF).append(" as typecode, ");
      if(dicText!=null&&dicText.length()>0){
        dicSql.append(dicText).append(" as typename ");
      }else{
        dicSql.append(dicF).append(" as typename ");
      }
      dicSql.append(" FROM ").append(dicT);
      dicSql.append(" ORDER BY ").append(dicF);
    }
    //step.3 字典数据
    List<Map<String, Object>> dicDatas = systemService.findForJdbc(dicSql.toString());
    return dicDatas;
  }
}
TOP

Related Classes of org.jeecgframework.web.cgform.controller.autolist.CgAutoListController

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.