Browse Source

Merge branch 'master' of http://192.168.1.220:10080/huangzhiyong/eip_manage

huangzhiyong 7 years ago
parent
commit
94b2022548
48 changed files with 3410 additions and 99 deletions
  1. 14 0
      src/main/java/com/yihu/hos/config/BeanConfig.java
  2. 73 0
      src/main/java/com/yihu/hos/fegin/AppFeatureFegin.java
  3. 64 0
      src/main/java/com/yihu/hos/fegin/AppFegin.java
  4. 1 1
      src/main/java/com/yihu/hos/filter/SessionOutTimeFilter.java
  5. 1 0
      src/main/java/com/yihu/hos/interceptor/AuditInterceptor.java
  6. 1 0
      src/main/java/com/yihu/hos/interceptor/JdbcTemplateAdvice.java
  7. 0 61
      src/main/java/com/yihu/hos/interceptor/LocalContext.java
  8. 1 0
      src/main/java/com/yihu/hos/interceptor/WebMvcInterceptor.java
  9. 3 3
      src/main/java/com/yihu/hos/listeners/ApplicationStart.java
  10. 1 1
      src/main/java/com/yihu/hos/remotemanage/controller/RemoteShellController.java
  11. 1 1
      src/main/java/com/yihu/hos/remotemanage/service/RemoteShellService.java
  12. 1 1
      src/main/java/com/yihu/hos/services/ServiceFlowEventService.java
  13. 1 1
      src/main/java/com/yihu/hos/services/ServiceShellEventService.java
  14. 99 17
      src/main/java/com/yihu/hos/system/controller/AppController.java
  15. 227 0
      src/main/java/com/yihu/hos/system/controller/AppFeatureController.java
  16. 1 1
      src/main/java/com/yihu/hos/system/controller/SystemController.java
  17. 130 0
      src/main/java/com/yihu/hos/system/model/AppFeature.java
  18. 80 2
      src/main/java/com/yihu/hos/system/model/SystemApp.java
  19. 1 1
      src/main/java/com/yihu/hos/system/service/AppManager.java
  20. 1 1
      src/main/java/com/yihu/hos/system/service/FlowManager.java
  21. 1 1
      src/main/java/com/yihu/hos/system/service/SystemManager.java
  22. 2 2
      src/main/java/com/yihu/hos/tenant/service/AuthenticateService.java
  23. 3 1
      src/main/resources/application.yml
  24. 41 1
      src/main/resources/resource/SystemApp.hbm.xml
  25. 0 1
      src/main/webapp/WEB-INF/ehr/jsp/standard/integration/importDataJs.jsp
  26. 8 1
      src/main/webapp/WEB-INF/ehr/jsp/system/app/appJs.jsp
  27. 113 0
      src/main/webapp/WEB-INF/ehr/jsp/system/app/feature/appFeature.jsp
  28. 356 0
      src/main/webapp/WEB-INF/ehr/jsp/system/app/feature/appFeatureJs.jsp
  29. 98 0
      src/main/webapp/WEB-INF/ehr/jsp/system/app/feature/dialog.jsp
  30. 139 0
      src/main/webapp/WEB-INF/ehr/jsp/system/app/feature/dialogJs.jsp
  31. BIN
      src/main/webapp/develop/images/1ji_icon.png
  32. BIN
      src/main/webapp/develop/images/2ji_icon.png
  33. BIN
      src/main/webapp/develop/images/3ji_icon.png
  34. BIN
      src/main/webapp/develop/images/bianji01_btn.png
  35. BIN
      src/main/webapp/develop/images/bianji_btn.png
  36. BIN
      src/main/webapp/develop/images/bianji_btn_pre.png
  37. BIN
      src/main/webapp/develop/images/shanchu01_btn.png
  38. BIN
      src/main/webapp/develop/images/shanchu_btn.png
  39. BIN
      src/main/webapp/develop/images/shanchu_btn_pre.png
  40. BIN
      src/main/webapp/develop/images/tianjia_btn.png
  41. BIN
      src/main/webapp/develop/images/tianjia_pre.png
  42. 205 0
      src/main/webapp/develop/lib/ehrjs/formFieldTools.js
  43. 157 0
      src/main/webapp/develop/lib/ehrjs/gridTools.js
  44. 325 0
      src/main/webapp/develop/lib/ehrjs/ligerGridEx.js
  45. 969 0
      src/main/webapp/develop/lib/ehrjs/searchTree.js
  46. 281 0
      src/main/webapp/develop/lib/ehrjs/toolBar.js
  47. 0 1
      src/main/webapp/develop/lib/module/dataModel.js
  48. 11 0
      src/main/webapp/develop/lib/module/util.js

+ 14 - 0
src/main/java/com/yihu/hos/config/BeanConfig.java

@ -17,6 +17,8 @@ import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.filter.HiddenHttpMethodFilter;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
@ -169,4 +171,16 @@ public class BeanConfig {
    }
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    @Bean
    public HiddenHttpMethodFilter hiddenHttpMethodFilter() {
        HiddenHttpMethodFilter hiddenHttpMethodFilter= new HiddenHttpMethodFilter();
        return hiddenHttpMethodFilter;
    }
}

+ 73 - 0
src/main/java/com/yihu/hos/fegin/AppFeatureFegin.java

