package cn.timer.api.controller.zzgl;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import javax.transaction.Transactional;

import cn.timer.api.bean.kqmk.KqglAssoMonthPunchSummary;
import cn.timer.api.bean.zzgl.*;
import com.google.common.collect.Lists;
import freemarker.template.utility.StringUtil;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeNodeConfig;
import cn.hutool.core.lang.tree.TreeUtil;
import cn.hutool.core.util.StrUtil;
import cn.timer.api.aspect.lang.annotation.Log;
import cn.timer.api.aspect.lang.enums.BusinessType;
import cn.timer.api.bean.admin.AdminMenuTemplate;
import cn.timer.api.bean.qyzx.QyzxAdminMenu;
import cn.timer.api.bean.yggl.YgglMainEmp;
import cn.timer.api.config.annotation.CurrentUser;
import cn.timer.api.config.annotation.UserBean;
import cn.timer.api.config.enuminterface.YgEnumInterface;
import cn.timer.api.controller.kqgl.ClockInTool;
import cn.timer.api.controller.zzgl.service.ZzglBmgwMService;
import cn.timer.api.dao.yggl.YgglMainEmpMapper;
import cn.timer.api.dao.zzgl.ZzglBmgwMMapper;
import cn.timer.api.dao.zzgl.ZzglLogDgjlMapper;
import cn.timer.api.dao.zzgl.ZzglMenuMapper;
import cn.timer.api.dao.zzgl.ZzglPostMenuMapper;
import cn.timer.api.dto.qyzx.MenuStructureDto;
import cn.timer.api.dto.zzgl.DepartmentStaffDto;
import cn.timer.api.dto.zzgl.LogDgjlsDto;
import cn.timer.api.dto.zzgl.LogDgjlsQueryDto;
import cn.timer.api.dto.zzgl.ObtainDepartmentDto;
import cn.timer.api.dto.zzgl.UpEmpDeptDto;
import cn.timer.api.dto.zzgl.ZzglPostMenuDto;
import cn.timer.api.utils.Result;
import cn.timer.api.utils.ResultUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

@Api(tags = "2.组织管理")
@RestController
@Transactional
@RequestMapping(value = "/zzgl", produces = { "application/json" })
public class ZzglController {

	@Autowired
	ZzglBmgwMService zzglBmgwMService;

	@Autowired
	ZzglBmgwMMapper zzglBmgwMMapper;

	@Autowired
	ZzglPostMenuMapper zzglPostMenuMapper;

	@Autowired
	ZzglLogDgjlMapper zzglLogDgjlMapper;

	@Autowired
	YgglMainEmpMapper ygglMainEmpMapper;

	/**
	 * 架构树/架构图/导出
	 *
	 * @param
	 * @return
	 */
	@GetMapping(value = "/deptlist")
	@ApiOperation(value = "获取部门岗位", httpMethod = "GET", notes = "接口发布说明")
	public Result<List<ZzglBmgwM>> selectlistdept(@CurrentUser UserBean userBean) {
		Integer orgCode = userBean.getOrgCode();
		List<ZzglBmgwM> zzglBmgwMs = new LambdaQueryChainWrapper<ZzglBmgwM>(zzglBmgwMMapper)
				.eq(ZzglBmgwM::getOrgCode, orgCode).list();
		return ResultUtil.data(zzglBmgwMs);
	}

	/**
	 * 获取部门岗位-升级版
	 *
	 * @param
	 * @return
	 */
	@GetMapping(value = "/deptlist_plus")
	@ApiOperation(value = "1.获取部门岗位-升级版", httpMethod = "GET", notes = "接口发布说明")
	@ApiOperationSupport(order = 1)
	public Result<List<Tree<String>>> deptlistPlus(@CurrentUser UserBean userBean) {
		Integer orgCode = userBean.getOrgCode();
		List<ZzglBmgwM> zzglBmgwMs = new LambdaQueryChainWrapper<ZzglBmgwM>(zzglBmgwMMapper)
				.eq(ZzglBmgwM::getOrgCode, orgCode).list();

		// 构建node列表
//		List<TreeNode<String>> nodeList = CollUtil.newArrayList();
//		zzglBmgwMs.forEach(z -> {
//			nodeList.add(new TreeNode<>(Convert.toStr(z.getId()), Convert.toStr(z.getUpId()), z.getName(), 0));
//		});

		//配置
		TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
		// 自定义属性名 都要默认值的
		treeNodeConfig.setIdKey("id");
		treeNodeConfig.setParentIdKey("upId");
		// 最大递归深度
//		treeNodeConfig.setDeep(10);

		//转换器
		List<Tree<String>> treeNodes = TreeUtil.build(zzglBmgwMs, "0", treeNodeConfig,
		        (treeNode, tree) -> {
		            tree.setId(Convert.toStr(treeNode.getId()));
		            tree.setParentId(Convert.toStr(treeNode.getUpId()));
//		            tree.setWeight(treeNode.getWeight());
		            tree.setName(treeNode.getName());
		            // 扩展属性 ...
		            tree.putExtra("leader", treeNode.getLeader());
		            tree.putExtra("type", treeNode.getType());
//		            tree.putExtra("other", new Object());
		        });



//		System.out.println(treeNodes);
//		System.out.println(treeNodes.size());
//		System.out.println(deep2(treeNodes));

		return ResultUtil.data(treeNodes);
	}

