package com.yeejoin.amos.boot.module.common.biz.service.impl;

import java.io.Serializable;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

import javax.annotation.Resource;

import com.google.common.collect.Maps;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import org.typroject.tyboot.component.emq.EmqKeeper;
import org.typroject.tyboot.core.foundation.utils.Bean;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.rdbms.service.BaseService;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import com.yeejoin.amos.boot.biz.common.constants.CommonConstant;
import com.yeejoin.amos.boot.biz.common.entity.BaseEntity;
import com.yeejoin.amos.boot.biz.common.utils.TreeParser;
import com.yeejoin.amos.boot.module.common.api.dto.CheckObjectDto;
import com.yeejoin.amos.boot.module.common.api.dto.CompanyDto;
import com.yeejoin.amos.boot.module.common.api.dto.CompanyPerson;
import com.yeejoin.amos.boot.module.common.api.dto.DynamicFormInstanceDto;
import com.yeejoin.amos.boot.module.common.api.dto.ESOrgUsrDto;
import com.yeejoin.amos.boot.module.common.api.dto.FormValue;
import com.yeejoin.amos.boot.module.common.api.dto.OrgDepartmentDto;
import com.yeejoin.amos.boot.module.common.api.dto.OrgDepartmentFormDto;
import com.yeejoin.amos.boot.module.common.api.dto.OrgMenuDto;
import com.yeejoin.amos.boot.module.common.api.dto.OrgPersonDto;
import com.yeejoin.amos.boot.module.common.api.dto.OrgPersonExcelDto;
import com.yeejoin.amos.boot.module.common.api.dto.OrgPersonFormDto;
import com.yeejoin.amos.boot.module.common.api.dto.OrgUsrDto;
import com.yeejoin.amos.boot.module.common.api.dto.OrgUsrExcelDto;
import com.yeejoin.amos.boot.module.common.api.dto.OrgUsrFormDto;
import com.yeejoin.amos.boot.module.common.api.dto.OrgUsrzhDto;
import com.yeejoin.amos.boot.module.common.api.dto.RequestData;
import com.yeejoin.amos.boot.module.common.api.dto.UserDto;
import com.yeejoin.amos.boot.module.common.api.dto.UserUnitDto;
import com.yeejoin.amos.boot.module.common.api.entity.DynamicFormColumn;
import com.yeejoin.amos.boot.module.common.api.entity.DynamicFormInstance;
import com.yeejoin.amos.boot.module.common.api.entity.MaintenanceCompany;
import com.yeejoin.amos.boot.module.common.api.entity.OrgUsr;
import com.yeejoin.amos.boot.module.common.api.enums.OrgPersonEnum;
import com.yeejoin.amos.boot.module.common.api.enums.UserRolesEnum;
import com.yeejoin.amos.boot.module.common.api.enums.UserUnitTypeEnum;
import com.yeejoin.amos.boot.module.common.api.mapper.DynamicFormInstanceMapper;
import com.yeejoin.amos.boot.module.common.api.mapper.OrgUsrMapper;
import com.yeejoin.amos.boot.module.common.api.service.IMaintenanceCompanyService;
import com.yeejoin.amos.boot.module.common.api.service.IOrgUsrService;
import com.yeejoin.amos.component.feign.model.FeignClientResult;
import com.yeejoin.amos.feign.privilege.Privilege;
import com.yeejoin.amos.feign.privilege.model.AgencyUserModel;
import com.yeejoin.amos.feign.privilege.model.RoleModel;

import ch.qos.logback.core.joran.conditional.IfAction;

/**
 * 机构/部门/人员表 服务实现类
 *
 * @author tb
 * @date 2021-06-18
 */

@Service
public class OrgUsrServiceImpl extends BaseService<OrgUsrDto, OrgUsr, OrgUsrMapper> implements IOrgUsrService {

	private final Logger logger = LoggerFactory.getLogger(OrgUsrServiceImpl.class);

	private static final String TYPE = "PERSON,COMPANY";

	private static final String CODE = "amosAccount";

	private static final String FIELD_CODE = "telephone";

	private static final String COMPANY_FIELD_CODE = "companyLocation,longitude,latitude";

	@Autowired
	DynamicFormInstanceServiceImpl alertFormValueServiceImpl;
	@Autowired
	FirefightersServiceImpl firefightersService;
	@Autowired
	DynamicFormColumnServiceImpl alertFormServiceImpl;
	@Resource
	OrgUsrMapper orgUsrMapper;
	@Autowired
	EmqKeeper emqKeeper;
	@Autowired
	ESOrgUsrService eSOrgUsrService;
	@Autowired
	IMaintenanceCompanyService maintenanceCompanyService;
	@Autowired
	FireStationServiceImpl fireStationServiceImpl;
	@Value("${jcs.company.topic.add}")
	private String airportAddTopic;
	
	@Autowired
	DynamicFormInstanceMapper dynamicFormInstanceMapper;

	public static List<OrgMenuDto> buildTreeParallel(List<OrgUsr> list) {

		List<OrgMenuDto> menuList = list.stream().map(o -> {
			OrgMenuDto menu = new OrgMenuDto(o.getSequenceNbr(), o.getBizOrgName(),
					ObjectUtils.isEmpty(o.getParentId()) ? 0L : Long.valueOf(o.getParentId()), o.getBizOrgType(), false,
					o.getBizOrgCode());
			return menu;
		}).collect(Collectors.toList());

		List<OrgMenuDto> result = new ArrayList<>();
		Map<Long, OrgMenuDto> map = new HashMap<>(menuList.size());
		menuList.forEach(e -> map.put(e.getKey(), e));
		Set<? extends Map.Entry<Long, ? extends OrgMenuDto>> entries = map.entrySet();
		// 此处多线程，会value 出现null 的情况
		// entries.parallelStream().forEach(entry -> {
		entries.stream().forEach(entry -> {
			OrgMenuDto value = entry.getValue();
			if (value != null) {
				OrgMenuDto treeDto = map.get(value.getParentId());
				if (treeDto != null) {
					List<OrgMenuDto> children = treeDto.getChildren();
					if (children == null) {
						children = new ArrayList<>();
						treeDto.setChildren(children);
					}

					children.add(value);
				} else {
					result.add(value);
				}
			}
		});
		return result;
	}

	public static String getOrgCodeStr() {
		return TreeParser.genTreeCode();
	}

	@Override
	public String selectUpUnitByParam(String id) {
		return this.baseMapper.selectUpUnitByParam(id);
	}

	@Override
	public List<OrgMenuDto> getTree(Long topId, Collection entityList, String packageURL, String IDMethodName,
			int IDHierarchy, String NAMEMethodName, String PARENTIDMethodName, String OrgTypeMethodName)
			throws Exception {
		List<OrgMenuDto> resultList = new ArrayList<>();
		Class<?> clazz = Class.forName(packageURL);
		Method IDMethodNameme = null;
		switch (IDHierarchy) {
		case 1:
			IDMethodNameme = clazz.getDeclaredMethod(IDMethodName);
			break;
		case 2:
			IDMethodNameme = clazz.getSuperclass().getDeclaredMethod(IDMethodName);
			break;
		case 3:
			IDMethodNameme = clazz.getSuperclass().getSuperclass().getDeclaredMethod(IDMethodName);
			break;
		default:
			IDMethodNameme = clazz.getDeclaredMethod(IDMethodName);
			break;
		}

		Method NAMEMethodNameme = clazz.getDeclaredMethod(NAMEMethodName);
		Method PARENTIDMethodNameme = clazz.getDeclaredMethod(PARENTIDMethodName);
		Method OrgTypeMethodNameme = clazz.getDeclaredMethod(OrgTypeMethodName);
		// 获取顶层元素集合
		Long parentId;
		for (Object ob : entityList) {

			Object entity = clazz.cast(ob);

			parentId = !ObjectUtils.isEmpty(PARENTIDMethodNameme.invoke(entity))
					? Long.valueOf(String.valueOf(PARENTIDMethodNameme.invoke(entity)))
					: null;
//			if (parentId == null || topId ==parentId ) {
//				OrgMenuDto menu = new OrgMenuDto(Long.valueOf(String.valueOf(IDMethodNameme.invoke(entity))),
//						String.valueOf(NAMEMethodNameme.invoke(entity)), parentId,
//						String.valueOf(OrgTypeMethodNameme.invoke(entity)), false);
//				resultList.add(menu);
//			}
			/*
			 * *******************topId与parentId的等值判断，修改人陈浩 on 2021/07/21---start
			 ******************************/
			if (parentId == null) {// topId与parentId的等值判断，修改人陈浩 on 2021/07/21
				OrgMenuDto menu = new OrgMenuDto(Long.valueOf(String.valueOf(IDMethodNameme.invoke(entity))),
						String.valueOf(NAMEMethodNameme.invoke(entity)), parentId,
						String.valueOf(OrgTypeMethodNameme.invoke(entity)), false);
				resultList.add(menu);
			} else if (topId != null && topId.longValue() == parentId.longValue()) {
				OrgMenuDto menu = new OrgMenuDto(Long.valueOf(String.valueOf(IDMethodNameme.invoke(entity))),
						String.valueOf(NAMEMethodNameme.invoke(entity)), parentId,
						String.valueOf(OrgTypeMethodNameme.invoke(entity)), false);
				resultList.add(menu);
			}
			/*
			 * *******************topId与parentId的等值判断，修改人陈浩 on 2021/07/21---end
			 ******************************/
		}
		// 获取每个顶层元素的子数据集合
		for (OrgMenuDto entity : resultList) {
			entity.setChildren(getSub(entity.getKey(), entityList, packageURL, IDMethodName, IDHierarchy,
					NAMEMethodName, PARENTIDMethodName, OrgTypeMethodName));
		}
		return resultList;
	}

	@Override
	public List<OrgMenuDto> getSub(Long topId, @SuppressWarnings("rawtypes") Collection entityList, String packageURL,
			String IDMethodName, int IDHierarchy, String NAMEMethodName, String PARENTIDMethodName,
			String OrgTypeMethodName) throws Exception {
		List<OrgMenuDto> childList = new ArrayList<>();
		Class clazz = Class.forName(packageURL);
		Method IDMethodNameme = null;
		switch (IDHierarchy) {
		case 1:
			IDMethodNameme = clazz.getDeclaredMethod(IDMethodName);
			break;
		case 2:
			IDMethodNameme = clazz.getSuperclass().getDeclaredMethod(IDMethodName);
			break;
		case 3:
			IDMethodNameme = clazz.getSuperclass().getSuperclass().getDeclaredMethod(IDMethodName);
			break;
		default:
			IDMethodNameme = clazz.getDeclaredMethod(IDMethodName);
			break;
		}
		Method OrgTypeMethodNameme = clazz.getDeclaredMethod(OrgTypeMethodName);
		Method NAMEMethodNameme = clazz.getDeclaredMethod(NAMEMethodName);
		Method PARENTIDMethodNameme = clazz.getDeclaredMethod(PARENTIDMethodName);

		Long parentId;
		// 子集的直接子对象
		for (Object ob : entityList) {
			Object entity = clazz.cast(ob);

			parentId = !ObjectUtils.isEmpty(PARENTIDMethodNameme.invoke(entity))
					? Long.valueOf(String.valueOf(PARENTIDMethodNameme.invoke(entity)))
					: null;

			if (parentId == null) {
				if (topId == parentId) {
					OrgMenuDto menu = new OrgMenuDto(Long.valueOf(String.valueOf(IDMethodNameme.invoke(entity))),
							String.valueOf(NAMEMethodNameme.invoke(entity)), parentId,
							String.valueOf(OrgTypeMethodNameme.invoke(entity)));
					childList.add(menu);
				}
			} else {
				if (topId.longValue() == parentId.longValue()) {
					OrgMenuDto menu = new OrgMenuDto(Long.valueOf(String.valueOf(IDMethodNameme.invoke(entity))),
							String.valueOf(NAMEMethodNameme.invoke(entity)), parentId,
							String.valueOf(OrgTypeMethodNameme.invoke(entity)));
					childList.add(menu);
				}
			}

		}

		// 子集的间接子对象
		for (OrgMenuDto entity : childList) {
			entity.setChildren(getSub(entity.getKey(), entityList, packageURL, IDMethodName, IDHierarchy,
					NAMEMethodName, PARENTIDMethodName, OrgTypeMethodName));
			if (entity.getChildren() != null) {
				entity.setLeaf(false);
			}
		}

		// 递归退出条件
		if (childList.size() == 0) {
			return null;
		}

		return childList;
	}

