From 34c25ddf37a3eb8da9efb04efedad089f13efe83 Mon Sep 17 00:00:00 2001
From: ludc
Date: 星期三, 24 七月 2024 18:20:27 +0800
Subject: [PATCH] 部门导入调整,按照部门名称/实现层级关系。枚举导入功能接口上传,属性池添加新增、查询、修改、导出、查看应用范围等接口。业务类型、链接类型、枚举类型增加等接口属性是否产生数据检查、根据属性名修改业务类型和连接类型中对应属性方法,以及属性池中需要的一些下拉查询接口。

---
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/OrgDeptQueryServiceImpl.java |  653 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 617 insertions(+), 36 deletions(-)

diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/OrgDeptQueryServiceImpl.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/OrgDeptQueryServiceImpl.java
index abe3257..637ca30 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/OrgDeptQueryServiceImpl.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/OrgDeptQueryServiceImpl.java
@@ -1,30 +1,44 @@
 package com.vci.frameworkcore.compatibility.impl;
 
+import com.vci.dto.OrgDepartmentDTO;
+import com.vci.corba.common.PLException;
+import com.vci.corba.common.data.UserEntityInfo;
+import com.vci.corba.framework.data.DeptInfo;
+import com.vci.corba.omd.data.BusinessObject;
 import com.vci.frameworkcore.compatibility.OrgDeptQueryServiceI;
 import com.vci.frameworkcore.lcstatuspck.FrameworkDataLCStatus;
-import com.vci.frameworkcore.model.OrgDeptForPlatform1;
-import com.vci.frameworkcore.model.SmRoleForPlatform1;
-import com.vci.frameworkcore.pagemodel.OrgDepartmentVO;
-import com.vci.frameworkcore.pagemodel.SmRoleVO;
+import com.vci.model.OrgDeptForPlatform1;
+import com.vci.po.OrgDeptPO;
+import com.vci.pagemodel.OrgDepartmentVO;
+import com.vci.omd.utils.ObjectTool;
+import com.vci.starter.poi.bo.ReadExcelOption;
+import com.vci.starter.poi.bo.WriteExcelData;
+import com.vci.starter.poi.bo.WriteExcelOption;
+import com.vci.starter.poi.constant.ExcelLangCodeConstant;
+import com.vci.starter.poi.util.ExcelUtil;
 import com.vci.starter.revision.bo.TreeWrapperOptions;
 import com.vci.starter.revision.service.RevisionModelUtil;
 import com.vci.starter.web.constant.QueryOptionConstant;
 import com.vci.starter.web.exception.VciBaseException;
-import com.vci.starter.web.pagemodel.DataGrid;
-import com.vci.starter.web.pagemodel.PageHelper;
-import com.vci.starter.web.pagemodel.Tree;
-import com.vci.starter.web.pagemodel.TreeQueryObject;
-import com.vci.starter.web.util.BeanUtil;
-import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.pagemodel.*;
+import com.vci.starter.web.util.*;
 import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
 import com.vci.web.service.WebBoServiceI;
+import com.vci.web.util.Func;
+import com.vci.web.util.PlatformClientUtil;
 import com.vci.web.util.WebUtil;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.hssf.util.HSSFColor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import java.io.File;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -42,10 +56,26 @@
 	private WebBoServiceI boService;
 
 	/**
+	 * 骞冲彴璋冪敤瀹㈡埛绔�
+	 */
+	@Autowired
+	private PlatformClientUtil platformClientUtil;
+
+	/**
 	 * 瀵硅薄鎿嶄綔宸ュ叿绫�
 	 */
 	@Autowired
 	private RevisionModelUtil revisionModelUtil;
+
+	/**
+	 * 蹇呭~鍒�
+	 */
+	private ArrayList<Integer> ColumnNameisRed = new ArrayList<Integer>();
+
+	/**
+	 * 鏃ュ織
+	 */
+	private Logger logger = LoggerFactory.getLogger(getClass());
 
 	/**
      * 鏍规嵁閮ㄩ棬涓婚敭鑾峰彇閮ㄩ棬鐨勪俊鎭�
@@ -54,13 +84,80 @@
      * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱瀛樺湪闂鐨勬椂鍊欎細鎶涘嚭寮傚父
      */
 	@Override