	@GetMapping(value = "/deptlist_ultra")
	@ApiOperation(value = "获取部门岗位", httpMethod = "GET", notes = "接口发布说明")
	public Result<List<ZzglBmgwM>> deptlist_plusUltra(@CurrentUser UserBean userBean) {
		Integer orgCode = userBean.getOrgCode();
		List<ZzglBmgwM> zzglBmgwMs = new LambdaQueryChainWrapper<ZzglBmgwM>(zzglBmgwMMapper)
				.eq(ZzglBmgwM::getOrgCode, orgCode).list();
		zzglBmgwMs.forEach(z->{
			if(z.getType()==1){
				z.setUserList(new LambdaQueryChainWrapper<YgglMainEmp>(ygglMainEmpMapper).eq(YgglMainEmp::getBmgwId,z.getId()).list());
			}
		});
		return ResultUtil.data(zzglBmgwMs);
	}
	// 非递归,利用树的层次遍历
//	public static int deep2(List<Tree<String>> treeNodes) {
//		if(treeNodes == null)
//			return 0;
//		int depth = 0;
//		for (Tree<String> tree : treeNodes) {
//			if (tree.getChildren() == null) {
//				depth = tree.size()-1 > depth ? tree.size()-1 : depth;
//				if (Convert.toInt(tree.get("type")) == 1) {
//					depth = depth > 1 ? depth - 1 : depth;
//				}
//				System.out.println("depth = "+ depth);
//			}else {
//				int temp = deep2(tree.getChildren());
//				depth = temp > depth ? temp : depth;
//				System.out.println("temp = "+ temp);
//			}
//		}
//
//		return depth;
//	}

	/**
	 * 获取部门
	 *
	 * @param
	 * @return
	 */
	@GetMapping(value = "/depts_tree")
	@ApiOperation(value = "2.获取部门", httpMethod = "GET", notes = "接口发布说明")
	@ApiOperationSupport(order = 1)
	public Result<List<Tree<String>>> deptsOnlyone(@CurrentUser UserBean userBean) {
		Integer orgCode = userBean.getOrgCode();
		List<ZzglBmgwM> zzglBmgwMs = new LambdaQueryChainWrapper<ZzglBmgwM>(zzglBmgwMMapper)
				.eq(ZzglBmgwM::getOrgCode, orgCode).list();
		if (CollectionUtil.isNotEmpty(zzglBmgwMs)) {
			zzglBmgwMs = zzglBmgwMs.stream().filter(z -> z.getType() == 0).collect(Collectors.toList());

			if (CollectionUtil.isNotEmpty(zzglBmgwMs)) {
				//配置
				TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
				// 自定义属性名 都要默认值的
				treeNodeConfig.setIdKey("id");
				treeNodeConfig.setParentIdKey("upId");

				//转换器
				List<Tree<String>> treeNodes = TreeUtil.build(zzglBmgwMs, "0", treeNodeConfig,
			        (treeNode, tree) -> {
			            tree.setId(Convert.toStr(treeNode.getId()));
			            tree.setParentId(Convert.toStr(treeNode.getUpId()));
			            tree.setName(treeNode.getName());
			            // 扩展属性 ...
			            tree.putExtra("leader", treeNode.getLeader());
			            tree.putExtra("type", treeNode.getType());

				});

				return ResultUtil.data(treeNodes);
			}

		}

		return ResultUtil.success();
	}