	@Override
	public List<Map<String, Object>> returnCompanyPersonMsg(List<Long> ids) throws Exception {
		List<Map<String, Object>> companyPersonMsg = new ArrayList<>();
		for (int i = 0; i < ids.size(); i++) {
			Map<String, Object> resultMap = new HashMap<>();
			// 查询出单位基本信息
			OrgUsr company = getById(ids.get(i));
			resultMap.put("id", company.getSequenceNbr());
			// 上级单位
			resultMap.put("upUnit", selectUpUnitByParam(company.getSequenceNbr() + ""));
			// 当前单位
			resultMap.put("currentUnit", company.getBizOrgName());
			// 下级单位
			Map<String, Object> downUnitColumnMap = new HashMap<>();
			downUnitColumnMap.put("is_delete", CommonConstant.IS_DELETE_00);
			downUnitColumnMap.put("biz_org_type", CommonConstant.BIZ_ORG_TYPE_COMPANY);
			downUnitColumnMap.put("parent_id", company.getSequenceNbr());
			QueryWrapper<OrgUsr> downUnitWrapper = new QueryWrapper<OrgUsr>();
			downUnitWrapper.allEq(downUnitColumnMap);
			List<OrgUsr> downList = list(downUnitWrapper);
			if (downList.size() == 0) {
				resultMap.put("downUnit", false);
			} else {
				resultMap.put("downUnit", true);
			}
			// 人员数量
			Map<String, Object> countPerson = new HashMap<>();
			countPerson.put("parent_id", company.getSequenceNbr());
			countPerson.put("biz_org_type", CommonConstant.BIZ_ORG_TYPE_PERSON);
			QueryWrapper<OrgUsr> personNumWrapper = new QueryWrapper<OrgUsr>();
			personNumWrapper.allEq(countPerson);
			int personNum = count(personNumWrapper);
			resultMap.put("personNum", personNum);
			if (0 == personNum) {
				continue;
			}
			List<Map<String, Object>> personList = new ArrayList<>();
			// 查询动态表单Phone
			Map<String, Object> phone = new HashMap<>();
			phone.put("instance_id", company.getSequenceNbr());
			phone.put("field_code", "companyPhone");
			QueryWrapper<DynamicFormInstance> phoneWrapper = new QueryWrapper<DynamicFormInstance>();
			phoneWrapper.allEq(phone);
			DynamicFormInstance phoneValue = alertFormValueServiceImpl.getOne(phoneWrapper);
			if (phoneValue == null) {
				resultMap.put("tel", "");
			} else {
				resultMap.put("tel", phoneValue.getFieldValue());
			}

			// 获取单位人员列表信息
			personList = listPerson(company.getSequenceNbr() + "").stream().map(p -> {
				Map<String, Object> person = new HashMap<>();
				person.put("tel", getValue(p.get("telephone"), null));
				person.put("img", getValue(p.get("personImg"), null));
				person.put("id", getValue(p.get("sequenceNbr"), null));
				person.put("name", getValue(p.get("bizOrgName"), null));
				person.put("zhiwei", getValue(p.get("administrativePositionCode"), null));
				person.put("unit", getValue(p.get("fireManagementPostCode"), null));
				return person;
			}).collect(Collectors.toList());
			resultMap.put("children", personList);
			companyPersonMsg.add(resultMap);
		}
		return companyPersonMsg;
	}

	private Object getValue(Object obj, Object defaultValue) {
		return ObjectUtils.isEmpty(obj) ? defaultValue : obj;
	}

	public List<Map<String, Object>> listPerson(String parentId) {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("fields", alertFormServiceImpl.queryListByFormId(OrgPersonEnum.人员.getCode()));
		map.put("bizOrgType", OrgPersonEnum.人员.getKey());
		map.put("parentId", parentId);
		List<Map<String, Object>> list = this.baseMapper.selectPersonAllList(map);
		return list == null ? new ArrayList<Map<String, Object>>() : list;
	}

	public IPage<Map<String, Object>> pagePerson(String pageNum, String pageSize, Map<String, Object> req) {
		IPage<Map<String, Object>> pageBean = null;
		if (StringUtils.isBlank(pageNum) || StringUtils.isBlank(pageSize)) {
			pageBean = new Page<>(0, Long.MAX_VALUE);
		} else {
			pageBean = new Page<>(Integer.parseInt(pageNum), Integer.parseInt(pageSize));
		}
		Map<String, Object> map = new HashMap<>();
		/* Bug2652 根据名字和工号模糊查询失效 已添加模糊匹配 2021-09-01 陈召 开始 */
		map.put("bizOrgType", OrgPersonEnum.人员.getKey());
		if (!ObjectUtils.isEmpty(req.get("bizOrgName"))) {
			map.put("bizOrgName", req.get("bizOrgName"));
		}

		if (!ObjectUtils.isEmpty(req.get("personNumber"))) {
			map.put("personNumber", req.get("personNumber"));
		}
		/* BUG2680 查询部门人员错误 传递参数类型不正确 修改为string 2021-09-14 陈召 开始 */
		if (req.get("parentId") != null && req.get("parentId") != "") {
			OrgUsr parent = this.getById(req.get("parentId").toString());
			map.put("bizOrgCode", ObjectUtils.isEmpty(parent) ? null : parent.getBizOrgCode());
		}
		/* BUG2680 查询部门人员错误 传递参数类型不正确 修改为string 2021-09-14 陈召 开始 */

		req.remove("bizOrgName");
		req.remove("pageSize");
		req.remove("pageNum");
		req.remove("parentId");

		map.put("fieldsValue", req);
		map.put("fields", alertFormServiceImpl.queryListByFormId(OrgPersonEnum.人员.getCode()));
		pageBean.setTotal(this.baseMapper.selectPersonListCount(map));
		map.put("pageNum", (pageBean.getCurrent() - 1) * pageBean.getSize());
		map.put("pageSize", pageBean.getSize());
		List<Map<String, Object>> list = this.baseMapper.selectPersonList(map);
		list.stream().forEach(t -> {
			// BUG2886 因为前期沟通 人员code 可能会发生改变 所以 现在接口code 不再保存，查询数据时通过接口重新赋值 by kongfm
			// 2021-09-16
			if (null != t.get("amosOrgId") && StringUtils.isNotEmpty(t.get("amosOrgId").toString())) {
				FeignClientResult<AgencyUserModel> result1 = Privilege.agencyUserClient
						.queryByUserId(t.get("amosOrgId").toString());
				if (null != result1.getResult()) {
					t.put("amosOrgCode", result1.getResult().getRealName());
				}
			}

		});
		/* Bug2652 根据名字和工号模糊查询失效 已添加模糊匹配 2021-09-01 陈召 结束 */
		pageBean.setRecords(list);
		return pageBean;
	}

	@Override
	public List<FormValue> getFormValue(Long id) throws Exception {
		// 动态表单数据

		List<DynamicFormInstanceDto> list = alertFormValueServiceImpl.listByCalledId(id);
		List<FormValue> formValue = new ArrayList<>();
		for (DynamicFormInstanceDto alertFormValue : list) {
			/* 修改为动态表单返回的数据参数量 2021-09-08 陈浩 开始 */
//            if (alertFormValue.getFieldValueLabel() != null) {
//                FormValue value = new FormValue(alertFormValue.getFieldCode(), alertFormValue.getFieldName(),
//                        alertFormValue.getFieldType(), alertFormValue.getFieldValueLabel(), alertFormValue.getBlock());
//                formValue.add(value);
//            } else {
			FormValue value = new FormValue(alertFormValue.getFieldCode(), alertFormValue.getFieldName(),
					alertFormValue.getFieldType(), alertFormValue.getFieldValue(), alertFormValue.getBlock(),
					alertFormValue.getFieldValueLabel());
			formValue.add(value);
			/* 修改为动态表单返回的数据参数量 2021-09-08 陈浩 结束 */
//            }
			/* BUG2580 返回值为code值 修改为类型名称 2021-08-31 陈召 开始 */
		}
		return formValue;

	}

	public List<FormValue> getFormValueDetail(Long id) throws Exception {
		// 动态表单数据
		List<DynamicFormInstanceDto> list = alertFormValueServiceImpl.listByCalledId(id);
		List<FormValue> formValue = new ArrayList<>();
		for (DynamicFormInstanceDto alertFormValue : list) {
			FormValue value = new FormValue(alertFormValue.getFieldCode(), alertFormValue.getFieldName(),
					alertFormValue.getFieldType(), alertFormValue.getFieldValue(), alertFormValue.getBlock(),
					alertFormValue.getFieldValueLabel());// 陈浩 添加getFieldValueLabel的属性值 2021-09-08
			formValue.add(value);
		}
		return formValue;
	}

	@Override
	public void saveOrgUsr(OrgUsr orgUsr, OrgUsr oriOrgUsr) throws Exception {

		if (oriOrgUsr.getParentId() != oriOrgUsr.getParentId()) {
			OrgUsr parent = getById(orgUsr.getParentId());
			if (parent != null && !ObjectUtils.isEmpty(parent.getBizOrgCode())) {
				orgUsr.setBizOrgCode(parent.getBizOrgCode() + getOrgCodeStr());
			}
			updateChildOrgCode(oriOrgUsr.getBizOrgCode(), orgUsr.getBizOrgCode());
			orgUsr.setParentId(oriOrgUsr.getParentId());
		}
		AgencyUserModel me = Privilege.agencyUserClient.getme().getResult();
		orgUsr.setRecDate(new Date());
		orgUsr.setRecUserId(me.getUserId());
		orgUsr.setRecUserName(me.getRealName());
		updateById(orgUsr);
	}

	private void updateChildOrgCode(String oriOrgCode, String targetOrgCode) {
		List<OrgUsr> list = queryOrgUsrList(oriOrgCode);
		if (!ObjectUtils.isEmpty(list)) {
			list.forEach(action -> {
				action.setBizOrgCode(action.getBizOrgCode().replace(oriOrgCode, targetOrgCode));
				updateById(action);
			});
		}
	}

	public List<OrgUsr> queryOrgUsrList(String bizOrgCode) {
		return this.baseMapper.queryOrgUsrListByBizOrgCode(bizOrgCode);
	}