-	public OrgDepartmentVO getDeptByDeptOid(String deptOid)
-			throws VciBaseException {
+	public OrgDepartmentVO getDeptByDeptOid(String deptOid) throws VciBaseException {
 		if(StringUtils.isBlank(deptOid)){
 			return null;
 		}
-		OrgDeptForPlatform1 deptForPlatform1 = boService.selectByOid(deptOid, OrgDeptForPlatform1.class);
-		return deptDO2VO(deptForPlatform1);
+		Map<String, String> conditionMap = new HashMap<>();
+		conditionMap.put("pluid",deptOid);
+		VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(conditionMap, OrgDeptForPlatform1.class);
+		List<OrgDeptForPlatform1> deptForPlatform1s = boService.selectByQueryWrapper(queryWrapper, OrgDeptForPlatform1.class);
+		if(Func.isEmpty(deptForPlatform1s)){
+			return null;
+		}
+		return deptDO2VO(deptForPlatform1s.get(0));
+	}
+
+	/**
+	 * 鏍规嵁鐖堕儴闂ㄤ富閿幏鍙栭儴闂ㄥ悕绉伴儴闂ㄧ殑淇℃伅
+	 * @param parentDeptOid 鐖堕儴闂ㄤ富閿�
+	 * @param conditionMap 閮ㄩ棬鍚嶇О
+	 * @return 閮ㄩ棬鐨勬樉绀哄璞★紝濡傛灉閮ㄩ棬涓嶅瓨鍦ㄥ垯杩斿洖null锛屼笉浼氭姏鍑哄紓甯�
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱瀛樺湪闂鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public List<OrgDepartmentVO> getDeptByDeptpOidAndCondition(String parentDeptOid,Map<String,String> conditionMap) throws VciBaseException {
+		if(Func.isEmpty(conditionMap)){
+			conditionMap = new HashMap();
+		}
+		VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(conditionMap,OrgDeptForPlatform1.class);
+		//鐖朵富閿负绌烘煡椤跺眰
+		if(Func.isBlank(parentDeptOid)){
+			queryWrapper.isNull("plparentuid");
+		}else{
+			queryWrapper.eq("plparentuid",parentDeptOid);
+		}
+		List<OrgDeptForPlatform1> roleForPlatform1s = boService.selectByQueryWrapper(queryWrapper, OrgDeptForPlatform1.class);
+		if(Func.isEmpty(roleForPlatform1s)){
+			return null;
+		}
+		return deptDO2VOs(roleForPlatform1s);
+	}
+
+	/**
+	 * 鏍规嵁鐖堕儴闂ㄥ悕绉拌矾寰勮幏鍙栧拰閮ㄩ棬鍚嶇О閮ㄩ棬鐨勪俊鎭紙涓昏鐢ㄤ簬瀵煎叆鏃舵牴鎹儴闂ㄥ懡浠ゅ叏璺緞鍜屽悕绉版垨缂栧彿鏌ラ噸锛�
+	 * @return 閮ㄩ棬鐨勬樉绀哄璞★紝濡傛灉閮ㄩ棬涓嶅瓨鍦ㄥ垯杩斿洖null锛屼笉浼氭姏鍑哄紓甯�
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱瀛樺湪闂鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public List<OrgDepartmentVO> getDeptAllFullName() throws VciBaseException {
+		//鏌ヨ閮ㄩ棬淇℃伅锛屼富瑕佹煡璇㈤儴闂ㄥ悕绉扮粍鎴愬叏璺緞
+		String sql = "SELECT  PLUID, PLNAME, PLNUM, PLSTATUS, level, substr(sys_connect_by_path(PLNAME, '/'), 2) AS FULL_NAME_PATH " +
+				"FROM PLDEPT " +
+				"START WITH PLPARENTUID IS NULL " +
+				"CONNECT BY PRIOR PLUID = PLPARENTUID";
+		List<BusinessObject> cbos = boService.queryByOnlySql(sql);
+		List<OrgDepartmentVO> departmentVOList = new ArrayList<>();
+		if(!CollectionUtils.isEmpty(cbos)){
+			cbos.stream().forEach(cbo->{
+				//閮ㄩ棬涓婚敭
+				String deptOid = ObjectTool.getNewBOAttributeValue(cbo,"PLUID");
+				//閮ㄩ棬鍚嶇О
+				String deptName = ObjectTool.getNewBOAttributeValue(cbo, "PLNAME");
+				//閮ㄩ棬缂栧彿
+				String deptNum = ObjectTool.getNewBOAttributeValue(cbo, "PLNUM");
+				//閮ㄩ棬灞傜骇
+				String deptLevel = ObjectTool.getNewBOAttributeValue(cbo, "level");
+				//閮ㄩ棬鍚嶇О鍏ㄨ矾寰�
+				String fullDeptNamePath = ObjectTool.getNewBOAttributeValue(cbo, "FULL_NAME_PATH");
+				//閮ㄩ棬鐘舵��
+				String deptStatus = ObjectTool.getNewBOAttributeValue(cbo, "PLSTATUS");
+				OrgDepartmentVO orgDepartmentVO = new OrgDepartmentVO(deptNum,deptName,Short.valueOf(deptStatus),fullDeptNamePath,Integer.valueOf(deptLevel));
+				orgDepartmentVO.setOid(deptOid);
+				departmentVOList.add(orgDepartmentVO);
+			});
+		}
+		return departmentVOList;
 	}
 
 	/**
@@ -85,22 +182,28 @@
 		OrgDepartmentVO departmentVO = new OrgDepartmentVO();
 		if(deptForPlatform1!=null){
 			departmentVO.setOid(deptForPlatform1.getPluid());
+			// 闄ら儴闂ㄤ富閿鐨勫敮涓�鏍囪瘑锛岄暱搴︿负Dept:+8浣嶅彲閫氳繃璇ュ弬鏁板弽鎺ㄥ洖閮ㄩ棬涓婚敭鐨刪ash缂栫爜
+			//departmentVO.setUniqueId("Dept:"+Func.oidEnHash(deptForPlatform1.getPluid()));
 			departmentVO.setId(deptForPlatform1.getPlnum());
 			departmentVO.setName(deptForPlatform1.getPlname());
+			departmentVO.setStatus(deptForPlatform1.getPlstatus());
 			if(0 == deptForPlatform1.getPlstatus()){
-				departmentVO.setLcStatus(FrameworkDataLCStatus.ENABLED.getValue());
+				departmentVO.setStatusText(FrameworkDataLCStatus.ENABLED.getValue());
 			}else{
-				departmentVO.setLcStatus(FrameworkDataLCStatus.DISABLED.getValue());
+				departmentVO.setStatusText(FrameworkDataLCStatus.DISABLED.getValue());
 			}
+			departmentVO.setSpecialties(deptForPlatform1.getPlspecialties());
+			departmentVO.setCode(deptForPlatform1.getPlcode());
 			departmentVO.setPkFatherDepartment(deptForPlatform1.getPlparentuid());
 			departmentVO.setDescription(deptForPlatform1.getPldesc());
-			departmentVO.setCheckInTime(deptForPlatform1.getPlcreatetime());
+			departmentVO.setCreateTime(new Date(deptForPlatform1.getPlcreatetime()));
 			departmentVO.setCreator(deptForPlatform1.getPlcreateuser());
-			departmentVO.setLastModifyTime(deptForPlatform1.getPlupdatetime());
+			departmentVO.setLastModifyTime(new Date(deptForPlatform1.getPlupdatetime()));
 			departmentVO.setLastModifier(deptForPlatform1.getPlupdateuser());
 		}
 		return departmentVO;
 	}
+
 	/**
      * 鎵归噺鑾峰彇閮ㄩ棬鐨勪俊鎭� 锛堟牴鎹儴闂ㄤ富閿級
      * @param deptOidCollections 閮ㄩ棬涓婚敭鐨勯泦鍚堬紝鍙互瓒呰繃1000涓�
@@ -123,8 +226,9 @@
 				depts.addAll(roleForPlatform1s);
 			}
 		});
-		return 	deptDO2VOs(depts);
+		return deptDO2VOs(depts);
 	}
+
 	/**
      * 鑾峰彇閮ㄩ棬鐨勫垪琛紝榛樿浼氫互閮ㄩ棬鍚嶇О鍗囧簭鎺掑垪锛岄儴闂ㄧ殑缂栬緫椤甸潰鍒楄〃涓嶈浣跨敤杩欎釜鎺ュ彛
      * @param queryMap 鏌ヨ鏉′欢
@@ -138,6 +242,7 @@
 		if(pageHelper == null){
 			pageHelper = new PageHelper(-1);
 		}
+		//鏍规嵁閮ㄩ棬缂栧彿鎺掑簭
 		pageHelper.addDefaultAsc("plnum");
 		VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(queryMap,OrgDeptForPlatform1.class,pageHelper);
 		List<OrgDeptForPlatform1> deptForPlatform1s = boService.selectByQueryWrapper(queryWrapper, OrgDeptForPlatform1.class);
@@ -148,6 +253,7 @@
 		}
 		return dataGrid;
 	}
+
 	 /**
      * 鏍规嵁閮ㄩ棬涓婚敭鑾峰彇閮ㄩ棬鐨勫鍚�
      * @param deptOid 閮ㄩ棬涓婚敭
@@ -173,7 +279,7 @@
 		if(queryMap == null){
 			queryMap = new HashMap<>();
 		}
-		List<OrgDeptForPlatform1> roles = new ArrayList<>();
+		List<OrgDeptForPlatform1> deptForPlatform1s = new ArrayList<>();
 		if(userOid.contains(",")){
 			Map<String, String> finalQueryMap = queryMap;
 			WebUtil.switchCollectionForOracleIn(WebUtil.str2List(userOid)).stream().forEach(userOids->{
@@ -185,7 +291,7 @@
 				VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(conditionMap,OrgDeptForPlatform1.class);
 				List<OrgDeptForPlatform1> roleForPlatform1s = boService.selectByQueryWrapper(queryWrapper, OrgDeptForPlatform1.class);
 				if(!CollectionUtils.isEmpty(roleForPlatform1s)){
-					roles.addAll(roleForPlatform1s);
+					deptForPlatform1s.addAll(roleForPlatform1s);
 				}
 			});
 		}else {
@@ -194,25 +300,27 @@
 		VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(queryMap,OrgDeptForPlatform1.class);
 		List<OrgDeptForPlatform1> roleForPlatform1s = boService.selectByQueryWrapper(queryWrapper, OrgDeptForPlatform1.class);
 		if(!CollectionUtils.isEmpty(roleForPlatform1s)){
-			roles.addAll(roleForPlatform1s);
+			deptForPlatform1s.addAll(roleForPlatform1s);
 		}
-		return deptDO2VOs(roles);
+		return deptDO2VOs(deptForPlatform1s);
 	}
-	 /**
+
+	/**
      * 鏍规嵁鐢ㄦ埛涓婚敭鑾峰彇鍏宠仈鐨勯儴闂�
      * @param userOid 鐢ㄦ埛涓婚敭
      * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
      * @return 閮ㄩ棬鐨勬樉绀哄璞�
      */
 	@Override
-	public OrgDepartmentVO listDeptByUserOid(String userOid,
+	public List<OrgDepartmentVO> listDeptByUserOid(String userOid,
 			Map<String, String> queryMap) {
 		List<OrgDepartmentVO> departmentVOS = listDeptByUserOid(userOid, queryMap, false);
 		if(CollectionUtils.isEmpty(departmentVOS)){
-			return null;
+			return new ArrayList<>();
 		}
-		return departmentVOS.get(0);
+		return departmentVOS;
 	}
+
 	/**
      * 鑾峰彇鏈叧鑱旀煇涓敤鎴风殑閮ㄩ棬
      * @param userOid 鐢ㄦ埛涓婚敭
@@ -270,7 +378,7 @@
      * 鎵归噺鏍规嵁鐢ㄦ埛鐨勪富閿潵鑾峰彇閮ㄩ棬
      * @param userOidCollection 鐢ㄦ埛涓婚敭闆嗗悎
      * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
-     * @return 閮ㄩ棬鐨勬樉绀哄璞★紝key鏄敤鎴蜂富閿�,value鏄繖涓敤鎴峰叧鑱旂殑閮ㄩ棬
+     * @return 閮ㄩ棬鐨勬樉绀哄璞★紝key鏄敤鎴蜂富閿�,value鏄叧鑱旂殑閮ㄩ棬
      */
 	@Override
 	public Map<String, List<OrgDepartmentVO>> batchListDeptByUserOids(
@@ -285,19 +393,21 @@
 			if(!CollectionUtils.isEmpty(deptVOs)){
 				deptVOList.addAll(deptVOs);
 				String sql = "select pluseruid,pldeptuid from pluserdept where pluseruid in (" + WebUtil.toInSql(userOids.toArray(new String[0])) + ")";
-				List<com.vci.client.bof.ClientBusinessObject> cbos = boService.queryBySql(sql, null);
+				List<BusinessObject> cbos = boService.queryBySql(sql, null);
 				if(!CollectionUtils.isEmpty(cbos)){
 					cbos.stream().forEach(cbo->{
-						String userOid = cbo.getAttributeValue("pluseruid");
+						String userOid = ObjectTool.getNewBOAttributeValue(cbo,"pluseruid");
 						List<String> deptOids = userDeptOidMap.getOrDefault(userOid,new ArrayList<>());
-						deptOids.add(cbo.getAttributeValue("pldeptuid"));
+						deptOids.add(ObjectTool.getNewBOAttributeValue(cbo,"pldeptuid"));
 						userDeptOidMap.put(userOid,deptOids);
 					});
 				}
 			}
 		});
 		if(!CollectionUtils.isEmpty(deptVOList)){
-			Map<String, OrgDepartmentVO> deptVOMap = deptVOList.stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
+			//杩欏効搴旇瀵筪eptVOList鍋氫竴娆″幓閲嶅鐞嗭紝鍥犱负鑲畾浼氭湁閲嶅鐨勯儴闂ㄨ鏌ュ嚭鏉�
+			Map<String, OrgDepartmentVO> deptVOMap = deptVOList.stream()
+					.collect(Collectors.toMap(OrgDepartmentVO::getOid, Function.identity(), (existing, replacement) -> existing));
 			Map<String, List<OrgDepartmentVO>> userDeptVOMap = new HashMap<>();
 			userDeptOidMap.forEach((userOid,deptOids)->{
 				List<OrgDepartmentVO> deptVOS = new ArrayList<>();
@@ -312,7 +422,64 @@
 		}
 		return new HashMap<>();
 	}
-	 /**
+
+	/**
+	 * 鎵归噺鏍规嵁鐢ㄦ埛鐨勪富閿潵鑾峰彇閮ㄩ棬鍚嶇О锛�/闂撮殧鏂瑰紡锛�
+	 * @param userOidCollection 鐢ㄦ埛涓婚敭闆嗗悎
+	 * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+	 * @return 閮ㄩ棬鐨勬樉绀哄璞★紝key鏄敤鎴蜂富閿�,value鏄叧鑱旂殑閮ㄩ棬锛堝寘鍚埗鑺傜偣濡傚綋鍓嶉儴闂ㄤ负浜哄姏璧勬簮閮ㄥ垯鍊间负锛�550/浜哄姏璧勬簮閮級
+	 */
+	@Override
+	public Map<String,Map<String,String>> batchMapDeptNameByUserOids(Collection<String> userOidCollection, Map<String, String> queryMap) {
+		if(CollectionUtils.isEmpty(userOidCollection)){
+			return new HashMap<>();
+		}
+		Map<String,Map<String,String>> deptOidNameMap = new HashMap<>();
+		Map<String,Map<String,String>> userDeptOidMap = new HashMap<>();
+		WebUtil.switchCollectionForOracleIn(userOidCollection).stream().forEach(userOids->{
+			//1銆佽鍏堟牴鎹敤鎴蜂富閿幏鍙栧埌鍏宠仈鐨勯儴闂ㄤ富閿�
+			String sql = "select pluseruid,pldeptuid from pluserdept where pluseruid in (" + WebUtil.toInSql(userOids.toArray(new String[0])) + ")";
+			List<BusinessObject> cbos = boService.queryBySql(sql, null);
+			if(!CollectionUtils.isEmpty(cbos)){
+				cbos.stream().forEach(cbo->{
+					//瑙掕壊涓婚敭
+					String userOid = ObjectTool.getNewBOAttributeValue(cbo,"pluseruid");
+					//閮ㄩ棬涓婚敭
+					String deptUid = ObjectTool.getNewBOAttributeValue(cbo, "pldeptuid");
+					//2銆佺劧鍚庢牴鎹儴闂ㄤ富閿幏鍙栧埌鐢遍儴闂ㄥ悕绉�/缁勬垚鐨勫��
+					//閬垮厤澶氭鏌ヨ锛屾垨鑰呭惊鐜煡璇�
+					if(deptOidNameMap.containsKey(deptUid)){
+						userDeptOidMap.put(userOid,deptOidNameMap.get(deptUid));
+					}else {
+						if(Func.isNotEmpty(deptUid)){
+							//2.1銆佹煡璇㈤儴闂╫id锛屽綋鍓嶉儴闂ㄥ寘鍚埗閮ㄩ棬
+							String queryDeptSql = "select pluid,plname from pldept START with pluid = '" +
+									deptUid + "' connect by prior plparentuid = pluid";
+							List<BusinessObject> cboDepts = boService.queryBySql(queryDeptSql, null);
+							if(!CollectionUtils.isEmpty(cboDepts)){
+								StringBuilder sb = new StringBuilder();
+								for (int i = cboDepts.size()-1; i >=0; i--) {
+									String deptName = ObjectTool.getNewBOAttributeValue(cboDepts.get(i),"plname");
+									sb.append(deptName);
+									sb.append("/");
+								}
+								//2.2銆侀伩鍏嶅悓涓�閮ㄩ棬澶氭鏌ヨ锛岃繖閲屽瓨鍌ㄥ湪涓�涓叕鍏遍泦鍚堜腑锛屼究浜庨噸澶嶄娇鐢�
+								//鍒犻櫎鏈�鍚庝竴涓枩鏉�
+								sb.deleteCharAt(sb.length() - 1);
+								Map<String,String> tempMap = new HashMap<>();
+								tempMap.put(deptUid,sb.toString());
+								deptOidNameMap.put(deptUid,tempMap);
+								userDeptOidMap.put(userOid,tempMap);
+							}
+						}
+					}
+				});
+			}
+		});
+		return userDeptOidMap;
+	}
+
+	/**
      * 鑾峰彇鏌愪釜閮ㄩ棬鐨勭洿灞炰笅绾ч儴闂�
      * @param pkFatherDepartmment 閮ㄩ棬鐨勪富閿�
      * @param queryMap 鏌ヨ鏉′欢
@@ -330,6 +497,7 @@
 		List<OrgDeptForPlatform1> depts = boService.selectByQueryWrapper(queryWrapperForDO, OrgDeptForPlatform1.class);
 		return deptDO2VOs(depts);
 	}
+
 	 /**
      * 鑾峰彇鏌愪釜閮ㄩ棬鐨勬墍鏈夊眰绾х殑涓嬬骇閮ㄩ棬
      * @param pkFatherDepartmment 閮ㄩ棬鐨勪富閿�
@@ -343,6 +511,7 @@
 		queryWrapperForDO.in("pluid","select pluid from pldept start with " + (StringUtils.isBlank(pkFatherDepartmment)?" (plparentuid is null or plparentuid = '') ":"plparentuid = '" + pkFatherDepartmment.trim() + "'") +  "connect by PRIOR pluid=plparentuid");
 		return deptDO2VOs(boService.selectByQueryWrapper(queryWrapperForDO, OrgDeptForPlatform1.class));
 	}
+
 	/**
      * 鍙傜収鏍戝舰鏁版嵁鐨勯儴闂ㄤ俊鎭�
      * @param treeQueryObject 鏍戝舰鏌ヨ鐨勬潯浠�
@@ -352,6 +521,7 @@
 	public List<Tree> refTreeDept(TreeQueryObject treeQueryObject) {
 		String pkFatherDepartmment=treeQueryObject.getParentOid();
 		Map<String, String> conditionMap = treeQueryObject.getConditionMap();
+		Map<String, String> extandParamsMap = treeQueryObject.getExtandParamsMap();
 		if(conditionMap==null){
 			conditionMap=new HashMap<String, String>();
 		}
@@ -363,12 +533,32 @@
 			VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(conditionMap,OrgDeptForPlatform1.class);
 			orgDepartmentVOList = deptDO2VOs(boService.selectByQueryWrapper(queryWrapperForDO,OrgDeptForPlatform1.class));
 		}
-		TreeWrapperOptions treeWrapperOptions = new TreeWrapperOptions("pkFatherDepartment");
+		TreeWrapperOptions treeWrapperOptions = new TreeWrapperOptions();
 		BeanUtil.convert(treeQueryObject,treeWrapperOptions);
-		return revisionModelUtil.doList2Trees(orgDepartmentVOList,treeWrapperOptions,dept->{
-			return dept.getId() + " " + dept.getName() + (FrameworkDataLCStatus.DISABLED.getValue().equals(dept.getLcStatus())?"銆愬仠鐢ㄣ��":"");
+		treeWrapperOptions.setParentFieldName("pkFatherDepartment");
+		List<Tree> trees = revisionModelUtil.doList2Trees(orgDepartmentVOList, treeWrapperOptions, dept -> {
+			return dept.getId() + " " + dept.getName() + (FrameworkDataLCStatus.DISABLED.getValue().equals(dept.getLcStatus()) ? "銆愬仠鐢ㄣ��" : "");
 		});
+		//extandParamsMap涓坊鍔�"showAllDepartmentNode"涓�"true"鏃�,骞朵笖parentOid涓虹┖锛岃繑鍥炵粨鏋滀腑浼氬寘鍚�滄墍鏈夐儴闂ㄢ�濊繖涓妭鐐�
+		if(Func.isBlank(pkFatherDepartmment) && (Func.isNotEmpty(extandParamsMap) && Boolean.parseBoolean(extandParamsMap.getOrDefault("showAllDepartmentNode","false")))){
+			List<Tree> treeList = new ArrayList<>();
+			Tree tree = new Tree();
+			tree.setLeaf(false);
+			tree.setParentId(null);
+			//娌℃湁瀹為檯浣滅敤鍙槸鐣岄潰涓婃覆鏌撲娇鐢�
+			tree.setOid(UUID.randomUUID().toString());
+			tree.setParentName(null);
+			Map<String, String> map = new HashMap<>();
+			map.put("name","鎵�鏈夐儴闂�");
+			map.put("ALLDept","ALLDept");
+			tree.setAttributes(map);
+			tree.setChildren(trees);
+			treeList.add(tree);
+			return treeList;
+		}
+		return trees;
 	}
+
 	  /**
      * 鍙傜収鏍戝舰琛ㄦ牸鐨勯儴闂ㄤ俊鎭紝涓婄骇閮ㄩ棬鐨勬槸琛ㄦ牸涓殑鏍戝舰鍒�
      * @param treeQueryObject 鏍戝舰鏌ヨ鐨勬潯浠�
@@ -397,4 +587,395 @@
 		return dataGrid;
 	}
 
+	/**
+	 * 淇濆瓨閮ㄩ棬鐢ㄦ埛鍏宠仈淇℃伅锛屽甫鏌ラ噸鍔熻兘
+	 * @param userOIds 鐢ㄦ埛id
+	 * @param deptId 閮ㄩ棬id
+	 * @return
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public boolean saveUsersDept(String[] userOIds, String deptId) throws PLException {
+		//鍏堣繘鎬ф煡閲嶅鐞�
+		List<String> repeatUserOidList = new ArrayList<>();
+		//寰幆杩涜鏌ラ噸锛岄伩鍏峣n澶т簬1000
+		WebUtil.switchCollectionForOracleIn(Arrays.asList(userOIds)).stream().forEach(userOId->{
+			String sql = "select pluseruid,pldeptuid from pluserdept where pldeptuid = '" + deptId
+					+ "' and " + "pluseruid in ("+WebUtil.toInSql(userOId.toArray(new String[0]))+")";
+			List<BusinessObject> cbos = boService.queryBySql(sql, null);
+			if(!CollectionUtils.isEmpty(cbos)){
+				cbos.stream().forEach(cbo->{
+					repeatUserOidList.add(ObjectTool.getNewBOAttributeValue(cbo,"pluseruid"));
+				});
+			}
+		});
+
+		//浠庡嵆灏嗚鎵ц淇濆瓨鐨勭敤鎴穙id涓Щ闄ゅ綋鍓嶇敤鎴峰凡缁忓瓨鍦ㄥ叧鑱斿叧绯荤殑oid
+		//绉婚櫎閲嶅鐨�
+		List<String> tempList = new ArrayList<>(Arrays.asList(userOIds));
+		tempList.removeAll(repeatUserOidList);
+		userOIds = tempList.toArray(new String[tempList.size()]);
+		if(Func.isNotEmpty(userOIds)){
+			platformClientUtil.getFrameworkService().saveUserDept(userOIds, deptId,new UserEntityInfo(WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId(),null));
+		}
+		return true;
+	}
+
+	/**
+	 * 澧炲姞閮ㄩ棬淇℃伅
+	 * @param orgDepartmentDTO
+	 * @return
+	 */
+	@Override
+	public boolean addDept(OrgDepartmentDTO orgDepartmentDTO) throws PLException {
+		//鍒ょ┖
+		VciBaseUtil.alertNotNull(
+				orgDepartmentDTO,"娣诲姞鐨勯儴闂ㄥ璞�",
+				orgDepartmentDTO.getName(),"閮ㄩ棬鍚�");
+		//閮ㄩ棬鍚嶅拰缂栧彿鍒ら噸
+		Map<String, String> conditionMap = new HashMap<>();
+		conditionMap.put("plname",QueryOptionConstant.OR + orgDepartmentDTO.getName());
+		if(Func.isNotBlank(orgDepartmentDTO.getId())){
+			conditionMap.put("plnum",QueryOptionConstant.OR + orgDepartmentDTO.getId());
+		}
+		List<OrgDepartmentVO> departmentVOS = getDeptByDeptpOidAndCondition(orgDepartmentDTO.getPkFatherDepartment(), conditionMap);
+		if(Func.isNotEmpty(departmentVOS)){
+			throw new VciBaseException("鍚屼竴鐖惰妭鐐逛笅璇ラ儴闂ㄥ悕绉版垨缂栧彿宸茬粡瀛樺湪,璇蜂慨鏀�!");
+		}
+		SessionInfo loginUser = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
+		String userId = loginUser.getUserId();
+
+		//鐢熸垚瀛樺偍鐨刢orba瀵硅薄
+		orgDepartmentDTO.setCreateTime(new Date());
+		orgDepartmentDTO.setCreator(userId);
+		orgDepartmentDTO.setLastModifier(userId);
+		orgDepartmentDTO.setStatus((short) 0);
+		DeptInfo deptInfo = changeOrgDeptDTOToDeptInfo(orgDepartmentDTO);
+		UserEntityInfo userEntityInfo = new UserEntityInfo(userId, "");
+		String oid = platformClientUtil.getFrameworkService().saveDepartment(deptInfo, userEntityInfo);
+		if (Func.isEmpty(oid)) {
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * 淇敼閮ㄩ棬淇℃伅
+	 * @param orgDepartmentDTO
+	 * @return
+	 */
+	@Override
+	public boolean updateDept(OrgDepartmentDTO orgDepartmentDTO) throws PLException {
+		//鍒ょ┖
+		VciBaseUtil.alertNotNull(
+				orgDepartmentDTO,"淇敼鐨勯儴闂ㄥ璞�",
+				orgDepartmentDTO.getOid(),"鐢ㄦ埛涓婚敭",
+				orgDepartmentDTO.getId(),"鐢ㄦ埛鍚�"
+		);
+		//鎸塷id鏌ヨ鏁版嵁搴撲腑宸插瓨鍦ㄧ殑锛岀‘淇濅慨鏀圭殑閮ㄩ棬瀛樺湪
+		OrgDepartmentVO dbDepartmentVO = getDeptByDeptOid(orgDepartmentDTO.getOid());
+		if(Func.isEmpty(dbDepartmentVO)){
+			throw new VciBaseException("淇敼鐨勯儴闂ㄤ笉瀛樺湪锛�");
+		}
+		//閮ㄩ棬鍚嶅拰缂栧彿鍒ら噸锛岄伩鍏嶆柊瀹堕儴闂ㄩ噸澶�
+		Map<String, String> conditionMap = new HashMap<>();
+		conditionMap.put("plname",QueryOptionConstant.OR + orgDepartmentDTO.getName());
+		if(Func.isNotBlank(orgDepartmentDTO.getId())){
+			conditionMap.put("plnum",QueryOptionConstant.OR + orgDepartmentDTO.getId());
+		}
+		List<OrgDepartmentVO> repeatDepartmentVOS = getDeptByDeptpOidAndCondition(orgDepartmentDTO.getPkFatherDepartment(), conditionMap);
+		repeatDepartmentVOS = repeatDepartmentVOS.stream().filter(item -> {
+			if((item.getName().equals(orgDepartmentDTO.getName()) || item.getId().equals(orgDepartmentDTO.getId())) &&
+					!item.getOid().equals(orgDepartmentDTO.getOid())){
+				return true;
+			}
+			return false;
+		}).collect(Collectors.toList());
+		if(Func.isNotEmpty(repeatDepartmentVOS) ){
+			throw new VciBaseException("鍚屼竴鐖惰妭鐐逛笅璇ラ儴闂ㄥ悕绉版垨缂栧彿宸茬粡瀛樺湪,璇蜂慨鏀�!");
+		}
+		OrgDepartmentDTO departmentDTO = new OrgDepartmentDTO();
+		BeanUtil.convert(dbDepartmentVO,departmentDTO);
+		departmentDTO.setCode(orgDepartmentDTO.getCode());
+		departmentDTO.setId(orgDepartmentDTO.getId());
+		departmentDTO.setSpecialties(orgDepartmentDTO.getSpecialties());
+		departmentDTO.setDescription(orgDepartmentDTO.getDescription());
+		departmentDTO.setName(orgDepartmentDTO.getName());
+		String loginUserId = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
+		orgDepartmentDTO.setLastModifier(loginUserId);
+		DeptInfo deptInfo = changeOrgDeptDTOToDeptInfo(departmentDTO);
+		boolean updateBoolean = platformClientUtil.getFrameworkService().updateDepartment(deptInfo, new UserEntityInfo(loginUserId, null));
+		return updateBoolean;
+	}
+
+	/**
+	 * Dto瀵硅薄杞琧orb瀵硅薄
+	 * @param orgDepartmentDTO
+	 * @return
+	 */
+	public DeptInfo changeOrgDeptDTOToDeptInfo(OrgDepartmentDTO orgDepartmentDTO) {
+		DeptInfo departmentInfo = new DeptInfo();
+		departmentInfo.id = orgDepartmentDTO.getOid() == null ? "" : orgDepartmentDTO.getOid();
+		departmentInfo.name = orgDepartmentDTO.getName() == null ? "" : orgDepartmentDTO.getName();
+		departmentInfo.num = orgDepartmentDTO.getId() == null ? "" : orgDepartmentDTO.getId();
+		departmentInfo.code = orgDepartmentDTO.getCode() == null ? "" : orgDepartmentDTO.getCode();
+		departmentInfo.specialties = orgDepartmentDTO.getSpecialties() == null ? "" : orgDepartmentDTO.getSpecialties();
+		departmentInfo.status = orgDepartmentDTO.getStatus() == 0 ? 0 : orgDepartmentDTO.getStatus();
+		departmentInfo.description = orgDepartmentDTO.getDescription() == null ? "" : orgDepartmentDTO.getDescription();
+		departmentInfo.parentId = orgDepartmentDTO.getPkFatherDepartment() == null ? "" : orgDepartmentDTO.getPkFatherDepartment();
+		departmentInfo.createUser = orgDepartmentDTO.getCreator() == null ? "" : orgDepartmentDTO.getCreator();
+		departmentInfo.createTime = orgDepartmentDTO.getCreateTime().getTime();
+		departmentInfo.updateTime = System.currentTimeMillis();
+		departmentInfo.updateUser = orgDepartmentDTO.getLastModifier() == null ? "" : orgDepartmentDTO.getLastModifier();
+		//departmentInfo.grantor = orgDepartmentDTO.getGrantor() == null ? "" : orgDepartmentDTO.getGrantor();
+		return departmentInfo;
+	}
+
+	/**
+	 * 鍒犻櫎閮ㄩ棬
+	 * @param ids
+	 * @return
+	 */
+	@Override
+	public boolean deleteDept(String[] ids) throws PLException {
+		VciBaseUtil.alertNotNull(ids,"瑕佸垹闄ょ殑閮ㄩ棬涓婚敭");
+		//TODO:鑰冭檻鏄惁闇�瑕佹坊鍔犲垹闄ゅ墠鍒ゆ柇閮ㄩ棬涓嬫槸鍚﹂厤缃湁鐢ㄦ埛锛岃繖绉嶆儏鍐靛簲璇ヤ笉鍏佽鍒犻櫎
+		//TODO: 搴旇鏄笉鍏峰杩炲甫鍒犻櫎鐨勫姛鑳斤紝閮ㄩ棬鍒犻櫎鍚庣敤鎴峰叧鑱旂殑鏃犵敤閮ㄩ棬杩樺湪,鑰冭檻鍚庢湡鏄惁闇�瑕佸仛锛屾暟鎹噺涓嶅ぇ鍙互涓嶅仛杩炲甫鍒犻櫎
+		return platformClientUtil.getFrameworkService().deleteDepartment(
+				ids,
+				new UserEntityInfo(WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId(), null)
+		);
+	}
+
+	/**
+	 * 涓嬭浇瀵煎叆閮ㄩ棬鐨別xcel妯℃澘銆�
+	 * @param downloadFileName
+	 * @return
+	 */
+	@Override
+	public String downloadImportTemplate(String downloadFileName) {
+		//鐣岄潰娌′紶鍚嶇О锛屼娇鐢ㄩ粯璁ゅ悕绉�
+		downloadFileName = Func.isBlank(downloadFileName) ?  "閮ㄩ棬瀵煎叆妯℃澘_" + Func.format(new Date(),"yyyy-MM-dd HHmmss.sss"):downloadFileName;
+		// 璁剧疆琛ㄥ崟鍒楀悕
+		List<String> columns = new ArrayList<>(Arrays.asList("鍚嶇О", "缂栧彿", "浠e彿", "涓撲笟", "鐖堕儴闂ㄥ悕绉板叏璺緞锛�/闂撮殧锛�", "鎻忚堪"));
+		//璁剧疆蹇呭~鍒�
+		ColumnNameisRed.clear();
+		ColumnNameisRed.add(0);
+		ColumnNameisRed.add(1);
+		//鍐檈xcel
+		String excelPath = LocalFileUtil.getDefaultTempFolder() + File.separator + downloadFileName +  ".xls";
+		try {
+			new File(excelPath).createNewFile();
+		} catch (Throwable e) {
+			throw new VciBaseException(LangBaseUtil.getErrorMsg(e), new String[]{excelPath}, e);
+		}
+		//璁剧疆鍒�
+		List<WriteExcelData> excelDataList = new ArrayList<>();
+		for (int index = 0; index < columns.size(); index++) {
+			//鍒ゆ柇鏄惁涓哄繀濉垪锛岀粰蹇呭~鍒楄缃鑹�
+			if(ColumnNameisRed.contains(index)){
+				WriteExcelData excelData = new WriteExcelData(0, index, columns.get(index));
+				excelData.setFontColor(String.valueOf(HSSFColor.HSSFColorPredefined.RED.getIndex()));
+				excelDataList.add(excelData);
+			}else{
+				excelDataList.add(new WriteExcelData(0,index, columns.get(index)));
+			}
+		}
+		WriteExcelOption excelOption = new WriteExcelOption(excelDataList);
+		ExcelUtil.writeDataToFile(excelPath, excelOption);
+		return excelPath;
+	}
+
+	/**
+	 * 瀵煎叆閮ㄩ棬
+	 * @param file
+	 * @return
+	 * @throws VciBaseException
+	 */
+	@Override
+	public BaseResult importDept(File file) throws Exception {
+		VciBaseUtil.alertNotNull(file,"excel鏂囦欢");
+		if(!file.exists()){
+			throw new VciBaseException("瀵煎叆鐨別xcel鏂囦欢涓嶅瓨鍦�,{0}",new String[]{file.getPath()});
+		}
+		try{
+			//1銆佽鍙杄xcel涓殑鏁版嵁锛岀粍鎴愬璞�
+			ReadExcelOption excelOption = new ReadExcelOption();
+			//褰撳墠鐧诲綍鐨勭敤鎴疯处鍙�
+			//String loginUserId = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
+			String loginUserId = "developer";
+			UserEntityInfo userEntityInfo = new UserEntityInfo(loginUserId,null);
+			List<OrgDeptPO> poList = ExcelUtil.readDataObjectFromExcel(file, OrgDeptPO.class,excelOption,(value, po, fieldName)->{});
+			//鍘婚櫎閮芥槸绌虹殑鎯呭喌
+			if(CollectionUtils.isEmpty(poList)){
+				return BaseResult.fail(ExcelLangCodeConstant.IMPORT_CONTENT_NULL,new String[]{});
+			}
+
+			//2銆佸繀濉垽绌恒�佸垽閲嶏紙鏁版嵁搴撳垽閲嶅拰excel涓垽閲嶏級锛岀粍瑁呮垚淇濆瓨鐢ㄧ殑鏁版嵁瀵硅薄
+			List<DeptInfo> deptInfoList = new ArrayList<>();
+			//2.1銆佺敤浠ュ瓨鍌╡xcel涓噸澶嶇殑鏁版嵁锛屼袱涓笉鍙噸澶嶇殑瀛楁锛夛紙Name涓嶈兘涓虹┖锛孨ame銆丆ode鍚屼竴鐖堕儴闂ㄤ笅鍞竴锛�
+			Map<String,String> repeatNameMap = new HashMap<>();
+			Map<String,String> repeatNumMap = new HashMap<>();
+			Map<String,String> indexMap = new HashMap<>();
+			//2.2銆佸瓨鍌ㄧ敤鎴锋墜杈撶殑oid鍜屽疄闄呭瓨鍌╫id鐨勬槧灏勫叧绯�
+			Map<String, String> oidMap = new HashMap<>();
+			//鏌ヨ绯荤粺涓儴闂紝鍏朵腑鍖呭惈浜嗛儴闂ㄥ悕绉版爲灞炴��
+			List<OrgDepartmentVO> dbOrgDepartmentVOList = this.getDeptAllFullName();
+			//閬嶅巻鎴恗ap瀵硅薄锛歬ey涓篋eptName鐨勫叏璺緞锛歷alue涓篋ept瀵硅薄(鐢ㄦ埛澶勭悊閮ㄩ棬鐖剁粍浠�)
+			Map<String, String> dbOrgDepartFullNameOidMap = dbOrgDepartmentVOList.stream().collect(Collectors.toMap(OrgDepartmentVO::getFullDeptNamePath, OrgDepartmentVO::getOid));
+			//鐢ㄦ潵鍒ゆ柇澶刾arentName鏃笉鍦ㄥ簱涓瓨鍦紝鍙堜笉鍦╬oNames瀛樺湪鐨勬儏鍐�
+			List<String> poNames = poList.stream().map(OrgDeptPO::getName).collect(Collectors.toList());
+			poList.stream().forEach(po->{
+				String parentFullNamePath = Func.isBlank(po.getParentFullNamePath()) ? "":po.getParentFullNamePath();
+				//閮ㄩ棬鍚嶇О鍒ょ┖锛岄�氬父閫氳繃po涓殑娉ㄨВ灏卞彲瀹炵幇
+				if(Func.isBlank(po.getName())){
+					throw new VciBaseException("绗��"+po.getRowIndex()+"銆戣锛宒epterror,Reason:Name cannot be empty");
+				}else if(parentFullNamePath.equals(repeatNameMap.getOrDefault(po.getName(), null))/*excel涓悓涓�閮ㄩ棬涓婲ame鐩哥瓑*/){
+					//鍚屼竴閮ㄩ棬涓嬪悕绉板垽閲�
+					throw new VciBaseException("绗��"+po.getRowIndex()+"銆戣锛宒eptnameerror,Reason: Names under the same department cannot be duplicated");
+				}else if(Func.isNotBlank(po.getNum()) && parentFullNamePath.equals(repeatNumMap.getOrDefault(po.getNum(),null))/*excel涓悓涓�閮ㄩ棬涓嬬紪鍙峰瓨鍦� */){
+					throw new VciBaseException("绗��"+po.getRowIndex()+"銆戣锛宒eptnumerror,Reason: The number cannot be duplicated");
+				}else{
+					//2.2銆佹煡璇㈡暟鎹簱涓殑鏁版嵁锛堟煡閲岻D鍜孨UM锛夛紝姣旇緝楹荤儲闇�瑕佹牴鎹甈arentName鍏ㄨ矾寰勬煡璇紙鎵�鏈夊彧鑳藉崟鏉℃煡璇㈣繘琛屽垽閲嶏級
+					//鍚屼竴閮ㄩ棬涓�(parentName鐩哥瓑)锛宯ame鎴栬�卬um鐩哥瓑
+					List<OrgDepartmentVO> repeatOrgDept = dbOrgDepartmentVOList.stream().filter(item -> {
+						//鍚屼竴閮ㄩ棬鍚嶇О鍏ㄨ矾寰勪笅锛岄儴闂ㄥ悕绉扮浉绛夈�侀儴闂ㄧ紪鍙蜂笉涓虹┖骞朵笖鍜岀郴缁熶腑瀛樺湪鐩哥瓑鐨勭紪鍙�
+						boolean isNameOrNumRepeat = po.getName().equals(item.getName()) || (Func.isNotBlank(po.getNum()) && po.getNum().equals(item.getId()));
+						/*褰損arentFullNamePath涓�""鏃秈tem.getFullDeptNamePath().contains(parentFullNamePath)姘歌繙涓簍rue锛�
+						鎵�浠ラ渶瑕佺壒娈婂鐞嗙洿鎺ュ垽鏂《灞傜殑閮ㄩ棬鏄惁瀛樺湪閲嶅*/
+						if(((Func.isBlank(parentFullNamePath) && item.getTreelevel() == 1)
+							|| (Func.isNotBlank(parentFullNamePath) && item.getFullDeptNamePath().contains(parentFullNamePath)))
+							&& isNameOrNumRepeat) {
+							return true;
+						}
+						return false;
+					}).collect(Collectors.toList());
+					//鍙涓嶄负绌哄氨璇存槑褰撳墠琛屾暟鎹湪绯荤粺涓噸澶�
+					if(Func.isNotEmpty(repeatOrgDept)){
+						throw new VciBaseException("绗��"+po.getRowIndex()+"銆戣锛宒eptname or deptnum error,Reason: The name or number already exists in the system");
+					}
+				}
+				//瀛樺偍鏍¢獙閫氳繃鐨勬暟鎹紝浠ヤ究鍚庣画excel鏌ラ噸
+				repeatNameMap.put(po.getName(),parentFullNamePath);
+				if(Func.isNotBlank(po.getNum())){
+					repeatNumMap.put(po.getNum(),parentFullNamePath);
+				}
+				indexMap.put(po.getName(),po.getRowIndex());
+				//鏍¢獙鏁版嵁灏辫缁勮鎴怐TO鏁版嵁瀵硅薄浜�
+				OrgDepartmentDTO dto = new OrgDepartmentDTO();
+				BeanUtil.convert(po,dto);
+				dto.setOid(po.getId());
+				dto.setId(po.getNum());
+				dto.setDescription(po.getDesc());
+				dto.setSpecialties(po.getSpecialties());
+				dto.setCreateTime(new Date());
+				dto.setCreator(loginUserId);
+				dto.setLastModifier(loginUserId);
+				dto.setStatus((short) 0);
+				//缁欏鍏ョ殑鏁版嵁璁剧疆鐨勪富閿�
+				String oid = VciBaseUtil.getPk().toUpperCase(Locale.ROOT);
+				dto.setOid(oid);
+				/*澶勭悊閮ㄩ棬鍚嶇О鍏ㄨ矾寰勮浆鎹负PkFatherDepartment锛堥儴闂ㄤ富閿級锛�
+				  鎯呭喌1銆佺洿灞炵埗閮ㄩ棬鏄郴缁熶腑宸插瓨鍦紙鍒ゆ柇鏂瑰紡锛氶儴闂ㄥ悕绉板叏璺緞鍦╠bOrgDepartmentVOList涓瓨鍦紝fullDeptNamePath鍏ㄧ瓑浜巔arentFullNamePath锛夈��
+				  鎯呭喌2銆佺洿灞炵埗閮ㄩ棬涓嶆槸绯荤粺涓凡瀛樺湪鐨�,浣嗘槸鐩村睘鐖堕儴闂ㄧ殑鐨勪笂绾ч儴闂ㄦ槸绯荤粺涓凡瀛樺湪鐨�(娑夊強鍒皁id鍜宲arentoid瀵瑰簲鍏崇郴澶勭悊姣旇緝楹荤儲)銆�
+				  鎯呭喌3銆佺洿灞炵埗閮ㄩ棬鍜屽叾涓婄骇閮ㄩ棬閮芥槸excel涓柊鏋勫缓鐨勩��(娑夊強鍒皁id鍜宲arentoid瀵瑰簲鍏崇郴澶勭悊姣旇緝楹荤儲)*/
+				String dbDeptoid = dbOrgDepartFullNameOidMap.getOrDefault(parentFullNamePath, null);
+				//鎯呭喌1鍙互鐩存帴璁剧疆parentOid銆�
+				if(Func.isNotEmpty(dbDeptoid) || "".equals(parentFullNamePath)){
+					//璁剧疆鐖堕儴闂ㄤ富閿�
+					dto.setPkFatherDepartment(dbDeptoid);
+				}else{
+					//澶勭悊鐖惰矾寰勫悕鏃笉瀛樺湪浜庢暟鎹簱鍙堜笉瀛樺湪浜庡綋鍓峞xcel
+					String lastParentFullName = parentFullNamePath.substring(parentFullNamePath.lastIndexOf("/") + 1);//鐖惰矾寰勫悕鐨勬渶鍚庝竴涓儴闂ㄥ悕绉�
+					if(Func.isBlank(dbOrgDepartFullNameOidMap.getOrDefault(parentFullNamePath,null))
+						&& !poNames.contains(lastParentFullName)
+					){
+						throw new VciBaseException("褰撳墠瀵煎叆鐨勯儴闂ㄦ暟鎹腑锛岀銆�" + indexMap.get(po.getName()) + "銆戣锛岀埗閮ㄩ棬璁剧疆瀛樺湪闂锛�");
+					}
+					//鎯呭喌2鍜�3闇�瑕侀�氳繃鏄犲皠鍏崇郴璁剧疆parentoid锛屾墍浠ヨ繖閲屽厛鏍囪鍚庣画鍐嶅仛澶勭悊銆�
+					dto.setPkFatherDepartment("Pending:" + parentFullNamePath);
+				}
+				//瀛樺偍parentOid:oid鏄犲皠鍏崇郴
+				String key = Func.isBlank(parentFullNamePath) ? po.getName():parentFullNamePath + "/"+po.getName();
+				oidMap.put(key,oid);
+
+				DeptInfo deptInfo = this.changeOrgDeptDTOToDeptInfo(dto);
+				deptInfoList.add(deptInfo);
+			});
+			//3銆佸鐞唎id鍜宲arentOid鐨勬槧灏勫叧绯�:閽堝鏂板姞鐨勬暟鎹槸鐖堕儴闂�
+			deptInfoList.stream().forEach(info -> {
+				try {
+					//parentId涓嶄负绌哄苟涓旀病鏈塒ending:鐩稿叧鐨勫瓧绗︿覆,璇存槑鏄渶瑕佸鐞唎id鏄犲皠parentOid鐨�
+					if (info.parentId.contains("Pending:")){
+						//绯荤粺涓凡瀛樺湪鐨勭埗閮ㄩ棬OID锛岄渶瑕佺Щ闄ゆ帀Dept:鏍囪瘑
+						String key = info.parentId.replace("Pending:","");
+						String parentId = oidMap.get(key);
+						info.parentId = parentId;
+					}
+					//4銆佷繚瀛樻搷浣�
+					platformClientUtil.getFrameworkService().saveDepartment(
+							info,
+							userEntityInfo
+					);
+				} catch (PLException e) {
+					e.printStackTrace();
+					throw new VciBaseException("淇濆瓨鏃跺嚭鐜伴敊璇紒锛屽師鍥狅細"+VciBaseUtil.getExceptionMessage(e));
+				}
+			});
+		}catch (Exception e){
+			if(logger.isErrorEnabled()){
+				logger.error("璇诲彇excel鍐呭鏃舵垨淇濆瓨鐢ㄦ埛淇℃伅鏃跺嚭鐜颁簡閿欒锛屽叿浣撳師鍥狅細",e.getMessage());
+			}
+			e.printStackTrace();
+			return BaseResult.fail(LangBaseUtil.getErrorMsg(e),new String[]{},e);
+		}
+		return BaseResult.success("閮ㄩ棬瀵煎叆鎴愬姛锛�");
+	}
+
+	/**
+	 * 鑾峰彇鎵�鏈夐儴闂ㄧ殑淇℃伅
+	 * @return key锛氶儴闂ㄧ敱鍚嶇О缁勬垚鐨勮矾寰勶紙/闂撮殧锛夛紝value瀵瑰簲鏈�灏忓眰绾х殑閮ㄩ棬淇℃伅
+	 */
+	@Override
+	public Map<String, OrgDepartmentVO> getDeptAllTreeMap() {
+		List<OrgDepartmentVO> orgDepartmentVOList = listAllLevelChildrenDeptByParentOid(null, null);
+		Map<String, OrgDepartmentVO> stringOrgDepartmentVOMap = convertToMap(orgDepartmentVOList);
+		return stringOrgDepartmentVOMap;
+	}
+
+	/**
+	 * 鑾峰彇閮ㄩ棬鐢卞悕绉扮粍鎴愮殑璺緞锛�/闂撮殧锛夛紝value瀵瑰簲鏈�灏忓眰绾х殑閮ㄩ棬淇℃伅
+	 * @param orgDepartmentVOList
+	 * @return
+	 */
+	private Map<String, OrgDepartmentVO> convertToMap(List<OrgDepartmentVO> orgDepartmentVOList) {
+		Map<String, OrgDepartmentVO> map = new HashMap<>();
+		for (OrgDepartmentVO orgDepartmentVO : orgDepartmentVOList) {
+			String key = buildKey(orgDepartmentVO, orgDepartmentVOList);
+			map.put(key, orgDepartmentVO);
+		}
+		return map;
+	}
+
+	private String buildKey(OrgDepartmentVO orgDepartmentVO, List<OrgDepartmentVO> orgDepartmentVOList) {
+		StringBuilder keyBuilder = new StringBuilder();
+		OrgDepartmentVO current = orgDepartmentVO;
+		while (current != null) {
+			keyBuilder.insert(0, current.getName());
+			keyBuilder.insert(0, "/");
+			current = getParentDepartment(current.getPkFatherDepartment(), orgDepartmentVOList);
+		}
+		keyBuilder.deleteCharAt(0);
+		return keyBuilder.toString();
+	}
+
+	private OrgDepartmentVO getParentDepartment(String pkFatherDepartment, List<OrgDepartmentVO> orgDepartmentVOList) {
+		for (OrgDepartmentVO orgDepartmentVO : orgDepartmentVOList) {
+			if (pkFatherDepartment != null && pkFatherDepartment.equals(orgDepartmentVO.getOid())) {
+				return orgDepartmentVO;
+			}
+		}
+		return null;
+	}
+
 }

--
Gitblit v1.9.3