	@GetMapping(value = "/depts")
	@ApiOperation(value = "2.获取部门", httpMethod = "GET", notes = "接口发布说明")
	@ApiOperationSupport(order = 2)
	public Result<List<ZzglBmgwM>> selectdepts(@CurrentUser UserBean userBean) {
		Integer orgCode = userBean.getOrgCode();
		List<ZzglBmgwM> zzglBmgwMs = new LambdaQueryChainWrapper<ZzglBmgwM>(zzglBmgwMMapper)
				.eq(ZzglBmgwM::getOrgCode, orgCode)
				.eq(ZzglBmgwM::getType, YgEnumInterface.OrgType.DEPARTMENT)
				.list();
		return ResultUtil.data(zzglBmgwMs);
	}

	/**
	 * 岗位成员
	 *
	 * @param 部门岗位id
	 * @return
	 */
	@GetMapping(value = "/otherlistent/{id}")
	@ApiOperation(value = "获取岗位成员列表", httpMethod = "GET", notes = "接口发布说明")
	public Result<List<YgglMainEmp>> selectOtherlistent(@CurrentUser UserBean userBean, @PathVariable Integer id, @ApiParam("过滤参数") @RequestParam(value = "param", required = false, defaultValue = "") String param) {
		Integer orgCode = userBean.getOrgCode();
		ArrayList<Integer> list = new ArrayList<Integer>();
		List<ZzglBmgwM> zzglBmgwMs = new LambdaQueryChainWrapper<ZzglBmgwM>(zzglBmgwMMapper)
				.eq(ZzglBmgwM::getOrgCode, orgCode).list();
		list.add(id);
		ZzglBmgwM.getDepts(list, id, zzglBmgwMs);

		ZzglBmgwM messsage = ZzglBmgwM.builder().build().selectOne(new QueryWrapper<ZzglBmgwM>().eq("id", id));
		Integer lead = messsage.getLeader(); // 获取部门或岗位领导id

		if (list == null || list.size() == 0) {
			return ResultUtil.error("部门信息不存在,请先添加部门!");
		} else {
			LambdaQueryWrapper<YgglMainEmp> ygglMainEmpsLambdaQueryWrapper = new LambdaQueryWrapper<>();
			ygglMainEmpsLambdaQueryWrapper
					.select(YgglMainEmp::getId, YgglMainEmp::getEmpNum, YgglMainEmp::getName, YgglMainEmp::getPhone,
							YgglMainEmp::getBmgwId,YgglMainEmp::getCustomNum)
					.eq(YgglMainEmp::getOrgCode, orgCode)
					.and(i -> i.in(YgglMainEmp::getBmgwId, list.toArray()))
					.and(!StrUtil.hasBlank(param),w -> w.like(YgglMainEmp::getName, param).or().like(YgglMainEmp::getEmpNum, param).or().eq(YgglMainEmp::getPhone, param).or().like(YgglMainEmp::getCustomNum, param))
					.last(lead != null, "order by if (emp_num='" + lead + "',0,1)");
			List<YgglMainEmp> ygglMainEmps = YgglMainEmp.builder().build().selectList(ygglMainEmpsLambdaQueryWrapper);
			return ResultUtil.data(ygglMainEmps);
		}
	}

	/**
	 * 获取调岗记录(weng)
	 *
	 * @param 部门岗位id
	 * @return
	 */
	@PostMapping(value = "/listdgjl")
	@ApiOperation(value = "获取调岗记录(weng)", httpMethod = "POST", notes = "接口发布说明")
	public Result<Object> selectlistdgjl(@CurrentUser UserBean userBean,
			@RequestBody LogDgjlsQueryDto logDgjlsQueryDto) {
		Integer orgCode = userBean.getOrgCode();
		ArrayList<Integer> list = new ArrayList<Integer>();
		List<ZzglBmgwM> zzglBmgwMs = new LambdaQueryChainWrapper<ZzglBmgwM>(zzglBmgwMMapper)
				.eq(ZzglBmgwM::getOrgCode, orgCode).list();
		list.add(logDgjlsQueryDto.getDeptId());
		ZzglBmgwM.getDepts(list, logDgjlsQueryDto.getDeptId(), zzglBmgwMs);

		if (list == null || list.size() == 0) {
			return ResultUtil.error("部门信息不存在,请先添加部门!");
		} else {

			logDgjlsQueryDto.setDeptIdList(list);
			logDgjlsQueryDto.setOrgCode(orgCode);

			IPage<LogDgjlsDto> page = new Page<LogDgjlsDto>(
					logDgjlsQueryDto.getCurrentPage() == null ? 1 : logDgjlsQueryDto.getCurrentPage(),
					logDgjlsQueryDto.getTotalPage() == null ? 10 : logDgjlsQueryDto.getTotalPage());
			List<LogDgjlsDto> logDgjlDtos = zzglLogDgjlMapper.selectListdgjls(page, logDgjlsQueryDto);
			return ResultUtil.data(page, logDgjlDtos, "查询成功");
		}
	}