	@Override
	public OrgUsrDto saveOrgUsrDynamicFormInstance(OrgUsr orgUsr, List<DynamicFormInstance> alertFromValuelist)
			throws Exception {
		orgUsr.setRecDate(new Date());
		AgencyUserModel user = Privilege.agencyUserClient.getme().getResult();
		orgUsr.setRecUserName(user.getRealName());
		orgUsr.setRecUserId(user.getUserId());
		OrgUsrDto orgUsrDto = new OrgUsrDto();
		BeanUtils.copyProperties(orgUsr, orgUsrDto);
		// 单位新增情况
		OrgUsrDto model = createWithModel(orgUsrDto);
		// save(orgUsr);
		// 填充主键
		alertFromValuelist.stream().forEach(alertFromValue -> {
			if (OrgPersonEnum.公司.getKey().equals(orgUsrDto.getBizOrgType())) {
				alertFromValue.setGroupCode(OrgPersonEnum.公司.getCode());
			} else if (OrgPersonEnum.部门.getKey().equals(orgUsrDto.getBizOrgType())) {
				alertFromValue.setGroupCode(OrgPersonEnum.部门.getCode());
			}
			alertFromValue.setInstanceId(orgUsrDto.getSequenceNbr());
		});
		// 保存动态表单数据
		alertFormValueServiceImpl.saveBatch(alertFromValuelist);
		OrgUsrFormDto formDto = this.selectCompanyById(orgUsrDto.getSequenceNbr());
		if (OrgPersonEnum.公司.getKey().equals(orgUsrDto.getBizOrgType())) {
			try {
				emqKeeper.getMqttClient().publish(airportAddTopic, JSON.toJSONString(formDto).getBytes(), 2, false);
			} catch (Exception e) {
				e.getMessage();
			}
		}
		return model;
	}

	@Override
	public void updateDynamicFormInstance(Long instanceId, List<DynamicFormInstance> fromValueList) {
		// 填充主键
		fromValueList.forEach(alertFromValue -> {
			alertFromValue.setInstanceId(instanceId);
		});
		List<DynamicFormInstanceDto> formList = alertFormValueServiceImpl.queryByCalledId(instanceId);

		Map<Long, DynamicFormInstanceDto> resourceMap = new HashMap<>();
		Map<Long, DynamicFormInstance> newResourceMap = new HashMap<>();
		formList.parallelStream().forEach(form -> {
			resourceMap.put(form.getFormColumnId(), form);
		});

		List<DynamicFormInstance> updateList = new ArrayList<>();
		List<DynamicFormInstance> addList = new ArrayList<>();
		List<Long> deleteList = new ArrayList<>();

		fromValueList.parallelStream().forEach(submitFormItem -> {
			if (resourceMap.containsKey(submitFormItem.getFormColumnId())) {
				DynamicFormInstanceDto oldForm = resourceMap.get(submitFormItem.getFormColumnId());
				submitFormItem.setSequenceNbr(oldForm.getSequenceNbr());
				updateList.add(submitFormItem);
			} else {
				addList.add(submitFormItem);
			}
			newResourceMap.put(submitFormItem.getFormColumnId(), submitFormItem);
		});

		newResourceMap.keySet().parallelStream().forEach(form -> {
			resourceMap.remove(form);
		});

		resourceMap.keySet().parallelStream().forEach(action -> {
			deleteList.add(resourceMap.get(action).getSequenceNbr());
		});

		if (deleteList.size() > 0) {
			alertFormValueServiceImpl.deleteBatchSeq(deleteList);
		}

		if (updateList.size() > 0) {
			alertFormValueServiceImpl.updateBatchById(updateList);
		}

		if (addList.size() > 0) {
			alertFormValueServiceImpl.saveBatch(addList);
		}
	}

	@Override
	public Map<String, Object> selectForShowById(OrgUsr orgUsr, Long id) throws Exception {
		QueryWrapper<DynamicFormColumn> queryWrapper = new QueryWrapper<DynamicFormColumn>();
		queryWrapper.eq("group_code", OrgPersonEnum.人员.getCode());
		List<DynamicFormColumn> alertForms = alertFormServiceImpl.list(queryWrapper);
		// 动态表单数据
		List<DynamicFormInstanceDto> list = alertFormValueServiceImpl.listByCalledId(id);
		Map<String, Object> result = new HashMap<>();

		// 机场人员AMOS角色丢失修正, by litw start 2021年9月10日
		if (StringUtils.isNotEmpty(orgUsr.getAmosOrgId())) {
			FeignClientResult<AgencyUserModel> result1 = Privilege.agencyUserClient
					.queryByUserId(orgUsr.getAmosOrgId());
			if (null != result1.getResult()) {
				orgUsr.setAmosOrgCode(result1.getResult().getRealName());
			}
		}
		// 机场人员AMOS角色丢失修正, by litw end 2021年9月10日
		result = Bean.BeantoMap(orgUsr);
		/* bug 2869 部门为空人员详情报空指针 2021-09-15 陈召 开始 */
		if (orgUsr.getParentId() != null) {
			result.put("parenName", getById(orgUsr.getParentId()).getBizOrgName());
		}
		/* bug 2869 部门为空人员详情报空指针 2021-09-15 陈召 结束 */
		// 放入所有动态表单数据
		for (DynamicFormColumn alertForm : alertForms) {
			result.put(alertForm.getFieldCode(), null);
		}
		for (DynamicFormInstanceDto alertFormValue : list) {
			result.put(alertFormValue.getFieldCode(),
					ObjectUtils.isEmpty(alertFormValue.getFieldValueLabel()) ? alertFormValue.getFieldValue()
							: alertFormValue.getFieldValueLabel());
		}
		return result;
	}




	@Override
	public Map<String, Object> selectForShowByIduser(OrgUsr orgUsr, Long id) throws Exception {
		QueryWrapper<DynamicFormColumn> queryWrapper = new QueryWrapper<DynamicFormColumn>();
		queryWrapper.eq("group_code", OrgPersonEnum.人员.getCode());
		List<DynamicFormColumn> alertForms = alertFormServiceImpl.list(queryWrapper);
		// 动态表单数据
		List<DynamicFormInstanceDto> list = alertFormValueServiceImpl.listByCalledId(id);
		Map<String, Object> result = new HashMap<>();
		result = Bean.BeantoMap(orgUsr);
     	// 放入所有动态表单数据
		for (DynamicFormColumn alertForm : alertForms) {
			result.put(alertForm.getFieldCode(), null);
		}

		result.put("parenName", orgUsr.getParentId() != null?getByIduser(orgUsr.getParentId()).getBizOrgName():"");

		for (DynamicFormInstanceDto alertFormValue : list) {
			result.put(alertFormValue.getFieldCode(),
					ObjectUtils.isEmpty(alertFormValue.getFieldValueLabel()) ? alertFormValue.getFieldValue()
							: alertFormValue.getFieldValueLabel());
		}
		return result;
	}

















	@Override
	public List<OrgUsr> selectCompanyDepartmentMsg() {
		List<OrgUsr> list = this.baseMapper.selectCompanyDepartmentMsg();
		if (list == null) {
			return new ArrayList<>();
		}
		list = list.stream().filter(o -> !ObjectUtils.isEmpty(o)).collect(Collectors.toList());
		return list;
	}

	public List<OrgUsr> selectCompanyList() {
		List<OrgUsr> list = list(
				new LambdaQueryWrapper<OrgUsr>().eq(OrgUsr::getIsDelete, false).eq(OrgUsr::getBizOrgType, "COMPANY"));
		if (list == null) {
			return new ArrayList<>();
		}
		list = list.stream().filter(o -> !ObjectUtils.isEmpty(o)).collect(Collectors.toList());
		return list;
	}

	@Override
	public OrgUsrDto saveOrgUsr(OrgUsrDto OrgUsrVo) throws Exception {
		OrgUsr orgUsr = new OrgUsr();
		BeanUtils.copyProperties(OrgUsrVo, orgUsr);
		orgUsr.setBizOrgType(CommonConstant.BIZ_ORG_TYPE_COMPANY);
		if (OrgUsrVo.getParentId() != null) {
			OrgUsr parent = getById(OrgUsrVo.getParentId());
			if (parent != null && ObjectUtils.isEmpty(OrgUsrVo.getBizOrgCode())) {
				orgUsr.setBizOrgCode(parent.getBizOrgCode() + getOrgCodeStr());
			}
		} else {
			orgUsr.setBizOrgCode(getOrgCodeStr());
		}
		OrgUsrDto orgUsrDto = saveOrgUsrDynamicFormInstance(orgUsr, OrgUsrVo.getDynamicFormValue());

		/**
		 * 同步保存ES
		 */
		eSOrgUsrService.saveAlertCalledToES(orgUsr);
		return orgUsrDto;
	}

	@Override
	public OrgUsrDto saveOrgPerson(OrgPersonDto OrgPersonVo) throws Exception {
		OrgUsr orgUsr = new OrgUsr();
		BeanUtils.copyProperties(OrgPersonVo, orgUsr);
		orgUsr.setBizOrgType(CommonConstant.BIZ_ORG_TYPE_PERSON);
		if (OrgPersonVo.getParentId() != null) {
			OrgUsr parent = getById(OrgPersonVo.getParentId());
			if (parent != null && ObjectUtils.isEmpty(OrgPersonVo.getBizOrgCode())) {
				orgUsr.setBizOrgCode(parent.getBizOrgCode() + getOrgCodeStr());
			}
		} else {
			orgUsr.setBizOrgCode(getOrgCodeStr());
		}

		return saveOrgUsrDynamicFormInstance(orgUsr, OrgPersonVo.getDynamicFormValue());
	}

	public void saveOrgPersonExcel(OrgUsrExcelDto OrgPersonVo) throws Exception {
		OrgUsr orgUsr = new OrgUsr();
		BeanUtils.copyProperties(OrgPersonVo, orgUsr);
		orgUsr.setBizOrgType(CommonConstant.BIZ_ORG_TYPE_PERSON);
		if (OrgPersonVo.getParentId() != null) {
			OrgUsr parent = getById(OrgPersonVo.getParentId());
			if (parent != null && ObjectUtils.isEmpty(OrgPersonVo.getBizOrgCode())) {
				orgUsr.setBizOrgCode(parent.getBizOrgCode() + getOrgCodeStr());
			}
		} else {
			orgUsr.setBizOrgCode(getOrgCodeStr());
		}

		if (!ObjectUtils.isEmpty(OrgPersonVo.getAmosOrgId())) {
			AgencyUserModel user = Privilege.agencyUserClient.queryByUserId(OrgPersonVo.getAmosOrgId()).getResult();
			OrgPersonVo.setAmosOrgCode(user.getRealName());
		}

		saveOrgUsrDynamicFormInstance(orgUsr, OrgPersonVo.getDynamicFormValue());
	}

	@Override
	public OrgUsrDto updateByIdOrgUsr(OrgUsrDto OrgUsrVo, Long id) throws Exception {
		// 修改单位信息
		OrgUsr orgUsr = new OrgUsr();
		OrgUsr oriOrgUsr = getById(id);
		BeanUtils.copyProperties(OrgUsrVo, orgUsr);
		// 判断是否修改所属单位
		if (!(oriOrgUsr.getParentId() != null ? oriOrgUsr.getParentId() : "").equals(OrgUsrVo.getParentId())) {

			/* 单位编辑后 code值也应做出修改 2021-09-09 陈召 开始 */
			OrgUsr parent = getById(OrgUsrVo.getParentId());
			if (parent != null) {
				orgUsr.setBizOrgCode(parent.getBizOrgCode() + getOrgCodeStr());
			}
			orgUsr.setSequenceNbr(id);
			// 查询机构下的所有部门单位人员数据，进行bizOrgCode的统一修改 BUG 2880 by litw start 2021年9月16日
//            String oriOrgCode = oriOrgUsr.getBizOrgCode();
//            Map<String, Object> columnMap = new HashMap<>();
//            columnMap.put("bizOrgCode", oriOrgCode);
//            List<OrgUsr> list = orgUsrMapper.selectAllChildrenList(columnMap);
//            list.stream().forEach(e -> {
//                e.setBizOrgCode(e.getBizOrgCode().replace(oriOrgCode, orgUsr.getBizOrgCode()));
//            });
//            this.updateBatchById(list);
//            /*单位编辑后 code值也应做出修改 2021-09-09 陈召 结束  */
			orgUsrMapper.updatelistByParentId(orgUsr.getBizOrgCode(), oriOrgUsr.getBizOrgCode());
		}
		updateById(orgUsr);

		// saveOrgUsr(orgUsr, oriOrgUsr);

		// 保存动态表单数据
		updateDynamicFormInstance(orgUsr.getSequenceNbr(), OrgUsrVo.getDynamicFormValue());
		/**
		 * 同步保存ES
		 */
		eSOrgUsrService.saveAlertCalledToES(orgUsr);
		OrgUsrVo.setBizOrgCode(orgUsr.getBizOrgCode());
		return OrgUsrVo;
	}

