content: package org.jeecg.modules.system.controller;
  
  import java.io.IOException;
  import java.util.*;
  
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  
  import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  import org.apache.shiro.SecurityUtils;
  import org.apache.shiro.authz.annotation.RequiresRoles;
  import org.jeecg.common.api.vo.Result;
  import org.jeecg.common.constant.CacheConstant;
  import org.jeecg.common.constant.CommonConstant;
  import org.jeecg.common.system.query.QueryGenerator;
  import org.jeecg.common.system.util.JwtUtil;
  import org.jeecg.common.system.vo.LoginUser;
  import org.jeecg.common.util.ImportExcelUtil;
  import org.jeecg.common.util.YouBianCodeUtil;
  import org.jeecg.common.util.oConvertUtils;
  import org.jeecg.modules.system.entity.SysDepart;
  import org.jeecg.modules.system.entity.SysUser;
  import org.jeecg.modules.system.model.DepartIdModel;
  import org.jeecg.modules.system.model.SysDepartTreeModel;
  import org.jeecg.modules.system.service.ISysDepartService;
  import org.jeecg.modules.system.service.ISysPositionService;
  import org.jeecg.modules.system.service.ISysUserDepartService;
  import org.jeecg.modules.system.service.ISysUserService;
  import org.jeecg.modules.system.util.FindsDepartsChildrenUtil;
  import org.jeecgframework.poi.excel.ExcelImportUtil;
  import org.jeecgframework.poi.excel.def.NormalExcelConstants;
  import org.jeecgframework.poi.excel.entity.ExportParams;
  import org.jeecgframework.poi.excel.entity.ImportParams;
  import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
  import org.springframework.beans.BeanUtils;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.cache.annotation.CacheEvict;
  import org.springframework.data.redis.core.RedisTemplate;
  import org.springframework.util.CollectionUtils;
  import org.springframework.web.bind.annotation.*;
  import org.springframework.web.multipart.MultipartFile;
  import org.springframework.web.multipart.MultipartHttpServletRequest;
  import org.springframework.web.servlet.ModelAndView;
  
  import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  
  import lombok.extern.slf4j.Slf4j;
  
  /**
   * <p>
   * 部门表 前端控制器
   * <p>
   * 
   * @Author: Steve @Since： 2019-01-22
   */
  @RestController
  @RequestMapping("/sys/sysDepart")
  @Slf4j
  public class SysDepartController {
  
  	@Autowired
  	private ISysDepartService sysDepartService;
  	@Autowired
  	public RedisTemplate<String, Object> redisTemplate;
  	@Autowired
  	private ISysUserService sysUserService;
  	@Autowired
  	private ISysUserDepartService sysUserDepartService;
  	/**
  	 * 查询数据 查出我的部门,并以树结构数据格式响应给前端
  	 *
  	 * @return
  	 */
  	@RequestMapping(value = "/queryMyDeptTreeList", method = RequestMethod.GET)
  	public Result<List<SysDepartTreeModel>> queryMyDeptTreeList() {
  		Result<List<SysDepartTreeModel>> result = new Result<>();
  		LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
  		try {
  			if(oConvertUtils.isNotEmpty(user.getUserIdentity()) && user.getUserIdentity().equals( CommonConstant.USER_IDENTITY_2 )){
  				List<SysDepartTreeModel> list = sysDepartService.queryMyDeptTreeList(user.getDepartIds());
  				result.setResult(list);
  				result.setMessage(CommonConstant.USER_IDENTITY_2.toString());
  				result.setSuccess(true);
  			}else{
  				result.setMessage(CommonConstant.USER_IDENTITY_1.toString());
  				result.setSuccess(true);
  			}
  		} catch (Exception e) {
  			log.error(e.getMessage(),e);
  		}
  		return result;
  	}
  
  	/**
  	 * 查询数据 查出所有部门,并以树结构数据格式响应给前端
  	 * 
  	 * @return
  	 */
  	@RequestMapping(value = "/queryTreeList", method = RequestMethod.GET)
  	public Result<List<SysDepartTreeModel>> queryTreeList() {
  		Result<List<SysDepartTreeModel>> result = new Result<>();
  		try {
  			// 从内存中读取
  //			List<SysDepartTreeModel> list =FindsDepartsChildrenUtil.getSysDepartTreeList();
  //			if (CollectionUtils.isEmpty(list)) {
  //				list = sysDepartService.queryTreeList();
  //			}
  			List<SysDepartTreeModel> list = sysDepartService.queryTreeList();
  			result.setResult(list);
  			result.setSuccess(true);
  		} catch (Exception e) {
  			log.error(e.getMessage(),e);
  		}
  		return result;
  	}
  
  	/**
  	 * 异步查询部门list
  	 *
  	 * @return
  	 */
  	@RequestMapping(value = "/queryDepartTreeSync", method = RequestMethod.GET)
  	public Result<List<SysDepartTreeModel>> queryDepartTreeSync(@RequestParam(name = "pid", required = false) String parentId) {
  		Result<List<SysDepartTreeModel>> result = new Result<>();
  		try {
  			List<SysDepartTreeModel> list = sysDepartService.queryTreeListByPid(parentId);
  			result.setResult(list);
  			result.setSuccess(true);
  		} catch (Exception e) {
  			log.error(e.getMessage(),e);
  		}
  		return result;
  	}
  
  	/**
  	 * 添加新数据 添加用户新建的部门对象数据,并保存到数据库
  	 * 
  	 * @param sysDepart
  	 * @return
  	 */
  	//@RequiresRoles({"admin"})
  	@RequestMapping(value = "/add", method = RequestMethod.POST)
  	@CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true)
  	public Result<SysDepart> add(@RequestBody SysDepart sysDepart, HttpServletRequest request) {
  		Result<SysDepart> result = new Result<SysDepart>();
  		String username = JwtUtil.getUserNameByToken(request);
  		try {
  			sysDepart.setCreateBy(username);
  			sysDepartService.saveDepartData(sysDepart, username);
  			//清除部门树内存
  			// FindsDepartsChildrenUtil.clearSysDepartTreeList();
  			// FindsDepartsChildrenUtil.clearDepartIdModel();
  			result.success("添加成功！");
  		} catch (Exception e) {
  			log.error(e.getMessage(),e);
  			result.error500("操作失败");
  		}
  		return result;
  	}
  
  	/**
  	 * 编辑数据 编辑部门的部分数据,并保存到数据库
  	 * 
  	 * @param sysDepart
  	 * @return
  	 */
  	//@RequiresRoles({"admin"})
  	@RequestMapping(value = "/edit", method = RequestMethod.PUT)
  	@CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true)
  	public Result<SysDepart> edit(@RequestBody SysDepart sysDepart, HttpServletRequest request) {
  		String username = JwtUtil.getUserNameByToken(request);
  		sysDepart.setUpdateBy(username);
  		Result<SysDepart> result = new Result<SysDepart>();
  		SysDepart sysDepartEntity = sysDepartService.getById(sysDepart.getId());
  		if (sysDepartEntity == null) {
  			result.error500("未找到对应实体");
  		} else {
  			boolean ok = sysDepartService.updateDepartDataById(sysDepart, username);
  			// TODO 返回false说明什么？
  			if (ok) {
  				//清除部门树内存
  				//FindsDepartsChildrenUtil.clearSysDepartTreeList();
  				//FindsDepartsChildrenUtil.clearDepartIdModel();
  				result.success("修改成功!");
  			}
  		}
  		return result;
  	}
  	
  	 /**
       *   通过id删除
      * @param id
      * @return
      */
  	//@RequiresRoles({"admin"})
      @RequestMapping(value = "/delete", method = RequestMethod.DELETE)
  	@CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true)
     public Result<SysDepart> delete(@RequestParam(name="id",required=true) String id) {
  
         Result<SysDepart> result = new Result<SysDepart>();
         SysDepart sysDepart = sysDepartService.getById(id);
         if(sysDepart==null) {
             result.error500("未找到对应实体");
         }else {
             boolean ok = sysDepartService.delete(id);
             if(ok) {
  	            //清除部门树内存
  	   		   //FindsDepartsChildrenUtil.clearSysDepartTreeList();
  	   		   // FindsDepartsChildrenUtil.clearDepartIdModel();
                 result.success("删除成功!");
             }
         }
         return result;
     }
  
  
  	/**
  	 * 批量删除 根据前端请求的多个ID,对数据库执行删除相关部门数据的操作
  	 * 
  	 * @param ids
  	 * @return
  	 */
  	//@RequiresRoles({"admin"})
  	@RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE)
  	@CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true)
  	public Result<SysDepart> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
  
  		Result<SysDepart> result = new Result<SysDepart>();
  		if (ids == null || "".equals(ids.trim())) {
  			result.error500("参数不识别！");
  		} else {
  			this.sysDepartService.deleteBatchWithChildren(Arrays.asList(ids.split(",")));
  			result.success("删除成功!");
  		}
  		return result;
  	}
  
  	/**
  	 * 查询数据 添加或编辑页面对该方法发起请求,以树结构形式加载所有部门的名称,方便用户的操作
  	 * 
  	 * @return
  	 */
  	@RequestMapping(value = "/queryIdTree", method = RequestMethod.GET)
  	public Result<List<DepartIdModel>> queryIdTree() {
  //		Result<List<DepartIdModel>> result = new Result<List<DepartIdModel>>();
  //		List<DepartIdModel> idList;
  //		try {
  //			idList = FindsDepartsChildrenUtil.wrapDepartIdModel();
  //			if (idList != null && idList.size() > 0) {
  //				result.setResult(idList);
  //				result.setSuccess(true);
  //			} else {
  //				sysDepartService.queryTreeList();
  //				idList = FindsDepartsChildrenUtil.wrapDepartIdModel();
  //				result.setResult(idList);
  //				result.setSuccess(true);
  //			}
  //			return result;
  //		} catch (Exception e) {
  //			log.error(e.getMessage(),e);
  //			result.setSuccess(false);
  //			return result;
  //		}
  		Result<List<DepartIdModel>> result = new Result<>();
  		try {
  			List<DepartIdModel> list = sysDepartService.queryDepartIdTreeList();
  			result.setResult(list);
  			result.setSuccess(true);
  		} catch (Exception e) {
  			log.error(e.getMessage(),e);
  		}
  		return result;
  	}
  	 
  	/**
  	 * <p>
  	 * 部门搜索功能方法,根据关键字模糊搜索相关部门
  	 * </p>
  	 * 
  	 * @param keyWord
  	 * @return
  	 */
  	@RequestMapping(value = "/searchBy", method = RequestMethod.GET)
  	public Result<List<SysDepartTreeModel>> searchBy(@RequestParam(name = "keyWord", required = true) String keyWord,@RequestParam(name = "myDeptSearch", required = false) String myDeptSearch) {
  		Result<List<SysDepartTreeModel>> result = new Result<List<SysDepartTreeModel>>();
  		//部门查询，myDeptSearch为1时为我的部门查询，登录用户为上级时查只查负责部门下数据
  		LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
  		String departIds = null;
  		if(oConvertUtils.isNotEmpty(user.getUserIdentity()) && user.getUserIdentity().equals( CommonConstant.USER_IDENTITY_2 )){
  			departIds = user.getDepartIds();
  		}
  		List<SysDepartTreeModel> treeList = this.sysDepartService.searhBy(keyWord,myDeptSearch,departIds);
  		if (treeList == null || treeList.size() == 0) {
  			result.setSuccess(false);
  			result.setMessage("未查询匹配数据！");
  			return result;
  		}
  		result.setResult(treeList);
  		return result;
  	}
  
  
  	/**
       * 导出excel
       *
       * @param request
       */
      @RequestMapping(value = "/exportXls")
      public ModelAndView exportXls(SysDepart sysDepart,HttpServletRequest request) {
          // Step.1 组装查询条件
          QueryWrapper<SysDepart> queryWrapper = QueryGenerator.initQueryWrapper(sysDepart, request.getParameterMap());
          //Step.2 AutoPoi 导出Excel
          ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
          List<SysDepart> pageList = sysDepartService.list(queryWrapper);
          //按字典排序
          Collections.sort(pageList, new Comparator<SysDepart>() {
              @Override
  			public int compare(SysDepart arg0, SysDepart arg1) {
              	return arg0.getOrgCode().compareTo(arg1.getOrgCode());
              }
          });
          //导出文件名称
          mv.addObject(NormalExcelConstants.FILE_NAME, "部门列表");
          mv.addObject(NormalExcelConstants.CLASS, SysDepart.class);
          LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
          mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("部门列表数据", "导出人:"+user.getRealname(), "导出信息"));
          mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
          return mv;
      }
  
      /**
       * 通过excel导入数据
       *
       * @param request
       * @param response
       * @return
       */
      //@RequiresRoles({"admin"})
      @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
  	@CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true)
      public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
          MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
  		List<String> errorMessageList = new ArrayList<>();
  		List<SysDepart> listSysDeparts = null;
          Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
          for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
              MultipartFile file = entity.getValue();// 获取上传文件对象
              ImportParams params = new ImportParams();
              params.setTitleRows(2);
              params.setHeadRows(1);
              params.setNeedSave(true);
              try {
              	// orgCode编码长度
              	int codeLength = YouBianCodeUtil.zhanweiLength;
                  listSysDeparts = ExcelImportUtil.importExcel(file.getInputStream(), SysDepart.class, params);
                  //按长度排序
                  Collections.sort(listSysDeparts, new Comparator<SysDepart>() {
                      @Override
  					public int compare(SysDepart arg0, SysDepart arg1) {
                      	return arg0.getOrgCode().length() - arg1.getOrgCode().length();
                      }
                  });
  
                  int num = 0;
                  for (SysDepart sysDepart : listSysDeparts) {
                  	String orgCode = sysDepart.getOrgCode();
                  	if(orgCode.length() > codeLength) {
                  		String parentCode = orgCode.substring(0, orgCode.length()-codeLength);
                  		QueryWrapper<SysDepart> queryWrapper = new QueryWrapper<SysDepart>();
                  		queryWrapper.eq("org_code", parentCode);
                  		try {
                  		SysDepart parentDept = sysDepartService.getOne(queryWrapper);
                  		if(!parentDept.equals(null)) {
  							sysDepart.setParentId(parentDept.getId());
  						} else {
  							sysDepart.setParentId("");
  						}
                  		}catch (Exception e) {
                  			//没有查找到parentDept
                  		}
                  	}else{
                  		sysDepart.setParentId("");
  					}
                      //update-begin---author:liusq   Date:20210223  for：批量导入部门以后，不能追加下一级部门 #2245------------
  					sysDepart.setOrgType(sysDepart.getOrgCode().length()/codeLength+"");
                      //update-end---author:liusq   Date:20210223  for：批量导入部门以后，不能追加下一级部门 #2245------------
  					sysDepart.setDelFlag(CommonConstant.DEL_FLAG_0.toString());
  					ImportExcelUtil.importDateSaveOne(sysDepart, ISysDepartService.class, errorMessageList, num, CommonConstant.SQL_INDEX_UNIQ_DEPART_ORG_CODE);
  					num++;
                  }
  				//清空部门缓存
  				Set keys3 = redisTemplate.keys(CacheConstant.SYS_DEPARTS_CACHE + "*");
  				Set keys4 = redisTemplate.keys(CacheConstant.SYS_DEPART_IDS_CACHE + "*");
  				redisTemplate.delete(keys3);
  				redisTemplate.delete(keys4);
  				return ImportExcelUtil.imporReturnRes(errorMessageList.size(), listSysDeparts.size() - errorMessageList.size(), errorMessageList);
              } catch (Exception e) {
                  log.error(e.getMessage(),e);
                  return Result.error("文件导入失败:"+e.getMessage());
              } finally {
                  try {
                      file.getInputStream().close();
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              }
          }
          return Result.error("文件导入失败！");
      }
  
  
  	/**
  	 * 查询所有部门信息
  	 * @return
  	 */
  	@GetMapping("listAll")
  	public Result<List<SysDepart>> listAll(@RequestParam(name = "id", required = false) String id) {
  		Result<List<SysDepart>> result = new Result<>();
  		LambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<SysDepart>();
  		query.orderByAsc(SysDepart::getOrgCode);
  		if(oConvertUtils.isNotEmpty(id)){
  			String arr[] = id.split(",");
  			query.in(SysDepart::getId,arr);
  		}
  		List<SysDepart> ls = this.sysDepartService.list(query);
  		result.setSuccess(true);
  		result.setResult(ls);
  		return result;
  	}
  	/**
  	 * 查询数据 查出所有部门,并以树结构数据格式响应给前端
  	 *
  	 * @return
  	 */
  	@RequestMapping(value = "/queryTreeByKeyWord", method = RequestMethod.GET)
  	public Result<Map<String,Object>> queryTreeByKeyWord(@RequestParam(name = "keyWord", required = false) String keyWord) {
  		Result<Map<String,Object>> result = new Result<>();
  		try {
  			Map<String,Object> map=new HashMap<String,Object>();
  			List<SysDepartTreeModel> list = sysDepartService.queryTreeByKeyWord(keyWord);
  			//根据keyWord获取用户信息
  			LambdaQueryWrapper<SysUser> queryUser = new LambdaQueryWrapper<SysUser>();
  			queryUser.eq(SysUser::getDelFlag,CommonConstant.DEL_FLAG_0);
  			queryUser.and(i -> i.like(SysUser::getUsername, keyWord).or().like(SysUser::getRealname, keyWord));
  			List<SysUser> sysUsers = this.sysUserService.list(queryUser);
  			map.put("userList",sysUsers);
  			map.put("departList",list);
  			result.setResult(map);
  			result.setSuccess(true);
  		} catch (Exception e) {
  			log.error(e.getMessage(),e);
  		}
  		return result;
  	}
  
  	/**
  	 * 根据部门编码获取部门信息
  	 *
  	 * @param orgCode
  	 * @return
  	 */
  	@GetMapping("/getDepartName")
  	public Result<SysDepart> getDepartName(@RequestParam(name = "orgCode") String orgCode) {
  		Result<SysDepart> result = new Result<>();
  		LambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<>();
  		query.eq(SysDepart::getOrgCode, orgCode);
  		SysDepart sysDepart = sysDepartService.getOne(query);
  		result.setSuccess(true);
  		result.setResult(sysDepart);
  		return result;
  	}
  
  	/**
  	 * 根据部门id获取用户信息
  	 *
  	 * @param id
  	 * @return
  	 */
  	@GetMapping("/getUsersByDepartId")
  	public Result<List<SysUser>> getUsersByDepartId(@RequestParam(name = "id") String id) {
  		Result<List<SysUser>> result = new Result<>();
  		List<SysUser> sysUsers = sysUserDepartService.queryUserByDepId(id);
  		result.setSuccess(true);
  		result.setResult(sysUsers);
  		return result;
  	}
  }
  