	/**
	 * 未设置岗位的成员
	 *
	 * @return
	 */
	@GetMapping(value = "/listent")
	@ApiOperation(value = "未设置岗位的成员", httpMethod = "GET", notes = "接口发布说明")
	public Result<List<YgglMainEmp>> selectlistent(@CurrentUser UserBean userBean) {
		Integer orgCode = userBean.getOrgCode();

		LambdaQueryWrapper<YgglMainEmp> ygglMainEmpsLambdaQueryWrapper = new LambdaQueryWrapper<>();
		ygglMainEmpsLambdaQueryWrapper
				.select(YgglMainEmp::getId, YgglMainEmp::getEmpNum, YgglMainEmp::getName, YgglMainEmp::getPhone)
				.eq(YgglMainEmp::getOrgCode, orgCode)
				.and(i -> i.isNull(YgglMainEmp::getBmgwId).or().eq(YgglMainEmp::getBmgwId, 0));
		// .and(lqw -> lqw.notIn(id != null,
		// YgglMainEmp::getBmgwId,Arrays.asList(id)).or().isNull(YgglMainEmp::getBmgwId))
		List<YgglMainEmp> ygglMainEmps = YgglMainEmp.builder().build().selectList(ygglMainEmpsLambdaQueryWrapper);
		// List<ZzglBmgwMEmpDto> zzglBmgwMEmpDtos =
		// zzglBmgwMMapper.selectOtherListByOrgCode(orgCode,id);
		return ResultUtil.data(ygglMainEmps);
	}

	/**
	 * 添加/修改部门岗位
	 *
	 * @param
	 * @return
	 */
	@PostMapping(value = "/dept")
	@ApiOperation(value = "添加/修改部门", httpMethod = "POST", notes = "接口发布说明")
	@Log(title = "添加/修改-部门", businessType = BusinessType.INSERT_UPDATE)
	public Result<ZzglBmgwM> adddept(@CurrentUser UserBean userBean, @RequestBody ZzglBmgwM zzglBmgwM) {

		Integer count = zzglBmgwMMapper.selectCount(new QueryWrapper<ZzglBmgwM>().lambda()
				.eq(ZzglBmgwM::getOrgCode, userBean.getOrgCode()));
		if (count <= 0) {
			// 根部门upId 默认为0
			zzglBmgwM.setUpId(0);
		}
		ZzglBmgwM bmgwM = zzglBmgwMMapper.selectById(zzglBmgwM.getUpId());
		if(bmgwM !=null) {
			if (bmgwM.getType() != 0) {
				return ResultUtil.error("部门名称上级不能为岗位");
			}
		}
		if (zzglBmgwM.getLeader() == null && StrUtil.length(StrUtil.trim(zzglBmgwM.getName())) == 0)
			return ResultUtil.error("部门名称不能为空");

		Boolean notId = zzglBmgwM.getId() == null;
		if (notId && zzglBmgwM.getType() == null)
			zzglBmgwM.setType((Integer) 0);
			zzglBmgwM.setOrgCode(userBean.getOrgCode());
			zzglBmgwM.insertOrUpdate();

		return notId ? ResultUtil.data(zzglBmgwM) : ResultUtil.success();
	}
	/**
	 * 添加/修改部门岗位
	 *
	 * @param
	 * @return
	 */
	@PostMapping(value = "/job")
	@ApiOperation(value = "添加/修改部门", httpMethod = "POST", notes = "接口发布说明")
	@Log(title = "添加/修改-部门", businessType = BusinessType.INSERT_UPDATE)
	public Result<ZzglBmgwM> addjob
	(@CurrentUser UserBean userBean, @RequestBody ZzglBmgwM zzglBmgwM) {



		if (zzglBmgwM.getLeader() == null && StrUtil.length(StrUtil.trim(zzglBmgwM.getName())) == 0)
			return ResultUtil.error("岗位名称不能为空");

		Boolean notId = zzglBmgwM.getId() == null;
		if (notId && zzglBmgwM.getType() == null)
			zzglBmgwM.setType((Integer) 1);
		zzglBmgwM.setOrgCode(userBean.getOrgCode());
		zzglBmgwM.insertOrUpdate();

		return notId ? ResultUtil.data(zzglBmgwM) : ResultUtil.success();
	}