	@Override
	public OrgPersonDto updateByIdOrgPerson(OrgPersonDto OrgPersonVo, Long id) throws Exception {
		// 修改人员信息
		OrgUsr orgUsr = new OrgUsr();
		OrgUsr oriOrgUsr = getById(id);
		BeanUtils.copyProperties(OrgPersonVo, orgUsr);
		/*
		 * Bug 2647 编辑用户所属单位后按单位筛选人员结果错误 增加了 638 639 两行代码 根据修改的部门调整部门code 2021-09-03 陈召
		 * 开始
		 */
		OrgUsr parent = getById(OrgPersonVo.getParentId());
		if (parent != null) {
			orgUsr.setBizOrgCode(parent.getBizOrgCode() + getOrgCodeStr());
		}
		/*
		 * Bug 2647 编辑用户所属单位后按单位筛选人员结果错误 增加了 638 639 两行代码 根据修改的部门调整部门code 2021-09-03 陈召
		 * 结束
		 */
		orgUsr.setSequenceNbr(id);
		if (!ObjectUtils.isEmpty(OrgPersonVo.getAmosOrgId())) {
			AgencyUserModel user = Privilege.agencyUserClient.queryByUserId(OrgPersonVo.getAmosOrgId()).getResult();
			// oriOrgUsr.setAmosOrgCode(user.getRealName()); 去掉AmosOrgCode by litw
			// 2021年9月10日
			oriOrgUsr.setAmosOrgId(user.getUserId());
			// orgUsr.setAmosOrgCode(user.getRealName()); 去掉AmosOrgCode by litw 2021年9月10日
			orgUsr.setAmosOrgId(user.getUserId());
		}
		saveOrgUsr(orgUsr, oriOrgUsr);
		// 保存动态表单数据
		updateDynamicFormInstance(orgUsr.getSequenceNbr(), OrgPersonVo.getDynamicFormValue());
		if (orgUsr.getBizOrgCode() != null){
			OrgPersonVo.setBizOrgCode(orgUsr.getBizOrgCode());
		}
		return OrgPersonVo;
	}

	@Override
	public OrgUsrFormDto selectCompanyById(Long id) throws Exception {
		OrgUsr orgUsr = getById(id);
		// 动态表单数据
		List<FormValue> formValue = getFormValue(id);
		// bug 2580 返回值改为具体名称 chenzhao 2021-09-27 start
		// bug 2797 前端要求先改回code值。
		/*
		 * for (FormValue value : formValue) { if (value.getValueName() != null &&
		 * !value.getValueName() .equals(" ")){ value.setValue(value.getValueName()); }
		 * }
		 */
		// bug 2580 返回值改为具体名称 chenzhao 2021-09-27 end
		OrgUsrFormDto orgUsrFormVo = new OrgUsrFormDto();
		orgUsrFormVo.setDynamicFormAlert(formValue);
		BeanUtils.copyProperties(orgUsr, orgUsrFormVo);
		return orgUsrFormVo;
	}

	@Override
	public IPage<OrgUsr> bizOrgTypeListPage(String pageNum, String pageSize, String bizOrgType) throws Exception {

		Map<String, Object> columnMap = new HashMap<>();
		columnMap.put("is_delete", CommonConstant.IS_DELETE_00);
		columnMap.put("biz_org_type", bizOrgType);
		Page<OrgUsr> pageBean = new Page<OrgUsr>();
		if (StringUtils.isBlank(pageNum) || StringUtils.isBlank(pageSize)) {
			pageBean = new Page<>(0, Long.MAX_VALUE);
		} else {
			pageBean = new Page<>(Integer.parseInt(pageNum), Integer.parseInt(pageSize));
		}
		QueryWrapper<OrgUsr> queryWrapper = new QueryWrapper<OrgUsr>();
		queryWrapper.allEq(columnMap);
		queryWrapper.orderByAsc("sequence_nbr");
		return page(pageBean, queryWrapper);
	}

	@Override
	public void saveDepartment(List<OrgDepartmentDto> OrgDepartmentVo, Long id) throws Exception {
		for (int i = 0; i < OrgDepartmentVo.size(); i++) {
			// 导入部门信息的前提条件：单位信息已经存在
			if (getById(id) != null) {
				OrgUsr orgUsr = new OrgUsr();
				BeanUtils.copyProperties(OrgDepartmentVo.get(i), orgUsr);
				orgUsr.setBizOrgType(CommonConstant.BIZ_ORG_TYPE_DEPARTMENT);
				saveOrgUsrDynamicFormInstance(orgUsr, OrgDepartmentVo.get(i).getDynamicFormValue());
			}
		}
	}

	@Override
	public void saveCompany(List<OrgUsrDto> OrgUsrVo) throws Exception {
		for (int i = 0; i < OrgUsrVo.size(); i++) {
			OrgUsr orgUsr = new OrgUsr();
			BeanUtils.copyProperties(OrgUsrVo.get(i), orgUsr);
			orgUsr.setBizOrgType(CommonConstant.BIZ_ORG_TYPE_COMPANY);
			saveOrgUsrDynamicFormInstance(orgUsr, OrgUsrVo.get(i).getDynamicFormValue());
		}
	}

	@Override
	public OrgPersonFormDto selectPersonById(Long id) throws Exception {
		OrgUsr orgUsr = getById(id);
		// 动态表单数据
		List<FormValue> formValue = getFormValue(id);
		OrgPersonFormDto orgPersonFormVo = new OrgPersonFormDto(formValue);
		BeanUtils.copyProperties(orgUsr, orgPersonFormVo);
		OrgUsr parent = getById(orgUsr.getParentId());
		if (!ObjectUtils.isEmpty(parent)) {
			orgPersonFormVo.setParentName(parent.getBizOrgName());
		}

		return orgPersonFormVo;
	}

	@Override
	public OrgPersonFormDto selectPersonByIdDetail(Long id) throws Exception {
		OrgUsr orgUsr = getById(id);

		// 动态表单数据
		List<FormValue> formValue = getFormValueDetail(id);
		OrgPersonFormDto orgPersonFormVo = new OrgPersonFormDto(formValue);
		BeanUtils.copyProperties(orgUsr, orgPersonFormVo);

		/* bug 2869 部门为空人员详情报空指针 2021-09-15 陈召 开始 */
		if (orgUsr.getParentId() != null) {
			orgPersonFormVo.setParentName(getById(orgUsr.getParentId()).getBizOrgName());
		}
		/* bug 2869 部门为空人员详情报空指针 2021-09-15 陈召 结束 */

		return orgPersonFormVo;
	}

	@Override
	public List<OrgMenuDto> selectPersonTree() throws Exception {
		Map<String, Object> columnMap = new HashMap<>();
		columnMap.put("is_delete", CommonConstant.IS_DELETE_00);
		columnMap.put("biz_org_type", CommonConstant.BIZ_ORG_TYPE_PERSON);
		Collection<OrgUsr> list = listByMap(columnMap);
//        list.stream().forEach(t-> {
//            // BUG2886 因为前期沟通 人员code 可能会发生改变 所以 现在接口code 不再保存，查询数据时通过接口重新赋值 by kongfm 2021-09-16
//            if(StringUtils.isNotEmpty(t.getAmosOrgId())) {
//                FeignClientResult<AgencyUserModel> result1 = Privilege.agencyUserClient.queryByUserId(t.getAmosOrgId());
//                if(null !=result1.getResult()) {
//                    t.setAmosOrgCode(result1.getResult().getRealName());
//                }
//            }
//        });
		return getTree(null, list, OrgUsr.class.getName(), "getSequenceNbr", 2, "getBizOrgName", "getParentId",
				"getBizOrgType");
	}

	@Override
	public void savePersonList(List<OrgPersonDto> OrgPersonVo) throws Exception {
		for (int i = 0; i < OrgPersonVo.size(); i++) {
			OrgUsr orgUsr = new OrgUsr();
			BeanUtils.copyProperties(OrgPersonVo.get(i), orgUsr);
			orgUsr.setBizOrgType(CommonConstant.BIZ_ORG_TYPE_PERSON);
			saveOrgUsrDynamicFormInstance(orgUsr, OrgPersonVo.get(i).getDynamicFormValue());
		}
	}

	@Override
	public OrgUsrDto saveOrgDepartment(OrgDepartmentDto OrgDepartmentVo) throws Exception {
		OrgUsr orgUsr = new OrgUsr();
		BeanUtils.copyProperties(OrgDepartmentVo, orgUsr);
		orgUsr.setBizOrgType(CommonConstant.BIZ_ORG_TYPE_DEPARTMENT);
		if (OrgDepartmentVo.getParentId() != null) {
			OrgUsr parent = getById(OrgDepartmentVo.getParentId());
			if (parent != null && ObjectUtils.isEmpty(OrgDepartmentVo.getBizOrgCode())) {
				orgUsr.setBizOrgCode(parent.getBizOrgCode() + getOrgCodeStr());
			}
		} else {
			orgUsr.setBizOrgCode(getOrgCodeStr());
		}
		return saveOrgUsrDynamicFormInstance(orgUsr, OrgDepartmentVo.getDynamicFormValue());
	}

	@Override
	public OrgDepartmentDto updateByIdOrgDepartment(OrgDepartmentDto OrgDepartmentVo, Long id) throws Exception {
		// 修改部门信息
		OrgUsr orgUsr = new OrgUsr();
		OrgUsr oriOrgUsr = getById(id);
		BeanUtils.copyProperties(OrgDepartmentVo, orgUsr);
		/* 部门编辑后 code值也应做出修改 2021-09-09 陈召 开始 */
		OrgUsr parent = getById(OrgDepartmentVo.getParentId());
		if (parent != null) {
			orgUsr.setBizOrgCode(parent.getBizOrgCode() + getOrgCodeStr());
		}
		orgUsr.setSequenceNbr(id);
		/* 部门编辑后 code值也应做出修改 2021-09-09 陈召 结束 */

		saveOrgUsr(orgUsr, oriOrgUsr);
		// 保存动态表单数据
		updateDynamicFormInstance(orgUsr.getSequenceNbr(), OrgDepartmentVo.getDynamicFormValue());
		OrgDepartmentVo.setBizOrgCode(orgUsr.getBizOrgCode());
		return OrgDepartmentVo ;
	}

	@Override
	public OrgDepartmentFormDto selectDepartmentById(Long id) throws Exception {
		OrgUsr orgUsr = getById(id);
		// 动态表单数据
		List<FormValue> formValue = getFormValue(id);
		OrgDepartmentFormDto orgDepartmentFormVo = new OrgDepartmentFormDto(formValue);
		BeanUtils.copyProperties(orgUsr, orgDepartmentFormVo);
		return orgDepartmentFormVo;
	}