@ -0,0 +1,73 @@
package com.yihu.hos.fegin;
import com.yihu.ehr.constants.ApiVersion;
import com.yihu.ehr.constants.MicroServices;
import com.yihu.ehr.constants.ServiceApi;
import com.yihu.hos.system.model.AppFeature;
import com.yihu.hos.web.framework.constant.SystemContants;
import com.yihu.hos.web.framework.model.Envelop;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
@FeignClient(name = MicroServices.HosApp)
@RequestMapping(ApiVersion.Version1_0)
public interface AppFeatureFegin {
    @RequestMapping(value = SystemContants.AppFeature.Feature, method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ApiOperation(value = "新增App功能")
    AppFeature create(@RequestBody String json, @RequestParam(value = "schemaName", required = false) String schemaName);
    @RequestMapping(value = SystemContants.AppFeature.GetById, method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "获取appFeature")
    public Envelop getById(
            @ApiParam(name = "id", value = "id")
            @PathVariable(value = "id") Integer id,
            @ApiParam(name = "schemaName", value = "schemaName")
            @RequestParam(value = "schemaName") String schemaName) throws Exception;
    //@RequestMapping(value = SystemContants.AppFeature.App, method = RequestMethod.DELETE)
    //@ApiOperation(value = "删除App功能")
    //boolean deleteApp(
    //        @ApiParam(name = "app_id", value = "id")
    //        @PathVariable(value = "app_id") String appId,
    //        @RequestParam(value = "schemaName", required = false) String schemaName) throws Exception;
    //
    //
    //@RequestMapping(value = ServiceApi.Apps.Apps, method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    //@ApiOperation(value = "更新App功能")
    //SystemApp updateApp(@RequestBody String appJson, @RequestParam(value = "schemaName", required = false) String schemaName);
    @RequestMapping(value = ServiceApi.AppFeature.FilterFeatureNoPage, method = RequestMethod.GET)
    @ApiOperation(value = "获取过滤AppFeature列表(不分页)")
    public Envelop getAppFeatureNoPage(
            @ApiParam(name = "filters", value = "过滤器,为空检索所有条件")
            @RequestParam(value = "filters", required = false) String filters,
            @RequestParam(value = "roleId", required = false) String roleId,
            @RequestParam(value = "schemaName", required = false) String schemaName) throws Exception ;
    @RequestMapping(value = SystemContants.AppFeature.IsExist, method = RequestMethod.GET)
    @ApiOperation(value = "存在性校验")
    @ResponseBody
    public Envelop isExist(
            @ApiParam(name = "filters", value = "过滤器,为空检索所有条件")
            @RequestParam(value = "filters", required = false) String filters,
            @RequestParam(value = "schemaName", required = false) String schemaName);
    @RequestMapping(value = SystemContants.AppFeature.DeleteById, method = RequestMethod.DELETE)
    @ApiOperation(value = "删除AppFeature")
    @ResponseBody
    Envelop delete(
            @ApiParam(name = "id", value = "id", defaultValue = "")
            @PathVariable(value = "id") Integer id,
            @RequestParam(value = "schemaName", required = false) String schemaName);
}

+ 64 - 0
src/main/java/com/yihu/hos/fegin/AppFegin.java

@ -0,0 +1,64 @@
package com.yihu.hos.fegin;
import com.yihu.ehr.constants.ApiVersion;
import com.yihu.ehr.constants.MicroServices;
import com.yihu.hos.system.model.SystemApp;
import com.yihu.hos.web.framework.constant.SystemContants;
import com.yihu.hos.web.framework.model.Envelop;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
@FeignClient(name = MicroServices.HosApp)
@RequestMapping(ApiVersion.Version1_0)
public interface AppFegin {
    @RequestMapping(value = SystemContants.SystemApp.Apps, method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ApiOperation(value = "新增App")
    SystemApp createApp(@RequestBody String appJson, @RequestParam(value = "schemaName", required = false) String schemaName);
    @RequestMapping(value = SystemContants.SystemApp.App, method = RequestMethod.DELETE)
    @ApiOperation(value = "删除App")
    @ResponseBody
    Envelop deleteApp(
            @ApiParam(name = "app_id", value = "id")
            @PathVariable(value = "app_id") String appId,
            @RequestParam(value = "schemaName", required = false) String schemaName) throws Exception ;
    @RequestMapping(value = SystemContants.SystemApp.Apps, method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ApiOperation(value = "更新App")
    SystemApp updateApp(@RequestBody String appJson, @RequestParam(value = "schemaName", required = false) String schemaName);
    /**
     * 应用列表
     *
     * @param request
     * @return
     */
    //@RequestMapping(value = ServiceApi.Apps.Apps, method = RequestMethod.GET)
    //@ApiOperation(value = "获取App列表")
    //@ResponseBody
    //Collection<SystemApp> getAppList(
    //        @ApiParam(name = "fields", value = "返回的字段,为空返回全部字段", defaultValue = "id,name,secret,url,createTime,icon,releaseFlag")
    //        @RequestParam(value = "fields", required = false) String fields,
    //        @ApiParam(name = "filters", value = "过滤器,为空检索所有条件")
    //        @RequestParam(value = "filters", required = false) String filters,
    //        @ApiParam(name = "sorts", value = "排序,规则参见说明文档", defaultValue = "+name,+createTime")
    //        @RequestParam(value = "sorts", required = false) String sorts,
    //        @ApiParam(name = "size", value = "分页大小", defaultValue = "15")
    //        @RequestParam(value = "size") int size,
    //        @ApiParam(name = "page", value = "页码", defaultValue = "1")
    //        @RequestParam(value = "page") int page,
    //        HttpServletRequest request,
    //        HttpServletResponse response,
    //        @RequestParam(value = "schemaName", required = false) String schemaName);
}

+ 1 - 1
src/main/java/com/yihu/hos/filter/SessionOutTimeFilter.java

@ -1,7 +1,7 @@
package com.yihu.hos.filter;
import com.yihu.hos.common.constants.ContextAttributes;
import com.yihu.hos.interceptor.LocalContext;
import com.yihu.hos.web.framework.thread.LocalContext;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

+ 1 - 0
src/main/java/com/yihu/hos/interceptor/AuditInterceptor.java

@ -1,6 +1,7 @@
package com.yihu.hos.interceptor;
import com.yihu.hos.common.constants.ContextAttributes;
import com.yihu.hos.web.framework.thread.LocalContext;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.EmptyInterceptor;
import org.slf4j.Logger;

+ 1 - 0
src/main/java/com/yihu/hos/interceptor/JdbcTemplateAdvice.java

@ -1,6 +1,7 @@
package com.yihu.hos.interceptor;
import com.yihu.hos.common.constants.ContextAttributes;
import com.yihu.hos.web.framework.thread.LocalContext;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;

+ 0 - 61
src/main/java/com/yihu/hos/interceptor/LocalContext.java

@ -1,61 +0,0 @@
package com.yihu.hos.interceptor;
import java.util.HashMap;
import java.util.Map;
/**
 * @created Airhead 2016/11/14.
 */
public class LocalContext {
    private static final ThreadLocal<LocalContext> LOCAL = new ThreadLocal<LocalContext>() {
        @Override
        protected LocalContext initialValue() {
            return new LocalContext();
        }
    };
    private static final Map<String, String> attachments = new HashMap<>();
    public static LocalContext getContext() {
        return LOCAL.get();
    }
    public static void removeContext() {
        LOCAL.remove();
    }
    public String getAttachment(String key) {
        return this.attachments.get(key);
    }
    public LocalContext setAttachment(String key, String value) {
        if (value == null) {
            this.attachments.remove(key);
        } else {
            this.attachments.put(key, value);
        }
        return this;
    }
    public LocalContext removeAttachment(String key) {
    this.attachments.remove(key);
        return this;
    }
    public Map<String, String> getAttachments() {
        return this.attachments;
    }
    public LocalContext setAttachments(Map<String, String> attachment) {
        this.attachments.clear();
        if (attachment != null && attachment.size() > 0) {
            this.attachments.putAll(attachment);
        }
        return this;
    }
    public void clearAttachments() {
        this.attachments.clear();
    }
}

+ 1 - 0
src/main/java/com/yihu/hos/interceptor/WebMvcInterceptor.java

@ -2,6 +2,7 @@ package com.yihu.hos.interceptor;
import com.yihu.hos.common.constants.ContextAttributes;
import com.yihu.hos.tenant.model.TenantSession;
import com.yihu.hos.web.framework.thread.LocalContext;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;

+ 3 - 3
src/main/java/com/yihu/hos/listeners/ApplicationStart.java

@ -3,13 +3,13 @@ package com.yihu.hos.listeners;
import com.yihu.hos.common.constants.ContextAttributes;
import com.yihu.hos.core.log.Logger;
import com.yihu.hos.core.log.LoggerFactory;
import com.yihu.hos.interceptor.LocalContext;
import com.yihu.hos.services.ServiceFlowEventService;
import com.yihu.hos.web.framework.model.bo.ServiceFlow;
import com.yihu.hos.system.service.FlowManager;
import com.yihu.hos.web.framework.constant.DateConvert;
import com.yihu.hos.tenant.model.TenantModel;
import com.yihu.hos.tenant.service.TenantService;
import com.yihu.hos.web.framework.constant.DateConvert;
import com.yihu.hos.web.framework.model.bo.ServiceFlow;
import com.yihu.hos.web.framework.thread.LocalContext;
import org.apache.commons.beanutils.ConvertUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;

+ 1 - 1
src/main/java/com/yihu/hos/remotemanage/controller/RemoteShellController.java

@ -1,9 +1,9 @@
package com.yihu.hos.remotemanage.controller;
import com.yihu.hos.common.constants.ContextAttributes;
import com.yihu.hos.interceptor.LocalContext;
import com.yihu.hos.remotemanage.service.RemoteShellService;
import com.yihu.hos.web.framework.model.Result;
import com.yihu.hos.web.framework.thread.LocalContext;
import com.yihu.hos.web.framework.util.controller.BaseController;
import io.swagger.annotations.ApiParam;
import org.springframework.stereotype.Controller;

+ 1 - 1
src/main/java/com/yihu/hos/remotemanage/service/RemoteShellService.java

@ -2,10 +2,10 @@ package com.yihu.hos.remotemanage.service;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yihu.hos.common.constants.ContextAttributes;
import com.yihu.hos.interceptor.LocalContext;
import com.yihu.hos.services.ServiceShellEventService;
import com.yihu.hos.web.framework.constant.SSHConstant;
import com.yihu.hos.web.framework.model.bo.ServiceShell;
import com.yihu.hos.web.framework.thread.LocalContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.zbus.broker.ZbusBroker;

+ 1 - 1
src/main/java/com/yihu/hos/services/ServiceFlowEventService.java

@ -4,9 +4,9 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.yihu.hos.common.constants.ContextAttributes;
import com.yihu.hos.core.log.Logger;
import com.yihu.hos.core.log.LoggerFactory;
import com.yihu.hos.interceptor.LocalContext;
import com.yihu.hos.web.framework.constant.ServiceFlowConstant;
import com.yihu.hos.web.framework.model.bo.ServiceFlow;
import com.yihu.hos.web.framework.thread.LocalContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.zbus.broker.ZbusBroker;

+ 1 - 1
src/main/java/com/yihu/hos/services/ServiceShellEventService.java

@ -4,9 +4,9 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.yihu.hos.common.constants.ContextAttributes;
import com.yihu.hos.core.log.Logger;
import com.yihu.hos.core.log.LoggerFactory;
import com.yihu.hos.interceptor.LocalContext;
import com.yihu.hos.web.framework.constant.SSHConstant;
import com.yihu.hos.web.framework.model.bo.ServiceShell;
import com.yihu.hos.web.framework.thread.LocalContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.zbus.broker.ZbusBroker;

+ 99 - 17
src/main/java/com/yihu/hos/system/controller/AppController.java

@ -1,23 +1,33 @@
package com.yihu.hos.system.controller;
import com.yihu.ehr.constants.ApiVersion;
import com.yihu.hos.config.BeanConfig;
import com.yihu.hos.fegin.AppFegin;
import com.yihu.hos.system.model.SystemApp;
import com.yihu.hos.system.model.SystemServiceEndpoint;
import com.yihu.hos.system.service.AppManager;
import com.yihu.hos.web.framework.constant.ContextAttributes;
import com.yihu.hos.web.framework.model.Envelop;
import com.yihu.hos.web.framework.model.Result;
import com.yihu.hos.web.framework.thread.LocalContext;
import com.yihu.hos.web.framework.util.controller.BaseController;
import net.sf.json.JSONObject;
import org.apache.commons.beanutils.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
@ -26,10 +36,18 @@ import java.util.Map;
@RequestMapping("/app")
@Controller
public class AppController extends BaseController {
    @Resource(name = AppManager.BEAN_ID)
    private AppManager appManager;
    @Autowired
    private BeanConfig beanConfig;
    @Autowired
    private RestTemplate restTemplate;
    @Value("${service-gateway.appService}"+ ApiVersion.Version1_0)
    private String appService;
    @Autowired
    private AppFegin appFegin;
    /**
     *  应用管理管理界面
@ -52,19 +70,43 @@ public class AppController extends BaseController {
     */
    @RequestMapping("/getAppList")
    @ResponseBody
    public Result getAppList(HttpServletRequest request,String name,String status) {
    public Result getAppList(HttpServletRequest request, String name, String status) {
        try {
            //todo  name   status 待传
            Map<String, Object> params = new HashMap<>();
            params.put("name", name);
            params.put("status", status);
            //params.put("name", name);
            //params.put("status", status);
            String page = StringUtils.isEmpty(request.getParameter("page")) ? "1" : request.getParameter("page");
            String rows = StringUtils.isEmpty(request.getParameter("rows")) ? "10" : request.getParameter("rows");
            String pageStr = StringUtils.isEmpty(request.getParameter("page")) ? "1" : request.getParameter("page");
            String rowsStr = StringUtils.isEmpty(request.getParameter("rows")) ? "10" : request.getParameter("rows");
            Integer page = Integer.valueOf(pageStr);
            Integer rows = Integer.valueOf(rowsStr);
            String schemaName = LocalContext.getContext().getAttachment(ContextAttributes.SCHEMA);
            params.put("page", page);
            params.put("rows", rows);
            Result result = appManager.getAppList(params);
            return result;
            params.put("size", rows);
            //todo
            params.put("schemaName",schemaName);
            params.put("sorts",null);
            params.put("filters",null);
            //------------------------------------
            //String fileds="";
            //String filters ="";
            //String sorts = "";
            ////Collection<SystemApp> list1 = appFegin.getAppList(fileds, filters, sorts, page, rows, schemaName);
            //--------------------------------------------
            ResponseEntity<List> responseEntity = restTemplate.getForEntity(appService+"/apps?size={size}&page={page}&sorts={sorts}&filters={filters}&schemaName={schemaName}", List.class,params);
            List<SystemApp> list = responseEntity.getBody();
            Integer totalCount = getTotalCount(responseEntity);
            return getResult(list,totalCount,page,rows);
        } catch (Exception ex) {
            ex.printStackTrace();
            return Result.error(ex.getMessage());
@ -83,12 +125,15 @@ public class AppController extends BaseController {
        try {
            SystemApp app = null;
            if (id != null && id.length() > 0) {
                app = appManager.getAppById(id);
                Map<String, Object> params = new HashMap<>();
                String schemaName = LocalContext.getContext().getAttachment(ContextAttributes.SCHEMA);
                params.put("schemaName",schemaName);
                app = restTemplate.getForObject(appService + "/apps/"+id+"?schemaName={schemaName}", SystemApp.class,params);
            }  else {
                app = new SystemApp();
            }
            model.addAttribute("model", app);
                model.addAttribute("flag", flag);
            model.addAttribute("flag", flag);
            model.addAttribute("dfs",beanConfig.getFsUrl());
            model.addAttribute("categoryId", categoryId);
            model.addAttribute("contentPage", "/system/app/editorApp");
@ -109,7 +154,10 @@ public class AppController extends BaseController {
        try {
            SystemApp app = null;
            if (id != null && id.length() > 0) {
                app = appManager.getAppById(id);
                Map<String, Object> params = new HashMap<>();
                String schemaName = LocalContext.getContext().getAttachment(ContextAttributes.SCHEMA);
                params.put("schemaName",schemaName);
                app = restTemplate.getForObject(appService + "/apps/"+id+"?schemaName={schemaName}", SystemApp.class,params);
            }  else {
                app = new SystemApp();
            }
@ -133,8 +181,26 @@ public class AppController extends BaseController {
        try {
            SystemApp obj = new SystemApp();
            BeanUtils.populate(obj, request.getParameterMap());
            obj.setCreateDate(new Date());
            return appManager.addApp(obj);
            Map<String, Object> params = new HashMap<>();
            String schemaName = LocalContext.getContext().getAttachment(ContextAttributes.SCHEMA);
            params.put("schemaName",schemaName);
            //HttpHeaders headers = new HttpHeaders();
            //MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
            //headers.setContentType(type);
            //headers.add("Accept", MediaType.APPLICATION_JSON.toString());
            //
            JSONObject jsonObj = JSONObject.fromObject(obj);
            //HttpEntity<String> formEntity = new HttpEntity<String>(jsonObj.toString(), headers);
            //ResponseEntity<SystemApp> responseEntity = restTemplate.postForEntity(appService + "/app/addApp?schemaName={schemaName}", formEntity, SystemApp.class,params);
            //SystemApp app = responseEntity.getBody();
            SystemApp app = appFegin.createApp(jsonObj.toString(),schemaName);
            if(app!=null){
                return Result.success("保存成功");
            }else{
                return Result.error("保存失败,应用Code已存在");
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            return Result.error(ex.getMessage());
@ -151,9 +217,17 @@ public class AppController extends BaseController {
    public Result deleteApp(HttpServletRequest request) {
        try {
            String schemaName = LocalContext.getContext().getAttachment(ContextAttributes.SCHEMA);
            String id = request.getParameter("id");
            appManager.deleteApp(id);
            return Result.success("删除成功!");
            Envelop envelop = appFegin.deleteApp(id, schemaName);
            if(envelop.isSuccessFlg()){
                return Result.success("删除成功!");
            }else {
                return Result.error("删除失败!");
            }
        } catch (Exception e) {
            e.printStackTrace();
            return Result.error("删除失败!");
@ -170,7 +244,15 @@ public class AppController extends BaseController {
            SystemApp obj = new SystemApp();
            BeanUtils.populate(obj, request.getParameterMap());
            return appManager.updateApp(obj);
            JSONObject jsonObj = JSONObject.fromObject(obj);
            String schemaName = LocalContext.getContext().getAttachment(ContextAttributes.SCHEMA);
            SystemApp app = appFegin.updateApp(jsonObj.toString(),schemaName);
            if(app!=null){
                return Result.success("更新成功");
            }else{
                return Result.error("更新失败,应用Code已存在");
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            return Result.error(ex.getMessage());
@ -196,7 +278,7 @@ public class AppController extends BaseController {
     */
    @RequestMapping("/getAppServiceList")
    @ResponseBody
    public Result getAppServiceList(HttpServletRequest request,String name,String valid,String appId) {
    public Result getAppServiceList(HttpServletRequest request, String name, String valid, String appId) {
        try {
            Map<String, Object> params = new HashMap<>();
            params.put("name", name);

+ 227 - 0
src/main/java/com/yihu/hos/system/controller/AppFeatureController.java

@ -0,0 +1,227 @@
package com.yihu.hos.system.controller;
import com.yihu.ehr.constants.ApiVersion;
import com.yihu.hos.config.BeanConfig;
import com.yihu.hos.fegin.AppFeatureFegin;
import com.yihu.hos.system.model.AppFeature;
import com.yihu.hos.web.framework.constant.ContextAttributes;
import com.yihu.hos.web.framework.model.Envelop;
import com.yihu.hos.web.framework.thread.LocalContext;
import com.yihu.hos.web.framework.util.controller.BaseController;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import net.sf.json.JSONObject;
import org.apache.commons.beanutils.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.client.RestTemplate;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
/**
 * 应用管理
 */
@RequestMapping("/app/feature")
@Controller
public class AppFeatureController extends BaseController {
    @Autowired
    private BeanConfig beanConfig;
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private AppFeatureFegin appFeatureFegin;
    @Value("${service-gateway.appService}"+ ApiVersion.Version1_0+"/appFeature")
    private String appService;
    /**
     *  应用功能管理界面
     *
     * @param model
     * @return
     */
    @RequestMapping("/initial")
    public String gotoList(Model model, String dataModel){
        model.addAttribute("dataModel",dataModel);
        model.addAttribute("contentPage", "system/app/feature/appFeature");
        return "partView";
    }
    @RequestMapping(value="/list",produces = "application/json;charset=UTF-8")
    @ResponseBody
    public Object search(String parentId, String appId){
        try{
            Map<String, Object> params = new HashMap<>();
            Map<String, Object> filtersMap = new HashMap<>();
            filtersMap.put("parentId",parentId);
            filtersMap.put("appId",appId);
            String filters = JSONObject.fromObject(filtersMap).toString();
            params.put("filters",filters);
            String schemaName = LocalContext.getContext().getAttachment(ContextAttributes.SCHEMA);
            Envelop envelop = appFeatureFegin.getAppFeatureNoPage(filters, null, schemaName);
            return toJson(envelop);
        } catch (Exception e) {
            e.printStackTrace();
            Envelop result = new Envelop();
            result.setSuccessFlg(false);
            result.setErrorMsg("系统错误");
            return toJson(result);
        }
    }
    @RequestMapping(value="/tree",produces = "application/json; charset=utf-8")
    @ResponseBody
    public Object tree(String appId, String appName) {
        Map<String, Object> params = new HashMap<>();
        String schemaName = LocalContext.getContext().getAttachment(ContextAttributes.SCHEMA);
        params.put("schemaName",schemaName);
        params.put("appId",appId);
        params.put("appName",appName);
        ResponseEntity<String> responseEntity = restTemplate.getForEntity(appService+"/tree?appId={appId}&appName={appName}&schemaName={schemaName}", String.class,params);
        return responseEntity.getBody();
    }
    @RequestMapping("/gotoModify")
    public Object gotoModify(Model model, Integer id, String mode, String extParms,String appId,Integer parentId){
        try {
            Envelop envelop = new Envelop();
            Map<String, Object> params = new HashMap<>();
            params.put("id",id);
            params.put("mode",mode);
            params = putAll(extParms, params);
            if (!StringUtils.isEmpty(id)){ //如果id不为空,则通过微服务查询
                String schemaName = LocalContext.getContext().getAttachment(ContextAttributes.SCHEMA);
                envelop = appFeatureFegin.getById(id,schemaName);
            }
            Object appFeature;
            if(envelop.getObj()==null){
                AppFeature tem = new AppFeature();
                tem.setAppId(appId);
                tem.setParentId(parentId);
                appFeature = tem;
            } else {
                appFeature =envelop.getObj();
            }
            model.addAttribute("model",appFeature);
            model.addAttribute("mode",mode);
            if("add".equals(mode)){
                model.addAttribute("contentPage", "/system/app/feature/dialog");
                model.addAttribute("flag", "");
            }else {
                model.addAttribute("contentPage", "/system/app/feature/dialog");
                model.addAttribute("flag", "disabled");
            }
            model.addAttribute("staged", params.get("staged"));
            return "pageView";
        } catch (Exception e) {
            e.printStackTrace();
            Envelop result = new Envelop();
            result.setSuccessFlg(false);
            result.setErrorMsg("系统错误");
            return result;
        }
    }
    /**
     * 新增应用功能
     * @param request
     * @return
     */
    @RequestMapping("/add")
    @ResponseBody
    public Envelop add(HttpServletRequest request) {
        Envelop envelop = new Envelop();
        try {
            AppFeature obj = new AppFeature();
            BeanUtils.populate(obj, request.getParameterMap());
            obj.setId(null);
            Map<String, Object> params = new HashMap<>();
            String schemaName = LocalContext.getContext().getAttachment(ContextAttributes.SCHEMA);
            params.put("schemaName",schemaName);
            JSONObject jsonObj = JSONObject.fromObject(obj);
            AppFeature feature = appFeatureFegin.create(jsonObj.toString(),schemaName);
            if(feature!=null){
                envelop.setSuccessFlg(true);
                envelop.setObj(feature);
                return envelop;
            }else{
                envelop.setSuccessFlg(false);
                envelop.setObj(feature);
                envelop.setErrorMsg("保存失败");
                return envelop;
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            envelop.setSuccessFlg(false);
            envelop.setErrorMsg(ex.getMessage());
            return envelop;
        }
    }
    @RequestMapping("/existence")
    @ResponseBody
    public Object isExistence(String filters){
        try {
            String schemaName = LocalContext.getContext().getAttachment(ContextAttributes.SCHEMA);
            Envelop envelop = appFeatureFegin.isExist(filters, schemaName);
            return toJson(envelop);
        } catch (Exception e) {
            e.printStackTrace();
            Envelop result = new Envelop();
            result.setSuccessFlg(false);
            result.setErrorMsg("系统错误");
            return toJson(result);
        }
    }
    @RequestMapping(value = "/delete", method = RequestMethod.DELETE)
    @ApiOperation(value = "删除AppFeature")
    @ResponseBody
    public Envelop deleteAppFeature(
            @ApiParam(name = "id", value = "id", defaultValue = "")
            @RequestParam(value = "id") Integer id) {
        String schemaName = LocalContext.getContext().getAttachment(ContextAttributes.SCHEMA);
        Envelop envelop = appFeatureFegin.delete(id,schemaName);
        return envelop;
    }
    private String nullToSpace(String str){
        if(str == null)
            return "";
        return str;
    }
    //public Map beforeGotoModify(Map params){
    //
    //    return params;
    //}
    //
    //public Object afterGotoModify(Object rs, Map params){
    //
    //    return rs;
    //}
}

+ 1 - 1
src/main/java/com/yihu/hos/system/controller/SystemController.java

@ -1,12 +1,12 @@
package com.yihu.hos.system.controller;
import com.yihu.hos.common.constants.ContextAttributes;
import com.yihu.hos.interceptor.LocalContext;
import com.yihu.hos.system.service.SystemManager;
import com.yihu.hos.tenant.model.TenantSession;
import com.yihu.hos.tenant.service.AuthenticateService;
import com.yihu.hos.web.framework.model.ActionResult;
import com.yihu.hos.web.framework.model.Result;
import com.yihu.hos.web.framework.thread.LocalContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

+ 130 - 0
src/main/java/com/yihu/hos/system/model/AppFeature.java

@ -0,0 +1,130 @@
package com.yihu.hos.system.model;
import javax.persistence.*;
/**
 * apps_api_feature对象。
 *
 * @author linzhuo
 * @version 1.0
 * @created 2016年7月7日17:45:30
 */
@Entity
@Table(name = "apps_feature")
public class AppFeature {
    private Integer id;
    private String code;
    private String name;
    private String description;
    private String type;
    private int parentId;
    private String url;
    private String iconUrl;
    private String auditLevel;
    private String openLevel;
    private String appId;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    @Column(name = "name", nullable = true)
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Column(name = "description", nullable = true)
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    @Column(name = "code", nullable = true)
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    @Column(name = "type", nullable = true)
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    @Column(name = "parent_id", nullable = true)
    public int getParentId() {
        return parentId;
    }
    public void setParentId(int parentId) {
        this.parentId = parentId;
    }
    @Column(name = "url", nullable = true)
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    @Column(name = "icon_url", nullable = true)
    public String getIconUrl() {
        return iconUrl;
    }
    public void setIconUrl(String iconUrl) {
        this.iconUrl = iconUrl;
    }
    @Column(name = "audit_level", nullable = true)
    public String getAuditLevel() {
        return auditLevel;
    }
    public void setAuditLevel(String auditLevel) {
        this.auditLevel = auditLevel;
    }
    @Column(name = "open_level", nullable = true)
    public String getOpenLevel() {
        return openLevel;
    }
    public void setOpenLevel(String openLevel) {
        this.openLevel = openLevel;
    }
    @Column(name = "app_id", nullable = true)
    public String getAppId() {
        return appId;
    }
    public void setAppId(String appId) {
        this.appId = appId;
    }
}

+ 80 - 2
src/main/java/com/yihu/hos/system/model/SystemApp.java

@ -1,5 +1,7 @@
package com.yihu.hos.system.model;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
/**
@ -11,19 +13,95 @@ public class SystemApp implements java.io.Serializable {
	// Fields
	private String id;
	private String code; //Ӣ����
	private String code; //
	private String name;
	private String appKey;
	private String appType;
	private String orgId;
	private String englishName;
	private String status;
	private String appUrl;
	private String appSecret;
	private String icon;
	private String developer;
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+08:00")
	private Date createDate;
	// Constructors
	private String creator;
	private String auditor;
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+08:00")
	private Date auditTime;
	private String description;
	private String tags;
	private Integer sourceType;
	private Integer releaseFlag;
	public String getEnglishName() {
		return englishName;
	}
	public void setEnglishName(String englishName) {
		this.englishName = englishName;
	}
	public String getCreator() {
		return creator;
	}
	public void setCreator(String creator) {
		this.creator = creator;
	}
	public String getAuditor() {
		return auditor;
	}
	public void setAuditor(String auditor) {
		this.auditor = auditor;
	}
	public Date getAuditTime() {
		return auditTime;
	}
	public void setAuditTime(Date auditTime) {
		this.auditTime = auditTime;
	}
	public String getDescription() {
		return description;
	}
	public void setDescription(String description) {
		this.description = description;
	}
	public String getTags() {
		return tags;
	}
	public void setTags(String tags) {
		this.tags = tags;
	}
	public Integer getSourceType() {
		return sourceType;
	}
	public void setSourceType(Integer sourceType) {
		this.sourceType = sourceType;
	}
	public Integer getReleaseFlag() {
		return releaseFlag;
	}
	public void setReleaseFlag(Integer releaseFlag) {
		this.releaseFlag = releaseFlag;
	}
// Constructors
	/** default constructor */
	public SystemApp() {

+ 1 - 1
src/main/java/com/yihu/hos/system/service/AppManager.java

@ -5,13 +5,13 @@ import com.yihu.hos.common.constants.ContextAttributes;
import com.yihu.hos.config.MongoConfig;
import com.yihu.hos.core.log.Logger;
import com.yihu.hos.core.log.LoggerFactory;
import com.yihu.hos.interceptor.LocalContext;
import com.yihu.hos.system.dao.AppDao;
import com.yihu.hos.system.dao.AppServiceDao;
import com.yihu.hos.system.model.SystemApp;
import com.yihu.hos.system.model.SystemServiceEndpoint;
import com.yihu.hos.web.framework.constant.EndPointConstant;
import com.yihu.hos.web.framework.model.Result;
import com.yihu.hos.web.framework.thread.LocalContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

+ 1 - 1
src/main/java/com/yihu/hos/system/service/FlowManager.java

@ -4,7 +4,6 @@ import com.yihu.hos.common.constants.ContextAttributes;
import com.yihu.hos.config.BeanConfig;
import com.yihu.hos.core.datatype.ClassFileUtil;
import com.yihu.hos.core.file.FileUtil;
import com.yihu.hos.interceptor.LocalContext;
import com.yihu.hos.services.ServiceFlowEventService;
import com.yihu.hos.system.dao.FlowClassDao;
import com.yihu.hos.system.dao.FlowDao;
@ -17,6 +16,7 @@ import com.yihu.hos.web.framework.model.ActionResult;
import com.yihu.hos.web.framework.model.DictItem;
import com.yihu.hos.web.framework.model.Result;
import com.yihu.hos.web.framework.model.bo.ServiceFlow;
import com.yihu.hos.web.framework.thread.LocalContext;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;

+ 1 - 1
src/main/java/com/yihu/hos/system/service/SystemManager.java

@ -2,10 +2,10 @@ package com.yihu.hos.system.service;
import com.yihu.hos.common.constants.ContextAttributes;
import com.yihu.hos.core.datatype.StringUtil;
import com.yihu.hos.interceptor.LocalContext;
import com.yihu.hos.system.model.SystemUser;
import com.yihu.hos.tenant.model.TenantSession;
import com.yihu.hos.web.framework.model.ActionResult;
import com.yihu.hos.web.framework.thread.LocalContext;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

+ 2 - 2
src/main/java/com/yihu/hos/tenant/service/AuthenticateService.java

@ -1,10 +1,10 @@
package com.yihu.hos.tenant.service;
import com.yihu.hos.common.constants.ContextAttributes;
import com.yihu.hos.interceptor.LocalContext;
import com.yihu.hos.system.dao.UserDao;
import com.yihu.hos.tenant.model.TenantModel;
import com.yihu.hos.tenant.model.TenantSession;
import com.yihu.hos.system.dao.UserDao;
import com.yihu.hos.web.framework.thread.LocalContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

+ 3 - 1
src/main/resources/application.yml

@ -56,7 +56,8 @@ hos:
  zbus:
    url: 172.19.103.57:9020
  filesystem:
    url: http://172.19.103.57:9010/dfs/file
    url: http://172.19.103.37:9010/dfs/file
  mysql:
    filePath: e://learn.sql   #租户基础表 sql文件位置
service-gateway:
@ -66,6 +67,7 @@ service-gateway:
  oauth2RedictUrl: http://192.168.131.106:8083/ehr/login/signinReport
  oauth2ReportClientId: 2YTOSRI0tw
  url: http://172.19.103.37:9999/api
  appService: http://127.0.0.1:10500
---
spring:
  profiles: test

+ 41 - 1
src/main/resources/resource/SystemApp.hbm.xml

@ -35,6 +35,11 @@
                <comment>机构id</comment>
            </column>
        </property>
        <property name="englishName" type="java.lang.String">
            <column name="english_name" length="50">
                <comment>英文名</comment>
            </column>
        </property>
        <property name="status" type="java.lang.String">
            <column name="status" length="10">
                <comment>状态</comment>
@ -62,9 +67,44 @@
            </column>
        </property>
        <property name="createDate" type="java.util.Date">
            <column name="create_date" length="10">
            <column name="create_date" length="7">
                <comment>创建时间</comment>
            </column>
        </property>
        <property name="creator" type="java.lang.String">
            <column name="creator" length="32">
                <comment>创建者</comment>
            </column>
        </property>
        <property name="auditor" type="java.lang.String">
            <column name="auditor" length="32">
                <comment>审核者</comment>
            </column>
        </property>
        <property name="auditTime" type="java.util.Date">
            <column name="audit_time" length="10">
                <comment>审核时间</comment>
            </column>
        </property>
        <property name="description" type="java.lang.String">
            <column name="description" length="500">
                <comment>应用描述</comment>
            </column>
        </property>
        <property name="tags" type="java.lang.String">
            <column name="tags" length="100">
                <comment>应用标签</comment>
            </column>
        </property>
        <property name="sourceType" type="java.lang.Integer">
            <column name="source_type" length="20">
                <comment>应用来源</comment>
            </column>
        </property>
        <property name="releaseFlag" type="java.lang.Integer">
            <column name="release_flag" length="11">
                <comment>是否上线</comment>
            </column>
        </property>
    </class>
</hibernate-mapping>

+ 0 - 1
src/main/webapp/WEB-INF/ehr/jsp/standard/integration/importDataJs.jsp

@ -100,7 +100,6 @@
            }
          })
          self.$importdel.bind("click",function(){//删除
            debugger
            var obj=$(this);
            var textObj=$(this).closest("div").find("input[type='text']");
            var upObj=obj.closest("div").find(".btn.up");//浏览的按钮

+ 8 - 1
src/main/webapp/WEB-INF/ehr/jsp/system/app/appJs.jsp

@ -50,6 +50,7 @@
                        var html = '<div class="m-inline-buttons" style="width:350px;">';
                        html += "<a class=\"m-btn\" style=\"padding-right:10px\" onclick=\"app.editorDialog('"+row.id+"','disabled')\">查看详情</a>";
                        html += "<a class=\"m-btn\" style=\"padding-right:10px\" onclick=\"app.appServiceManage('"+row.id+"')\">服务管理</a>";
                        html += "<a class=\"m-btn\" style=\"padding-right:10px\" onclick=\"app.appFunctionManage('"+row.id+"','"+row.name+"')\">功能管理</a>";
//                        html += "<a class=\"m-btn\"  onclick=\"app.dialogDetail('"+row.id+"')\">应用标准</a>";
                        html += "<a class=\"m-btn-edit\" onclick=\"app.editorDialog('"+row.id+"','')\"></a>";
                        html += "<a class=\"m-btn-delete\" onclick=\"app.delete('"+row.id+"','"+row.icon+"')\"></a>";
@ -163,7 +164,13 @@
        appServiceManage: function (id) {
            indexPage.openChildPage("",'${contextRoot}/app/initAppService?appId='+id);
        },
    anthorize: function (id) {
        appFunctionManage: function (id,name) {
            var data = {
                'dataModel':id+","+name
            }
            indexPage.openChildPage("",'${contextRoot}/app/feature/initial','',data);
        },
        anthorize: function (id) {
        },
        //弹窗返回

+ 113 - 0
src/main/webapp/WEB-INF/ehr/jsp/system/app/feature/appFeature.jsp

@ -0,0 +1,113 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="utf-8" %>
<%@include file="/WEB-INF/ehr/commons/jsp/commonInclude.jsp" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!--######用户管理页面Title设置######-->
<style>
    .grid_edit {
        display: inline-block;
        width: 40px;
        height: 40px;
        cursor: pointer;
        background: url(/esb/develop/images/bianji01_btn.png) center no-repeat;
    }
    .grid_delete {
        display: inline-block;
        width: 40px;
        height: 40px;
        cursor: pointer;
        background: url(/esb/develop/images/shanchu01_btn.png) center no-repeat;
    }
    .m-grid-body{
        width:100% !important;
    }
    .l-grid-body-inner{
        width:100% !important;
    }
    .l-grid-body-table{
        width:100% !important;
    }
    .l-grid-row-cell-inner{
        width:100% !important;
    }
    .row-icon{
        width: 16px;
        height: 16px;
        float: left;
        margin-top: 12px;
        margin-right: 10px;
        margin-left: 5px;
    }
    .image-create{
        display: inline-block;
        margin-left: -4px;
        margin-top: 10px;
        width: 20px;
        height: 30px;
        background: url(${staticRoot}/images/tianjia_btn.png) no-repeat;
    }
    .image-create:hover{
        cursor: pointer;
        background: url(${staticRoot}/images/tianjia_pre.png) no-repeat;
    }
    .retrieve-border{
        display:block;
        border: 1px solid #D6D6D6;
        border-bottom: 0px
    }
    .l-tree .l-tree-text-height{
        height: 22px;
        line-height: 22px;
    }
    .l-tree span{
        height: 22px;
        line-height: 22px;
    }
    .body-head input{
        border: 0;
        font-size: 12px;
        width: 120px;
    }
    .back{
        border-right: 1px solid #d3d3d3;
    }
    .l-grid-tree-content div{
        line-height: 40px;
     }
    #div_right .l-grid-row-cell .l-grid-row-cell-inner div{
        line-height: 40px;
        text-align: center;
    }
</style>
<!-- ####### 页面部分 ####### -->
<div class="m-content">
    <!-- ####### 查询条件部分 ####### -->
    <div class="m-form-inline">
        <div class="m-form-group">
            <div class="m-form-control">
                <div id="div_back" class="l-button">
                    <span>返回</span>
                </div>
            </div>
        </div>
    </div>
    <div id="grid_content" style="width: 100%">
        <!--   属性菜单 -->
        <div id="div_left" style=" width:360px;float: left;">
            <div id="treeMenuWrap" style="border: 1px solid #D6D6D6; width: 360px; height: 100px; overflow: hidden">
                <div style="width: 360px">
                    <div id="treeMenu" style="margin-top: -42px;  "></div>
                </div>
            </div>
        </div>
        <!--   列表   -->
        <div id="div_right" style="float: left;width: 700px;margin-left: 10px">
            <div id="rightGrid"></div>
        </div>
    </div>
</div>

+ 356 - 0
src/main/webapp/WEB-INF/ehr/jsp/system/app/feature/appFeatureJs.jsp

@ -0,0 +1,356 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="utf-8" %>
<%@include file="/WEB-INF/ehr/commons/jsp/commonInclude.jsp" %>
<script src="${staticRoot}/lib/ehrjs/formFieldTools.js"></script>
<script src="${staticRoot}/lib/ehrjs/ligerGridEx.js"></script>
<script src="${staticRoot}/lib/plugin/scrollbar/jquery.mCustomScrollbar.js"></script>
<script src="${staticRoot}/lib/module/pubsub.js"></script>
<script src="${staticRoot}/lib/ehrjs/gridTools.js"></script>
<script src="${staticRoot}/lib/ehrjs/searchTree.js"></script>
<script src="${staticRoot}/lib/ligerui/plugins/ligerGrid.js"></script>
<script src="${staticRoot}/lib/module/ajax.js"></script>
<script src="${staticRoot}/lib/module/baseObject.js"></script>
<script src="${staticRoot}/lib/module/dataModel.js"></script>
<script src="${staticRoot}/lib/plugin/notice/topNotice.js"></script>
<style>
    .row-icon{
        width: 16px;
        height: 16px;
        float: left;
        margin-top: 12px;
        margin-right: 10px;
        margin-left: 5px;
    }
    .image-create{
        display: inline-block;
        margin-left: -4px;
        margin-top: 10px;
        width: 20px;
        height: 30px;
        background: url(${staticRoot}/images/tianjia_btn.png) no-repeat;
    }
    .image-create:hover{
        cursor: pointer;
        background: url(${staticRoot}/images/tianjia_pre.png) no-repeat;
    }
    .retrieve-border{
        display:block;
        border: 1px solid #D6D6D6;
        border-bottom: 0px
    }
    .l-tree .l-tree-text-height{
        height: 22px;
        line-height: 22px;
    }
    .l-tree span{
        height: 22px;
        line-height: 22px;
    }
    .body-head input{
        border: 0;
        font-size: 12px;
        width: 120px;
    }
    .back{
        border-right: 1px solid #d3d3d3;
    }
</style>
<script>
    var Util = $.Util;
    var p = '${dataModel}'.split(",");
    var contentH = $('.l-layout-center').height();
    var urls = {
        gotoModify: '${contextRoot}/app/feature/gotoModify',
        tree: '${contextRoot}/app/feature/tree',
        list: '${contextRoot}/app/feature/list',
        del: '${contextRoot}/app/feature/delete',
        existence: "${contextRoot}/app/feature/existence"
    };
    var initSub = function () {
        $('#btn_back').click(function () {
            $('#contentPage').empty();
            $('#contentPage').load('${contextRoot}/app/initial', {dataModel: 1});
        });
    }();
    var master = {
        tree: undefined,
        dialog: undefined,
        init: function () {
            var m = this;
            m.rendTreeGrid();
        },
        rendTreeGrid: function () {
            function collapse(grid, data){
                for(var i=0;i<data.length;i++){
                    var row = data[i];
                    if(row.children && row.children.length>0){
                        grid.collapse(row);
                        collapse(grid, row.children)
                    }
                }
            }
            this.tree = $("#treeMenu").ligerGrid($.LigerGridEx.config({
                rownumbers: false,
                allowAdjustColWidth: false,
                usePager: false,
                height: contentH - 12,
                tree: {columnId: 'name', parentIDFieldName:'parentId'},
                url: urls.tree,
                parms: {appId: p[0], appName: p[1]},
                columns: [
                    {
                        display: '组织结构名称', name: 'name', id: 'name', align: 'left', width: '290',
                        render: function (row) {
                            var iconName = "";
                            switch (parseInt(row.type)){
                                case 0: iconName= '1ji_icon'; break;
                                case 1: iconName= '2ji_icon'; break;
                                case 2: iconName= '3ji_icon'; break;
                                default : iconName= '3ji_icon';
                            }
                            return '<img src="${contextRoot}/develop/images/'+ iconName +'.png" class="row-icon">' +
                                '<div id="t_'+ row.id +'">'+ row.name +'</div>';
                        }
                    },
                    {
                        display: '操作', name: 'operator', align: 'left', width: '70', render: function (row) {
                        var html =
                            '<a class="image-create" href="#" title="新增" ' +
                            'onclick="javascript:' + Util.format("$.publish('{0}',['{1}','{2}','{3}','{4}', '{5}'])", "app:plf:man:modify", row.id, 'add', row.type, 0, row.__id) + '"></a>';
                        if(row.id>0){
                            html +=  '<a class="grid_delete" href="#" style="width: 30px; margin-left:4px" title="删除" ' +
                                'onclick="javascript:' + Util.format("$.publish('{0}',['{1}', '{2}', '{3}', '{4}'])", "app:plf:man:del", row.id, 0, row.__id, undefined, undefined, row.url) + '"></a>';
                        }
                        return html;
                    }
                    }
                ],
                onSelectRow: function (rowData, rowId, rowObj) {
                    em.find(rowData.id);
                },
                onDblClickRow: function (rowData, rowId, rowObj) {
                    if( rowData.id){
                        em.gotoModify(undefined, rowData.id, 'view', rowData.type, 0, rowId);
                    }
                },
                onAfterShowData:function(currentData){
                    var modules = currentData.detailModelList[0].children;
                    if(modules && modules.length>0)
                        collapse(this, modules);
                }
            }));
        }
    }
    var em = {
        grid: undefined, dialog: undefined, params: {},
        //初始化
        init: function () {
            var m = this;
            m.rendGrid();
            m.publishFunc();
        },
        //初始化表格
        rendGrid: function () {
            var m = em;
            var columns = [
                {display: 'ID', name: 'id', hide: true},
                {display: '名称', name: 'name', width: '20%', align: 'left'},
                {display: '编码', name: 'code', width: '20%', align: 'left'},
                {display: 'URL', name: 'url', width: '40%', align: 'left'},
                {display: '操作', name: 'operator', width: '20%', render: m.opratorRender}];
            m.grid = initGrid($('#rightGrid'), urls.list, {}, columns, {
                delayLoad: true,
                rownumbers: true,
                usePager: false,
                heightDiff: 20,
                checkbox: false,
                onDblClickRow: function (rowData, rowId, rowObj) {
                    em.gotoModify(undefined, rowData.id, 'view', rowData.type, 0, rowId);
                }
            });
        },
        //操作栏渲染器
        opratorRender: function (row) {
            var vo = [
                {
                    type: 'edit',
                    clkFun: "$.publish('app:plf:man:modify',['" + row['id'] + "', 'modify', '" + row['type'] + "', '1', '"+ row.__id +"'])"
                },
                {type: 'del',
                    clkFun: "$.publish('app:plf:man:del',['" + row['id'] + "', 1, '" + row.__id + "', '" + row.parentId + "', '" + row.type + "', '" + row.url + "'])"}
            ];
            return initGridOperator(vo);
        },
        //修改、新增点击事件
        gotoModify: function (event, id, mode, type, frm, rowId) {
            var params;
            if(mode == 'add'){
                em.params = {upType: type, upId: id, frm: frm, appId: p[0], rowId: rowId};
                var appId = em.params.appId;
                var parentId =em.params.upId;
                params = {mode: mode,appId:appId,parentId:parentId};
            }else{
                em.params = {frm: frm,  rowId: rowId}
                params = {id: id, mode: mode, rowId: rowId}
            }
            var title = mode=='add'?'新增': mode=='modify'? '修改': '查看';
            em.dialog = $.ligerDialog.open({
                height: 600,
                width: 500,
                title: title,
                url: urls.gotoModify,
                //load: true,
                urlParms: params
            });
        },
        del: function (event, id, frm, rowId, parentId, type, url) {
            function del(){
                $.ligerDialog.confirm("确定删除?", function (yes) {
                    if (yes){
                        var dialog = $.ligerDialog.waitting('正在处理中,请稍候...');
                        var dataModel = $.DataModel.init();
                        var extParms = {url: url};
                        dataModel.updateRemote(urls.del, {
                            //data: {ids: id, idField: "id", type: "uniq", extParms: JSON.stringify(extParms),_method:"delete"},
                            data: {id: id,_method:"delete"},
                            success: function (data) {
                                if (data.successFlg) {
                                    $.Notice.success('删除成功!');
                                    if(frm==0)
                                        master.tree.remove(master.tree.getRow(rowId));
                                    else{
                                        if(type==3){
                                            em.grid.remove(em.grid.getRow( rowId ));
                                        }else{
                                            var cell = $('#t_'+ id, $('#treeMenu')).parent().parent().parent().parent();
                                            var treeRowId = $(cell).attr('id').split('|')[2];
                                            master.tree.remove( master.tree.getRow( treeRowId ) );
                                            cell = $('#t_'+ parentId, $('#treeMenu')).parent().parent().parent().parent();
                                            treeRowId = $(cell).attr('id').split('|')[2];
                                            master.tree.select( master.tree.getRow( treeRowId ) );
                                        }
                                    }
                                } else {
                                    $.Notice.error(data.errorMsg);
                                }
                            },
                            complete: function () {dialog.close();},
                            error: function(){$.Notice.error('请求错误!');}
                        });
                    }
                });
            }
            var dataModel = $.DataModel.init();
            dataModel.updateRemote(urls.existence, {
                data: {filters: "{'parentId':"+id+"}"},
                success: function (data) {
                    if (data.successFlg) {
                        if(!data.obj)
                            del();
                        else
                            $.Notice.error("该删除项存在子项,请先删除子项!");
                    } else {
                        $.Notice.error("验证错误!");
                    }
                },
                error: function(){$.Notice.error('请求出错!');}
            });
        },
        //查询列表方法
        find: function (upId) {
            //var params = {filters: "appId="+ p[0] +";parentId=" + (upId || upId==0  ? upId : -1), page: 1, rows: 999}
            var data={
                appId:p[0],
                parentId:upId || upId==0  ? upId : -1
            }
            reloadGrid(this.grid, 1, data);
        },
        //公开方法
        publishFunc: function () {
            var m = em;
            $.subscribe('app:plf:man:modify', m.gotoModify);
            $.subscribe('app:plf:man:del', m.del);
            $('#div_back').click(function () {
                em.returnAppManage();
            });
        },
        //弹窗返回
        dialogSuccess: function (msg, data) {
            em.dialog.close();
            if (msg) {
                $.Notice.success(msg);
                if (em.params.frm == 0) {
                    if (em.params.upType == 2) {
                        em.grid.appendRow(data.obj);
                    } else {
                        var parent = master.tree.getRow(em.params.rowId);
                        master.tree.appendRow(data.obj, parent);
                        master.tree.select(parent);
                    }
                } else {
                    var rowDom = em.grid.getRow(em.params.rowId);
                    em.grid.updateRow(rowDom, data.obj);
                }
            }
        },
        returnAppManage: function () {
            em.loadPage('${contextRoot}/app/initial'),"","";
        },
        //加载页面
        loadPage: function (url, data, fun) {
            try {
                var me = this;
                me.loading();
                var div = $("<div class='m-index-content'></div>").load(url, data, function () {
                    if (fun != undefined && typeof fun == 'function') {
                        fun();
                    }
                });
                $('#divIndexContent').html(div);
            }
            catch (e) {
                return;
            }
        },
        //加载中
        loading: function () {
            $('#divIndexContent').html("loading...");
        }
    }
    var resizeContent = function () {
        var contentW = $('#grid_content').width();
        var leftW = $('#div_left').width();
        $('#div_right').width(contentW - leftW - 20);
        $('#treeMenuWrap').height(contentH - 104);
        $('#treeMenu').height(contentH - 64);
    };
    resizeContent();
    //窗体改变大小事件
    $(window).bind('resize', resizeContent);
    window.getEditParms = function () {
        return em.params;
    }
    $(function () {
        em.init();
        master.init();
    });
</script>

+ 98 - 0
src/main/webapp/WEB-INF/ehr/jsp/system/app/feature/dialog.jsp

@ -0,0 +1,98 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="utf-8" %>
<%@include file="/WEB-INF/ehr/commons/jsp/commonInclude.jsp" %>
<!--######应用管理页面 > 应用详情模板页######-->
<div id="div_info_form" class="m-form-inline" style="padding-top:10px;" data-role-form>
    <input id="flag" value="${flag}" style="display: none">
    <input id="id" name="id" data-attr-scan="id" hidden>
    <input id="appId" name="appId" data-attr-scan="appId" hidden>
    <input id="parentId" name="parentId" data-attr-scan="parentId" hidden>
    <input id="openLevel" name="openLevel" data-attr-scan="openLevel" value="1"  hidden>
    <div class="m-form-group">
        <label><span class="red">*&nbsp;</span>名称:</label>
        <div class="m-form-control ">
            <div class="l-text">
                <input type="text" class="l-text-field required" placeholder="请输入名称" name="name"/>
            </div>
        </div>
    </div>
    <div class="m-form-group">
        <label><span class="red">*&nbsp;</span>编码:</label>
        <div class="m-form-control">
            <div class="l-text">
                <input type="text" class="l-text-field required" placeholder="请输入编码" name="code"/>
            </div>
        </div>
    </div>
    <div class="m-form-group">
        <label><span class="red">*&nbsp;</span>类型:</label>
        <div class="m-form-control ">
            <div class="l-text">
                <input type="text" id="type" class="l-text-field required" name="type">
            </div>
        </div>
    </div>
    <div class="m-form-group">
        <label><span class="red">*&nbsp;</span>审计要求:</label>
        <div class="m-form-control ">
            <div class="l-text">
                <input type="text" id="audit" class="l-text-field required" name="auditLevel">
            </div>
        </div>
    </div>
    <div class="m-form-group">
        <label><span class="red">*&nbsp;</span>图标URL:</label>
        <div class="m-form-control">
            <div class="l-text">
                <input type="text" class="l-text-field required" placeholder="请输入图标URL" name="iconUrl"/>
            </div>
        </div>
    </div>
    <div class="m-form-group">
        <label><span class="red">*&nbsp;</span>URL:</label>
        <div class="m-form-control">
            <div class="l-text">
                <input type="text" class="l-text-field required" placeholder="请输入URL" name="url"/>
            </div>
        </div>
    </div>
    <div class="m-form-group">
        <label><span class="red">*&nbsp;</span>说明:</label>
        <div class="m-form-control">
            <div class="l-text">
                <input type="text" class="l-text-field required" placeholder="请输入说明" name="description"/>
            </div>
        </div>
    </div>
    <div class="m-form-group" style="display: none;">
        <input name="id" hidden="hidden"/>
    </div>
    <div class="m-form-bottom"><!--  class="m-form-bottom" -->
        <div id="btnCancel" class="l-button l-button-no">
            <span>关闭</span>
        </div>
        <div id="btnEditor" class="l-button" style="display: no">
            <span>编辑</span>
        </div>
        <div id="btnSave" class="l-button">
            <span>保存</span>
        </div>
    </div>
</div>
<style>
    .m-form-group label {
        width: 135px;
    }
    .btnGrayUp.required {
        border: #FF7777 1px solid;
        float: left;
    }
</style>

+ 139 - 0
src/main/webapp/WEB-INF/ehr/jsp/system/app/feature/dialogJs.jsp

@ -0,0 +1,139 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="utf-8" %>
<%@include file="/WEB-INF/ehr/commons/jsp/commonInclude.jsp" %>
<script type="text/javascript">
    /* *************************** 模块初始化 ***************************** */
    var oldFileId = "";
    var editorParam = {
        actionUrl: "${contextRoot}/app/feature/add",
        init: function () {
            this.toDisable();
            this.bindEvents();
            this.initForm();
        },
        toDisable: function () {
            if ($("#flag").val() == 'disabled') {
                $("#btnEditor").show();
                $("#btnSave").hide();
                $("input[name='name']").attr("disabled", "disabled");
                $("input[name='code']").attr("disabled", "disabled");
                $("input[name='type']").attr("disabled", "disabled");
                $("input[name='auditLevel']").attr("disabled", "disabled");
                $("input[name='iconUrl']").attr("disabled", "disabled");
                $("input[name='url']").attr("disabled", "disabled");
                $("input[name='description']").attr("disabled", "disabled");
            }else{
                $("#btnEditor").hide();
                $("#btnSave").show();
            }
        },
        initForm: function () {
            var me = this;
            var data;
            var modelString = "${model.id}";
            debugger
            $("#appId").val("${model.appId}");
            $("#parentId").val("${model.parentId}");
            if (modelString != undefined && modelString != null && modelString.length > 0) {
                //liger.get("status").selectValue(status);  todo a
                data = {
                    id: "${model.id}",
                    appId: "${model.appId}",
                    parentId: "${model.parentId}",
                    openLevel: "${model.openLevel}",
                    name: "${model.name}",
                    code: "${model.code}",
                    type: "${model.type}",
                    auditLevel: "${model.auditLevel}",
                    iconUrl: "${model.iconUrl}",
                    url: "${model.url}",
                    description: "${model.description}"
                };
                me.actionUrl = "${contextRoot}/app/updateApp";
            } else {
                //新增
            }
            //todo
            $("#div_info_form").ligerAutoForm({
                data: data,
                validate: {
                    name: "required",
                    appUrl: "required",
                    developer: "required",
                    code: "required",
                    icon: {
                        required: true
                    },
                    appKey: "required",
                    appSecret: {
                        required: true
                    }
                },
            });
        },
        bindEvents: function () {
            var me = this;
            $(".m-form-bottom").on("click", "#btnSave", function () {
                if (!$("#div_info_form").ligerAutoForm("validate")) {
                    return;
                }
                var data = $("#div_info_form").ligerAutoForm("getData");
                $.ajax({ //ajax处理
                    type: "POST",
                    url: me.actionUrl,
                    dataType: "json",
                    data: data,
                    cache: false,
                    success: function (data) {
                        if (data.successFlg) {
                           parent.em.dialogSuccess("保存成功",data);
                        }
                        else {
                            $.ligerDialog.error(data.errorMsg);
                        }
                        $("#btnSave").css("pointer-events", "");
                    },
                    error: function (data) {
                        $.ligerDialog.error("Status:" + data.status + "(" + data.statusText + ")");
                        $("#btnSave").css("pointer-events", "");
                    }
                });
            });
            $(".m-form-bottom").on("click", "#btnEditor", function () {
                $("#btnEditor").hide();
                $("#btnSave").show();
                $("input[name='name']").removeAttr("disabled");
                $("input[name='code']").removeAttr("disabled");
                $("input[name='type']").removeAttr("disabled");
                $("input[name='auditLevel']").removeAttr("disabled");
                $("input[name='iconUrl']").removeAttr("disabled");
                $("input[name='url']").removeAttr("disabled");
                $("input[name='description']").removeAttr("disabled");
                $("#flag").val("");
            });
            $(".m-form-bottom").on("click", "#btnCancel", function () {
                parent.em.dialog.close();
            });
            $("#status").ligerComboBox({
                data: [{"value": "有效", "code": "1"}, {"value": "无效", "code": "0"}],
                cancelable: false,
                onSuccess: function (data) {
                }
            });
        }
    };
    $(function () {
        editorParam.init();
    });
</script>
<script type="text/javascript" src="${staticRoot}/lib/jquery/jqueryform.js"></script>

BIN
src/main/webapp/develop/images/1ji_icon.png


BIN
src/main/webapp/develop/images/2ji_icon.png


BIN
src/main/webapp/develop/images/3ji_icon.png


BIN
src/main/webapp/develop/images/bianji01_btn.png


BIN
src/main/webapp/develop/images/bianji_btn.png


BIN
src/main/webapp/develop/images/bianji_btn_pre.png


BIN
src/main/webapp/develop/images/shanchu01_btn.png


BIN
src/main/webapp/develop/images/shanchu_btn.png


BIN
src/main/webapp/develop/images/shanchu_btn_pre.png


BIN
src/main/webapp/develop/images/tianjia_btn.png


BIN
src/main/webapp/develop/images/tianjia_pre.png


+ 205 - 0
src/main/webapp/develop/lib/ehrjs/formFieldTools.js

@ -0,0 +1,205 @@
/**
 * 初始化文本框
 * @param el dom节点
 * @returns {ligerTextBox}
 */
function initTextDom(el, width, opts){
    var defaultOpts = {width: width || 240};
    opts = $.extend({}, defaultOpts, opts);
    return $(el).ligerTextBox(opts);
}
/**
 * 初始化日期框
 * @param el dom节点
 * @returns {ligerTextBox}
 */
function initDateDom(el, width, opts){
    var defaultOpts = {width: width || 240};
    opts = $.extend({}, defaultOpts, opts);
    return $(el).ligerDateEditor(opts);
}
/**
 * 初始化搜索文本框
 * @param el dom节点
 * @param searchFun 搜索方法
 * @param width 宽
 * @param opts 其他配置信息
 * @returns {ligerTextBox}
 */
function initSearchTextDom(el, searchFun, width, opts){
    var defaultOpts = {
        isSearch: true,
        width: width || 240,
        search: searchFun
    };
    opts = $.extend({}, defaultOpts, opts);
    return $(el).ligerTextBox(opts);
}
/**
 * 初始化普通下拉框
 * @param el dom节点
 * @param url 数据接口
 * @param parms 参数
 * @param opts 其他配置信息
 * @returns {ligerComboBox}
 */
function initSelDom(el, url, params, opts){
    var defaultOpts = {
        url: url,
        valueField: 'code',
        textField: 'value',
        dataParmName: 'detailModelList',
        parms: params
    };
    opts = $.extend({}, defaultOpts, opts);
    if(opts.initVal){
        var onSucFun = opts.onSuccess;
        opts.onSuccess = function(data){
            this.selectValue(opts.initVal);
            if(onSucFun)
                this.call(onSucFun, data);
        }
    }
    return $(el).ligerComboBox(opts);
}
/**
 * 初始化系统字典下拉框
 * @param el dom节点
 * @param dictId 参数
 * @param opts 其他配置信息
 * @returns {ligerComboBox}
 */
function initSystemSelDom(el, dictId, opts){
    var defaultOpts = {
        url: $.Context.PATH + '/dict/searchDictEntryList',
        valueField: 'code',
        textField: 'value',
        dataParmName: 'detailModelList',
        parms: {dictId: dictId, page: 1, rows: 500}
    };
    opts = $.extend({}, defaultOpts, opts);
    if(opts.initVal){
        var onSucFun = opts.onSuccess;
        opts.onSuccess = function(data){
            this.selectValue(opts.initVal);
            if(onSucFun)
                this.call(onSucFun, data);
        }
    }
    return $(el).ligerComboBox(opts);
}
function initValidate($form, onElementValidateForAjax){
    return new  $.jValidation.Validation($form, {
        immediate: true, onSubmit: false,
        onElementValidateForAjax: onElementValidateForAjax || function (elm) {}
    });
}
/**
 * opts {url: '', $form: '', validator: '', parms: '', modelName: '', notIncluded: []}
 * @param opts
 */
function saveForm(opts){
    var $form = opts.$form;
    var validator = opts.validator;
    if(!validator){
        validator = initValidate($form);
    }
    if(!validator.validate())
        return;
    var waittingDialog = $.ligerDialog.waitting('正在保存中,请稍候...');
    var parms = opts.parms;
    if(!parms){
        $form.attrScan();
        var model = $form.Fields.getValues();
        var id = model.id || '';
        if(opts.notIncluded){
            var tmp = opts.notIncluded.split(',');
            for(var i=0; i< tmp.length; i++){
                model[tmp[i]] = undefined;
            }
        }
        parms = {model: JSON.stringify(model), modelName: opts.modelName ? opts.modelName : '', id: id  }
    }
    var dataModel = $.DataModel.init();
    dataModel.createRemote(opts.url, {
        data: parms,
        success: function (data) {
            waittingDialog.close();
            if (data.successFlg) {
                if(opts.onSuccess)
                    opts.onSuccess(data);
                else
                    parent.closeDialog("保存成功!", data);
            } else {
                if (data.errorMsg)
                    $.Notice.error(data.errorMsg);
                else
                    $.Notice.error('出错了!');
            }
        },
        error: function () {
            waittingDialog.close();
        }
    });
}
function fillForm(model, $form){
    $form.attrScan();
    $form.Fields.fillValues(model);
}
function uniqValid(url, filters, errorMsg) {
    var result = new $.jValidation.ajax.Result();
    var dataModel = $.DataModel.init();
    dataModel.fetchRemote(url, {
        data: {filters: filters},
        async: false,
        success: function (data) {
            if(data.successFlg){
                if (data.obj) {
                    result.setResult(false);
                    result.setErrorMsg(errorMsg);
                } else {
                    result.setResult(true);
                }
            } else {
                result.setResult(false);
                result.setErrorMsg("验证出错,请刷新页面或联系管理员!");
            }
        }
    });
    return result;
}
function uniqValid4List(url, filters, errorMsg) {
    var result = new $.jValidation.ajax.Result();
    var dataModel = $.DataModel.init();
    dataModel.fetchRemote(url, {
        data: {filters: filters},
        async: false,
        success: function (data) {
            if(data.successFlg){
                if (data.detailModelList && data.detailModelList.length>0) {
                    result.setResult(false);
                    result.setErrorMsg(errorMsg);
                } else {
                    result.setResult(true);
                }
            } else {
                result.setResult(false);
                result.setErrorMsg("验证出错,请刷新页面或联系管理员!");
            }
        }
    });
    return result;
}

+ 157 - 0
src/main/webapp/develop/lib/ehrjs/gridTools.js

@ -0,0 +1,157 @@
/**
 * 操作栏添加编辑按钮
 * @param clkFun 点击事件
 * @returns {string}
 */
function addEditBtn(clkFun){
    return '<a class="grid_edit" title="编辑" href="#" onclick="javascript:' + clkFun + '"></a>'
}
/**
 * 操作栏添加失效按钮
 * @param clkFun 点击事件
 * @returns {string}
 */
function addLockBtn(clkFun){
    return '<a class="grid_lock" title="失效" href="#" onclick="javascript:' + clkFun + '"></a>'
}
/**
 * 操作栏添加生效按钮
 * @param clkFun 点击事件
 * @returns {string}
 */
function addActiveBtn(clkFun){
    return '<a class="grid_active" title="生效" href="#" onclick="javascript:' + clkFun + '"></a>'
}
/**
 * 操作栏添加删除按钮
 * @param clkFun 点击事件
 * @returns {string}
 */
function addDelBtn(clkFun){
    return '<a class="grid_delete" title="删除" href="#" onclick="javascript:' + clkFun + '"></a>'
}
/**
 * 操作栏添加文字按钮
 * @param text 显示文本
 * @param clkFun 点击事件
 * @returns {string}
 */
function addTextBtn(text, clkFun){
    return '<a class="label_a" title="'+ text +'" style="margin-left:5px;" href="#" onclick="javascript:' + clkFun + '">'+ text +'</a>';
}
/**
 * 初始化操作按钮
 * @param vo 操作按钮集合,[{type: 'edit', clkFun: clkFun}, {type: '适配', clkFun: clkFun}]
 * @returns {string}
 */
function initGridOperator(vo, spiltFlag){
    var oprs = [];
    if($.isArray(vo) && vo.length>0){
        var v, html= '';
        for(var i=0; i<vo.length; i++){
            v = vo[i];
            if(v.type == 'edit')
                html = addEditBtn(v.clkFun);
            else if(v.type == 'del')
                html = addDelBtn(v.clkFun);
            else if(v.type == 'lock')
                html = addLockBtn(v.clkFun);
            else if(v.type == 'active')
                html = addActiveBtn(v.clkFun);
            else
                html = addTextBtn(v.type, v.clkFun);
            oprs.push(html);
        }
    }
    spiltFlag = spiltFlag ? spiltFlag : '';
    return oprs.join(spiltFlag);
}
/**
 * 初始化grid
 * @param el 元素
 * @param url 数据接口
 * @param params 参数
 * @param columns 列配置
 * @param opts 事件集合
 * @returns {ligerGrid}
 */
function initGrid(el, url, params, columns, opts){
    opts = $.extend(
        {},
        {
            url: url,
            parms: params,
            columns: columns,
            selectRowButtonOnly: false,
            checkbox: true,
            allowHideColumn: false
        },
        opts
    );
    var grid = $(el).ligerGrid($.LigerGridEx.config(opts));
    grid.adjustToWidth();
    return grid;
}
/**
 * 初始化grid
 * @param el 元素
 * @param url 数据接口
 * @param params 参数
 * @param columns 列配置
 * @param opts 事件集合
 * @returns {ligerGrid}
 */
function initGridDef(el, url, params, columns, opts){
    var defaults = {
        record: 'totalCount',
        root: 'detailModelList',
        pageSize:15,
        pagesizeParmName: 'rows',
        height:'100%',
        heightDiff: -10,
        rownumbers:true,
        headerRowHeight: 40,
        rowHeight: 40,
        editorTopDiff: 41,
        allowAdjustColWidth: true
    };
    opts = $.extend(
        defaults,
        {
            url: url,
            parms: params,
            columns: columns,
            selectRowButtonOnly: false,
            checkbox: true,
            allowHideColumn: false
        },
        opts
    );
    var grid = $(el).ligerGrid(opts);
    //grid.adjustToWidth();
    return grid;
}
/**
 * 重新加载grid
 * @param curPage 加载页面
 * @param params 参数
 * @param url 路径
 */
function reloadGrid(grid, curPage, params, url) {
    $.Util.reloadGrid.call(grid, url, params, curPage);
}

+ 325 - 0
src/main/webapp/develop/lib/ehrjs/ligerGridEx.js

@ -0,0 +1,325 @@
/**
 * ligerGridEx -v1.0.0 (2015/10/28)
 *
 * @description LigerGrid的相关扩展
 * @example
 * $grid.ligerGrid($.LigerGridEx.config({
 * checkbox: true},{
 * isCheckedMemory: true
 * });
 * @author      yezehua
 * @copyright   2015 www.yihu.com
 */
(function ($, win) {
    var Util = $.Util;
    function f_onCheckAllRow(checked)
    {
        for (var rowid in this.records)
        {
            if(checked)
                addCheckedRecord(this.records[rowid]['id']);
            else
                removeCheckedRecord(this.records[rowid]['id']);
        }
    }
    /*
     该例子实现 表单分页多选
     即利用onCheckRow将选中的行记忆下来,并利用isChecked将记忆下来的行初始化选中
     */
    var checkedRecords = [];
    function findCheckedRecord(id)
    {
        for(var i =0;i<checkedRecords.length;i++)
        {
            if(checkedRecords[i] == id) return i;
        }
        return -1;
    }
    function addCheckedRecord(id)
    {
        if(findCheckedRecord(id) == -1)
            checkedRecords.push(id);
    }
    function removeCheckedRecord(id)
    {
        var i = findCheckedRecord(id);
        if(i==-1) return;
        checkedRecords.splice(i,1);
    }
    function f_isChecked(rowdata)
    {
        if (findCheckedRecord(rowdata.id) == -1)
            return false;
        return true;
    }
    function f_onCheckRow(checked, data)
    {
        if (checked) addCheckedRecord(data.id);
        else removeCheckedRecord(data.id);
    }
    function resizeColumns() {
        var self = this;
        self._initColumns();
        $(self.columns).each(function () {
            if(!this.isrownumber) {
                var newwidth = this._width;
                var g = self, p = self.options;
                if (!newwidth) return;
                newwidth = parseInt(newwidth, 10);
                var column = this;
                if (!column) return;
                //添加.l-grid1 .l-grid-header-table .l-grid-hd-cell 自动计算列宽度,适用于多表头
                $('.l-grid1 .l-grid-header-table .l-grid-hd-cell,.l-grid2 .l-grid-header-table .l-grid-hd-cell',self.element).each(function(){
                    var idx = $(this).attr('columnindex');
                    if(idx){
                        $(this).css('width',self.getColumn(idx)._width);
                    }
                });
                $(document.getElementById(column['__domid'])).css('width', newwidth);
                var cells = [];
                for (var rowid in g.records)
                {
                    var obj = g.getCellObj(g.records[rowid], column);
                    if (obj) cells.push(obj);
                    if (!g.enabledDetailEdit() && g.editors[rowid] && g.editors[rowid][column['__id']])
                    {
                        var o = g.editors[rowid][column['__id']];
                        if (o.editor.resize) o.editor.resize(o.input, newwidth, o.container.height(), o.editParm);
                    }
                }
                for (var i = 0; i < g.totalNumber; i++)
                {
                    var tobj = document.getElementById(g.id + "|total" + i + "|" + column['__id']);
                    if (tobj) cells.push(tobj);
                }
                $(cells).css('width', newwidth).find("> div.l-grid-row-cell-inner:first").css('width', newwidth - 8);
            }
        });
        self._initBuildGridHeader();
        this.gridheader.width(this.gridtablewidth);
        //$("div:first", this.gridheader).width(this.gridtablewidth);
        // $("div:first", this.gridbody).width(this.gridtablewidth);
        updateScroller.apply(self, arguments);
        checkColumnVisable.call(self);
        resizeMinWidth.call(self);
    }
    function updateScroller () {
        var self = this;
        var gridScroll = $('.m-custom-scroll',self.element);
        var pluginPfx = 'mCS';
        var d=gridScroll.data(pluginPfx);
        var scrollWrapper =  $('.m-custom-scroll',this.element),
            mGridBody = $('.m-grid-body', this.element),
            mContainer =  $('.mCSB_container', this.element);
        if($('.l-grid-body-inner',this.gridview1).height() <= $('.l-grid-body-inner',this.gridview1).parent().height()) {
            scrollWrapper.css({
                width: this.gridview2.width(),
                height: this.gridview.height()-40
            });
            mGridBody.css({
                width: this.gridtablewidth - 1,
                height: $('.l-grid-body-inner',this.gridview1).height()
            });
            $('.mCSB_scrollTools_horizontal',this.gridview2).css({
                bottom: 0
            });
        } else {
            scrollWrapper.css({
                width: this.gridview2.width(),
                height: Math.min(this.gridbody.height(),this.gridview.height()-40) - 10
            });
            mGridBody.css({
                width: this.gridtablewidth - 1,
                height: Math.max(this.gridview.height()-40,$('.l-grid-body-table', this.element).height())
            });
            $('.l-grid-body1', this.gridview1).css({
                height: scrollWrapper.height()+10
            });
            $('.mCSB_scrollTools_horizontal',this.gridview2).css({
                bottom: -13
            });
        }
        mContainer.css({
            width: this.gridtablewidth - 1
        });
        self.gridbody.css({
            overflow: 'hidden',
            height:$('.l-grid-body-table', this.element).height()
        });
        if(!d) {
            try {
                self.mScroller = gridScroll.mCustomScrollbar({
                    theme:"minimal-dark",
                    axis:"yx",
                    callbacks:{
                        whileScrolling: function(){
                            self.gridheader[0].scrollLeft = -this.mcs.left;
                            self.f.gridbody[0].scrollTop = -this.mcs.top;
                            //$('.l-grid-editor',self.element).top - self.f.gridbody[0].scrollTop;
                            // 修复滚动条滚动时,gridbody高度不变导致数据无法显示问题
                            self.gridbody.css({
                                height:$('.l-grid-body-table', self.element).height()
                            });
                        },
                        onScroll: function () {
                            //updateScroller.apply(self, arguments);
                        }
                    }
                });
            } catch (e) {
                // console.log(e.message);
            }
        }
        $(".m-custom-scroll",this.gridview2).mCustomScrollbar("update");
    }
    function checkColumnVisable () {
        var self = this;
        $('.l-grid-popup .l-checkbox', self.element).each(function() {
            var $cell = $(this);
            var idx = $cell.attr('columnindex');
            self.toggleCol(parseInt(idx), $cell[0].checked, true);
        });
    }
    function resizeMinWidth() {
        var self = this;
        $(this.columns).each(function () {
            if(this.lWidth && this.lWidth > this._width) {
                self.setColumnWidth(this.columnindex, this.lWidth);
            }
        });
    }
    $.LigerGridEx = {
        config: function (opts,ext) {
            var defaults = {
                // 存储总记录数的字段名
                record: 'totalCount',
                // 数据源字段名
                root: 'detailModelList',
                // 每页记录数
                pageSize:15,
                // 页记录数参数名,(提交给服务器)
                pagesizeParmName: 'rows',
                //width: '98%',
                height:'100%',
                // 高度补差,当设置height:100%时,可能会有高度的误差,可以通过这个属性调整
                heightDiff: -10,
                // 是否显示行序号
                rownumbers:true,
                // 表头行的高度
                headerRowHeight: 40,
                // 行的高度
                rowHeight: 40,
                // 编辑器位置误差调整
                editorTopDiff: 41,
                allowAdjustColWidth: true
            };
            var extOpts = {};
            var ext = ext || {};
            if(ext.adjustToWidth!==false) {
                $.extend(extOpts,{
                    onAfterChangeColumnWidth: function () {
                        updateScroller.apply(this, arguments);
                    },
                    onLoading: function() {
                        this.toggleLoading(true);
                    },
                    onAfterShowData: function () {
                        updateScroller.apply(this, arguments);
                        //var left = parseInt($('.mCSB_scrollTools_horizontal .mCSB_dragger').css('left'));
                        opts.onAfterShowData&&opts.onAfterShowData.apply(this, arguments);
                        $(".m-custom-scroll",this.gridview2).mCustomScrollbar("scrollTo");
                        resizeMinWidth.call(this);
                        var mcs = this.mScroller[0].mcs;
                        if(mcs) {
                            this.gridheader[0].scrollLeft = -mcs.left;
                            this.f.gridbody[0].scrollTop = -mcs.top;
                        }
                    },
                    onAfterAddRow: function () {
                        updateScroller.apply(this, arguments);
                        $(".m-custom-scroll",this.gridview2).mCustomScrollbar("scrollTo","bottom");
                    },
                    onTreeExpanded: function () {
                        this.resizeColumns();
                    },
                    onTreeCollapsed:function () {
                        this.resizeColumns();
                    }
                });
                $.ligerMethos.Grid.adjustToWidth = function () {
                    var self = this;
                    // 修复数据表初始化无数据时,出现横向滚动条问题
                    updateScroller.apply(self, arguments);
                    var timmer = null;
                    $(window).on('resize', function () {
                        if(!timmer) {
                            timmer = setTimeout(function () {
                                self.resizeColumns();
                                win.clearTimeout(timmer);
                                timmer = null;
                            },100);
                        }
                    });
                    $('.l-grid-popup .l-checkbox', self.element).click(function(){
                        updateScroller.apply(self, arguments);
                        $("div:first", self.gridheader).width($('.m-grid-body',self.gridview2).width());
                    });
                };
                $.ligerMethos.Grid.resizeColumns = resizeColumns;
            }
            if(ext.isCheckedMemory) {
                return $.extend({},opts,defaults,{
                    isChecked: function() {
                        var flag = true;
                        if(Util.isFunction(opts.isChecked)){
                            flag = opts.isChecked.apply(this, arguments);
                        }
                        return flag && f_isChecked.apply(this, arguments);
                    },
                    onCheckRow: function() {
                        var flag = true;
                        if(Util.isFunction(opts.onCheckRow)){
                            flag = opts.onCheckRow.apply(this, arguments);
                        }
                        return flag && f_onCheckRow.apply(this, arguments);
                    },
                    onCheckAllRow: function() {
                        var flag = true;
                        if(Util.isFunction(opts.onCheckAllRow)){
                            flag = opts.onCheckAllRow.apply(this, arguments);
                        }
                        return flag && f_onCheckAllRow.apply(this, arguments);
                    }
                });
            } else {
                return $.extend({},defaults,opts,extOpts);
            }
        }
    };
})(jQuery, window);

+ 969 - 0
src/main/webapp/develop/lib/ehrjs/searchTree.js

@ -0,0 +1,969 @@
(function ($, win) {
    function indexOf(source, item){
        for(var i=0; i<source.length; i++){
            if(source[i] == item){
                return i;
            }
        }
        return -1;
    }
    function remove(source, item){
        var rmId = indexOf(source, item);
        if(rmId == -1)
            return source;
        return source.slice(0, rmId).concat(source.slice(rmId+1, source.length));
    }
    function isStrEmpty(str) {
        return str == null || !str || typeof str == undefined || str == '';
    }
    function isJson(obj){
        return typeof(obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length;
    }
    $.fn.ligerSearchTree = function (options)
    {
        return $.ligerui.run.call(this, "ligerSearchTree", arguments);
    };
    $.ligerui.controls.SearchTree = function (element, options)
    {
        var onSuccess = options.onSuccess;
        options.onSuccess = function (data) {
            var g = this;
            g._checkNextSearch(data);
            g.refreshAllCheckedDomStatus(true);
            if(onSuccess) onSuccess.call(this, data);
        }
        var onExpand = options.onExpand;
        options.onExpand = function (e) {
            var g = this;
            g._checkNextSearch(e.data.children);
            if(onExpand)onExpand.call(this, e);
        }
        var onBeforeExpand = options.onBeforeExpand;
        options.onBeforeExpand = function (e) {
            var g = this, p= this.options;
            var dataIndex = g._getDataIndexByDom(e.target);
            if(dataIndex!=-1) g._addCache(dataIndex);
            if(onBeforeExpand)onBeforeExpand.call(this, e);
        }
        var onCheck = options.onCheck;
        options.onCheck = function (e, checked) {
            var g = this, p= this.options;
            if(onCheck) onCheck.call(this, e, checked);
            g.refreshAllCheckedDomStatus(checked);
        }
        var onAfterSSearch = options.onAfterSSearch;
        options.onAfterSSearch = function (e) {
            var g = this
            if(onAfterSSearch) onAfterSSearch.call(this, e);
            g.refreshAllCheckedDomStatus(true);
        }
        var onUnSelect = options.onUnSelect;
        options.onUnSelect = function (e) {
            var g = this, p= this.options;
            if(onUnSelect) onUnSelect.call(this, e);
            if(!p.isSelectToChecked) return;
            var checkbox;
            if((checkbox=$(e.dom).prev()).hasClass('l-checkbox')){
                checkbox.trigger("click");
            }
        }
        $.ligerui.controls.SearchTree.base.constructor.call(this, element, options);
    };
    var options = {
        _searching: false,
        _searchData: {},
        _searchCache: {},
        allCheckDom: undefined,
        onUnSelect: function () {},
        onAfterSSearch: function() {},
        allCheckDom: undefined,     //全选的节点
        onAllChecked: function() {},  //全选事件
        onAllCancelChecked: function() {},  //取消全选事件
        isSelectToChecked: false,
        renderAll: false,   //weitrue时,  delay为true  同样渲染所有节点,但是是隐藏的
        rusultTree: undefined,  // 将选中的数据集放到该树中
        parentTreeDom: undefined,//作废
        childTree: undefined,     //作废
        onBeforeShowData: function(data) {return data;}
    }
    $.ligerDefaults.SearchTree = $.extend({}, $.ligerDefaults.Tree, options);
    $.ligerui.controls.SearchTree.ligerExtend($.ligerui.controls.Tree, {
        //查询
        s_search: function (queryNm) {
            var g= this;
            if (!isStrEmpty(queryNm)) {
                g.hide($(g.element).find("li")); //先隐藏所有节点
                var liArr = $('span[title*="' + queryNm + '"]', g.tree).closest('li');//查询出符合条件的结果集
                var parent;
                if(liArr.length>0){
                    for (var i = 0; i < liArr.length; i++) {
                        $(liArr[i]).show();
                        parent = $(liArr[i]);
                        while((parent = g.getParentTreeItem(parent))!=null){
                            g.expandNode($(parent));
                        }
                    }
                }
            } else {//查询条件为空,则显示所有节点
                g.show($(g.element).find("li"));
            }
            g.trigger("afterSSearch", [g, queryNm]);
        },
        //异步查询 seq为树形id数组["1,1.2,1.2.3", "2,2.3,2.3.5"]
        s_searchForLazy: function (seq) {
            var g= this, p= this.options;
            seq = $.isArray(seq)? seq : [seq];
            if(seq.length==0)
                return;
            p._searching = true;
            var s = [];
            $.each(seq, function (i, v) {
                var ids = v.split(',');
                var dataIndex = g._getTreeDataIndex(ids[0]);
                p._searchData[dataIndex] = {nextIndex: 1, seq: ids};
                s.push(dataIndex);
            })
            g._search(s);
        },
        //清除数据
        removeData : function (treeNode) {
            var g = this, p = this.options;
            treeNode = g.getNodeDom(treeNode);
            var parentNode = g.getParentTreeItem(treeNode);
            var treedataindex = parseInt($(treeNode).attr("treedataindex"));
            var treenodedata = g._getDataNodeByTreeDataIndex(g.data, treedataindex);
            //清除数据
            var parentData;
            if(parentData = g._getDataNodeByTreeDataIndex(g.data, $(parentNode).attr('treedataindex')))
                parentData.children = remove(parentData.children, treenodedata);
            else
                g.data = remove(g.data, treenodedata);
            $(treeNode).remove();
            g._updateStyle(parentNode ? $("ul:first", parentNode) : g.tree);
        },
        expandNode: function (node) {
            $(".l-expandable-close:first", node).addClass('l-expandable-open').removeClass('l-expandable-close');
            $('.l-children:first', node).show();
            $(node).show();
        },
        refreshStatusFromResultTree: function (data) {
            var g= this;
            data = data || g.getData();
        },
        _initAllCheckedDom: function(){
            var g= this, p= this.options, dom = p.allCheckDom;
            if(!dom) return;
            dom.mouseover(function () {
                $(this).parent().addClass('l-over');
            })
            dom.mouseout(function () {
                $(this).parent().removeClass('l-over');
            });
            dom.click(function (e, data) {
                var clz = $(this).attr('class');
                if(clz.indexOf('l-checkbox-checked') != -1)
                    g.unCheckAll(true);
                else
                    g.checkAll(true);
            });
        },
        unCheckAll: function (isTriggerAllCancelEvt) {
            var g= this, p= this.options;
            if(p.allCheckDom)
                $(p.allCheckDom).removeClass('l-checkbox-checked l-checkbox-incomplete').addClass('l-checkbox-unchecked');
            g.selectNode(function (e) {
                if( $(g.getNodeDom(e)).is(':visible'))
                    g.cancelSelect(e);
                return false;
            });
            if(isTriggerAllCancelEvt==undefined || isTriggerAllCancelEvt==true) g.trigger('allCancelChecked', g);
        },
        checkAll: function (isTriggerAllCheckEvt) {
            var g= this, p= this.options;
            if(p.allCheckDom)
                $(p.allCheckDom).removeClass('l-checkbox-incomplete l-checkbox-unchecked').addClass('l-checkbox-checked');
            g.selectNode(function (e) {
                return ! $(g.getNodeDom(e)).is(':hidden');
            })
            if(isTriggerAllCheckEvt==undefined || isTriggerAllCheckEvt==true) g.trigger('allChecked', g);
        },
        refreshAllCheckedDomStatus: function(checked){
            var g= this, p= this.options, allCheckDom = p.allCheckDom;
            if(!allCheckDom) return;
            if(g.isAllChecked())
                allCheckDom.addClass('l-checkbox-checked').removeClass('l-checkbox-unchecked l-checkbox-incomplete');
            else if(g.isEmpty() || g.isNoChecked())
                allCheckDom.addClass('l-checkbox-unchecked').removeClass('l-checkbox-incomplete l-checkbox-checked');
            else
                allCheckDom.addClass('l-checkbox-incomplete').removeClass('l-checkbox-unchecked l-checkbox-checked');
        },
        getDataByNode: function (treenode) {
            var g= this;
            var dataindex = g._getDataIndexByDom(treenode);
            if(dataindex==-1) return {};
            return g._getDataNodeByTreeDataIndex(g.data, dataindex);
        },
        /*****************************************************************************************/
        /**    判断方法                                                                        **/
        /*****************************************************************************************/
        isAllChecked: function () {
            var g= this;
            return !g.isEmpty() && $('.l-box.l-checkbox.l-checkbox-unchecked:visible', g.tree).length==0;
        },
        isNoChecked: function () {
            var g= this;
            return $('.l-box.l-checkbox.l-checkbox-checked:visible', g.tree).length==0;
        },
        isEmpty: function () {
            var g= this;
            return $('.l-body:visible', g.tree).length == 0;
        },
        isExist: function (parentDom, id, outlinelevel) {
            return $(parentDom).find('li[id="'+ id +'"][outlinelevel='+ outlinelevel +']').length>0;
        },
        /*****************************************************************************************/
        /**    异步查询方法                                                                     **/
        /*****************************************************************************************/
        _removeCache: function (dataIndex) {
            var g= this, p= options;
            p._searchCache[dataIndex] = undefined;
        },
        _addCache: function (dataIndex) {
            var p= options;
            p._searchCache[dataIndex] = true;
        },
        _dataInSearch: function (dataIndex) {
            var p= options;
            if(p._searchCache[dataIndex]){
                p._searchCache[dataIndex] = undefined;
                return true;
            }
            return false;
        },
        _search: function (dataIndexs) {
            var g= this, p= this.options;
            dataIndexs = $.isArray(dataIndexs) ? dataIndexs : [dataIndexs];
            $.each(dataIndexs, function (i, v) {
                var dom = $(g.getNodeDom(v));
                if(dom.length>0){
                    dom = $(".l-expandable-close", dom);
                    if(dom.length>0)
                        dom[0].click();
                }
            })
        },
        _checkNextSearch: function (data) {
            var g = this, p= this.options;
            if(data && $.isArray(data) && data.length>0){
                var parentDom = $( g.getParentTreeItem(data[0]));
                if(parentDom.length>0){
                    var dataIndex = parentDom.attr('treedataindex');
                    if(!g._dataInSearch(dataIndex)) return;
                    var s= p._searchData[dataIndex];
                    if(s && s.nextIndex < s.seq.length){
                        var nextDataIndex = g._getTreeDataIndex(s.seq[s.nextIndex], parentDom);
                        p._searchData[dataIndex] = undefined;
                        s.nextIndex++;
                        p._searchData[nextDataIndex] = s;
                        g._search(nextDataIndex);
                    }
                }
            }
        },
        _getTreeDataIndex: function (id, parent) {
            var g= this;
            var dom = $('#'+id, parent || g.tree);
            if(dom.length>0){
                return parseInt(dom.attr("treedataindex"));
            }
            return -1;
        },
        _getDataIndexByDom: function (dom) {
            var g= this;
            dom = $(dom);
            if(dom.length>0){
                return parseInt(dom.attr("treedataindex"));
            }
            return -1;
        },
        _getDataById: function (id, parent) {
            var g= this;
            var dataIndex = g._getTreeDataIndex(id, parent);
            if(dataIndex!=-1){
                return g._getDataNodeByTreeDataIndex(g.data, dataIndex);
            }
            return null;
        },
        /*****************************************************************************************/
        /**    重写原方法                                                                     **/
        /*****************************************************************************************/
        _init: function ()
        {
            $.ligerui.controls.Tree.base._init.call(this);
            var g = this, p = this.options;
            if (p.single) p.autoCheckboxEven = false;
            g._initAllCheckedDom();
        },
        //parm [nodeParm] dom节点(li)、节点数据 或者节点 dataindex
        cancelSelect: function (nodeParm, isTriggerEvent)
        {
            var g = this, p = this.options;
            var domNode = g.getNodeDom(nodeParm);
            var treeitem = $(domNode);
            var treedataindex = parseInt(treeitem.attr("treedataindex"));
            var treenodedata = g._getDataNodeByTreeDataIndex(g.data, treedataindex);
            var treeitembody = $(">div:first", treeitem);
            if (p.checkbox)
                $(".l-checkbox", treeitembody).removeClass("l-checkbox-checked").addClass("l-checkbox-unchecked");
            else
                treeitembody.removeClass("l-selected");
            if(p.allCheckDom)
                g.refreshAllCheckedDomStatus(false);
            if (isTriggerEvent != false)
            {
                g.trigger('cancelSelect', [{ data: treenodedata, target: treeitem[0] }]);
            }
        },
        _setTreeEven: function ()
        {
            var g = this, p = this.options;
            if (g.hasBind('contextmenu'))
            {
                g.tree.bind("contextmenu", function (e)
                {
                    var obj = (e.target || e.srcElement);
                    var treeitem = null;
                    if (obj.tagName.toLowerCase() == "a" || obj.tagName.toLowerCase() == "span" || $(obj).hasClass("l-box"))
                        treeitem = $(obj).parent().parent();
                    else if ($(obj).hasClass("l-body"))
                        treeitem = $(obj).parent();
                    else if (obj.tagName.toLowerCase() == "li")
                        treeitem = $(obj);
                    if (!treeitem) return;
                    var treedataindex = parseInt(treeitem.attr("treedataindex"));
                    var treenodedata = g._getDataNodeByTreeDataIndex(g.data, treedataindex);
                    return g.trigger('contextmenu', [{ data: treenodedata, target: treeitem[0] }, e]);
                });
            }
            g.tree.click(function (e)
            {
                var obj = (e.target || e.srcElement);
                var treeitem = null;
                if (obj.tagName.toLowerCase() == "a" || obj.tagName.toLowerCase() == "span" || $(obj).hasClass("l-box"))
                    treeitem = $(obj).parent().parent();
                else if ($(obj).hasClass("l-body"))
                    treeitem = $(obj).parent();
                else
                    treeitem = $(obj);
                if (!treeitem) return;
                var treedataindex = parseInt(treeitem.attr("treedataindex"));
                var treenodedata = g._getDataNodeByTreeDataIndex(g.data, treedataindex);
                var treeitembtn = $("div.l-body:first", treeitem).find("div.l-expandable-open:first,div.l-expandable-close:first");
                var clickOnTreeItemBtn = $(obj).hasClass("l-expandable-open") || $(obj).hasClass("l-expandable-close");
                if (!$(obj).hasClass("l-checkbox") && !clickOnTreeItemBtn)
                {
                    if (!$(">div:first", treeitem).hasClass("l-unselectable"))
                    {
                        if ($(">div:first", treeitem).hasClass("l-selected") && p.needCancel)
                        {
                            if (g.trigger('beforeCancelSelect', [{ data: treenodedata, target: treeitem[0] }]) == false)
                                return false;
                            $(">div:first", treeitem).removeClass("l-selected");
                            g.trigger('cancelSelect', [{ data: treenodedata, target: treeitem[0] }]);
                        }
                        else
                        {
                            if (g.trigger('beforeSelect', [{ data: treenodedata, target: treeitem[0] }]) == false)
                                return false;
                            $(".l-body", g.tree).removeClass("l-selected");
                            $(">div:first", treeitem).addClass("l-selected");
                            g.trigger('select', [{ data: treenodedata, target: treeitem[0] }])
                        }
                    } else {
                        //add by lincl
                        g.trigger('unSelect', [{ data: treenodedata, target: treeitem[0], dom: obj }])
                    }
                }
                //chekcbox even
                if ($(obj).hasClass("l-checkbox"))
                {
                    if (p.autoCheckboxEven)
                    {
                        //状态:未选中
                        if ($(obj).hasClass("l-checkbox-unchecked"))
                        {
                            $(obj).removeClass("l-checkbox-unchecked").addClass("l-checkbox-checked");
                            $(".l-children .l-checkbox", treeitem)
                                .removeClass("l-checkbox-incomplete l-checkbox-unchecked")
                                .addClass("l-checkbox-checked");
                            g.trigger('check', [{ data: treenodedata, target: treeitem[0] }, true]);
                        }
                        //状态:选中
                        else if ($(obj).hasClass("l-checkbox-checked"))
                        {
                            $(obj).removeClass("l-checkbox-checked").addClass("l-checkbox-unchecked");
                            $(".l-children .l-checkbox", treeitem)
                                .removeClass("l-checkbox-incomplete l-checkbox-checked")
                                .addClass("l-checkbox-unchecked");
                            g.trigger('check', [{ data: treenodedata, target: treeitem[0] }, false]);
                        }
                        //状态:未完全选中
                        else if ($(obj).hasClass("l-checkbox-incomplete"))
                        {
                            $(obj).removeClass("l-checkbox-incomplete").addClass("l-checkbox-checked");
                            $(".l-children .l-checkbox", treeitem)
                                .removeClass("l-checkbox-incomplete l-checkbox-unchecked")
                                .addClass("l-checkbox-checked");
                            g.trigger('check', [{ data: treenodedata, target: treeitem[0] }, true]);
                        }
                        g._setParentCheckboxStatus(treeitem);
                    }
                    else
                    {
                        //状态:未选中
                        if ($(obj).hasClass("l-checkbox-unchecked"))
                        {
                            $(obj).removeClass("l-checkbox-unchecked").addClass("l-checkbox-checked");
                            //是否单选
                            if (p.single)
                            {
                                $(".l-checkbox", g.tree).not(obj).removeClass("l-checkbox-checked").addClass("l-checkbox-unchecked");
                            }
                            g.trigger('check', [{ data: treenodedata, target: treeitem[0] }, true]);
                        }
                        //状态:选中
                        else if ($(obj).hasClass("l-checkbox-checked"))
                        {
                            $(obj).removeClass("l-checkbox-checked").addClass("l-checkbox-unchecked");
                            g.trigger('check', [{ data: treenodedata, target: treeitem[0] }, false]);
                        }
                    }
                }
                //状态:已经张开
                else if (treeitembtn.hasClass("l-expandable-open") && (!p.btnClickToToggleOnly || clickOnTreeItemBtn))
                {
                    if (g.trigger('beforeCollapse', [{ data: treenodedata, target: treeitem[0] }]) == false)
                        return false;
                    treeitembtn.removeClass("l-expandable-open").addClass("l-expandable-close");
                    if (p.slide)
                        $("> .l-children:first", treeitem).slideToggle('fast');
                    else
                        $("> .l-children:first", treeitem).hide();
                    $("> div ." + g._getParentNodeClassName(true), treeitem)
                        .removeClass(g._getParentNodeClassName(true))
                        .addClass(g._getParentNodeClassName());
                    g.trigger('collapse', [{ data: treenodedata, target: treeitem[0] }]);
                }
                //状态:没有张开
                else if (treeitembtn.hasClass("l-expandable-close") && (!p.btnClickToToggleOnly || clickOnTreeItemBtn))
                {
                    if (g.trigger('beforeExpand', [{ data: treenodedata, target: treeitem[0] }]) == false)
                        return false;
                    $(g.toggleNodeCallbacks).each(function ()
                    {
                        if (this.data == treenodedata)
                        {
                            this.callback(treeitem[0], treenodedata);
                        }
                    });
                    treeitembtn.removeClass("l-expandable-close").addClass("l-expandable-open");
                    var callback = function ()
                    {
                        g.trigger('expand', [{ data: treenodedata, target: treeitem[0] }]);
                    };
                    if (p.slide)
                    {
                        $("> .l-children:first", treeitem).slideToggle('fast', callback);
                    }
                    else
                    {
                        $("> .l-children:first", treeitem).show();
                        callback();
                    }
                    $("> div ." + g._getParentNodeClassName(), treeitem)
                        .removeClass(g._getParentNodeClassName())
                        .addClass(g._getParentNodeClassName(true));
                }
                g.trigger('click', [{ data: treenodedata, target: treeitem[0] }]);
            });
            //节点拖拽支持
            if ($.fn.ligerDrag && p.nodeDraggable)
            {
                g.nodeDroptip = $("<div class='l-drag-nodedroptip' style='display:none'></div>").appendTo('body');
                g.tree.ligerDrag({
                    revert: true, animate: false,
                    proxyX: 20, proxyY: 20,
                    proxy: function (draggable, e)
                    {
                        var src = g._getSrcElementByEvent(e);
                        if (src.node)
                        {
                            var content = "dragging";
                            if (p.nodeDraggingRender)
                            {
                                content = p.nodeDraggingRender(draggable.draggingNodes, draggable, g);
                            }
                            else
                            {
                                content = "";
                                var appended = false;
                                for (var i in draggable.draggingNodes)
                                {
                                    var node = draggable.draggingNodes[i];
                                    if (appended) content += ",";
                                    content += node.text;
                                    appended = true;
                                }
                            }
                            var proxy = $("<div class='l-drag-proxy' style='display:none'><div class='l-drop-icon l-drop-no'></div>" + content + "</div>").appendTo('body');
                            return proxy;
                        }
                    },
                    onRevert: function () { return false; },
                    onRendered: function ()
                    {
                        this.set('cursor', 'default');
                        g.children[this.id] = this;
                    },
                    onStartDrag: function (current, e)
                    {
                        if (e.button == 2) return false;
                        this.set('cursor', 'default');
                        var src = g._getSrcElementByEvent(e);
                        if (src.checkbox) return false;
                        if (p.checkbox)
                        {
                            var checked = g.getChecked();
                            this.draggingNodes = [];
                            for (var i in checked)
                            {
                                this.draggingNodes.push(checked[i].data);
                            }
                            if (!this.draggingNodes || !this.draggingNodes.length) return false;
                        }
                        else
                        {
                            this.draggingNodes = [src.data];
                        }
                        this.draggingNode = src.data;
                        this.set('cursor', 'move');
                        g.nodedragging = true;
                        this.validRange = {
                            top: g.tree.offset().top,
                            bottom: g.tree.offset().top + g.tree.height(),
                            left: g.tree.offset().left,
                            right: g.tree.offset().left + g.tree.width()
                        };
                    },
                    onDrag: function (current, e)
                    {
                        var nodedata = this.draggingNode;
                        if (!nodedata) return false;
                        var nodes = this.draggingNodes ? this.draggingNodes : [nodedata];
                        if (g.nodeDropIn == null) g.nodeDropIn = -1;
                        var pageX = e.pageX;
                        var pageY = e.pageY;
                        var visit = false;
                        var validRange = this.validRange;
                        if (pageX < validRange.left || pageX > validRange.right
                            || pageY > validRange.bottom || pageY < validRange.top)
                        {
                            g.nodeDropIn = -1;
                            g.nodeDroptip.hide();
                            this.proxy.find(".l-drop-icon:first").removeClass("l-drop-yes l-drop-add").addClass("l-drop-no");
                            return;
                        }
                        for (var i = 0, l = g.nodes.length; i < l; i++)
                        {
                            var nd = g.nodes[i];
                            var treedataindex = nd['treedataindex'];
                            if (nodedata['treedataindex'] == treedataindex) visit = true;
                            if ($.inArray(nd, nodes) != -1) continue;
                            var isAfter = visit ? true : false;
                            if (g.nodeDropIn != -1 && g.nodeDropIn != treedataindex) continue;
                            var jnode = $("li[treedataindex=" + treedataindex + "] div:first", g.tree);
                            var offset = jnode.offset();
                            var range = {
                                top: offset.top,
                                bottom: offset.top + jnode.height(),
                                left: g.tree.offset().left,
                                right: g.tree.offset().left + g.tree.width()
                            };
                            if (pageX > range.left && pageX < range.right && pageY > range.top && pageY < range.bottom)
                            {
                                var lineTop = offset.top;
                                if (isAfter) lineTop += jnode.height();
                                g.nodeDroptip.css({
                                    left: range.left,
                                    top: lineTop,
                                    width: range.right - range.left
                                }).show();
                                g.nodeDropIn = treedataindex;
                                g.nodeDropDir = isAfter ? "bottom" : "top";
                                if (pageY > range.top + 7 && pageY < range.bottom - 7)
                                {
                                    this.proxy.find(".l-drop-icon:first").removeClass("l-drop-no l-drop-yes").addClass("l-drop-add");
                                    g.nodeDroptip.hide();
                                    g.nodeDropInParent = true;
                                }
                                else
                                {
                                    this.proxy.find(".l-drop-icon:first").removeClass("l-drop-no l-drop-add").addClass("l-drop-yes");
                                    g.nodeDroptip.show();
                                    g.nodeDropInParent = false;
                                }
                                break;
                            }
                            else if (g.nodeDropIn != -1)
                            {
                                g.nodeDropIn = -1;
                                g.nodeDropInParent = false;
                                g.nodeDroptip.hide();
                                this.proxy.find(".l-drop-icon:first").removeClass("l-drop-yes  l-drop-add").addClass("l-drop-no");
                            }
                        }
                    },
                    onStopDrag: function (current, e)
                    {
                        var nodes = this.draggingNodes;
                        g.nodedragging = false;
                        if (g.nodeDropIn != -1)
                        {
                            for (var i = 0; i < nodes.length; i++)
                            {
                                var children = nodes[i].children;
                                if (children)
                                {
                                    nodes = $.grep(nodes, function (node, i)
                                    {
                                        var isIn = $.inArray(node, children) == -1;
                                        return isIn;
                                    });
                                }
                            }
                            for (var i in nodes)
                            {
                                var node = nodes[i];
                                if (g.nodeDropInParent)
                                {
                                    g.remove(node);
                                    g.append(g.nodeDropIn, [node]);
                                }
                                else
                                {
                                    g.remove(node);
                                    g.append(g.getParent(g.nodeDropIn), [node], g.nodeDropIn, g.nodeDropDir == "bottom")
                                }
                            }
                            g.nodeDropIn = -1;
                        }
                        g.nodeDroptip.hide();
                        this.set('cursor', 'default');
                    }
                });
            }
        },
        //根据data生成最终完整的tree html
        _getTreeHTMLByData: function (data, outlineLevel, isLast, isExpand)
        {
            if ($.Util.isStrEmpty(data)){
                data = [];
            }
            var g = this, p = this.options;
            if (g.maxOutlineLevel < outlineLevel)
                g.maxOutlineLevel = outlineLevel;
            isLast = isLast || [];
            outlineLevel = outlineLevel || 1;
            var treehtmlarr = [];
            if (!isExpand) treehtmlarr.push('<ul class="l-children" style="display:none">');
            else treehtmlarr.push("<ul class='l-children'>");
            for (var i = 0; i < data.length; i++)
            {
                var o = data[i];
                var isFirst = i == 0;
                var isLastCurrent = i == data.length - 1;
                var delay = g._getDelay(o, outlineLevel);
                var isExpandCurrent = delay ? false : g._isExpand(o, outlineLevel);
                treehtmlarr.push('<li ');
                if (o.treedataindex != undefined)
                    treehtmlarr.push('treedataindex="' + o.treedataindex + '" ');
                if (isExpandCurrent)
                    treehtmlarr.push('isexpand=' + o.isexpand + ' ');
                treehtmlarr.push('outlinelevel=' + outlineLevel + ' ');
                //增加属性支持
                for (var j = 0; j < g.sysAttribute.length; j++)
                {
                    if ($(this).attr(g.sysAttribute[j]))
                        data[dataindex][g.sysAttribute[j]] = $(this).attr(g.sysAttribute[j]);
                }
                for (var j = 0; j < p.attribute.length; j++)
                {
                    if (o[p.attribute[j]])
                        treehtmlarr.push(p.attribute[j] + '="' + o[p.attribute[j]] + '" ');
                }
                //css class
                treehtmlarr.push('class="');
                isFirst && treehtmlarr.push('l-first ');
                isLastCurrent && treehtmlarr.push('l-last ');
                isFirst && isLastCurrent && treehtmlarr.push('l-onlychild ');
                treehtmlarr.push('"');
                treehtmlarr.push('>');
                treehtmlarr.push('<div class="l-body');
                if (p.selectable && p.selectable(o) == false)
                {
                    treehtmlarr.push(' l-unselectable');
                }
                treehtmlarr.push('">');
                for (var k = 0; k <= outlineLevel - 2; k++)
                {
                    if (isLast[k]) treehtmlarr.push('<div class="l-box"></div>');
                    else treehtmlarr.push('<div class="l-box l-line"></div>');
                }
                if (g.hasChildren(o))
                {
                    if (isExpandCurrent) treehtmlarr.push('<div class="l-box l-expandable-open"></div>');
                    else treehtmlarr.push('<div class="l-box l-expandable-close"></div>');
                    if (p.checkbox)
                    {
                        if (o.ischecked)
                            treehtmlarr.push('<div class="l-box l-checkbox l-checkbox-checked"></div>');
                        else if(g.isIncomplete(o))
                            treehtmlarr.push('<div class="l-box l-checkbox l-checkbox-incomplete"></div>');
                        else
                            treehtmlarr.push('<div class="l-box l-checkbox l-checkbox-unchecked"></div>');
                    }
                    if (p.parentIcon)
                    {
                        //node icon
                        treehtmlarr.push('<div class="l-box l-tree-icon ');
                        treehtmlarr.push(g._getParentNodeClassName(isExpandCurrent ? true : false) + " ");
                        if (p.iconFieldName && o[p.iconFieldName])
                            treehtmlarr.push('l-tree-icon-none');
                        treehtmlarr.push('">');
                        if (p.iconFieldName && o[p.iconFieldName])
                            treehtmlarr.push('<img src="' + o[p.iconFieldName] + '" />');
                        treehtmlarr.push('</div>');
                    }
                }
                else
                {
                    if (isLastCurrent) treehtmlarr.push('<div class="l-box l-note-last"></div>');
                    else treehtmlarr.push('<div class="l-box l-note"></div>');
                    if (p.checkbox)
                    {
                        if (o.ischecked)
                            treehtmlarr.push('<div class="l-box l-checkbox l-checkbox-checked"></div>');
                        else
                            treehtmlarr.push('<div class="l-box l-checkbox l-checkbox-unchecked"></div>');
                    }
                    if (p.childIcon)
                    {
                        //node icon
                        treehtmlarr.push('<div class="l-box l-tree-icon ');
                        treehtmlarr.push(g._getChildNodeClassName() + " ");
                        if (p.iconFieldName && o[p.iconFieldName])
                            treehtmlarr.push('l-tree-icon-none');
                        treehtmlarr.push('">');
                        if (p.iconFieldName && o[p.iconFieldName])
                            treehtmlarr.push('<img src="' + o[p.iconFieldName] + '" />');
                        treehtmlarr.push('</div>');
                    }
                }
                if (p.render)
                {
                    treehtmlarr.push('<span>' + p.render(o, o[p.textFieldName]) + '</span>');
                } else
                {
                    /*treehtmlarr.push('<span>' + o[p.textFieldName] + '</span>');*/
                    /*****************TODO开始*******************/
                    treehtmlarr.push('<span title="'+ o[p.textFieldName] +'">' + o[p.textFieldName] + '</span>');
                    /*****************TODO结束*******************/
                }
                treehtmlarr.push('</div>');
                if (g.hasChildren(o))
                {
                    var isLastNew = [];
                    for (var k = 0; k < isLast.length; k++)
                    {
                        isLastNew.push(isLast[k]);
                    }
                    isLastNew.push(isLastCurrent);
                    if (delay)
                    {
                        if(delay==true && p.renderAll){
                            treehtmlarr.push(g._getTreeHTMLByData(o.children, outlineLevel + 1, isLastNew, false).join(''));
                        }
                        else if (delay == true)
                        {
                            g.toggleNodeCallbacks.push({
                                data: o,
                                callback: function (dom, o)
                                {
                                    var content = g._getTreeHTMLByData(o.children, outlineLevel + 1, isLastNew, isExpandCurrent).join('');
                                    $(dom).append(content);
                                    $(">.l-children .l-body", dom).hover(function ()
                                    {
                                        $(this).addClass("l-over");
                                    }, function ()
                                    {
                                        $(this).removeClass("l-over");
                                    });
                                    g._removeToggleNodeCallback(o);
                                }
                            });
                        }
                        else if (delay.url)
                        {
                            (function (o, url, parms)
                            {
                                g.toggleNodeCallbacks.push({
                                    data: o,
                                    callback: function (dom, o)
                                    {
                                        g.loadData(dom, url, parms, {
                                            showLoading: function ()
                                            {
                                                $("div.l-expandable-close:first", dom).addClass("l-box-loading");
                                            },
                                            hideLoading: function ()
                                            {
                                                $("div.l-box-loading:first", dom).removeClass("l-box-loading");
                                            }
                                        });
                                        g._removeToggleNodeCallback(o);
                                    }
                                });
                            })(o, delay.url, delay.parms);
                        }
                    }
                    else
                    {
                        treehtmlarr.push(g._getTreeHTMLByData(o.children, outlineLevel + 1, isLastNew, isExpandCurrent).join(''));
                    }
                }
                treehtmlarr.push('</li>');
            }
            treehtmlarr.push("</ul>");
            return treehtmlarr;
        },
        loadData: function (node, url, param, e)
        {
            var g = this, p = this.options;
            e = $.extend({
                showLoading: function ()
                {
                    g.loading.show();
                },
                success: function () { },
                error: function () { },
                hideLoading: function ()
                {
                    g.loading.hide();
                }
            }, e || {});
            var ajaxtype = p.ajaxType;
            //解决树无法设置parms的问题
            param = $.extend(($.isFunction(p.parms) ? p.parms() : p.parms), param);
            if (p.ajaxContentType == "application/json" && typeof (param) != "string")
            {
                param = liger.toJSON(param);
            }
            var urlParms = $.isFunction(p.urlParms) ? p.urlParms.call(g) : p.urlParms;
            if (urlParms)
            {
                for (name in urlParms)
                {
                    url += url.indexOf('?') == -1 ? "?" : "&";
                    url += name + "=" + urlParms[name];
                }
            }
            var ajaxOp = {
                type: ajaxtype,
                url: url,
                data: param,
                dataType: 'json',
                beforeSend: function ()
                {
                    e.showLoading();
                },
                success: function (data)
                {
                    if (!data) return;
                    if (p.idField && p.parentIDField)
                    {
                        data = g.arrayToTree(data, p.idField, p.parentIDField);
                    }
                    e.hideLoading();
                    data = p.onBeforeShowData? p.onBeforeShowData(data) : data;
                    g.append(node, data);
                    g.trigger('success', [data]);
                    e.success(data);
                },
                error: function (XMLHttpRequest, textStatus, errorThrown)
                {
                    try
                    {
                        e.hideLoading();
                        g.trigger('error', [XMLHttpRequest, textStatus, errorThrown]);
                        e.error(XMLHttpRequest, textStatus, errorThrown);
                    }
                    catch (e)
                    {
                    }
                }
            };
            if (p.ajaxContentType)
            {
                ajaxOp.contentType = p.ajaxContentType;
            }
            $.ajax(ajaxOp);
        },
    });
})(jQuery, window);

+ 281 - 0
src/main/webapp/develop/lib/ehrjs/toolBar.js

@ -0,0 +1,281 @@
/**
 * 工具栏添加按钮
 * @param type 类型
 * @param clkFun 点击事件
 * @param barId 工具栏id
 * @returns {string}
 */
function addBarBtn(type, clkFun, barId, imgClz, id){
    var text;
    if(type == 'batchDel'){
        id = "btn_del_" + barId;
        text = "批量删除";
    }
    else if(type == 'edit'){
        id = "btn_add_" + barId;
        text = "新增";
    }
    else if(type == 'import'){
        id = "btn_import_" + barId;
        text = "导入";
    }
    else{
        text = type;
    }
    var wrap = $('<div class="f-fr f-mr10"></div>');
    var btn;
    if(imgClz)
        btn = $('<div title="'+ text +'" id="btn_create" class="'+ imgClz +' f-mt5"></div>');
    else
        btn = $(
            '<div id="'+ id +'" class="l-button u-btn u-btn-primary u-btn-small f-ib f-vam" >' +
                '<span>'+ text +'</span>' +
            '</div>');
    btn.click(clkFun);
    wrap.append(btn);
    return  wrap;
}
/**
 * 初始化工具栏
 * @param el 工具栏dom
 * @param vo 按钮集合
 * @param barId 工具栏id
 */
function initBarBtn(el, vo, barId){
    if($.isArray(vo) && vo.length>0){
        for(var i=0; i<vo.length; i++){
            $(el).append(addBarBtn(vo[i].type, vo[i].clkFun, barId ? barId : 1, vo[i].imgClz, vo[i].id));
        }
    }
}
/**
 * 初始化form表单
 * @param vo
 * [
     {type: 'text', id: 'ipt_search', searchFun: searchFun},
     {type: 'select', id: 'ipt_search_type', url: '', params: {}, opts: {}},
     {type: 'searchBtn', id: 'search_btn', searchFun: searchFun}
   ];
 * @param area 所在页面位置,给搜索按钮使用
 */
function initFormFields(vo, area){
    if($.isArray(vo) && vo.length>0){
        var ipt_el;
        $.each(vo, function (i, v) {
            ipt_el = $('#' + v.id);
            if(v.type == 'text'){
                if(v.searchFun)
                    initSearchTextDom(ipt_el, v.searchFun, v.width, v.opts);
                else
                    initTextDom(ipt_el, v.width, v.opts);
            }
            else if(v.type == 'select'){
                if(v.dictId)
                    initSystemSelDom(ipt_el, v.dictId, v.opts);
                else
                    initSelDom(ipt_el, v.url, v.params, v.opts);
            }
            else if(v.type == 'searchBtn'){
                $(area).append(
                    '<div class="m-form-control m-form-control-fr f-ml10">' +
                        '<div id="'+ v.id +'" class="l-button u-btn u-btn-primary u-btn-small f-ib f-vam" >' +
                            '<span>搜索</span>' +
                        '</div>' +
                    '</div>');
                $('#' + v.id).click(v.searchFun);
            }
            else if(v.type == 'radio'){
                $('input[name="'+ v.id +'"]').ligerRadio();
            }
            else if(v.type == 'datetime'){
                var opts = {
                    format: 'yyyy-MM-dd hh:mm:ss',
                    showTime: true
                };
                opts = $.extend({}, opts, v.opts);
                initDateDom(ipt_el, v.width,opts);
            }
            else if(v.type == 'date'){
                var opts = {
                    format: 'yyyy-MM-dd'
                };
                opts = $.extend({}, opts, v.opts);
                initDateDom(ipt_el, v.width, opts);
            }
        })
    }
}
/**
 * 开启窗口
 * @param url
 * @param title
 * @param height
 * @param width
 * @param parms
 * @param opts
 * @returns {*|Window}
 */
function openDialog(url, title, width, height, parms, opts){
    var defaultOpts = {
        height: height || 440,
        width: width || 600,
        title: title,
        url: url,
        urlParms: parms || {id: id, mode: mode},
        load: true,
        isHidden: false
    };
    opts = $.extend({}, defaultOpts, opts);
    var dialog = $.ligerDialog.open(opts);
    return dialog;
}
function getSelectId(grid, code){
    code = code || 'id';
    var rows = grid.getSelectedRows();
    var ids = [];
    $.each(rows, function (i, v) {
        ids.push(v[code]);
    })
    return ids;
}
/**
 *
 * @param gtGrid 表格对象
 * @param findFunc reload方法对象
 * @param url 请求路径
 * @param ids 预删除的编号集
 * @param code 在表格里的字段名
 * @param idField 网关请求参数名
 * @param opration 操作名称 默认: 删除
 * @param warnMsg  提示信息 默认: 确定删除该数据
 */
function uniqDel(gtGrid, findFunc, url, ids, code, idField, opration, warnMsg) {
    opration = opration || '删除';
    if(ids && !$.isArray(ids)){
        ids = [ids];
    }
    ids = ids || getSelectId(gtGrid, code);
    if (ids.length > 0) {
        warnMsg = warnMsg || ('确定删除'+ (ids.length==1? '该' : '这些') +'数据?');
        $.ligerDialog.confirm(warnMsg, function (yes) {
            if (yes)
                remoteDel(ids, findFunc, gtGrid, url, idField, 'uniq', opration);
        });
    }else{
        $.ligerDialog.warn("请选择要删除的数据");
    }
}
/**
 *
 * @param gtGrid 表格对象
 * @param findFunc reload方法对象
 * @param url 请求路径
 * @param ids 预删除的编号集
 * @param code 在表格里的字段名
 * @param idField 网关请求参数名
 * @param opration 操作名称 默认: 删除
 * @param warnMsg  提示信息 默认: 确定删除该数据
 */
function batchDel(gtGrid, findFunc, url, ids, code, idField, opration, warnMsg) {
    opration = opration || '删除';
    if(ids && !$.isArray(ids)){
        ids = [ids];
    }
    ids = ids || getSelectId(gtGrid, code);
    if (ids.length > 0) {
        warnMsg = warnMsg || ('确定删除'+ (ids.length==1? '该' : '这些') +'数据?');
        $.ligerDialog.confirm(warnMsg, function (yes) {
            if (yes)
                remoteDel(ids, findFunc, gtGrid, url, idField, '', opration);
        });
    }else{
        $.ligerDialog.warn("请选择要"+ opration +"的数据");
    }
}
function remoteDel(ids, findFunc, gtGrid, url, idField, type, opration){
    opration = opration || '删除';
    var dialog = $.ligerDialog.waitting('正在处理中,请稍候...');
    var dataModel = $.DataModel.init();
    dataModel.updateRemote(url, {
        data: {ids: ids.join(','), idField: idField, type: type},
        success: function (data) {
            if (data.successFlg) {
                $.Notice.success(opration + '成功!');
                if(findFunc)
                    findFunc($.Util.checkCurPage.call(gtGrid, ids.length))
            } else {
                $.Notice.error(data.errorMsg);
            }
        },
        complete: function () {
            dialog.close();
        },
        error: function(){
            $.Notice.error('请求错误!');
        }
    });
}
function covertFilters(vo, $form){
    $form.attrScan();
    var model = $form.Fields.getValues();
    var f = '', v, fields, val;
    for(var i=0; i<vo.length; i++){
        v = vo[i];
        if($.Util.isStrEmpty((val = model[v.name])))
            continue;
        val = v.cover ? v.cover(val) : val;
        if(v.fields){
            fields = v.fields.split(',');
            for(var j=0; j<fields.length; j++){
                f += fields[j] + v.logic + val + ' g' + i + ';';
            }
        }else
            f += v.name + v.logic + val + ';';
    }
    return f;
}
function fetchData(url, sucFun){
    var dataModel = $.DataModel.init();
    dataModel.createRemote(url, {
        success: sucFun
    });
}
function initTree($el, opts){
    var defaultOpts = {
        idFieldName :'id',
        textFieldName: 'name',
        parentIDFieldName :'pid',
        checkbox: false,
        parentIcon: '',
        childIcon: '',
        slide: false
    };
    opts = $.extend({}, defaultOpts, opts);
    return $el.ligerSearchTree(opts);
}
function ls2map(ls, code, val){
    var rs = {};
    for(var i in ls){
        if(val)
            rs[ls[i][code]] = ls[i][val];
        else
            rs[ls[i][code]] = ls[i];
    }
    return rs;
}

+ 0 - 1
src/main/webapp/develop/lib/module/dataModel.js

@ -29,7 +29,6 @@
 */
(function ($, win) {
    var Util = $.Util;
    var ajax = $.AjaxUtil.ajax;

+ 11 - 0
src/main/webapp/develop/lib/module/util.js

@ -419,6 +419,17 @@
                    }
                    outTimes++;
                }
            },
            reloadGrid: function(url, params, curPage){
                if(curPage)
                    this.options.newPage = curPage;
                if(url && url!='')
                    this.setOptions({parms: params, url: url});
                else{
                    this.setOptions({parms: params});
                    this.loadData(true);
                }
            }
        }
    });