	/**
	 * 删除部门岗位
	 *
	 * @param 部门岗位ids [1,2,3,4]
	 * @return
	 */
	@DeleteMapping(value = "/dept")
	@ApiOperation(value = "删除部门岗位", httpMethod = "DELETE", notes = "接口发布说明")
	@Log(title = "删除-部门岗位", businessType = BusinessType.DELETE)
	public Result<Integer> deldepts(@CurrentUser UserBean userBean, @RequestBody List<Integer> ids) {
		YgglMainEmp ygglMainEmp = YgglMainEmp.builder().build();

		zzglLogDgjlMapper.insertbydeldept(ids, userBean.getEmpNum());
		ygglMainEmp.update(new UpdateWrapper<YgglMainEmp>().lambda()
				.set(YgglMainEmp::getBmgwId, null)
				.in(YgglMainEmp::getBmgwId, ids));
		zzglBmgwMMapper.deleteBatchIds(ids);

		return ResultUtil.success();
	}

	/**
	 * 批量修改/删除员工部门
	 *
	 * @param 部门岗位id
	 * @return
	 */
	@PostMapping(value = "/empdept")
	@ApiOperation(value = "批量修改/删除员工部门", httpMethod = "POST", notes = "接口发布说明")
	public Result<Void> updatelistempdept(@CurrentUser UserBean userBean, @RequestBody UpEmpDeptDto upEmpDeptDto) {
		Integer dpetId = upEmpDeptDto.getDpetId();
		List<Integer> empNums = upEmpDeptDto.getEmpNum();
		YgglMainEmp ygglMainEmp = YgglMainEmp.builder().build();
		KqglAssoMonthPunchSummary kqglAssoMonthPunchSummary = KqglAssoMonthPunchSummary.builder().build();
		String comm=null;
		Integer type=null;
		if(dpetId == null || dpetId == 0 ){
			comm="岗位删除员工";
			type=4;
		}else if(upEmpDeptDto.getIsdg() == null){
			comm="岗位添加员工";
			type=5;
		}else{
			if(upEmpDeptDto.getIsdg()==1) {
				comm = "员工调岗";
				type = 2;
			}
			if(upEmpDeptDto.getIsdg()==6) {
				comm = upEmpDeptDto.getRemake();
				type = 6;
			}
			if(upEmpDeptDto.getIsdg()==7) {
				comm = upEmpDeptDto.getRemake();;
				type = 7;
			}
		}
//		zzglLogDgjlMapper.insertbyaddemp(empNums, userBean.getEmpNum(), dpetId,null, userBean.getOrgCode(),comm,type);
		// 清楚 leader 主管标记
		if ((dpetId == null || dpetId == 0) || upEmpDeptDto.getIsdg() == null) {
			ZzglBmgwM.builder().leader(null).build()
				.update(new UpdateWrapper<ZzglBmgwM>().lambda()
						.eq(ZzglBmgwM::getOrgCode, userBean.getOrgCode())
						.in(ZzglBmgwM::getLeader, empNums));
		}

//		ygglMainEmp.update(new UpdateWrapper<YgglMainEmp>().lambda()
//				.set(YgglMainEmp::getBmgwId, dpetId).set(YgglMainEmp::getBmgwName, upEmpDeptDto.getDept())
//				.eq(YgglMainEmp::getOrgCode, userBean.getOrgCode()).in(YgglMainEmp::getEmpNum, empNums));

		List<YgglMainEmp> ygglMainEmpList=YgglMainEmp.builder().build().selectList(new QueryWrapper<YgglMainEmp>().lambda().eq(YgglMainEmp::getOrgCode,userBean.getOrgCode()).in(YgglMainEmp::getEmpNum,empNums));
		Integer oId=null;
			for(YgglMainEmp y:ygglMainEmpList) {
				if (upEmpDeptDto.getZpglCompanyId() != null) {
					y.setZpglCompanyId(upEmpDeptDto.getZpglCompanyId());
				}
				if (upEmpDeptDto.getZpglCompanyId() != null) {
					y.setZpglGzddId(upEmpDeptDto.getZpglGzddId());
				}
				if (upEmpDeptDto.getZpglCompanyId() != null) {
					y.setZpglZjId(upEmpDeptDto.getZpglZjId());
				}
				if (dpetId != null) {
					oId = y.getBmgwId();
					y.setBmgwId(dpetId);
				}
				y.updateById();
				zzglLogDgjlMapper.insertbyaddemp(empNums, userBean.getEmpNum(), dpetId, oId, userBean.getOrgCode(),
						comm, type);
			}
		// 调岗 同步部门 和 岗位信息 打卡月汇总
		if(!StringUtils.isEmpty(upEmpDeptDto.getIsdg()) && upEmpDeptDto.getIsdg().intValue()==1){
			kqglAssoMonthPunchSummary.update(new UpdateWrapper<KqglAssoMonthPunchSummary>().lambda()
					.set(KqglAssoMonthPunchSummary::getDept, upEmpDeptDto.getDept()).set(KqglAssoMonthPunchSummary::getPost, upEmpDeptDto.getPost())
					.eq(KqglAssoMonthPunchSummary::getOrgCode, userBean.getOrgCode()).in(KqglAssoMonthPunchSummary::getNum, empNums)
			);
		}

		return ResultUtil.success();
	}