	@Override
	public List<Map<String, Object>> selectForShowByListId(List<Long> ids) throws Exception {
		List<Map<String, Object>> personResult = new ArrayList<>();
		for (int i = 0; i < ids.size(); i++) {
			OrgUsr orgUsr = getById(ids.get(i));
			Map<String, Object> result = selectForShowById(orgUsr, ids.get(i));
			personResult.add(result);
		}
		return personResult;
	}
	@Override
	public List<Map<String, Object>> selectForShowByListIdUser(List<Long> ids) throws Exception {
		List<Map<String, Object>> personResult = new ArrayList<>();
		for (int i = 0; i < ids.size(); i++) {
			OrgUsr orgUsr = getByIduser(ids.get(i));
			Map<String, Object> result = selectForShowByIduser(orgUsr, ids.get(i));
			personResult.add(result);
		}
		return personResult;
	}
	@Override
	public List<CompanyDto> listContractDto(Integer pageNum, Integer pageSize, RequestData requestData) {
		if (null == pageNum || null == pageSize) {
			pageNum = 1;
			pageSize = Integer.MAX_VALUE;
		} else {
			pageNum = (pageNum - 1) * pageSize;
		}
		return orgUsrMapper.listContractDto(pageNum, pageSize, requestData);
	}

	@Override
	public Integer listContractDtoCount(RequestData par) {
		return orgUsrMapper.listContractDtoCount(par);
	}

	public void importByExcel(List<OrgPersonExcelDto> list) {
		list.forEach(item -> {
			OrgPersonDto orgPersonDto = new OrgPersonDto();
			orgPersonDto = Bean.toPo(item, orgPersonDto);
			List<DynamicFormInstance> alertFormValueList = new ArrayList<>();
			if (item.getPersonNumber() != null) {
				DynamicFormInstance alertFormValue = new DynamicFormInstance(102L, OrgPersonEnum.人员.getCode(), "员工编号",
						"personNumber", item.getPersonNumber(), null, false);
				alertFormValueList.add(alertFormValue);
			}
			if (item.getCertificatesType() != null) {
				String certificatesType = item.getCertificatesType();
				String[] split = certificatesType.split("@");
				DynamicFormInstance alertFormValue = new DynamicFormInstance(23L, OrgPersonEnum.人员.getCode(), "证件类型",
						"certificatesTypeCode", split[0], split[1], false);
				alertFormValueList.add(alertFormValue);
			}
			if (item.getGender() != null) {
				String gender = item.getGender();
				String[] split = gender.split("@");
				DynamicFormInstance alertFormValue = new DynamicFormInstance(22L, OrgPersonEnum.人员.getCode(), "性别",
						"gender", split[0], split[1], false);
				alertFormValueList.add(alertFormValue);
			}
			if (item.getCertificatesNumber() != null) {
				DynamicFormInstance alertFormValue = new DynamicFormInstance(100L, OrgPersonEnum.人员.getCode(), "证件号码",
						"certificatesNumber", item.getCertificatesNumber(), null, false);
				alertFormValueList.add(alertFormValue);
			}
			if (item.getTelephone() != null) {
				DynamicFormInstance alertFormValue = new DynamicFormInstance(24L, OrgPersonEnum.人员.getCode(), "联系电话",
						"telephone", item.getTelephone(), null, false);
				alertFormValueList.add(alertFormValue);
			}
			if (item.getState() != null) {
				String state = item.getState();
				String[] split = state.split("@");
				DynamicFormInstance alertFormValue = new DynamicFormInstance(25L, OrgPersonEnum.人员.getCode(), "人员状态",
						"stateCode", split[0], split[1], false);
				alertFormValueList.add(alertFormValue);
			}
			if (item.getSafetyTraining() != null) {
				String safetyTraining = item.getSafetyTraining();
				String[] split = safetyTraining.split("@");
				DynamicFormInstance alertFormValue = new DynamicFormInstance(29L, OrgPersonEnum.人员.getCode(),
						"是否进行安全培训", "safetyTraining", split[0], split[1], false);
				alertFormValueList.add(alertFormValue);
			}
			if (item.getAdministrativePosition() != null) {
				String administrativePosition = item.getAdministrativePosition();
				String[] split = administrativePosition.split("@");
				DynamicFormInstance alertFormValue = new DynamicFormInstance(28L, OrgPersonEnum.人员.getCode(), "行政职务",
						"administrativePositionCode", split[0], split[1], false);
				alertFormValueList.add(alertFormValue);
			}
			if (item.getInternalPosition() != null) {
				String internalPosition = item.getInternalPosition();
				String[] split = internalPosition.split("@");
				DynamicFormInstance alertFormValue = new DynamicFormInstance(26L, OrgPersonEnum.人员.getCode(),
						"消防管理组织机构内部职务", "internalPositionCode", split[0], split[1], false);
				alertFormValueList.add(alertFormValue);
			}
			if (item.getFireManagementPost() != null) {
				String fireManagementPost = item.getFireManagementPost();
				String[] split = fireManagementPost.split("@");
				DynamicFormInstance alertFormValue = new DynamicFormInstance(27L, OrgPersonEnum.人员.getCode(), "消防管理岗位",
						"fireManagementPostCode", split[0], split[1], false);
				alertFormValueList.add(alertFormValue);
			}
			if (item.getPositionType() != null) {
				String positionType = item.getPositionType();
				String[] split = positionType.split("@");
				DynamicFormInstance alertFormValue = new DynamicFormInstance(30L, OrgPersonEnum.人员.getCode(), "岗位类型",
						"positionType", split[0], split[1], false);
				alertFormValueList.add(alertFormValue);
			}
			if (item.getCertificateType() != null) {
				String certificateType = item.getCertificateType();
				String[] split = certificateType.split("@");
				DynamicFormInstance alertFormValue = new DynamicFormInstance(31L, OrgPersonEnum.人员.getCode(), "持证类别",
						"certificateType", split[0], split[1], false);
				alertFormValueList.add(alertFormValue);
			}
			if (item.getHoldingTime() != null) {
				DynamicFormInstance alertFormValue = new DynamicFormInstance(32L, OrgPersonEnum.人员.getCode(), "持证时间",
						"holdingTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(item.getHoldingTime()), null,
						false);
				alertFormValueList.add(alertFormValue);
			}
			if (item.getAuditCycle() != null) {
				String auditCycle = item.getAuditCycle();
				String[] split = auditCycle.split("@");
				DynamicFormInstance alertFormValue = new DynamicFormInstance(33L, OrgPersonEnum.人员.getCode(), "审核周期",
						"auditCycle", split[0], split[1], false);
				alertFormValueList.add(alertFormValue);
			}
			if (item.getPersonImg() != null) {
				DynamicFormInstance alertFormValue = new DynamicFormInstance(34L, OrgPersonEnum.人员.getCode(), "人员照片",
						"personImg", item.getPersonImg(), null, false);
				alertFormValueList.add(alertFormValue);
			}
			if (item.getCertificateImg() != null) {
				DynamicFormInstance alertFormValue = new DynamicFormInstance(101L, OrgPersonEnum.人员.getCode(),
						"重点工种资质证书", "certificateImg", item.getCertificateImg(), null, false);
				alertFormValueList.add(alertFormValue);
			}
			try {
				orgPersonDto.setDynamicFormValue(alertFormValueList);
				this.saveOrgPerson(orgPersonDto);
			} catch (Exception e) {
				e.printStackTrace();
			}
		});
	}

	public List<OrgPersonExcelDto> queryOrgPersonDtoList(boolean isDelete) {

		List<OrgPersonExcelDto> excelOrgPersonDtoList = orgUsrMapper.queryOrgPersonDtoList(isDelete);

		return excelOrgPersonDtoList;
	}

	/**
	 * 根据id查询当前单位下的所有子单位、部门
	 *
	 * @param orgUserId
	 * @return
	 */
	public List<OrgUsr> listOrgUserById(Long orgUserId) {
		return this.baseMapper.listOrgUserById(orgUserId);
	}

	public List<CompanyPerson> returnCompanyPerson(List<Long> ids) {
		if (ObjectUtils.isEmpty(ids)) {
			return null;
		}
		List<CompanyPerson> tempList = new ArrayList<CompanyPerson>();
		for (Long tempId : ids) {
			// BUG 2740 机场单位主键varchar 导致 通过主键搜索返回多条数据 2021 - 09 - 09by kongfm
			OrgUsr org = getById(tempId.toString());
			if (ObjectUtils.isEmpty(org)) {
				continue;
			}
			CompanyPerson company = new CompanyPerson();
			BeanUtils.copyProperties(org, company);
			company.setPersons(this.queryForListByParentIdAndOrgType(org.getSequenceNbr(), OrgPersonEnum.人员.getKey()));
			tempList.add(company);
		}
		return tempList;
	}

	// BUG 2736 人员导出过滤已经删除的数据by kongfm
	// 该方法使用时参数有问题 会有下标越界问题，现在更改为public List<OrgUsrDto>
	// queryForListByParentIdAndOrgType(Long parentId, String bizOrgType) 2021-09-13
	// by kongfm
	public List<OrgUsrDto> queryForListByParentIdAndOrgType(Long parentId, String bizOrgType, Boolean isDelete) {
		return this.queryForList(null, false, parentId, bizOrgType, isDelete);
	}

	public List<OrgUsrDto> queryForListByParentIdAndOrgType(Long parentId, String bizOrgType) {
		// BUG 2843 过滤没有绑定关联账户的user by kongfm 2021-09-16
		List<OrgUsr> tempUserList = this
				.list(new LambdaQueryWrapper<OrgUsr>().eq(OrgUsr::getIsDelete, false).eq(OrgUsr::getParentId, parentId)
						.eq(OrgUsr::getBizOrgType, bizOrgType).isNotNull(OrgUsr::getAmosOrgId));
		tempUserList.stream().forEach(m -> {
			if (StringUtils.isNotEmpty(m.getAmosOrgId())) {
				FeignClientResult<AgencyUserModel> result1 = Privilege.agencyUserClient.queryByUserId(m.getAmosOrgId());
				if (null != result1.getResult()) {
					m.setAmosOrgCode(result1.getResult().getRealName());
				}
			}
		});
		return Bean.toModels(tempUserList, this.getModelClass());
	}

	public OrgUsrDto getOrg(String amosUserId) {
		OrgUsrDto person = queryForListByParentIdAndOrgType(amosUserId);
		if (ObjectUtils.isEmpty(person)) {
			return null;
		}
		return this.queryBySeq(Long.valueOf(person.getParentId()));
	}

	public String getParentId(String amosOrgId) {
		List<OrgUsrDto> orgUsrDtos = queryForList("", false, amosOrgId);
		String parentId = null;
		if (orgUsrDtos.size() >= 1) {
			parentId = orgUsrDtos.get(0).getParentId();
		} else {
			return null;
		}
		return parentId;
	}

	public OrgUsrDto queryForListByParentIdAndOrgType(String amosOrgId) {
		return this.queryModelByParams(amosOrgId);
	}

	@Override
	public List<OrgUsrzhDto> getOrgUsrzhDto(String name) {
		// TODO Auto-generated method stub
		List<OrgUsrzhDto> list = orgUsrMapper.getOrgUsrzhDto(name);
		return list;
	}

	@Override
	public List<ESOrgUsrDto> selectByIddata(String name) {
		// 获取所有单位
		QueryWrapper<OrgUsr> wrapper = new QueryWrapper<>();

		wrapper.in("biz_org_type", "DEPARTMENT", "COMPANY");
		wrapper.eq("is_delete", 0);
		if (name != null && !"".equals(name)) {
			wrapper.like("biz_org_name", name);
		}

		List<OrgUsr> list = this.list(wrapper);
		List<ESOrgUsrDto> lidataDtos = new ArrayList();
		list.forEach(orgUsr -> {
			ESOrgUsrDto data = new ESOrgUsrDto();
			data.setSequenceNbr(orgUsr.getSequenceNbr());
			data.setBizOrgName(orgUsr.getBizOrgName());
			lidataDtos.add(data);
		});
		return lidataDtos;
	}