	/**
	 * 岗位权限
	 *
	 * @param 部门岗位id
	 * @return
	 */
	@GetMapping(value = "/auth/{id}")
	@ApiOperation(value = "获取岗位岗位权限", httpMethod = "GET", notes = "接口发布说明")
	public Result<List<ZzglAuth>> auth(@CurrentUser UserBean userBean, @PathVariable Integer id) {
		Integer orgCode = userBean.getOrgCode();
		ArrayList<Integer> list = new ArrayList<Integer>();
		List<ZzglBmgwM> zzglBmgwMs = new LambdaQueryChainWrapper<ZzglBmgwM>(zzglBmgwMMapper)
				.eq(ZzglBmgwM::getOrgCode, orgCode).list();
				ZzglBmgwM.getupDepts(list, id, zzglBmgwMs);
		if (list == null || list.size() == 0) {
			return ResultUtil.error("部门信息不存在,请先添加部门!");
		} else {
			LambdaQueryWrapper<ZzglAuth> wp = new LambdaQueryWrapper<>();
			wp.select(ZzglAuth::getMenuId, ZzglAuth::getBmgwId).eq(ZzglAuth::getOrgCode, orgCode)
					.and(i -> i.in(ZzglAuth::getBmgwId, list.toArray()));
			List<ZzglAuth> zas = ZzglAuth.builder().build().selectList(wp);



			List<MenuStructureDto> mestrs = new ArrayList<MenuStructureDto>();
			List<QyzxAdminMenu> qyme = QyzxAdminMenu.builder().build().selectList(new QueryWrapper<QyzxAdminMenu>().lambda().eq(QyzxAdminMenu::getOrgCode, userBean.getOrgCode()).orderByAsc(QyzxAdminMenu::getSortNumber));
			String[] zdy = new String[qyme.size()];
			int i  = 0;
			for(QyzxAdminMenu me : qyme) {
				MenuStructureDto metr = MenuStructureDto.builder().build();
				metr.setMenuCode(me.getMenuCode());
				metr.setMenuName(me.getMenuName());
				metr.setSortNumber(me.getSortNumber());
				AdminMenuTemplate adte = AdminMenuTemplate.builder().build().selectOne(new QueryWrapper<AdminMenuTemplate>().lambda().eq(AdminMenuTemplate::getMenuCode, me.getMenuCode()));
				metr.setPath(adte.getPath());
				mestrs.add(metr);
				zdy[i] = me.getMenuCode();
				i++;
			}
			//
			List<AdminMenuTemplate> adtes = AdminMenuTemplate.builder().build().selectList(new QueryWrapper<AdminMenuTemplate>().lambda().eq(AdminMenuTemplate::getEnable, 1).orderByAsc(AdminMenuTemplate::getSortNumber));
			for(AdminMenuTemplate adm : adtes) {

				if(!ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull(zdy), adm.getMenuCode())) {
					if(adm.getDistribution() == 0 && userBean.getOrgCode() == 3) {
						MenuStructureDto metr = MenuStructureDto.builder().build();
						metr.setMenuCode(adm.getMenuCode());
						metr.setMenuName(adm.getMenuName());
						metr.setSortNumber(adm.getSortNumber());
						metr.setPath(adm.getPath());
						mestrs.add(metr);
					}else if(adm.getDistribution() == 1) {
						MenuStructureDto metr = MenuStructureDto.builder().build();
						metr.setMenuCode(adm.getMenuCode());
						metr.setMenuName(adm.getMenuName());
						metr.setSortNumber(adm.getSortNumber());
						metr.setPath(adm.getPath());
						mestrs.add(metr);
					}
				}
			}

			List<ZzglAuth> zas_ = new ArrayList<ZzglAuth>();
			String[] qhf = new String[mestrs.size()];
			int y = 0;
			for(MenuStructureDto metu : mestrs) {
				ZzglAuth zd = ZzglAuth.builder().build();
				 for(ZzglAuth zg : zas) {
					if(metu.getPath().equals(zg.getMenuId())) {
						zd.setBmgwId(zg.getBmgwId());
						zd.setMenuId(zg.getMenuId());
						zas_.add(zd);
						qhf[y] = zg.getMenuId();
						y++;
						break;
					}
				}
			}

			for(ZzglAuth zg : zas) {
				if(!ClockInTool.useArrayUtils(ClockInTool.deleteArrayNull2(qhf), zg.getMenuId())) {
					ZzglAuth zd = ZzglAuth.builder().build();
					zd.setBmgwId(zg.getBmgwId());
					zd.setMenuId(zg.getMenuId());
					zas_.add(zd);
				}
			}


			return ResultUtil.data(zas_);
		}
	}

	/**
	 * 批量修改/删除岗位权限
	 *
	 * @param 部门岗位id
	 * @param 菜单ids
	 * @return
	 */
	@PostMapping(value = "/auth/{id}")
	@ApiOperation(value = "批量修改/删除岗位权限", httpMethod = "POST", notes = "接口发布说明")
	public Result<Void> auth(@CurrentUser UserBean userBean, @PathVariable Integer id, @RequestBody List<String> ids) {
		Integer orgCode = userBean.getOrgCode();
		ZzglAuth.builder().build().delete(
				new QueryWrapper<ZzglAuth>().lambda().eq(ZzglAuth::getOrgCode, orgCode).eq(ZzglAuth::getBmgwId, id));
		ids.forEach(o -> {
			ZzglAuth za = ZzglAuth.builder().build();
			za.setBmgwId(id);
			za.setOrgCode(orgCode);
			za.setMenuId(o);
			za.insert();
		});
		return ResultUtil.success();
	}

	@Autowired
	private ZzglMenuMapper zzglMenuMapper;

	/**
	 * 获取-菜单权限列表
	 *
	 * @return
	 */
	@GetMapping(value = "/menu")
	@ApiOperation(value = "获取-菜单权限列表", httpMethod = "GET", notes = "接口发布说明")
	public Result<List<ZzglMenu>> selectMenu(@CurrentUser UserBean userBean) {

		List<ZzglMenu> list = zzglMenuMapper.selectList(null);

		return ResultUtil.data(list);
	}

	/**
	 * 获取-菜单权限-搜索
	 *
	 * @return
	 */