	@Override
	public List<Map<String, Object>> getparent() {
		return orgUsrMapper.getparent();
	}

	@Override
	public List<OrgUsrExcelDto> exportToExcel(Map par) {
		String parentId = par.containsKey("parentId") ? par.get("parentId").toString() : null;
		String bizOrgName = par.containsKey("bizOrgName") ? par.get("bizOrgName").toString() : null;
		String internalPositionCode = par.containsKey("internalPositionCode")
				? par.get("internalPositionCode").toString()
				: null;
		String positionType = par.containsKey("positionType") ? par.get("positionType").toString() : null;
		return orgUsrMapper.exportToExcel(parentId, bizOrgName, internalPositionCode, positionType);
	}

	@Override
	public UserUnitDto getUserUnit(String userId) {
		if (StringUtils.isNotBlank(userId)) {
			String[] typeArr = TYPE.split(",");
			// 业主单位
			List<UserUnitDto> list = orgUsrMapper.getUserUnit(userId, typeArr[0], null);
			// 维保单位
			List<DynamicFormInstance> instanceList = alertFormValueServiceImpl.getInstanceByCodeAndValue(CODE, userId);
			if (!CollectionUtils.isEmpty(list) && !CollectionUtils.isEmpty(instanceList)) {
				throw new RuntimeException("人员绑定单位重复！");
			} else {
				if (!CollectionUtils.isEmpty(list)) {
					if (list.size() == 1) {
						UserUnitDto userUnitDto = list.get(0);
						String codeVal = userUnitDto.getCompanyId().substring(0, 5);
						if (StringUtils.isNotBlank(codeVal)) {
							List<UserUnitDto> dtoList = orgUsrMapper.getUserUnit(null, typeArr[1], codeVal);
							if (!CollectionUtils.isEmpty(dtoList)) {
								UserUnitDto dto = dtoList.get(0);
								userUnitDto.setCompanyId(dto.getPersonSeq());
								userUnitDto.setCompanyName(dto.getPersonName());
								return userUnitDto;
							}
						}
						throw new RuntimeException("未获取人员业主单位！");
					}
					throw new RuntimeException("人员绑定业主单位不唯一！");
				} else {
					if (!CollectionUtils.isEmpty(instanceList)) {
						if (instanceList.size() == 1) {
							Long instanceId = instanceList.get(0).getInstanceId();
							List<MaintenanceCompany> maintenanceCompanyList = maintenanceCompanyService
									.findByInstanceIdAndType(instanceId, typeArr[0]);
							if (!CollectionUtils.isEmpty(maintenanceCompanyList)) {
								if (maintenanceCompanyList.size() == 1) {
									MaintenanceCompany person = maintenanceCompanyList.get(0);
									UserUnitDto unitDto = new UserUnitDto();
									unitDto.setIdentityType(UserUnitTypeEnum.MAINTENANCE_COMPANY.getValue());
									unitDto.setPersonSeq(String.valueOf(person.getSequenceNbr()));
									unitDto.setPersonName(person.getName());
									String codeVal = person.getCode().substring(0, 5);
									if (StringUtils.isNotBlank(codeVal)) {
										List<MaintenanceCompany> companyList = maintenanceCompanyService
												.findByCodeAndType(codeVal, typeArr[1]);
										if (!CollectionUtils.isEmpty(companyList)) {
											MaintenanceCompany company = companyList.get(0);
											unitDto.setCompanyId(String.valueOf(company.getSequenceNbr()));
											unitDto.setCompanyName(company.getName());
											return unitDto;
										}
									}
									throw new RuntimeException("未获取人员维保单位！");
								}
								throw new RuntimeException("人员绑定维保单位不唯一！");
							}
						}
						throw new RuntimeException("人员绑定维保单位不唯一！");
					}
				}
			}
			throw new RuntimeException("人员未绑定任何单位！");
		}
		throw new RuntimeException("参数必传且不为空！");
	}

	@Override
	public List<UserDto> getUserInfo(String userId) {
		List<UserDto> userDtoList = new ArrayList<>();
		if (StringUtils.isNotBlank(userId)) {
			String[] typeArr = TYPE.split(",");
			// 业主单位
			List<UserDto> list = orgUsrMapper.getUserInfo(userId, typeArr[0], null, FIELD_CODE.split(","));
			if (!CollectionUtils.isEmpty(list)) {
				if (list.size() == 1) {
					userDtoList.addAll(list);
					UserDto userDto = list.get(0);
					String codeVal = userDto.getBizOrgCode().substring(0, 5);
					if (StringUtils.isNotBlank(codeVal)) {
						List<UserDto> dtoList = orgUsrMapper.getUserInfo(null, typeArr[1], codeVal,
								COMPANY_FIELD_CODE.split(","));
						if (!CollectionUtils.isEmpty(dtoList)) {
							userDtoList.addAll(dtoList);
						}
					}
					return userDtoList;
				}
				throw new RuntimeException("人员绑定业主单位不唯一！");
			}
			throw new RuntimeException("人员未绑定任何单位！");
		}
		throw new RuntimeException("参数必传且不为空！");
	}

	public List<OrgUsr> getCompanyDetailTree() {
		LambdaQueryWrapper<OrgUsr> wrapper = new LambdaQueryWrapper<OrgUsr>();
		wrapper.eq(OrgUsr::getBizOrgType, "COMPANY");
		wrapper.eq(OrgUsr::getIsDelete, false);
		return this.baseMapper.selectList(wrapper);
	}

	@Override
	public List<OrgMenuDto> companyUserTreeByUser(AgencyUserModel user) {
		LambdaQueryWrapper<OrgUsr> wrapper = new LambdaQueryWrapper<OrgUsr>();
		wrapper.eq(OrgUsr::getIsDelete, false);
		List<OrgUsr> companyDepartmentMsgList = this.baseMapper.selectList(wrapper);
		return gettTreeByUser(user, companyDepartmentMsgList);
	}

	@Override
	public List<OrgMenuDto> companyTreeByUser(AgencyUserModel user) {
		List<OrgUsr> companyDepartmentMsgList = selectCompanyDepartmentMsg();
		return gettTreeByUser(user, companyDepartmentMsgList);
	}

	;

	@Override
	public List<CheckObjectDto> companyListByUser(AgencyUserModel user) {
		List<CheckObjectDto> list = new ArrayList<>();
		// 需要角色为机场单位或管理员，其余角色返回空
		String code = UserRolesEnum.AIRPORTUNIT.getCode();
		String codeAdmin = UserRolesEnum.ADMIN.getCode();
		String roles = getRoles(user, code);

		if (!StringUtils.isEmpty(roles)) {
			List<CheckObjectDto> companyList = this.baseMapper.getCompanyAndKeySite(null);
			if (roles.equals(codeAdmin)) {
				// 返回全部单位列表
				return companyAndKeySiteList(companyList);
			} else if (roles.equals(code)) {
//			} else  {
				// 人员与多个部门/公司关联
				List<OrgUsr> orgUsrList = orgUsrList(user);
				if (ObjectUtils.isEmpty(orgUsrList)) {
					return list;
				}
				Set<Long> set = new HashSet<>();
				orgUsrList.forEach(orgUsr -> {
					if (!StringUtils.isEmpty(orgUsr.getParentId())) {
						Long parent = Long.parseLong(orgUsr.getParentId());
						if (set.add(parent)) {
							Long companyIdByDto = getCompanyIdByDto(parent, companyList);
							List<CheckObjectDto> orgUsrTreeDtoList = this.baseMapper
									.getCompanyAndKeySite(companyIdByDto);
							list.addAll(companyAndKeySiteList(orgUsrTreeDtoList));
						}
					}
				});
				// 返回所在用户单位列表
				return list.stream().distinct().collect(Collectors.toList());
			}
		}
		return list;
	}

	/**
	 * 获取登陆人所在公司
	 */
	private Long getCompanyIdByDto(Long parentId, List<CheckObjectDto> companyDepartmentMsgList) {
		Long pid = null;
		for (CheckObjectDto orgUsr : companyDepartmentMsgList) {
			if (orgUsr.getSequenceNbr().equals(parentId)) {
				if (orgUsr.getBizOrgType().equals(OrgPersonEnum.公司.getKey())
						&& ObjectUtils.isEmpty(orgUsr.getParentId())) {
					return orgUsr.getSequenceNbr();
				} else {
					if (!StringUtils.isEmpty(orgUsr.getParentId())) {
						pid = getCompanyIdByDto(Long.parseLong(orgUsr.getParentId()), companyDepartmentMsgList);
					}
				}
			}
		}
		return pid;
	}

	/**
	 * 查询单位列表
	 */
	private List<CheckObjectDto> companyAndKeySiteList(List<CheckObjectDto> companyList) {
		List<CheckObjectDto> list = new ArrayList<>();
		if (ObjectUtils.isEmpty(companyList)) {
			return list;
		}
		Map<Long, CheckObjectDto> map = new HashMap<>(companyList.size());
		companyList.forEach(e -> map.put(e.getSequenceNbr(), e));
		Set<? extends Map.Entry<Long, ? extends CheckObjectDto>> entries = map.entrySet();
		entries.parallelStream().forEach(entry -> {
			CheckObjectDto value = entry.getValue();
			if (!ObjectUtils.isEmpty(value)) {
				Long parent = ObjectUtils.isEmpty(value.getParentId()) ? 0L : Long.parseLong(value.getParentId());
				CheckObjectDto orgUsrTreeDto = map.get(parent);
				if (!ObjectUtils.isEmpty(orgUsrTreeDto)) {
					int num = orgUsrTreeDto.getNum() + value.getNum();
					orgUsrTreeDto.setNum(num);
				} else {
					if (value.getBizOrgType().equals(OrgPersonEnum.公司.getKey())) {
						list.add(value);
					}
				}
			}
		});
		return list;
	}

	/**
	 * 获取树
	 */
	private List<OrgMenuDto> gettTreeByUser(AgencyUserModel user, List<OrgUsr> list) {
		List<OrgMenuDto> treeList = new ArrayList<>();
		// 需要角色为机场单位或管理员，其余角色返回空
		String code = UserRolesEnum.AIRPORTUNIT.getCode();
		String codeAdmin = UserRolesEnum.ADMIN.getCode();
		String roles = getRoles(user, code);
		if (!StringUtils.isEmpty(roles)) {
//			treeList = getDepartmentTreeByUser(user,list);
			if (roles.equals(codeAdmin)) {
				// 返回全量树
				treeList = buildTreeParallel(list);
			} else if (roles.equals(code)) {
				// 获取当前用户所在部门树
				treeList = getDepartmentTreeByUser(user, list);
			}
		}
		return treeList;
	}

	/**
	 * 根基登陆人获取指定角色/最高角色,默认最高角色
	 */
	private String getRoles(AgencyUserModel user, String code) {
		String type = null;
		Map<Long, List<RoleModel>> orgRolesMap = user.getOrgRoles();
		if (ObjectUtils.isEmpty(orgRolesMap)) {
			return null;
		}
		for (Long key : orgRolesMap.keySet()) {
			if (!ObjectUtils.isEmpty(orgRolesMap.get(key))) {
				for (RoleModel roleModel : orgRolesMap.get(key)) {
					String roleType = roleModel.getRoleType();
					if (roleType.equals(code)) {
						type = code;
					}
					if (roleType.equals(UserRolesEnum.ADMIN.getCode())) {
						return roleType;
					}
				}
			}
		}
		return type;
	}