//	@PostMapping(value = "/querymenu")
//	@ApiOperation(value = "获取-菜单权限-搜索", httpMethod = "POST", notes = "接口发布说明")
//	public Result<List<Tree<String>>> queryMenu(@CurrentUser UserBean userBean,@RequestBody ZzglMenuQueryDto zzglMenuQueryDto) {
//
//		List<ZzglMenu> list = zzglMenuMapper.queryList(zzglMenuQueryDto);
//
//		//配置
//		TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
//		// 自定义属性名 都要默认值的
////		treeNodeConfig.setIdKey("id");
////		treeNodeConfig.setParentIdKey("upId");
//		treeNodeConfig.setNameKey("menuName");
//		// 最大递归深度
////		treeNodeConfig.setDeep(10);
//
//		//转换器
//		List<Tree<String>> treeNodes = TreeUtil.build(list, "0", treeNodeConfig,
//		        (treeNode, tree) -> {
//		            tree.setId(Convert.toStr(treeNode.getMenuId()));
//		            tree.setParentId(Convert.toStr(treeNode.getParentId()));
////				            tree.setWeight(treeNode.getWeight());
//		            tree.setName(treeNode.getMenuName());
//		            // 扩展属性 ...
//		            tree.putExtra("icon", treeNode.getIcon());
//		            tree.putExtra("isFrame", treeNode.getIsFrame());
//		            tree.putExtra("menuType", treeNode.getMenuType());
//		            tree.putExtra("orderNum", treeNode.getOrderNum());
//		            tree.putExtra("path", treeNode.getPath());
//		            tree.putExtra("perms", treeNode.getPerms());
//		            tree.putExtra("remark", treeNode.getRemark());
//		            tree.putExtra("visible", treeNode.getVisible());
////				    tree.putExtra("other", new Object());
//		        });
//
//		return ResultUtil.data(treeNodes);
//	}

	/**
	 * 新增-菜单权限
	 *
	 * @param 部门岗位id
	 * @return
	 */
	@PostMapping(value = "/menu")
	@ApiOperation(value = "新增-菜单权限", httpMethod = "POST", notes = "接口发布说明")
	public Result<List<ZzglMenu>> insertPostMenus(@Validated @RequestBody ZzglMenu zzglMenu) {

		Integer conut = zzglMenuMapper.selectCount(new QueryWrapper<ZzglMenu>().lambda()
				.eq(ZzglMenu::getMenuId, zzglMenu.getParentId()));
		if (conut <= 0) {
			return ResultUtil.error("上级权限不存在!");
		}

		return zzglMenu.insert() ? ResultUtil.success() : ResultUtil.error();
	}

	/**
	 * 删除-菜单权限
	 *
	 * @param 部门岗位id
	 * @return
	 */
	@DeleteMapping(value = "/menu/{id}")
	@ApiOperation(value = "删除-菜单权限", httpMethod = "DELETE", notes = "接口发布说明")
	public Result<List<ZzglMenu>> deletePostMenus(@Validated @RequestBody Integer id) {

		return zzglMenuMapper.deleteById(id) > 0 ? ResultUtil.success() : ResultUtil.error();
	}

	/**
	 * 修改-菜单权限
	 *
	 * @param 部门岗位id
	 * @return
	 */
	@PutMapping(value = "/menu/{id}")
	@ApiOperation(value = "修改-菜单权限", httpMethod = "PUT", notes = "接口发布说明")
	public Result<List<ZzglMenu>> updatePostMenus(@Validated @RequestBody ZzglMenu zzglMenu) {

		return zzglMenu.updateById() ? ResultUtil.success() : ResultUtil.error();
	}

	/**
	 * 获取-该岗位的菜单权限
	 *
	 * @param 部门岗位id
	 * @return
	 */
	@GetMapping(value = "/menu/{id}")
	@ApiOperation(value = "获取-该岗位的菜单权限", httpMethod = "GET", notes = "接口发布说明")
	public Result<List<Integer>> selectMenuByPostId(@CurrentUser UserBean userBean,@PathVariable Integer id) {

		return ResultUtil.data(zzglBmgwMService.selectMenuByPostId(id));
	}

	/**
	 * 修改-该岗位的菜单权限
	 *
	 * @param 部门岗位id
	 * @return
	 */
	@PutMapping(value = "/post_menu")
	@ApiOperation(value = "修改-该岗位的菜单权限", httpMethod = "PUT", notes = "接口发布说明")
	public Result<List<ZzglMenu>> updatePostMenus(@CurrentUser UserBean userBean,@RequestBody ZzglPostMenuDto zzglPostMenuDto) {

		Integer delCount = zzglPostMenuMapper.delete(new QueryWrapper<ZzglPostMenu>().lambda()
				.eq(ZzglPostMenu::getBmgwId, zzglPostMenuDto.getId()));
		Integer updateCount = zzglPostMenuMapper.insertPostMenus(zzglPostMenuDto.getId(),zzglPostMenuDto.getMenus());

		return ResultUtil.success();
	}


	@GetMapping(value = "/appdeptlist")
	@ApiOperation(value = "APP获取部门岗位", httpMethod = "GET", notes = "接口发布说明")
	public Result<Object> selectapplistdept(@CurrentUser UserBean userBean) {
		Integer orgCode = userBean.getOrgCode();
		List<ObtainDepartmentDto> tmen = new ArrayList<ObtainDepartmentDto>();

		List<ZzglBmgwM> zzglbmgwms = new LambdaQueryChainWrapper<ZzglBmgwM>(zzglBmgwMMapper)
				.eq(ZzglBmgwM::getOrgCode, userBean.getOrgCode()).eq(ZzglBmgwM::getType, 0).list();
		for(ZzglBmgwM gw : zzglbmgwms) {
			ObtainDepartmentDto tm = ObtainDepartmentDto.builder().build();
			BeanUtil.copyProperties(gw, tm);

			List<DepartmentStaffDto> destff = ygglMainEmpMapper.DepartmentStaff(orgCode,gw.getId());
			tm.setUser(destff);

			tmen.add(tm);
		}

		return ResultUtil.data(tmen);
	}
	@GetMapping(value = "/dgListByUser")
	@ApiOperation(value = "获取异动记录", httpMethod = "GET", notes = "接口发布说明")
	public Result<Object> dgListByUser(@CurrentUser UserBean userBean,@RequestParam(value = "empNum", required = false, defaultValue = "") Integer empNum) {
		List<ZzglLogDgjl> zzglLogDgjlList=zzglLogDgjlMapper.selectListByUser(userBean.getOrgCode(),empNum);
		return ResultUtil.data(zzglLogDgjlList);
	}
}