	/**
	 * 获取当前用户所在部门/用户树
	 */
	private List<OrgMenuDto> getDepartmentTreeByUser(AgencyUserModel user, List<OrgUsr> companyDepartmentMsgList) {

		List<OrgMenuDto> list = new ArrayList<>();
		if (ObjectUtils.isEmpty(companyDepartmentMsgList)) {
			return list;
		}

		// 1.获取当前登陆用户关联人员
		List<OrgUsr> orgUsrList = orgUsrList(user);
		if (ObjectUtils.isEmpty(orgUsrList)) {
			return list;
		}

		// 2.查询人员所属部门
		List<OrgMenuDto> treeList = buildTreeParallel(companyDepartmentMsgList);
		Set<Long> set = new HashSet<>();
		orgUsrList.forEach(orgUsr -> {
			if (!StringUtils.isEmpty(orgUsr.getParentId())) {
				Long parentId = Long.parseLong(orgUsr.getParentId());
				getTreeChildre(list, treeList, parentId, set, companyDepartmentMsgList);
			}
		});
		return list;
	}

	/**
	 * 获取登陆人关联账号
	 */
	private List<OrgUsr> orgUsrList(AgencyUserModel user) {
		String userId = user.getUserId();
		LambdaQueryWrapper<OrgUsr> wrapper = new LambdaQueryWrapper<>();
		wrapper.eq(OrgUsr::getIsDelete, false);
		wrapper.eq(OrgUsr::getAmosOrgId, userId);
		wrapper.eq(OrgUsr::getBizOrgType, OrgPersonEnum.人员.getKey());
		List<OrgUsr> orgUsrList = this.baseMapper.selectList(wrapper);
		return orgUsrList;
	}

	/**
	 * 组装树
	 */
	private void getTreeChildre(List<OrgMenuDto> list, List<OrgMenuDto> treeList, Long parentId, Set<Long> set,
			List<OrgUsr> companyDepartmentMsgList) {
		if (ObjectUtils.isEmpty(treeList) && ObjectUtils.isEmpty(companyDepartmentMsgList)) {
			return;
		}

		// 获取登陆人所在公司
		Long pid = getCompanyId(parentId, companyDepartmentMsgList);
		if (set.add(pid)) {
			List<OrgMenuDto> list1 = treeList.stream()
					.filter(orgMenuDto -> !ObjectUtils.isEmpty(orgMenuDto) && pid.equals(orgMenuDto.getKey()))
					.collect(Collectors.toList());
			list.addAll(list1);
		}
	}

	/**
	 * 获取登陆人所在公司
	 */
	private Long getCompanyId(Long parentId, List<OrgUsr> companyDepartmentMsgList) {
		Long pid = null;
		for (OrgUsr orgUsr : companyDepartmentMsgList) {
			if (orgUsr.getSequenceNbr().equals(parentId)) {
				if (orgUsr.getBizOrgType().equals(OrgPersonEnum.公司.getKey())
						&& ObjectUtils.isEmpty(orgUsr.getParentId())) {
					return orgUsr.getSequenceNbr();
				} else {
					if (!StringUtils.isEmpty(orgUsr.getParentId())) {
						pid = getCompanyId(Long.parseLong(orgUsr.getParentId()), companyDepartmentMsgList);
					}
				}
			}
		}
		return pid;
	}

	/**
	 * 查询组织机构下面的人员信息
	 *
	 * @param id
	 * @return
	 */
	@Override
	public List<OrgUsr> getPersonListByParentId(Long id) {
		LambdaQueryWrapper<OrgUsr> wrapper = new LambdaQueryWrapper<OrgUsr>();
		wrapper.eq(OrgUsr::getIsDelete, false);
		wrapper.eq(OrgUsr::getParentId, id);
		wrapper.eq(OrgUsr::getBizOrgType, OrgPersonEnum.人员.getKey());
		return this.baseMapper.selectList(wrapper);
	}

	/**
	 * 查询组织机构下面的人员信息
	 *
	 * @param id
	 * @return
	 */
	public List<OrgUsr> getPersonListByParentIds(List<String> ids) {
		LambdaQueryWrapper<OrgUsr> wrapper = new LambdaQueryWrapper<OrgUsr>();
		wrapper.eq(OrgUsr::getIsDelete, false);
		wrapper.in(OrgUsr::getParentId, ids);
		wrapper.eq(OrgUsr::getBizOrgType, OrgPersonEnum.人员.getKey());
		return this.baseMapper.selectList(wrapper);
	}

	@Override
	public List<OrgUsrExcelDto> exportPersonToExcelByParentId(Long parentId) {
		return orgUsrMapper.exportPersonToExcelByParentId(parentId);
	}

	@Override
	public List<Map<String, Object>> getLoginUserDetails(String userId, AgencyUserModel user) {

		// 获取登陆人关联账号
		List<OrgUsr> orgUsrs = getUsrList(userId);
		List<Map<String, Object>> list = new ArrayList<>();
		if (!ObjectUtils.isEmpty(orgUsrs)) {
			orgUsrs.forEach(orgUsr -> {
				Map<String, Object> map = new HashMap<>();
				map.put(OrgPersonEnum.人员.getKey(), orgUsr);
				// 获取关联账号所在部门/公司
				LambdaQueryWrapper<OrgUsr> wrapper = new LambdaQueryWrapper<>();
				wrapper.eq(OrgUsr::getIsDelete, false);
				wrapper.eq(BaseEntity::getSequenceNbr, orgUsr.getParentId());
				OrgUsr one = this.getOne(wrapper);
				map.put(OrgPersonEnum.部门.getKey(), one);
				map.put("AMOSUSER", user);
				list.add(map);
			});

		}
		return list;
	}

	/**
	 * 获取登陆人关联账号
	 */
	private List<OrgUsr> getUsrList(String userId) {
		// 获取登陆人角色
		LambdaQueryWrapper<OrgUsr> wrapper = new LambdaQueryWrapper<>();
		wrapper.eq(OrgUsr::getIsDelete, false);
		wrapper.eq(OrgUsr::getAmosOrgId, userId);
		wrapper.eq(OrgUsr::getBizOrgType, OrgPersonEnum.人员.getKey());
		List<OrgUsr> orgUsrList = this.baseMapper.selectList(wrapper);
		return orgUsrList;
	}

	/**
	 * 重写getByid 方法 因为前期沟通 人员code 可能会发生改变 所以 现在接口code 不再保存，查询数据时通过接口重新赋值 by kongfm
	 * 2021-09-16
	 *
	 * @param id
	 * @return
	 */
	@Override
	public OrgUsr getById(Serializable id) {
		OrgUsr orgUser = this.baseMapper.selectById(id);
		// BUG2886 因为前期沟通 人员code 可能会发生改变 所以 现在接口code 不再保存，查询数据时通过接口重新赋值 by kongfm
		// 2021-09-16
		if (orgUser != null && StringUtils.isNotEmpty(orgUser.getAmosOrgId())) {
			FeignClientResult<AgencyUserModel> result1 = Privilege.agencyUserClient
					.queryByUserId(orgUser.getAmosOrgId());
			if (null != result1.getResult()) {
				orgUser.setAmosOrgCode(result1.getResult().getRealName());
			}
		}
		return orgUser;
	}



	public OrgUsr getByIduser(Serializable id) {
		OrgUsr orgUser = this.baseMapper.selectById(id);
		return orgUser;
	}

	public Object amosIdExist(String amosId) {
		List<OrgUsr> orgUsrs = orgUsrMapper.amosIdExist(amosId);
		if (orgUsrs.size() > 0) {
			return false;
		}
		return true;
	}

	/**
	 * 获取对应公司组下面的人员信息
	 *
	 * @param ids
	 * @return
	 */
	@Override
	public List<Map<String, Object>> getPersonDetailByCompanyIds(List<String> ids) {

		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		LambdaQueryWrapper<OrgUsr> wrapper = new LambdaQueryWrapper<OrgUsr>();
		wrapper.eq(OrgUsr::getIsDelete, false);
		wrapper.eq(OrgUsr::getBizOrgType, OrgPersonEnum.人员.getKey());
		wrapper.in(OrgUsr::getParentId, ids);
		List<OrgUsr> orgPersonList = this.baseMapper.selectList(wrapper);
		for (OrgUsr orgUsr : orgPersonList) {
			Map<String, Object> map = new HashMap<String, Object>();
			List<DynamicFormInstanceDto> dyList = alertFormValueServiceImpl.queryByCalledId(orgUsr.getSequenceNbr());
			if (ObjectUtils.isEmpty(dyList)) {
				continue;
			}
			for (DynamicFormInstanceDto dto : dyList) {
				if ("positionType".equals(dto.getFieldCode())) {
					map.put("postType", dto.getFieldValue());
					map.put("postTypeName", dto.getFieldValueLabel());
					break;
				}
			}
			if (!map.containsKey("postType") || map.get("postType") == null
					|| StringUtils.isBlank(map.get("postType").toString())) {
				continue;
			}
			map.put("userName", orgUsr.getBizOrgName());
			map.put("userId", orgUsr.getSequenceNbr().toString());
			LambdaQueryWrapper<OrgUsr> wrapper1 = new LambdaQueryWrapper<OrgUsr>();
			wrapper1.eq(OrgUsr::getIsDelete, false);
			wrapper1.eq(OrgUsr::getBizOrgType, OrgPersonEnum.公司.getKey());
			wrapper1.eq(OrgUsr::getSequenceNbr, Long.parseLong(orgUsr.getParentId()));
			OrgUsr orgCompany = this.baseMapper.selectOne(wrapper1);
			if (ObjectUtils.isEmpty(orgCompany)) {
				continue;
			}
			map.put("teamName", orgCompany.getBizOrgName());
			map.put("teamId", orgCompany.getSequenceNbr().toString());
			List<Map<String, Object>> fireStationList = fireStationServiceImpl
					.queryForFireStationListByCompanyId(Long.parseLong(orgUsr.getParentId()));
			if (ObjectUtils.isEmpty(fireStationList)) {
				continue;
			}
			List<String> fireStationSimpleList = new ArrayList<String>();
			fireStationList.stream().forEach(i -> {
				String tagertString = i.get("name").toString() + "@" + i.get("sequence_nbr").toString();
				fireStationSimpleList.add(tagertString);
			});
			map.put("fireStation", fireStationSimpleList);
			list.add(map);
		}
		return list;
	}

	@Override
	public List<OrgUsr> selectCompanyUsers(Long orgUnitId) {
		OrgUsr orgUsr = this.getById(orgUnitId);
		if (null == orgUnitId) {
			return null;
		}
		LambdaQueryWrapper<OrgUsr> queryWrapper = new LambdaQueryWrapper();
		queryWrapper.like(OrgUsr::getBizOrgCode, orgUsr.getBizOrgCode());
		queryWrapper.eq(OrgUsr::getBizOrgType, CommonConstant.BIZ_ORG_TYPE_PERSON);
		queryWrapper.eq(OrgUsr::getIsDelete, false);
		List<OrgUsr> list = this.list(queryWrapper);
		return list;
	}

	@Override
	public OrgUsr selectByAmosOrgId(Long id) {

		QueryWrapper<OrgUsr> queryWrapper = new QueryWrapper<>();
		queryWrapper.eq("amos_org_id", id);
		OrgUsr orgUsr = orgUsrMapper.selectOne(queryWrapper);

		return orgUsr;
	}

	@Override
	public AgencyUserModel getAmosIdByOrgUserId(String orgUserId) throws Exception {
		OrgUsr orgUsr = this.baseMapper
				.selectOne(new LambdaQueryWrapper<OrgUsr>().eq(OrgUsr::getSequenceNbr, orgUserId));
		if (ValidationUtil.isEmpty(orgUsr)) {
			throw new Exception("账号不存在");
		}
		AgencyUserModel amosUser = Privilege.agencyUserClient.queryByUserId(orgUsr.getAmosOrgId()).getResult();
		if (ValidationUtil.isEmpty(amosUser)) {
			throw new Exception("账号不存在");
		}
		return amosUser;
	}

	@Override
	public List<String> getAmosIdListByOrgUserId(String orgUserIds) throws Exception {
		if (ValidationUtil.isEmpty(orgUserIds)) {
			throw new Exception("账号不存在");
		}
		List<String> orgUserIdList = Lists.newArrayList(orgUserIds.split(","));
		List<OrgUsr> orgUsrList = this.baseMapper
				.selectList(new LambdaQueryWrapper<OrgUsr>().in(OrgUsr::getSequenceNbr, orgUserIdList));
		if (ValidationUtil.isEmpty(orgUsrList)) {
			throw new Exception("账号不存在");
		}
		List<AgencyUserModel> amosUserList = Privilege.agencyUserClient.queryByIds(
				Joiner.on(",").join(orgUsrList.stream().map(OrgUsr::getAmosOrgId).collect(Collectors.toList())), false)
				.getResult();
		if (ValidationUtil.isEmpty(amosUserList)) {
			throw new Exception("账号不存在");
		}

		return amosUserList.stream().map(AgencyUserModel::getUserId).collect(Collectors.toList());
	}

	@Override
	public List<OrgUsrFormDto> getUnSyncOrgCompanyList(List<Long> companyIdList) {
		LambdaQueryWrapper<OrgUsr> queryWrapper = new LambdaQueryWrapper<>();
		queryWrapper.notIn(OrgUsr::getSequenceNbr, companyIdList).eq(OrgUsr::getIsDelete, false)
				.eq(OrgUsr::getBizOrgType, "COMPANY");
		List<OrgUsr> unSyncCompanyList = this.baseMapper.selectList(queryWrapper);
		List<OrgUsrFormDto> allUnSyncCompanyList = Lists.newArrayList();
		if (!ValidationUtil.isEmpty(unSyncCompanyList)) {
			unSyncCompanyList.forEach(company -> {
				try {
					OrgUsrFormDto orgUsrFormDto = this.selectCompanyById(company.getSequenceNbr());
					allUnSyncCompanyList.add(orgUsrFormDto);
				} catch (Exception e) {
					logger.info(e.getMessage());
				}
			});
		}
		return allUnSyncCompanyList;
	}

	public OrgUsr getDetailById(Long id) {
		LambdaQueryWrapper<OrgUsr> queryWrapper = new LambdaQueryWrapper<OrgUsr>();
		queryWrapper.eq(OrgUsr::getIsDelete, false);
		queryWrapper.eq(OrgUsr::getSequenceNbr, id);
		return this.baseMapper.selectOne(queryWrapper);
	}

	public List<Map<String, String>> getPersonSimpleDetail() {
		return orgUsrMapper.getPersonSimpleDetail();
	}

	public Map<String, Integer> getDeptCountByCompanyIds(List<String> companyIdList) {
		Map<String, Integer> resultMap = Maps.newHashMap();
		List<Map<String, Long>> companyDeptCountMapList;
		if (!ValidationUtil.isEmpty(companyIdList)) {
			companyDeptCountMapList = this.baseMapper.countDeptByCompanyId(companyIdList);
			if (!ValidationUtil.isEmpty(companyDeptCountMapList)) {
				companyDeptCountMapList.forEach(c -> {
					resultMap.put(c.get("sequence_nbr").toString(), Integer.valueOf(c.get("count").intValue()));
				});
			}
		}

		return resultMap;
	}

	public  List<Map<String,Object>> queryCompanyId(String bizOrgName,List<String> codes) {

		return orgUsrMapper.queryCompanyId(bizOrgName,codes);
	}

	public  List<Map<String,Object>> queryCompanyIdNew(String bizOrgName) {

		return orgUsrMapper.queryCompanyIdNew(bizOrgName);
	}
	
	
	public List<Map<String,Object>> getuserDetail(Long departmentId,List<Map<String, Object>> resulLists){
		OrgUsr resulList =this.baseMapper.selectById(departmentId);
		if(resulList.getParentId()!=null) {
			Map<String, Object> resultMap =new HashMap<String, Object>();
			resultMap.put("departmentId", resulList.getSequenceNbr());
			resulLists.add(resultMap);
			return	getuserDetail(Long.parseLong(resulList.getParentId()),resulLists);
		}else {
			return resulLists;
		}
	}
	

	public List<AgencyUserModel> getAmosUserByOrgUser(String orgUserIds) throws Exception {
		if (ValidationUtil.isEmpty(orgUserIds)) {
			throw new Exception("账号不存在");
		}
		List<String> orgUserIdList = Lists.newArrayList(orgUserIds.split(","));
		List<OrgUsr> orgUsr = this.baseMapper
				.selectList(new LambdaQueryWrapper<OrgUsr>().in(OrgUsr::getSequenceNbr, orgUserIdList));
		if (ValidationUtil.isEmpty(orgUsr)) {
			throw new Exception("账号不存在");
		}
		String userIds = Joiner.on(",").join(Lists.transform(orgUsr, OrgUsr::getAmosOrgId));
		List<AgencyUserModel> amosUser = Privilege.agencyUserClient.queryByIds(userIds, false).getResult();
		if (ValidationUtil.isEmpty(amosUser)) {
			throw new Exception("账号不存在");
		}
		return amosUser;
	}

	/**
	 * 查询组织机构下面的人员列表信息
	 *
	 * @param id
	 * @return
	 */
	public List<OrgUsr> getPersonListByCompanyId(String id) {
		OrgUsr company = this.getById(id);
		if (ValidationUtil.isEmpty(company)) {
			return null;
		}
		LambdaQueryWrapper<OrgUsr> wrapper = new LambdaQueryWrapper<OrgUsr>();
		wrapper.eq(OrgUsr::getIsDelete, false);
		wrapper.eq(OrgUsr::getBizOrgType, OrgPersonEnum.人员.getKey());
		wrapper.likeRight(OrgUsr::getBizOrgCode, company.getBizOrgCode());
		return this.baseMapper.selectList(wrapper);
	}

	@Override
	public List<OrgMenuDto> getTreeFlc(Long topId, Collection entityList, String packageURL, String IDMethodName,
									int IDHierarchy, String NAMEMethodName, String PARENTIDMethodName, String OrgTypeMethodName)
			throws Exception {
		List<OrgMenuDto> resultList = new ArrayList<>();
		Class<?> clazz = Class.forName(packageURL);
		Method IDMethodNameme = null;
		switch (IDHierarchy) {
			case 1:
				IDMethodNameme = clazz.getDeclaredMethod(IDMethodName);
				break;
			case 2:
				IDMethodNameme = clazz.getSuperclass().getDeclaredMethod(IDMethodName);
				break;
			case 3:
				IDMethodNameme = clazz.getSuperclass().getSuperclass().getDeclaredMethod(IDMethodName);
				break;
			default:
				IDMethodNameme = clazz.getDeclaredMethod(IDMethodName);
				break;
		}

		Method NAMEMethodNameme = clazz.getDeclaredMethod(NAMEMethodName);
		Method PARENTIDMethodNameme = clazz.getDeclaredMethod(PARENTIDMethodName);
		Method OrgTypeMethodNameme = clazz.getDeclaredMethod(OrgTypeMethodName);
		// 获取顶层元素集合
		Long parentId;
		for (Object ob : entityList) {

			Object entity = clazz.cast(ob);

			parentId = !ObjectUtils.isEmpty(PARENTIDMethodNameme.invoke(entity))
					? Long.valueOf(String.valueOf(PARENTIDMethodNameme.invoke(entity)))
					: null;
//			if (parentId == null || topId ==parentId ) {
//				OrgMenuDto menu = new OrgMenuDto(Long.valueOf(String.valueOf(IDMethodNameme.invoke(entity))),
//						String.valueOf(NAMEMethodNameme.invoke(entity)), parentId,
//						String.valueOf(OrgTypeMethodNameme.invoke(entity)), false);
//				resultList.add(menu);
//			}
			/*
			 * *******************topId与parentId的等值判断，修改人陈浩 on 2021/07/21---start
			 ******************************/
			if (parentId == null) {// topId与parentId的等值判断，修改人陈浩 on 2021/07/21
//				OrgMenuDto menu = new OrgMenuDto(Long.valueOf(String.valueOf(IDMethodNameme.invoke(entity))),
//						String.valueOf(NAMEMethodNameme.invoke(entity)), parentId,
//						String.valueOf(OrgTypeMethodNameme.invoke(entity)), false);
//				resultList.add(menu);
			} else if (topId != null && topId.longValue() == parentId.longValue()) {
				OrgMenuDto menu = new OrgMenuDto(Long.valueOf(String.valueOf(IDMethodNameme.invoke(entity))),
						String.valueOf(NAMEMethodNameme.invoke(entity)), parentId,
						String.valueOf(OrgTypeMethodNameme.invoke(entity)), false);
				resultList.add(menu);
			}
			/*
			 * *******************topId与parentId的等值判断，修改人陈浩 on 2021/07/21---end
			 ******************************/
		}
		// 获取每个顶层元素的子数据集合
		for (OrgMenuDto entity : resultList) {
			entity.setChildren(getSub(entity.getKey(), entityList, packageURL, IDMethodName, IDHierarchy,
					NAMEMethodName, "getParentId", OrgTypeMethodName));
		}
		return resultList;
	}

	@Override
	public OrgUsrDto saveOrgPersonFlc(OrgPersonDto OrgPersonVo) throws Exception {
		OrgUsr orgUsr = new OrgUsr();
		BeanUtils.copyProperties(OrgPersonVo, orgUsr);
		orgUsr.setBizOrgType(CommonConstant.BIZ_ORG_TYPE_PERSON);
		// orgCode 前端调用接口生成 不再后台生成orgCode
		/*
		if (OrgPersonVo.getParentId() != null) {OrgUsrMapper
			OrgUsr parent = getById(OrgPersonVo.getParentId());
			if (parent != null && ObjectUtils.isEmpty(OrgPersonVo.getBizOrgCode())) {
				orgUsr.setBizOrgCode(parent.getBizOrgCode() + getOrgCodeStr());
			}
		} else {
			orgUsr.setBizOrgCode(getOrgCodeStr());
		}*/
		OrgUsrDto result = new OrgUsrDto();
		if(orgUsr.getSequenceNbr() != null) { // 走更新方法
			this.updateById(orgUsr);
			BeanUtils.copyProperties(orgUsr, result);
		} else {
			result = saveOrgUsrDynamicFormInstance(orgUsr, OrgPersonVo.getDynamicFormValue());
		}


		return result;
	}

	@Override
	public void updateByIdOrgPersonFlc(OrgPersonDto OrgPersonVo, Long id) throws Exception {
		// 修改人员信息
		OrgUsr orgUsr = new OrgUsr();
		OrgUsr oriOrgUsr = getById(id);
		BeanUtils.copyProperties(OrgPersonVo, orgUsr);
		orgUsr.setSequenceNbr(id);
		updateById(orgUsr);
		// 保存动态表单数据
		updateDynamicFormInstance(orgUsr.getSequenceNbr(), OrgPersonVo.getDynamicFormValue());
	}

}
