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/SmUserQueryServiceImpl.java | 1042 +++++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 821 insertions(+), 221 deletions(-)

diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmUserQueryServiceImpl.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmUserQueryServiceImpl.java
index 45314e6..d08bcbb 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmUserQueryServiceImpl.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmUserQueryServiceImpl.java
@@ -1,39 +1,53 @@
 package com.vci.frameworkcore.compatibility.impl;
 
-import com.vci.client.common.providers.ServiceProvider;
+import com.vci.dto.SmUserDTO;
 import com.vci.common.util.ThreeDES;
 import com.vci.corba.common.PLException;
+import com.vci.corba.common.data.UserEntityInfo;
 import com.vci.corba.framework.data.UserInfo;
+import com.vci.corba.omd.data.BusinessObject;
+import com.vci.frameworkcore.compatibility.OrgDeptQueryServiceI;
+import com.vci.frameworkcore.compatibility.SmPwdStrategyQueryServiceI;
+import com.vci.frameworkcore.compatibility.SmRoleQueryServiceI;
 import com.vci.frameworkcore.compatibility.SmUserQueryServiceI;
-import com.vci.frameworkcore.pagemodel.SmPasswordStrategyVO;
-import com.vci.frameworkcore.pagemodel.SmUserVO;
+import com.vci.model.SmUserDO;
+import com.vci.pagemodel.SmUserVO;
+import com.vci.po.SmUserPO;
+import com.vci.pagemodel.OrgDepartmentVO;
+import com.vci.pagemodel.SmPasswordStrategyVO;
+import com.vci.pagemodel.SmRoleVO;
+import com.vci.frameworkcore.properties.ConfigCorbaReader;
+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.web.enumpck.BooleanEnum;
 import com.vci.starter.web.enumpck.UserSecretEnum;
 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.util.VciDateUtil;
+import com.vci.starter.web.pagemodel.*;
+import com.vci.starter.web.util.*;
 import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
 import com.vci.web.enumpck.UserTypeEnum;
-import com.vci.web.model.SmPasswordStrategyDO;
-import com.vci.web.model.SmUserDO;
 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.stream.Collectors;
 
-import static com.vci.frameworkcore.constant.FrameWorkBusLangCodeConstant.DATA_OID_NOT_EXIST;
-import static com.vci.web.util.WebUtil.arryAndSqlToClientBusinessObject;
+import static com.vci.web.util.WebUtil.arryAndSqlToBusinessObject;
 
 /**
  * 鐢ㄦ埛鐨勬煡璇㈢浉鍏崇殑鏈嶅姟锛屽彲浠ュ吋瀹硅�佸钩鍙板拰鑰佺殑pdm
@@ -56,6 +70,24 @@
 	 */
 	@Autowired
 	private WebBoServiceI boService;
+
+	/**
+	 * 閮ㄩ棬鏈嶅姟
+	 */
+	@Autowired
+	private OrgDeptQueryServiceI orgDeptQueryService;
+
+	/**
+	 * 瑙掕壊鏈嶅姟
+	 */
+	@Autowired
+	private SmRoleQueryServiceI smRoleQueryService;
+
+	/**
+	 * 瀵嗙爜绛栫暐鏌ヨ鏈嶅姟
+	 */
+	@Autowired
+	private SmPwdStrategyQueryServiceI smPwdStrategyQueryService;
 
 	/**
 	 * 浣跨敤瑙掕壊鐨勫睘鎬ф煡璇㈢敤鎴锋椂
@@ -83,6 +115,51 @@
 	public static final String QUERY_FIELD_ROLE = "roleUser.plroleuid";
 
 	/**
+	 * 蹇呭~鍒�
+	 */
+	private ArrayList<Integer> ColumnNameisRed = new ArrayList<Integer>();
+
+	/**
+	 * 鐢ㄦ埛鍒嗛〉鏌ヨ鏃惰幏鍙栭儴闂ㄦ斁鍒拌繖閲岄伩鍏嶉噸澶嶆煡璇�
+	 */
+	private Map<String,Map<String,String>> orgDepartmentVOMap;
+
+	/**
+	 * 鐢ㄦ埛鍒嗛〉鏌ヨ鏃惰幏鍙栬鑹叉斁鍒拌繖閲岄伩鍏嶉噸澶嶆煡璇�
+	 */
+	private Map<String,List<SmRoleVO>> smRoleVOMap;
+
+	/**
+	 * 鐢ㄦ埛鍒嗛〉鏌ヨ鏃惰幏鍙栧瘑鐮佺瓥鐣ユ斁鍒拌繖閲岄伩鍏嶅娆℃煡璇�
+	 */
+	private Map<String,SmPasswordStrategyVO> smPwdStrategyVOMap;
+
+	/**
+	 * 鏃ュ織
+	 */
+	private Logger logger = LoggerFactory.getLogger(getClass());
+
+	/**
+	 * 妫�鏌ョ敤鎴锋槸鍚﹀瓨鍦紝鍙互鏍规嵁鐢ㄦ埛鍚嶏紝涔熷彲浠ユ牴鎹敤鎴穙id
+	 * @param userName  浼爊ull锛屽嵆鐢╫id浣滀负妫�鏌ユ潯浠�
+	 * @param oid    浼爊ull锛屽嵆鐢╱serName浣滀负妫�鏌ユ潯浠�
+	 * @return true瀛樺湪锛宖alse涓嶅瓨鍦�
+	 */
+	@Override
+	public boolean checkUserExist(String userName, String oid) throws PLException {
+		if(Func.isEmpty(userName) && Func.isEmpty(oid)){
+			throw new PLException("500", new String[] { "妫�鏌ョ敤鎴锋槸鍚﹀瓨鍦ㄦ椂锛屼紶閫掔殑鍙傛暟鐢ㄦ埛鍚嶅拰鐢ㄦ埛oid閮戒负绌猴紒"});
+		}
+		UserInfo userInfo = null;
+		if(Func.isNotEmpty(userName)) {
+			userInfo = platformClientUtil.getFrameworkService().getUserObjectByUserName(userName);
+		}else{
+			userInfo = platformClientUtil.getFrameworkService().getUserObjectByoid(oid);
+		}
+		return Func.isNotEmpty(userInfo);
+	}
+
+	/**
      *  鏍规嵁鐢ㄦ埛鍚嶈幏鍙栫敤鎴风殑瀵硅薄锛屼笉鍖哄垎澶у皬鍐�
      * @param userId 鐢ㄦ埛鍚�
      * @return 鐢ㄦ埛鐨勬樉绀哄璞★紝濡傛灉鐢ㄦ埛涓嶅瓨鍦ㄥ垯杩斿洖null锛屼笉浼氭姏鍑哄紓甯�
@@ -100,43 +177,14 @@
 	}
 
 	/**
-	 * 涓氬姟鏁版嵁杞崲涓烘樉绀哄璞�
-	 * @param userInfo 骞冲彴杩斿洖鐨勪笟鍔℃暟鎹�
-	 * @return 鐢ㄦ埛鏄剧ず瀵硅薄
-	 */
-	private SmUserVO userInfo2VO(UserInfo userInfo) {
-		SmUserVO smUserVO = new SmUserVO();
-		smUserVO.setOid(userInfo.id);
-		smUserVO.setId(userInfo.userName);
-		smUserVO.setName(userInfo.trueName);
-		smUserVO.setSecretGrade(userInfo.secretGrade);
-		smUserVO.setSecretGradeText(UserSecretEnum.getSecretText(smUserVO.getSecretGrade()));
-		smUserVO.setUserType(String.valueOf(userInfo.userType));
-		smUserVO.setUserTypeText(UserTypeEnum.getTextByValue(smUserVO.getUserType()));
-		smUserVO.setDescription(userInfo.desc);
-		smUserVO.setEmail(userInfo.email);
-		if(userInfo.status == 0){
-			smUserVO.setLockFlag(false);
-		}else{
-			smUserVO.setLockFlag(true);
-		}
-		smUserVO.setCreator(userInfo.createUser);
-		smUserVO.setCreateTime(VciDateUtil.long2Date(userInfo.createTime));
-		smUserVO.setLastModifier(userInfo.updateUser);
-		smUserVO.setLastLoginTime(VciDateUtil.long2Date(userInfo.updateTime));
-		smUserVO.setLastModifyPasswordTime(VciDateUtil.long2Date(userInfo.pwdUpdateTime));
-		return smUserVO;
-	}
-
-	/**
 	 * 浣跨敤瀛楁鑾峰彇鐢ㄦ埛鐨勪俊鎭�
 	 * @param queryField 瀛楁
 	 * @param queryValue 鏌ヨ鍊�
 	 * @return 鐢ㄦ埛鐨勪俊鎭�
 	 * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
 	 */
-	private SmUserVO getUserByField(String queryField,String queryValue) throws VciBaseException{
-		VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(null,SmUserDO.class,null,true);
+	private SmUserVO getUserByField(String queryField, String queryValue) throws VciBaseException{
+		VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(null, SmUserDO.class,null,true);
 		queryWrapper.eq(queryWrapper.getTableNick() + "." +queryField,queryValue);
 		queryWrapper.setDistinct(true);
 		queryWrapper.wrapperSql();
@@ -147,9 +195,9 @@
 				" left join PLUSERPASSWORDSTRATEGY pkUserPassword on  " +queryWrapper.getTableNick() + ".pluid = pkUserPassword.pluseruid " +
 				queryWrapper.getLinkTableSql() + (StringUtils.isNotBlank(queryWrapper.getWhereSql())?(" where " + queryWrapper.getWhereSql()):"");
 		try{
-			String[][] sqlQueryResult = ServiceProvider.getBOFService().getSqlQueryResult(sql + fromSql, null);
+			String[][] sqlQueryResult = platformClientUtil.getBOFService().getSqlQueryResult(sql + fromSql, null);
 			if(sqlQueryResult.length>0){
-				com.vci.client.bof.ClientBusinessObject cbo = arryAndSqlToClientBusinessObject(queryWrapper.getSelectFieldSql(),sqlQueryResult[0]);
+				BusinessObject cbo = arryAndSqlToBusinessObject(queryWrapper.getSelectFieldSql(),sqlQueryResult[0]);
 				return cbo2VO(cbo);
 			}
 		}catch (Exception e){
@@ -177,7 +225,7 @@
 					+ " left join pluserdept up on " + queryWrapper.getTableNick() + ".pluid = up.pluseruid left join pldept pkDepartment on  up.pldeptuid = pkDepartment.pluid " +
 					" left join PLUSERPASSWORDSTRATEGY pkUserPassword on  " +queryWrapper.getTableNick() + ".pluid = pkUserPassword.pluseruid " +
 					queryWrapper.getLinkTableSql() + (StringUtils.isNotBlank(queryWrapper.getWhereSql())?(" where " + queryWrapper.getWhereSql()):"");
-			List<com.vci.client.bof.ClientBusinessObject> dataList = boService.queryBySql(sql + fromSql, null);
+			List<BusinessObject> dataList = boService.queryBySql(sql + fromSql, null);
 			if(!CollectionUtils.isEmpty(dataList)){
 				dataList.stream().forEach(cbo->{
 					userVOList.add(cbo2VO(cbo));
@@ -203,6 +251,7 @@
 			throw new VciBaseException("鑾峰彇鐢ㄦ埛澶辫触锛�"+e.getMessage());
 		}
 	}
+
 	/**
      * 鏍规嵁鐢ㄦ埛涓婚敭鑾峰彇鐢ㄦ埛鐨勪俊鎭�
      * @param userOid 鐢ㄦ埛涓婚敭
@@ -219,6 +268,7 @@
             throw new VciBaseException("鑾峰彇鐢ㄦ埛澶辫触锛�"+e.getMessage());
         }
 	}
+
 	 /**
      * 鎵归噺鑾峰彇鐢ㄦ埛鐨勪俊鎭� 锛堟牴鎹敤鎴蜂富閿級
      * @param userOidCollections 鐢ㄦ埛涓婚敭鐨勯泦鍚堬紝鍙互瓒呰繃1000涓�
@@ -226,8 +276,7 @@
      * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱瀛樺湪闂鐨勬椂鍊欎細鎶涘嚭寮傚父
      */
 	@Override
-	public List<SmUserVO> listUserByUserOids(
-			Collection<String> userOidCollections) throws VciBaseException {
+	public List<SmUserVO> listUserByUserOids(Collection<String> userOidCollections) throws VciBaseException {
 		WebUtil.alertNotNull(userOidCollections,"鐢ㄦ埛涓婚敭闆嗗悎");
         try {
             UserInfo[] userInfoArr = platformClientUtil.getFrameworkService().getUserObjectByoids(VciBaseUtil.collection2StrArr(userOidCollections));
@@ -242,12 +291,91 @@
 	 * @param userInfoArr 涓氬姟鏁版嵁鏁扮粍
 	 * @return 鏄剧ず瀵硅薄闆嗗悎
 	 */
-	private List<SmUserVO> userInfoArr2VO(UserInfo[] userInfoArr) {
+	private List<SmUserVO> userInfoArr2VO(UserInfo[] userInfoArr) throws PLException {
 		List<SmUserVO> userVOList = new ArrayList<>();
 		for(UserInfo userInfo : userInfoArr){
 			userVOList.add(userInfo2VO(userInfo));
 		}
 		return userVOList;
+	}
+
+	/**
+	 * 涓氬姟鏁版嵁杞崲涓烘樉绀哄璞�
+	 * @param userInfo 骞冲彴杩斿洖鐨勪笟鍔℃暟鎹�
+	 * @return 鐢ㄦ埛鏄剧ず瀵硅薄
+	 */
+	private SmUserVO userInfo2VO(UserInfo userInfo) throws PLException {
+		if(Func.isBlank(userInfo.id)){
+			return new SmUserVO();
+		}
+		SmUserVO smUserVO = new SmUserVO();
+		smUserVO.setOid(userInfo.id);
+		smUserVO.setId(userInfo.userName);
+		smUserVO.setName(userInfo.trueName);
+		smUserVO.setSecretGrade(userInfo.secretGrade);
+		smUserVO.setSecretGradeText(UserSecretEnum.getSecretText(userInfo.secretGrade));
+		smUserVO.setUserType(String.valueOf(userInfo.userType));
+		smUserVO.setUserTypeText(UserTypeEnum.getTextByValue(String.valueOf(userInfo.userType)));
+		smUserVO.setDescription(userInfo.desc);
+		smUserVO.setEmail(userInfo.email);
+		smUserVO.setStatus(userInfo.status);
+		smUserVO.setPassword(userInfo.pwd);
+		smUserVO.setConfirmPassword(userInfo.pwd);
+		//鐢ㄦ埛鎵�灞為儴闂ㄧ殑鏌ヨ璁剧疆
+		Map<String,String> orgDepartmentVOList;
+		//鏌ョ湅鍏ㄥ眬鍙橀噺涓槸鍚﹀瓨鍦ㄩ儴闂ㄤ俊鎭紝瀛樺湪鐨勬儏鍐垫渶涓昏鏄拡瀵瑰鏉$敤鎴锋煡璇㈢殑鏃跺�欓伩鍏嶉噸澶嶆煡璇㈢殑
+		if(Func.isNotEmpty(orgDepartmentVOMap)){
+			orgDepartmentVOList = Func.isNotEmpty(orgDepartmentVOMap.get(userInfo.id)) ?
+					orgDepartmentVOMap.get(userInfo.id):new HashMap<>();
+		}else {
+			Map<String, Map<String, String>> tempDeptMap = orgDeptQueryService.batchMapDeptNameByUserOids(Arrays.asList(userInfo.id), null);
+			orgDepartmentVOList = Func.isNotEmpty(tempDeptMap.get(userInfo.id)) ?
+					tempDeptMap.get(userInfo.id):new HashMap<>();
+		}
+		//閮ㄩ棬oid锛屾甯告儏鍐典笅涓�涓敤鎴峰彧浼氬瓨鍦ㄤ竴涓儴闂ㄤ笅
+		smUserVO.setPkDepartment(orgDepartmentVOList.keySet().stream().collect(Collectors.joining(",")));
+		smUserVO.setPkDepartmentName(orgDepartmentVOList.values().stream().collect(Collectors.joining(",")));
+		//瀵嗙爜绛栫暐鏌ヨ璁剧疆
+		SmPasswordStrategyVO smPasswordStrategyVO;
+		if(Func.isNotEmpty(smPwdStrategyVOMap)){
+			smPasswordStrategyVO = smPwdStrategyVOMap.getOrDefault(userInfo.id,new SmPasswordStrategyVO());
+		}else {
+			smPasswordStrategyVO = smPwdStrategyQueryService.getPasswordStrategyVOByUserOid(userInfo.id);
+			//濡傛灉涓嶅瓨鍦ㄥ氨鑾峰彇榛樿鐨�
+			smPasswordStrategyVO = Func.isNotEmpty(smPasswordStrategyVO) ? smPasswordStrategyVO:smPwdStrategyQueryService.getPasswordStrategyVOByDefault();
+		}
+		smUserVO.setPkPasswordStrategy(smPasswordStrategyVO.getOid());
+		smUserVO.setPkPasswordStrategyName(smPasswordStrategyVO.getName());
+		//瑙掕壊鏌ヨ璁剧疆
+		List<SmRoleVO> smRoleVOList;
+		if (Func.isNotEmpty(smRoleVOMap)) {
+			smRoleVOList = smRoleVOMap.get(userInfo.id);
+		}else {
+			smRoleVOList = smRoleQueryService.listRoleByUserOid(userInfo.id,null);
+		}
+		smUserVO.setPkPerson(
+				Func.isEmpty(smRoleVOList) ?
+						null:smRoleVOList.stream().map(SmRoleVO::getOid).collect(Collectors.joining(","))
+		);
+		smUserVO.setPkPersonName(
+				Func.isEmpty(smRoleVOList) ?
+						null:smRoleVOList.stream().map(SmRoleVO::getName).collect(Collectors.joining(","))
+		);
+		//鏄惁閮ㄩ棬棰嗗
+		smUserVO.setIsDeptLeader(userInfo.isDeptLeader.equals("0") ? "涓嶆槸":"鏄�");
+		//涓撲笟
+		smUserVO.setSpecialties(userInfo.specialties);
+		if(userInfo.status == 0){
+			smUserVO.setLockFlag(false);
+		}else{
+			smUserVO.setLockFlag(true);
+		}
+		smUserVO.setCreator(userInfo.createUser);
+		smUserVO.setCreateTime(VciDateUtil.long2Date(userInfo.createTime));
+		smUserVO.setLastModifier(userInfo.updateUser);
+		smUserVO.setLastLoginTime(VciDateUtil.long2Date(userInfo.updateTime));
+		smUserVO.setLastModifyPasswordTime(VciDateUtil.long2Date(userInfo.pwdUpdateTime));
+		return smUserVO;
 	}
 
 	/**
@@ -258,11 +386,20 @@
 	private List<SmUserVO> smUserDO2VOs(List<SmUserDO> userDOS){
 		List<SmUserVO> userVOList = new ArrayList<>();
 		Optional.ofNullable(userDOS).orElseGet(()->new ArrayList<>()).stream().forEach(userDO->{
-			SmUserVO userVO = new SmUserVO();
-			BeanUtil.convert(userDO,userVO);
-			userVOList.add(userVO);
+			userVOList.add(smUserDO2VO(userDO));
 		});
 		return userVOList;
+	}
+
+	/**
+	 * 鐢ㄦ埛鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+	 * @param smUserDO
+	 * @return
+	 */
+	private SmUserVO smUserDO2VO(SmUserDO smUserDO){
+		SmUserVO smUserVO = new SmUserVO();
+		BeanUtil.convert(smUserDO,smUserVO);
+		return smUserVO;
 	}
 
 	/**
@@ -286,7 +423,7 @@
 				+ " left join pluserdept up on " + queryWrapper.getTableNick() + ".pluid = up.pluseruid left join pldept pkDepartment on  up.pldeptuid = pkDepartment.pluid " +
 				" left join PLUSERPASSWORDSTRATEGY pkUserPassword on  " +queryWrapper.getTableNick() + ".pluid = pkUserPassword.pluseruid " + (QUERY_FIELD_ROLE.equalsIgnoreCase(queryField)?roleSql:"") +
 				queryWrapper.getLinkTableSql() + (StringUtils.isNotBlank(queryWrapper.getWhereSql())?(" where " + queryWrapper.getWhereSql()):"");
-		List<com.vci.client.bof.ClientBusinessObject> dataList = boService.queryBySql(sql + fromSql, null);
+		List<BusinessObject> dataList = boService.queryBySql(sql + fromSql, null);
 		if(!CollectionUtils.isEmpty(dataList)){
 			dataList.stream().forEach(cbo->{
 				userVOList.add(cbo2VO(cbo));
@@ -300,7 +437,7 @@
 	 * @param cbo 涓氬姟鏁版嵁
 	 * @return 鏄剧ず瀵硅薄
 	 */
-	private SmUserVO cbo2VO(com.vci.client.bof.ClientBusinessObject cbo){
+	private SmUserVO cbo2VO(BusinessObject cbo){
 		SmUserDO userDO = new SmUserDO();
 		SmUserVO userVO = new SmUserVO();
 		WebUtil.copyValueToObjectFromCbos(cbo,userDO);
@@ -323,9 +460,9 @@
 	 * @return 鐢ㄦ埛鐨勬樉绀哄璞$殑鍒楄〃
 	 */
 	private DataGrid<SmUserVO> gridUserByQueryField(String queryField,String queryValue, Map<String, String> queryMap, PageHelper pageHelper,boolean notIn){
-		if(StringUtils.isBlank(queryValue)){
+		/*if(StringUtils.isBlank(queryValue)){
 			return new DataGrid<>();
-		}
+		}*/
 		PageHelper newPageHelper = new PageHelper(-1);
 		newPageHelper.setSort(pageHelper.getSort());
 		newPageHelper.setOrder(pageHelper.getOrder());
@@ -354,7 +491,7 @@
 				}
 			}
 		}
-		List<com.vci.client.bof.ClientBusinessObject> dataList = boService.queryBySql((isPage?("select " + pageSelectList.stream().collect(Collectors.joining(","))+ " from (select A.*,rownum RN from ( "):"") + sql + fromSql + (isPage?pageSubfix:""), null);
+		List<BusinessObject> dataList = boService.queryBySql((isPage?("select " + pageSelectList.stream().collect(Collectors.joining(","))+ " from (select A.*,rownum RN from ( "):"") + sql + fromSql + (isPage?pageSubfix:""), null);
 		if(!CollectionUtils.isEmpty(dataList)){
 			dataList.stream().forEach(cbo->{
 				userVOList.add(cbo2VO(cbo));
@@ -368,17 +505,50 @@
 		}
 		return dataGrid;
 	}
+
 	/**
-     * 鑾峰彇鐢ㄦ埛鐨勫垪琛紝榛樿浼氫互鐢ㄦ埛鍚嶅崌搴忔帓鍒楋紝鐢ㄦ埛鐨勭紪杈戦〉闈㈠垪琛ㄤ笉瑕佷娇鐢ㄨ繖涓帴鍙�
-     * @param queryMap 鏌ヨ鏉′欢
-     * @param pageHelper 鍒嗛〉鍜屾帓搴忕殑淇℃伅锛屽湪鍏煎鑰佸钩鍙扮殑鏃跺�欎細鑷姩鍏煎锛屽鏋滃睘鎬т笉瀛樺湪浼氳嚜鍔ㄥ拷鐣�
-     * @return 鐢ㄦ埛鐨勬樉绀哄璞″垪琛�
-     * @throws VciBaseException 鍙傛暟涓虹┖鐨勬椂鍊欎細鎶涘嚭寮傚父
-     */
+	 * 鐢ㄦ埛绠$悊鐣岄潰鍒嗛〉鏌ヨ
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param pageHelper 鍒嗛〉鍙傛暟
+	 * @return
+	 */
 	@Override
-	public DataGrid<SmUserVO> gridUsers(Map<String, String> queryMap,
-										PageHelper pageHelper) throws VciBaseException {
-		return gridUserByQueryField(null,null,queryMap,pageHelper,false);
+	public DataGrid<SmUserVO> getDataGridUsers(Map<String, String> conditionMap, PageHelper pageHelper) throws PLException {
+		if(pageHelper == null){
+			pageHelper = new PageHelper(-1);
+		}
+		pageHelper.addDefaultAsc("PLTRUENAME");
+		String loginUserId = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
+		//String loginUserId = "Ludc";
+		//鍒嗛〉鏌ヨ
+		UserInfo[] userInfos = platformClientUtil.getFrameworkService().fetchUserInfoByCondition(
+				conditionMap.get("name"),
+				conditionMap.get("id"),
+				conditionMap.get("pkDepartment"),
+				conditionMap.get("pkPerson"),
+				loginUserId,  //褰撳墠鐧诲綍鐨勭敤鎴峰悕
+				pageHelper.getPage(),
+				pageHelper.getLimit()
+		);
+		DataGrid<SmUserVO> dataGrid = new DataGrid<>();
+		if(Func.isNotEmpty(userInfos)){
+			List<String> idList = Arrays.stream(userInfos).map(item -> item.id).collect(Collectors.toList());
+			orgDepartmentVOMap = orgDeptQueryService.batchMapDeptNameByUserOids(idList, null);
+			smRoleVOMap = smRoleQueryService.batchListRoleByUserOids(idList,null);
+			smPwdStrategyVOMap = smPwdStrategyQueryService.batchSmPwdStrategyByUserOids(idList);
+			dataGrid.setData(userInfoArr2VO(userInfos));
+			//TODO: 杩欎釜缁熻鎬绘暟鏈夐棶棰橈紝甯﹁繃鍘荤殑鍙傛暟涓嶈兘鍍忎笂闈㈤偅涓猣etchUserInfoByCondition鏌ヨ涓�鏍风粺璁″鍗寸殑鎬绘暟
+			dataGrid.setTotal(
+					platformClientUtil.getFrameworkService().getUserTotalByCondition(
+						conditionMap.get("name"),
+						conditionMap.get("id"),
+						conditionMap.get("pkDepartment"),
+						conditionMap.get("pkPerson"),
+						loginUserId  //褰撳墠鐧诲綍鐨勭敤鎴峰悕
+					)
+			);
+		}
+		return dataGrid;
 	}
 
 	/**
@@ -412,6 +582,7 @@
 		SmUserVO userVO = getUserByUserId(userId);
 		return userVO == null?"":userVO.getName();
 	}
+
 	 /**
      * 鏍规嵁鐢ㄦ埛涓婚敭鑾峰彇鐢ㄦ埛鐨勫鍚�
      * @param userOid 鐢ㄦ埛涓婚敭
@@ -423,26 +594,128 @@
 		return userVO.getName();
 	}
 
-
+	/**
+	 * 缁熻閮ㄩ棬涓嬬殑鐢ㄦ埛锛氬寘鍚瓙閮ㄩ棬涓嬬殑鐢ㄦ埛
+	 * @param deptOid
+	 * @param queryMap
+	 * @return
+	 * @throws VciBaseException
+	 */
+	@Override
+	public List<SmUserVO> countSmUserByDeptOid(String deptOid, Map<String, String> queryMap) throws VciBaseException {
+		//鏄惁鏌ヨ瀛愰儴闂ㄤ笅鍏宠仈鐨勭敤鎴�
+		List<OrgDepartmentVO> orgDepartmentVOList = orgDeptQueryService.listAllLevelChildrenDeptByParentOid(deptOid, null);
+		List<String> deptOidCollection = orgDepartmentVOList.stream().map(OrgDepartmentVO::getOid).collect(Collectors.toList());
+		deptOidCollection.add(deptOid);//灏嗗綋鍓嶅眰鐨刼id涔熸斁杩涘幓
+		List<SmUserVO> smUserVOList = listUserVOByDeptOid(queryMap, deptOidCollection, false);
+		if(Func.isEmpty(smUserVOList)){
+			return new ArrayList<>();
+		}
+		Map<String, List<SmRoleVO>> smRoleVOMap = smRoleQueryService.batchListRoleByUserOids(smUserVOList.stream().map(SmUserVO::getOid).collect(Collectors.toSet()), null);
+		smUserVOList = smUserVOList.stream().map(vo->{
+			List<SmRoleVO> smRoleVOS = smRoleVOMap.get(vo.getOid());
+			vo.setPkPerson(
+					Func.isEmpty(smRoleVOS) ?
+							null:smRoleVOS.stream().map(SmRoleVO::getOid).collect(Collectors.joining(","))
+			);
+			vo.setPkPersonName(
+					Func.isEmpty(smRoleVOS) ?
+							null:smRoleVOS.stream().map(SmRoleVO::getName).collect(Collectors.joining(","))
+			);
+			return vo;
+		}).collect(Collectors.toList());
+		return smUserVOList;
+	}
 
 	 /**
-     * 鏌ヨ鏌愪釜閮ㄩ棬涓嬬殑鐢ㄦ埛瀵硅薄
+     * 鏌ヨ鍦ㄦ煇涓儴闂ㄤ笅鐨勭敤鎴峰璞�
      * @param deptOid 閮ㄩ棬鐨勪富閿�
      * @param queryMap 鏌ヨ鏉′欢锛屽鏋滄槸閮ㄩ棬鐨勬煇涓睘鎬т綔涓烘煡璇㈡潯浠讹紝鍒欏彲浠ヤ娇鐢╬kDepartment.xxx杩欐牱鐨勬柟寮�
      * @return 鐢ㄦ埛鐨勬樉绀哄璞″垪琛�
      * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
      */
 	@Override
-	public List<SmUserVO> listUserByDeptOid(String deptOid,
-			Map<String, String> queryMap) throws VciBaseException {
-		if(StringUtils.isBlank(deptOid)){
-			return new ArrayList<>();
-		}
-		return listUserByQueryField(QUERY_FIELD_DEPARTMENT,deptOid,queryMap,false);
+	public List<SmUserVO> listUserByDeptOid(String deptOid, Map<String, String> queryMap) throws VciBaseException {
+		//鏌ヨ褰撳墠閫変腑鐨勯儴闂ㄤ笅鐨勭敤鎴�
+		return listUserVOByDeptOid(queryMap,Arrays.asList(deptOid),false );
 	}
 
 	/**
-	 * 鑾峰彇
+	 * 鏌ヨ涓嶅湪鏌愪釜閮ㄩ棬涓嬬殑鐢ㄦ埛瀵硅薄鍒楄〃
+	 * @param deptOid 閮ㄩ棬鐨勪富閿�
+	 * @param queryMap 鏌ヨ鏉′欢锛屽鏋滄槸閮ㄩ棬鐨勬煇涓睘鎬т綔涓烘煡璇㈡潯浠讹紝鍒欏彲浠ヤ娇鐢╬kDepartment.xxx杩欐牱鐨勬柟寮�
+	 * @return 鐢ㄦ埛鐨勬樉绀哄璞″垪琛紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public List<SmUserVO> listUserUnInDeptOid(String deptOid, Map<String, String> queryMap) throws VciBaseException {
+		// TODO:鏍规嵁褰撳墠鐧诲綍鐨勭敤鎴峰喅瀹氳兘鏌ラ偅浜涚敤鎴�
+		String userType = "0";//WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUsertype();
+		//鏍规嵁褰撳墠鐧诲綍鐨勭敤鎴风被鍨嬩笉鍚岋紝鏌ヨ涓嶅悓鐨勭敤鎴�
+		if(UserTypeEnum.SUPPER_ADMIN.getValue().equals(userType)){
+			//瓒呯鐢ㄦ埛鍙兘鏌ョ鐞嗗憳鐢ㄦ埛
+			queryMap.put("plusertype", "1");
+		}else{
+			//闄や簡瓒呯閮藉彧鑳芥煡鏅�氱敤鎴�
+			queryMap.put("plusertype", "2");
+		}
+		return listUserVOByDeptOid(queryMap,Arrays.asList(deptOid),true);
+	}
+
+	/**
+	 * 鐢ㄦ埛鏍规嵁閮ㄩ棬鏌ヨ鐨勭粺涓�鏂规硶
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param deptOidList 閮ㄩ棬涓婚敭
+	 * @param notIn true寰呴�夛紝false宸查��
+	 * @return
+	 */
+	private List<SmUserVO> listUserVOByDeptOid(Map<String,String> conditionMap/*鏀剧疆鏌ヨ鏉′欢*/,List<String> deptOidList,boolean notIn){
+		//鍏堟煡璇㈠凡閫変汉鍛榦id
+		List<String> userOidList = new ArrayList<>();
+		WebUtil.switchCollectionForOracleIn(deptOidList).stream().forEach(deptOids->{
+			String sql = "select pluseruid,pldeptuid from pluserdept where pldeptuid in (" + WebUtil.toInSql(deptOids.toArray(new String[0])) + ")";
+			List<BusinessObject> cbos = boService.queryBySql(sql, null);
+			//閬嶅巻鍑虹敤鎴蜂富閿�
+			cbos.stream().forEach(cbo->{
+				userOidList.add(ObjectTool.getNewBOAttributeValue(cbo,"pluseruid"));
+			});
+		});
+		//鏍规嵁鐢ㄦ埛oid鏌ヨ鐢ㄦ埛
+		VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(conditionMap, SmUserDO.class);
+		//娣诲姞杩炶〃鏌ヨ鏉′欢
+		queryWrapperForDO.setLinkTableSql(" left join pluserdept up on " + queryWrapperForDO.getTableNick() + ".pluid = up.pluseruid" +
+				" left join pldept pkDepartment on  up.pldeptuid = pkDepartment.pluid " +
+				" left join PLUSERPASSWORDSTRATEGY pkUserPassword on  " +queryWrapperForDO.getTableNick() + ".pluid = pkUserPassword.pluseruid ");
+		queryWrapperForDO.setOrderSql("order by " + queryWrapperForDO.getTableNick() + ".pltrueName");
+		List<SmUserDO> smUserDOList = new ArrayList<>();
+		//userOidList涓虹┖鏃剁殑涓ょ鎯呭喌
+		if(Func.isEmpty(userOidList)){
+			//濡傛灉鏄凡閫夋煡璇㈣鏄庡凡閫変负绌虹洿鎺ヨ繑鍥炵┖
+			if(!notIn){
+				return new ArrayList<>();
+			}
+			//涓嶆槸宸查�夋煡璇㈣鏄庡緟閫変负绌猴紝鐩存帴鏌ヨ鐢ㄦ埛
+			smUserDOList.addAll(boService.selectByQueryWrapper(queryWrapperForDO, SmUserDO.class));
+		}else{
+			//宸查�夋煡璇紝鎴栧緟閫夋煡璇紝浣嗘槸璇ラ儴闂ㄥ瓨鍦ㄧ浉鍏抽厤缃�
+			WebUtil.switchCollectionForOracleIn(userOidList).stream().forEach(userOids->{
+				//鏌ヨ涓嶅湪鑼冨洿鍐呯殑锛氬緟閫変汉鍛�
+				if(notIn){
+					queryWrapperForDO.notIn(queryWrapperForDO.getTableNick()+".pluid",WebUtil.toInSql(userOids.toArray(new String[0])));
+
+				}else{
+					//宸查�変汉鍛樺拰缁熻
+					queryWrapperForDO.in(queryWrapperForDO.getTableNick()+".pluid",WebUtil.toInSql(userOids.toArray(new String[0])));
+				}
+				smUserDOList.addAll(boService.selectByQueryWrapper(queryWrapperForDO, SmUserDO.class));
+			});
+		}
+		return smUserDO2VOs(smUserDOList);
+	}
+
+	/**
+	 * 鑾峰彇鏌ヨ灏佽鍣紝榛樿鍙煡浜唒lstatus=0鍜宲lusertype=2锛堟敼鎴愭牴鎹綋鍓嶇櫥褰曠殑鐢ㄦ埛鏉ュ喅瀹氭煡浠�涔堢被鍨嬬殑鐢ㄦ埛锛夛紝
+	 * 鎺掑簭榛樿plusername
 	 * @param queryField 鏌ヨ灞炴��
 	 * @param queryValue 鏌ヨ鐨勫��
 	 * @param queryMap  鏌ヨ鏉′欢锛屽鏋滄槸瑙掕壊鐨勫睘鎬э紝闇�瑕佷娇鐢╬krole.xxx
@@ -473,24 +746,19 @@
 		}
 		addRoleQuerySql(queryMap,queryWrapperForDO);
 		queryWrapperForDO.eq("plstatus", "0");
-		queryWrapperForDO.eq("plusertype", "2");
-		queryWrapperForDO.setDistinct(true);
+		// TODO:鏍规嵁褰撳墠鐧诲綍鐨勭敤鎴峰喅瀹氳兘鏌ラ偅浜涚敤鎴�
+		SessionInfo loginUser = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
+		//鏍规嵁褰撳墠鐧诲綍鐨勭敤鎴风被鍨嬩笉鍚岋紝鏌ヨ涓嶅悓鐨勭敤鎴�
+		if(UserTypeEnum.SUPPER_ADMIN.getValue().equals(loginUser.getUsertype())){
+			//瓒呯鐢ㄦ埛鍙兘鏌ョ鐞嗗憳鐢ㄦ埛
+			queryMap.put("plusertype", "1");
+		}else{
+			//闄や簡瓒呯閮藉彧鑳芥煡鏅�氱敤鎴�
+			queryMap.put("plusertype", "2");
+		}
 		return queryWrapperForDO;
 	}
-	/**
-     * 鏌ヨ鏌愪釜閮ㄩ棬涓嬬殑鐢ㄦ埛瀵硅薄鍒楄〃
-     * @param deptOid 閮ㄩ棬鐨勪富閿�
-     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滄槸閮ㄩ棬鐨勬煇涓睘鎬т綔涓烘煡璇㈡潯浠讹紝鍒欏彲浠ヤ娇鐢╬kDepartment.xxx杩欐牱鐨勬柟寮�
-     * @param pageHelper 鍒嗛〉鍜屾帓搴忎俊鎭紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
-     * @return 鐢ㄦ埛鐨勬樉绀哄璞″垪琛紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
-     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
-     */
-	@Override
-	public DataGrid<SmUserVO> gridUserByDeptOid(String deptOid,
-			Map<String, String> queryMap, PageHelper pageHelper)
-			throws VciBaseException {
-		return gridUserByQueryField(QUERY_FIELD_DEPARTMENT,deptOid,queryMap,pageHelper,false);
-	}
+
 	 /**
      * 鎵归噺鏍规嵁閮ㄩ棬鐨勪富閿幏鍙栫敤鎴�
      * @param deptOidCollection 閮ㄩ棬鐨勪富閿泦鍚�
@@ -509,36 +777,8 @@
 		}
 		return new HashMap<>();
 	}
+
 	/**
-     * 鏌ヨ涓嶅湪鏌愪釜閮ㄩ棬涓嬬殑鐢ㄦ埛瀵硅薄鍒楄〃
-     * @param deptOid 閮ㄩ棬鐨勪富閿�
-     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滄槸閮ㄩ棬鐨勬煇涓睘鎬т綔涓烘煡璇㈡潯浠讹紝鍒欏彲浠ヤ娇鐢╬kDepartment.xxx杩欐牱鐨勬柟寮�
-     * @return 鐢ㄦ埛鐨勬樉绀哄璞″垪琛紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
-     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
-     */
-	@Override
-	public List<SmUserVO> listUserUnInDeptOid(String deptOid,
-			Map<String, String> queryMap) throws VciBaseException {
-		if(StringUtils.isBlank(deptOid)){
-			return new ArrayList<>();
-		}
-		return listUserByQueryField(QUERY_FIELD_DEPARTMENT,deptOid,queryMap,true);
-	}
-	/**
-     * 鏌ヨ涓嶅湪鏌愪釜閮ㄩ棬涓嬬殑鐢ㄦ埛瀵硅薄鍒楄〃
-     * @param deptOid 閮ㄩ棬鐨勪富閿�
-     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滄槸閮ㄩ棬鐨勬煇涓睘鎬т綔涓烘煡璇㈡潯浠讹紝鍒欏彲浠ヤ娇鐢╬kDepartment.xxx杩欐牱鐨勬柟寮�
-     * @param pageHelper 鍒嗛〉鍜屾帓搴忎俊鎭紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
-     * @return 鐢ㄦ埛鐨勬樉绀哄璞″垪琛紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
-     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
-     */
-	@Override
-	public DataGrid<SmUserVO> gridUserUnInDeptOid(String deptOid,
-			Map<String, String> queryMap, PageHelper pageHelper)
-			throws VciBaseException {
-		return gridUserByQueryField(QUERY_FIELD_DEPARTMENT,deptOid,queryMap,pageHelper,true);
-	}
-	 /**
      * 鏌ヨ鏌愪釜瑙掕壊涓嬬殑鐢ㄦ埛瀵硅薄
      * @param roleOid 瑙掕壊鐨勪富閿�
      * @param queryMap 鏌ヨ鏉′欢锛屽鏋滄槸瑙掕壊鐨勬煇涓睘鎬т綔涓烘煡璇㈡潯浠讹紝鍒欏彲浠ヤ娇鐢╬kRole.xxx杩欐牱鐨勬柟寮�
@@ -548,26 +788,9 @@
 	@Override
 	public List<SmUserVO> listUserByRoleOid(String roleOid,
 			Map<String, String> queryMap) throws VciBaseException {
-		if(StringUtils.isBlank(roleOid)){
-			return new ArrayList<>();
-		}
-		return listUserByQueryField(QUERY_FIELD_ROLE,roleOid,queryMap,false);
+		return listUserVOByRoleOid(queryMap,roleOid,false);
+	}
 
-	}
-	/**
-     * 鏌ヨ鏌愪釜瑙掕壊涓嬬殑鐢ㄦ埛瀵硅薄鍒楄〃
-     * @param roleOid 瑙掕壊鐨勪富閿�
-     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滄槸瑙掕壊鐨勬煇涓睘鎬т綔涓烘煡璇㈡潯浠讹紝鍒欏彲浠ヤ娇鐢╬kRole.xxx杩欐牱鐨勬柟寮�
-     * @param pageHelper 鍒嗛〉鍜屾帓搴忎俊鎭紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
-     * @return 鐢ㄦ埛鐨勬樉绀哄璞″垪琛紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
-     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
-     */
-	@Override
-	public DataGrid<SmUserVO> gridUserByRoleOid(String roleOid,
-			Map<String, String> queryMap, PageHelper pageHelper)
-			throws VciBaseException {
-		return gridUserByQueryField(QUERY_FIELD_ROLE,roleOid,queryMap,pageHelper,false);
-	}
 	/**
      * 鏌ヨ涓嶅湪鏌愪釜瑙掕壊涓嬬殑鐢ㄦ埛瀵硅薄鍒楄〃
      * @param roleOid 瑙掕壊鐨勪富閿�
@@ -578,25 +801,56 @@
 	@Override
 	public List<SmUserVO> listUserUnInRoleOid(String roleOid,
 			Map<String, String> queryMap) throws VciBaseException {
-		if(StringUtils.isBlank(roleOid)){
+		// TODO:鏍规嵁褰撳墠鐧诲綍鐨勭敤鎴峰喅瀹氳兘鏌ラ偅浜涚敤鎴�
+		String usertype = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUsertype();
+		//鏍规嵁褰撳墠鐧诲綍鐨勭敤鎴风被鍨嬩笉鍚岋紝鏌ヨ涓嶅悓鐨勭敤鎴�
+		if(UserTypeEnum.SUPPER_ADMIN.getValue().equals(usertype)){
+			//瓒呯鐢ㄦ埛鍙兘鏌ョ鐞嗗憳鐢ㄦ埛
+			queryMap.put("plusertype", "1");
+		}else{
+			//闄や簡瓒呯閮藉彧鑳芥煡鏅�氱敤鎴�
+			queryMap.put("plusertype", "2");
+		}
+		return listUserVOByRoleOid(queryMap,roleOid,true);
+	}
+
+	/**
+	 * 鐢ㄦ埛鏍规嵁瑙掕壊鏌ヨ鐨勭粺涓�鏂规硶
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param roleOid 瑙掕壊涓婚敭
+	 * @param notIn true涓嶅湪鑼冨洿鍐咃紝false鍐嶈寖鍥村唴
+	 * @return
+	 */
+	private List<SmUserVO> listUserVOByRoleOid(Map<String,String> conditionMap,String roleOid,boolean notIn){
+		//listUserByQueryField杩欎釜鏂规硶鏆傛椂涓嶈兘婊¤冻鎴戠幇鍦ㄧ殑鏌ヨ闇�姹傦紝骞朵笖寮曠敤鐨勫湴鏂硅緝澶氾紝鎵�浠ヤ笉澶ソ鏀瑰姩
+		//1銆佸厛鏌ヨ涓庡綋鍓嶈鑹插瓨鍦ㄥ叧鑱斿叧绯荤殑鐢ㄦ埛
+		String sql = "select pluseruid,plroleuid from pluserrole where plroleuid = '" + roleOid +"'";
+		List<BusinessObject> cbos = boService.queryBySql(sql, null);
+		List<String> userOidList = new ArrayList<>();
+		if(CollectionUtils.isEmpty(cbos)){
 			return new ArrayList<>();
 		}
-		return listUserByQueryField(QUERY_FIELD_ROLE,roleOid,queryMap,true);
+		//閬嶅巻鍑虹敤鎴蜂富閿�
+		cbos.stream().forEach(cbo->{
+			userOidList.add(ObjectTool.getNewBOAttributeValue(cbo,"pluseruid"));
+		});
+		//2銆佸啀鏌ヨ鐢ㄦ埛
+		VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(conditionMap, SmUserDO.class);
+		List<SmUserDO> smUserDOS = new ArrayList<>();
+		queryWrapperForDO.setLinkTableSql(" left join pluserdept up on " + queryWrapperForDO.getTableNick() + ".pluid = up.pluseruid" +
+				" left join pldept pkDepartment on  up.pldeptuid = pkDepartment.pluid " +
+				" left join PLUSERPASSWORDSTRATEGY pkUserPassword on  " +queryWrapperForDO.getTableNick() + ".pluid = pkUserPassword.pluseruid ");
+		WebUtil.switchCollectionForOracleIn(userOidList).stream().forEach(userOids->{
+			if(notIn){
+				queryWrapperForDO.notIn("pluid",WebUtil.toInSql(userOids.toArray(new String[0])));
+			}else{
+				queryWrapperForDO.in("pluid",WebUtil.toInSql(userOids.toArray(new String[0])));
+			}
+			smUserDOS.addAll(boService.selectByQueryWrapper(queryWrapperForDO, SmUserDO.class));
+		});
+		return smUserDO2VOs(smUserDOS);
 	}
-	 /**
-     * 鏌ヨ涓嶅湪鏌愪釜瑙掕壊涓嬬殑鐢ㄦ埛瀵硅薄鍒楄〃
-     * @param roleOid 瑙掕壊鐨勪富閿�
-     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滄槸瑙掕壊鐨勬煇涓睘鎬т綔涓烘煡璇㈡潯浠讹紝鍒欏彲浠ヤ娇鐢╬kRole.xxx杩欐牱鐨勬柟寮�
-     * @param pageHelper 鍒嗛〉鍜屾帓搴忎俊鎭紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
-     * @return 鐢ㄦ埛鐨勬樉绀哄璞″垪琛紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
-     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
-     */
-	@Override
-	public DataGrid<SmUserVO> gridUserUnInRoleOid(String roleOid,
-			Map<String, String> queryMap, PageHelper pageHelper)
-			throws VciBaseException {
-		return gridUserByQueryField(QUERY_FIELD_ROLE,roleOid,queryMap,pageHelper,true);
-	}
+
 	/**
      * 鎵归噺鏍规嵁瑙掕壊鐨勪富閿幏鍙栫敤鎴�
      * @param roleOidCollection 瑙掕壊鐨勪富閿泦鍚�
@@ -654,6 +908,7 @@
 			PageHelper pageHelper) throws VciBaseException {
 		return gridUserByQueryField(null,null,queryMap,pageHelper,false);
 	}
+
 	/**
      * 鍙傜収鐢ㄦ埛鐨勬爲褰㈡樉绀�
      * @param treeQueryObject 鏍戝瀷鎺ュ彛鏌ヨ瀵硅薄
@@ -670,13 +925,13 @@
 				+ " left join pluserdept up on " + queryWrapper.getTableNick() + ".pluid = up.pluseruid left join pldept pkDepartment on  up.pldeptuid = pkDepartment.pluid " +
 				" left join PLUSERPASSWORDSTRATEGY pkUserPassword on  " +queryWrapper.getTableNick() + ".pluid = pkUserPassword.pluseruid " +
 				queryWrapper.getLinkTableSql() + (StringUtils.isNotBlank(queryWrapper.getWhereSql())?(" where " + queryWrapper.getWhereSql()):"");
-		List<com.vci.client.bof.ClientBusinessObject> dataList = boService.queryBySql(sql + fromSql, null);
+		List<BusinessObject> dataList = boService.queryBySql(sql + fromSql, null);
 		List<Tree> treeList = new ArrayList<>();
 		if(!CollectionUtils.isEmpty(dataList)){
 			dataList.stream().forEach(cbo->{
 				Tree tree = new Tree();
-				tree.setOid(cbo.getOid());
-				tree.setText(cbo.getId() + " " + cbo.getName());
+				tree.setOid(cbo.oid);
+				tree.setText(cbo.id + " " + cbo.name);
 				Map<String,String> attributeMap = new HashMap<>();
 				WebUtil.copyValueToCboFromMap(cbo,attributeMap);
 				tree.setAttributes(attributeMap);
@@ -686,6 +941,7 @@
 		}
 		return treeList;
 	}
+
 	 /**
      * 鏍¢獙瀵嗙爜鏄惁鐩稿悓锛屽湪鏂板钩鍙颁腑瀛樺偍鐨勫瘑鐮佹槸涓ゆmd5
      * @param userOid 鐢ㄦ埛涓婚敭
@@ -700,19 +956,20 @@
 		String sql = " select plpassword from pluser where pluid = :userOid";
 		Map<String,String> conditionMap = new HashMap<>();
 		conditionMap.put("userOid",userOid.trim());
-		List<com.vci.client.bof.ClientBusinessObject> clientBusinessObjectList = boService.queryBySql(sql, conditionMap);
-		if(CollectionUtils.isEmpty(clientBusinessObjectList)){
+		List<BusinessObject> BusinessObjectList = boService.queryBySql(sql, conditionMap);
+		if(CollectionUtils.isEmpty(BusinessObjectList)){
 			return  false;
 		}
 
 		ThreeDES des = new ThreeDES();// 瀹炰緥鍖栦竴涓锟�?
 		des.getKey("daliantan0v0");// 鐢熸垚瀵嗗寵
 		md5Password = des.getEncString(md5Password);
-		if(md5Password.equals(clientBusinessObjectList.get(0).getAttributeValue("plpassword"))){
+		if(md5Password.equals(ObjectTool.getNewBOAttributeValue(BusinessObjectList.get(0),"plpassword"))){
 			return true;
 		}
 		return false;
 	}
+
 	/**
      * 鏍¢獙鐢ㄦ埛鏄惁閿佸畾
      * @param smUserVO 鐢ㄦ埛瀵硅薄
@@ -725,7 +982,9 @@
 			return smUserVO.isLockFlag();
 		}
 		//鏌ヨ瀵嗙爜绛栫暐
-		SmPasswordStrategyVO passwordStrategyVO = getPasswordStrategyVOByOid(smUserVO.getPkPasswordStrategy());
+		SmPasswordStrategyVO passwordStrategyVO = smPwdStrategyQueryService.getPasswordStrategyVOByOid(
+				smUserVO.getPkPasswordStrategy()
+		);
 		if(passwordStrategyVO == null){
 			throw new VciBaseException("绯荤粺閲屾病鏈夊瘑鐮佸畨鍏ㄧ瓥鐣�");
 		}
@@ -733,58 +992,6 @@
 			return  true;
 		}
 		return false;
-	}
-
-	/**
-	 * 浣跨敤涓婚敭鑾峰彇瀵嗙爜绛栫暐
-	 * @param oid 涓婚敭
-	 * @return 瀵嗙爜绛栫暐鏄剧ず瀵硅薄
-	 */
-	public SmPasswordStrategyVO getPasswordStrategyVOByOid(String oid){
-		VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(null, SmPasswordStrategyDO.class);
-		queryWrapperForDO.eq("oid",oid.trim());
-		List<com.vci.client.bof.ClientBusinessObject> cboList = boService.queryBySql(queryWrapperForDO.getSelectFieldSql() + " from plpasswordstrategy " +
-				queryWrapperForDO.getTableNick() + queryWrapperForDO.getLinkTableSql() +
-				(StringUtils.isBlank(queryWrapperForDO.getWhereSql()) ? "" : (" where " + queryWrapperForDO.getWhereSql())), null);
-		if(!CollectionUtils.isEmpty(cboList)){
-			SmPasswordStrategyDO passwordStrategyDO = new SmPasswordStrategyDO();
-			WebUtil.copyValueToObjectFromCbos(cboList.get(0),passwordStrategyDO);
-			SmPasswordStrategyVO passwordStrategyVO = new SmPasswordStrategyVO();
-			BeanUtil.convert(passwordStrategyDO,passwordStrategyVO);
-			return passwordStrategyVO;
-		}else{
-			//鑾峰彇榛樿鐨�
-			queryWrapperForDO = new VciQueryWrapperForDO(null, SmPasswordStrategyDO.class);
-			queryWrapperForDO.eq("plisdefault","1");
-			cboList = boService.queryBySql(queryWrapperForDO.getSelectFieldSql() + " from plpasswordstrategy " +
-					queryWrapperForDO.getTableNick() + queryWrapperForDO.getLinkTableSql() +
-					(StringUtils.isBlank(queryWrapperForDO.getWhereSql()) ? "" : (" where " + queryWrapperForDO.getWhereSql())), null);
-			if(!CollectionUtils.isEmpty(cboList)){
-				SmPasswordStrategyDO passwordStrategyDO = new SmPasswordStrategyDO();
-				WebUtil.copyValueToObjectFromCbos(cboList.get(0),passwordStrategyDO);
-				SmPasswordStrategyVO passwordStrategyVO = new SmPasswordStrategyVO();
-				BeanUtil.convert(passwordStrategyDO,passwordStrategyVO);
-				return passwordStrategyVO;
-			}
-		}
-		return null;
-	}
-
-    /**
-     * 鏍规嵁鐢ㄦ埛鐨勪富閿紝鑾峰彇鐢ㄦ埛鐨勫瘑鐮佸畨鍏ㄧ瓥鐣�
-     * @param userOid 鐢ㄦ埛鐨勪富閿�
-     * @return 瀵嗙爜瀹夊叏绛栫暐鐨勬樉绀哄璞★紝濡傛灉涓嶅瓨鍦ㄥ垯浼氳繑鍥濶ull
-     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
-     */
-	@Override
-	public SmPasswordStrategyVO getPasswordStrategyVOByUserOid(String userOid)
-			throws VciBaseException {
-		WebUtil.alertNotNull(userOid,"鐢ㄦ埛鐨勪富閿�");
-		SmUserVO userVO = getUserByUserOid(userOid);
-		if(userVO == null || StringUtils.isBlank(userVO.getOid())){
-			throw new VciBaseException(DATA_OID_NOT_EXIST);
-		}
-		return getPasswordStrategyVOByOid(userVO.getPkPasswordStrategy());
 	}
 
     /**
@@ -795,6 +1002,7 @@
 	public void lockUser(String userId) {
 		//鑰佺殑杩欎釜骞冲彴锛屾槸渚濋潬閿佸畾娆℃暟鏉ュ垽鏂殑锛屾墍浠ヨ繖閲屾病鍔炴硶鐩存帴璁剧疆
 	}
+
 	 /**
      * 璁剧疆鏌愪釜鐢ㄦ埛涓嶆槸閿佸畾鐘舵��
      * @param userId 鐢ㄦ埛鍚�
@@ -809,29 +1017,61 @@
 			throw WebUtil.getVciBaseException(vciError);
 		}
 	}
+
 	 /**
      * 淇敼瀵嗙爜
      * @param userOid 鐢ㄦ埛涓婚敭
+     * @param oldPassword 鏃х殑瀵嗙爜
      * @param password 鏂扮殑瀵嗙爜
      * @param confirmPassword 纭瀵嗙爜
      */
 	@Override
-	public void changePassword(String userOid, String password,
-			String confirmPassword) throws VciBaseException {
-		WebUtil.alertNotNull(userOid,"鐢ㄦ埛涓婚敭",password,"瀵嗙爜",confirmPassword,"纭瀵嗙爜");
+	@Transactional(rollbackFor = Exception.class)
+	public boolean changePassword(String userOid,String oldPassword, String password,
+			String confirmPassword) throws Exception {
+		WebUtil.alertNotNull(userOid,"鐢ㄦ埛涓婚敭",oldPassword,"鐧诲綍瀵嗙爜",password,"瀵嗙爜",confirmPassword,"纭瀵嗙爜");
 		if(!password.equals(confirmPassword)){
 			throw new VciBaseException("瀵嗙爜鍜岀‘璁ゅ瘑鐮佷笉鐩哥瓑");
 		}
+		//瀵规棫瀵嗙爜鍜屽瘑鐮佽繘琛岃В瀵嗭紝渚夸簬姣斿瀵嗙爜鐢�
+		oldPassword = Func.decryptAes(oldPassword,"daliantan0v0vcip");
+		password = Func.decryptAes(password,"daliantan0v0vcip");
+		//瀵规瘮鏃у瘑鐮�
+		boolean b = this.checkPasswordEqual(oldPassword, userOid);
+		if(!b){
+			throw new PLException("500", new String[] { "鎮ㄨ緭鍏ョ殑瀵嗙爜涓庣櫥褰曞瘑鐮佷笉涓�鑷�,璇烽噸鏂拌緭鍏�!"});
+		}
+		SmUserVO smUserVO = getUserByUserOid(userOid);
+		if(Func.isEmpty(smUserVO)){
+			throw new VciBaseException("褰撳墠淇敼鐨勭敤鎴蜂笉瀛樺湪锛�");
+		}
+		//TODO:鏍¢獙瀵嗙爜鏄惁绗﹀悎绛栫暐
+		String error = platformClientUtil.getFrameworkService().checkPasswordStrategyByUserId(smUserVO.getId(), password,null);
+		if (!StringUtils.isBlank(error)) {
+			throw new VciBaseException("褰撳墠璁剧疆鐨勫瘑鐮侊紝瀵嗙爜绛栫暐鏍¢獙鏈�氳繃!");
+		}
+
+		//TODO:鑰冭檻鏄惁闇�瑕佸皢淇敼鏂瑰紡鏀规垚鐩存帴璋冪敤骞冲彴鐨勬帴鍙o紝鍥犱负鐜板湪鐨勪慨鏀规柟寮忔病鑳芥纭殑鏇存柊缂撳瓨
+		/*UserInfo userInfo = new UserInfo();
+		userInfo.id = userOid.trim();
+		userInfo.pwd = password;
+		userInfo.pwdUpdateTime = System.currentTimeMillis();
+		boolean updateBoolean = platformClientUtil.getFrameworkService().updateUser(userInfo, new UserEntityInfo(WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId(), null));
+		return updateBoolean;*/
+
 		ThreeDES des = new ThreeDES();// 瀹炰緥鍖栦竴涓锟�?
 		des.getKey("daliantan0v0");// 鐢熸垚瀵嗗寵
 		String encPassword = des.getEncString(password);
-		String sql = "update pluser set plpassword = '" + encPassword + "' where pluid = '" + userOid.trim() + "'";
+		//淇敼瀵嗙爜鐨勫悓鏃堕渶瑕佸皢瀵嗙爜淇敼鏃堕棿涔熸洿鏂�
+		String sql = "update pluser set plpassword = '" + encPassword + "', plpwdupdatetime = TO_DATE('"
+				+ Func.format(new Date(),"yyyy-MM-dd HH:mm:ss") +"','yyyy-MM-dd hh24:mi:ss') where pluid = '" + userOid.trim() + "'";
 		try {
-			platformClientUtil.getBOFactoryService().executeUpdateSql(sql);
+			return platformClientUtil.getBOFactoryService().executeUpdateSql(sql);
 		} catch (PLException vciError) {
 			throw WebUtil.getVciBaseException(vciError);
 		}
 	}
+
 	/**
      * 鏇存柊鐢ㄦ埛鐨勫瘑鐮侀敊璇鏁�
      * @param userOid 鐢ㄦ埛鐨勪富閿�
@@ -849,6 +1089,7 @@
 			throw WebUtil.getVciBaseException(vciError);
 		}
 	}
+
 	 /**
      * 鏇存柊鐢ㄦ埛鐨勬渶鍚庣櫥褰曟椂闂�
      * @param userOid 鐢ㄦ埛鐨勪富閿�
@@ -864,4 +1105,363 @@
 			throw WebUtil.getVciBaseException(vciError);
 		}
 	}
+
+	/**
+	 * 娣诲姞鐢ㄦ埛
+	 * @param smUserDTO
+	 * @return
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public boolean addUser(SmUserDTO smUserDTO) throws PLException {
+		//鍒ょ┖
+		VciBaseUtil.alertNotNull(
+				smUserDTO,"娣诲姞鐨勭敤鎴峰璞�",
+				smUserDTO.getId(),"鐢ㄦ埛鍚�",
+				smUserDTO.getPassword(),"瀵嗙爜",
+				smUserDTO.getConfirmPassword(),"纭瀵嗙爜",
+				smUserDTO.getName(),"濮撳悕"
+		);
+		//鏍¢獙
+		check(smUserDTO,true,false);
+		//鐢熸垚瀛樺偍鐨凞O瀵硅薄
+		Date date = new Date();
+		smUserDTO.setPwdUpdateTime(date);
+		smUserDTO.setStatus((short) 0);
+		smUserDTO.setCreateTime(date);
+		SessionInfo loginUser = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
+		String loginUserId = loginUser.getUserId();
+		//鐢ㄦ埛绫诲瀷锛岀幇鍦ㄦ寜鐓у綋鍓嶇櫥褰曠殑鐢ㄦ埛鍐冲畾浠栨墍娣诲姞鐨勭敤鎴风骇鍒�
+		//瓒呯娣诲姞鐨勫氨鏄鐞嗗憳
+		if(UserTypeEnum.SUPPER_ADMIN.getValue().equals(loginUser.getUsertype())){
+			smUserDTO.setUserType(Short.parseShort(UserTypeEnum.ADMIN.getValue()));
+		}else {
+			//绠$悊鍛樻坊鍔犵殑灏辨槸鏅�氱敤鎴�
+			smUserDTO.setUserType(Short.parseShort(UserTypeEnum.USER.getValue()));
+		}
+		smUserDTO.setCreator(loginUserId);
+		smUserDTO.setLastModifier(loginUserId);
+		UserInfo userInfo = changeSmUserDTOToUserInfo(smUserDTO);
+		UserEntityInfo userEntityInfo = new UserEntityInfo(loginUserId, "");
+		String oid = platformClientUtil.getFrameworkService().saveUser(userInfo, userEntityInfo);
+		if (Func.isEmpty(oid)) {
+			return false;
+		}
+		if(Func.isNotBlank(smUserDTO.getPkDepartment())){
+			//鎵ц淇濆瓨鐢ㄦ埛閮ㄩ棬鍏宠仈鍏崇郴
+			orgDeptQueryService.saveUsersDept(new String[]{oid},smUserDTO.getPkDepartment());
+		}
+		return true;
+	}
+
+	/**
+	 * 淇敼鐢ㄦ埛
+	 * @param smUserDTO
+	 * @return
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public boolean updateUser(SmUserDTO smUserDTO) throws PLException {
+		//鍒ょ┖
+		VciBaseUtil.alertNotNull(
+				smUserDTO,"淇敼鐨勭敤鎴峰璞�",
+				smUserDTO.getOid(),"鐢ㄦ埛涓婚敭",
+				smUserDTO.getId(),"鐢ㄦ埛鍚�",
+				smUserDTO.getPassword(),"瀵嗙爜",
+				smUserDTO.getConfirmPassword(),"纭瀵嗙爜",
+				smUserDTO.getName(),"濮撳悕"
+		);
+		//鏍¢獙
+		check(smUserDTO,false,false);
+		//鏌ヨ鏁版嵁搴撲腑鐨�
+		SmUserVO dbSmUserVO = getUserByUserOid(smUserDTO.getOid());
+		//鏍规嵁涓婚敭娌℃煡璇㈠埌浜嗙敤鎴�
+		if(Func.isEmpty(dbSmUserVO) || Func.isBlank(dbSmUserVO.getOid())){
+			throw new PLException("500", new String[] { "褰撳墠淇敼鐨勭敤鎴蜂笉瀛樺湪"});
+		}
+		SessionInfo loginUser = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
+		String loginUserName = loginUser.getUserId();
+		smUserDTO.setLastModifier(loginUserName);
+		smUserDTO.setUserType(Short.parseShort(dbSmUserVO.getUserType()));
+		smUserDTO.setPwdUpdateTime(dbSmUserVO.getLastModifyPasswordTime());
+		smUserDTO.setIsDeptLeader(smUserDTO.getIsDeptLeader().equals("涓嶆槸") ? "0":"1");
+		UserInfo userInfo = changeSmUserDTOToUserInfo(smUserDTO);
+		boolean updateBoolean = platformClientUtil.getFrameworkService().updateUser(userInfo, new UserEntityInfo(loginUserName, null));
+		//淇敼鎴愬姛锛屽苟涓旂敤鎴峰叧鑱旈儴闂ㄦ湁鎵�鏇存敼
+		if(updateBoolean && !smUserDTO.getPkDepartment().equals(dbSmUserVO.getPkDepartment())){
+			//鎵ц淇濆瓨鐢ㄦ埛閮ㄩ棬鍏宠仈鍏崇郴
+			orgDeptQueryService.saveUsersDept(new String[]{dbSmUserVO.getOid()},smUserDTO.getPkDepartment());
+		}
+		return updateBoolean;
+	}
+
+	/**
+	 * 妫�鏌ョ敤鎴蜂俊鎭槸鍚︾鍚堣鑼�
+	 * @param smUserDTO
+	 * @param isAdd 鏄惁鏂板
+	 * @param isImport 鏄惁瀵煎叆
+	 */
+	private void check(SmUserDTO smUserDTO, boolean isAdd,boolean isImport){
+		//瀵煎叆鐨勬病鏈夌‘璁ゅ瘑鐮�
+		if(!isImport && !smUserDTO.getPassword().equals(smUserDTO.getConfirmPassword())){
+			throw new VciBaseException("瀵嗙爜鍜岀‘璁ゅ瘑鐮佷笉鐩哥瓑");
+		}
+		if(smUserDTO.getId().getBytes().length > 128){
+			throw new VciBaseException("鐢ㄦ埛鍚嶉暱搴﹁秴杩囦笂闄�");
+		}
+		if(smUserDTO.getPassword().getBytes().length > 128){
+			throw new VciBaseException("瀵嗙爜闀垮害瓒呰繃涓婇檺");
+		}
+		if(smUserDTO.getName().getBytes().length > 64){
+			throw new VciBaseException("濮撳悕闀垮害瓒呰繃涓婇檺");
+		}
+		if (Func.isNotBlank(smUserDTO.getSpecialties()) && smUserDTO.getSpecialties().getBytes().length > 255){
+			throw new VciBaseException("涓撲笟闀垮害瓒呰繃涓婇檺");
+		}
+		if (Func.isNotBlank(smUserDTO.getEmail()) && smUserDTO.getEmail().getBytes().length > 128){
+			throw new VciBaseException("鐢靛瓙閭闀垮害瓒呰繃涓婇檺");
+		}
+		if (Func.isNotBlank(smUserDTO.getDescription()) && smUserDTO.getDescription().getBytes().length > 255 ){
+			throw new VciBaseException("鎻忚堪闀垮害瓒呰繃涓婇檺");
+		}
+		if (!smUserDTO.getId().matches("^[A-Za-z0-9_]+$")) {
+			throw new VciBaseException("鐢ㄦ埛鍚嶅繀椤绘槸鐢盇-Z a-z 0-9 _缁勬垚");
+		}
+		if (Func.isNotBlank(smUserDTO.getEmail()) && !smUserDTO.getEmail().matches("^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$")){
+			throw new VciBaseException("鐢靛瓙閭鏍煎紡閿欒");
+		}
+		/*鏄柊澧炴墠鍋氱敤鎴峰悕鏌ラ噸澶勭悊锛屼慨鏀逛笉闇�瑕佹煡閲嶏紙涓�缁忓垱寤轰笉鍏佽淇敼鐢ㄦ埛鍚嶏級锛�
+			瀵煎叆鐨勪篃涓嶉渶瑕佸湪杩欏効鏌ラ噸锛屽洜涓哄湪瀵煎叆閫昏緫閲岄潰闇�瑕佽繑鍥為噸澶嶇殑琛�
+		 */
+		if(isAdd && !isImport){
+			//鏍规嵁鐢ㄦ埛鍚嶏紙璐﹀彿锛夋煡閲�
+			SmUserVO dbSmUserVO = getUserByUserId(smUserDTO.getId());
+			if(Func.isNotEmpty(dbSmUserVO) && Func.isNotBlank(dbSmUserVO.getOid())){
+				throw new VciBaseException("璇ョ敤鎴峰悕鍦ㄧ郴缁熶腑宸茬粡瀛樺湪,璇蜂慨鏀�!");
+			}
+		}
+		//鏍规嵁褰撳墠鍒涘缓杩欎釜鐢ㄦ埛鐨勪汉鎵�缁戝畾瀵嗙爜绛栫暐鏉ヨ繘琛屽瘑鐮佹牎楠�
+		try {
+			String userId = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
+			String error = platformClientUtil.getFrameworkService().checkPasswordStrategyByUserId(userId, smUserDTO.getPassword(),null);
+			if (!StringUtils.isBlank(error)) {
+				throw new VciBaseException("褰撳墠璁剧疆鐨勫瘑鐮侊紝瀵嗙爜绛栫暐鏍¢獙鏈�氳繃");
+			}
+		} catch (PLException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+			throw new VciBaseException("妫�鏌ュ瘑鐮佺瓥鐣ョ鍚堟儏鍐靛け璐ワ紒2");
+		}
+	}
+
+	/***
+	 * 鐢ㄦ埛浠嶥TO瀵硅薄鍒癱orba瀵硅薄
+	 * @param user
+	 * @return
+	 */
+	public UserInfo changeSmUserDTOToUserInfo(SmUserDTO user) {
+		UserInfo userInfo = new UserInfo();
+		userInfo.id = user.getOid() == null ? "" : user.getOid();
+		userInfo.userName = user.getId() == null ? "" : user.getId();
+		userInfo.pwd = user.getPassword() == null ? "" : user.getPassword();
+		userInfo.trueName = user.getName() == null ? "" : user.getName();
+		userInfo.specialties = user.getSpecialties() == null ? "" : user.getSpecialties();
+		userInfo.email = user.getEmail() == null ? "" : user.getEmail();
+		userInfo.desc = user.getDescription() == null ? "" : user.getDescription();
+		userInfo.userType = user.getUserType();
+		userInfo.status = user.getStatus();
+		userInfo.createTime = user.getCreateTime().getTime();
+		userInfo.createUser = user.getCreator() == null ? "" : user.getCreator();
+		userInfo.updateTime = System.currentTimeMillis();
+		userInfo.updateUser = user.getLastModifier() == null ? "" : user.getLastModifier();
+		userInfo.pwdUpdateTime = user.getPwdUpdateTime().getTime();
+		userInfo.grantor = user.getGrantor() == null ? "" : user.getGrantor();
+		userInfo.isDeptLeader = user.getIsDeptLeader() == null ? "0" : user.getIsDeptLeader();
+		return userInfo;
+	}
+
+	/**
+	 * 鍒犻櫎鐢ㄦ埛
+	 * @param ids
+	 * @return
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public boolean deleteUser(String[] ids) throws PLException {
+		VciBaseUtil.alertNotNull(ids,"瑕佸垹闄ょ殑鐢ㄦ埛涓婚敭");
+		//璋冪敤platformClientUtil鐨勫垹闄ょ敤鎴风殑鏂规硶锛屼細涓�璧峰垹闄ゆ帀鍏峰鍏宠仈鍏崇郴鐨勪竴浜涗俊鎭紝濡傞儴闂�
+		return platformClientUtil.getFrameworkService().deleteUser(
+				ids,
+				new UserEntityInfo(WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId(),null)
+		);
+	}
+
+	/**
+	 * 鐢ㄦ埛鍋滅敤/鍚敤
+	 * @param ids
+	 * @param flag
+	 * @return
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public boolean stopUsers(String[] ids, boolean flag) throws PLException {
+		VciBaseUtil.alertNotNull(ids,"鍋滅敤/鍚敤鐨勭敤鎴穒d鍒楄〃");
+		return platformClientUtil.getFrameworkService().stopUsers(ids, flag,null);
+	}
+
+	/**
+	 * 涓嬭浇瀵煎叆浜哄憳鐨別xcel妯℃澘銆�
+	 * @param downloadFileName 涓嬭浇鏃剁晫闈紶杩囨潵鎸囧畾鏂囦欢鍚嶇殑
+	 * @return 鏂囦欢鍦ㄦ湰鍦扮殑鍏ㄨ矾寰�
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮枃浠跺嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+	 */
+	@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("璐﹀彿", "瀵嗙爜", "濮撳悕", "鐢靛瓙閭", "涓撲笟", "鎻忚堪", "閮ㄩ棬(涓婁笅绾ч儴闂ㄤ箣闂翠互鍙嶆枩鏉犻殧寮�(/))"));
+		//鑾峰彇鏄惁瀵煎嚭瀵嗙骇閰嶇疆椤�
+		String flag = ConfigCorbaReader.getConfigValue("exportSecretGrade");
+		if (flag != null && flag.equalsIgnoreCase("true")) {
+			columns = new ArrayList<>(Arrays.asList("璐﹀彿", "瀵嗙爜", "濮撳悕", "鐢靛瓙閭", "涓撲笟", "鎻忚堪", "閮ㄩ棬(涓婁笅绾ч儴闂ㄤ箣闂翠互鍙嶆枩鏉犻殧寮�(/))" ,"瀵嗙骇"));
+		}
+		//璁剧疆蹇呭~鍒�
+		ColumnNameisRed.clear();
+		ColumnNameisRed.add(0);
+		ColumnNameisRed.add(1);
+		ColumnNameisRed.add(2);
+		//鍐檈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 importUser(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();
+			UserEntityInfo userEntityInfo = new UserEntityInfo(loginUserId,null);
+			//鏄惁瀵煎叆瀵嗙骇閰嶇疆
+			boolean exportSecretGrade = Boolean.parseBoolean(ConfigCorbaReader.getConfigValue("exportSecretGrade"));
+			List<SmUserPO> poList = ExcelUtil.readDataObjectFromExcel(file, SmUserPO.class,excelOption,(value, po, fieldName)->{
+				Integer secretValue = UserSecretEnum.getSecretValueByText(po.getSecretGradeText());
+				//鏄惁蹇呴』瀵煎叆瀵嗙骇
+				if(exportSecretGrade){
+					if(secretValue == null){
+						throw new VciBaseException("浼犲叆鐨勫瘑绾т笉绗﹀悎瑙勫垯!");
+					}
+					po.setSecretGrade(secretValue);
+				}
+			});
+			//鍘婚櫎閮芥槸绌虹殑鎯呭喌
+			if(CollectionUtils.isEmpty(poList)){
+				return BaseResult.fail(ExcelLangCodeConstant.IMPORT_CONTENT_NULL,new String[]{});
+			}
+			//鏁版嵁搴撴煡璇㈡槸鍚︽湁宸插瓨鍦ㄧ殑鐢ㄦ埛锛屾柟渚垮悗缁仛鍒ら噸澶勭悊
+			List<SmUserVO> smUserVOList = this.listUserByUserIds(poList.stream().map(SmUserPO::getId).collect(Collectors.toSet()));
+			List<String> repeatUserId = new ArrayList<>();
+			if(Func.isNotEmpty(smUserVOList)){
+				repeatUserId = smUserVOList.stream().map(SmUserVO::getId).collect(Collectors.toList());
+			}
+			//褰撳墠excel涓槸鍚﹂噸澶嶇敤鐨勫垽閲峂ap:锛坘ey锛氳处鍙凤紝value锛氳鍙凤級
+			Map<String, String> excelReapeat = new HashMap<>();
+			//鍏堣幏鍙栧叏閮ㄩ儴闂ㄥ悕绉扮殑鐖跺瓙瀵瑰簲鍏崇郴锛歬ey涓洪儴闂ㄥ瓙鐖剁骇鍚嶇О璺緞锛寁alue涓洪儴闂ㄤ俊鎭�
+			List<OrgDepartmentVO> orgDepartmentVOList = orgDeptQueryService.getDeptAllFullName();
+			Map<String, OrgDepartmentVO> deptVOMap = orgDepartmentVOList.stream().collect(Collectors.toMap(OrgDepartmentVO::getFullDeptNamePath, s->s));
+			//Map<String,OrgDepartmentVO> deptVOMap = orgDeptQueryService.getDeptAllTreeMap();
+			//鍒ゆ柇蹇呭~灞炴�ф槸鍚︿负绌猴紝鐢ㄦ埛鏄惁宸插瓨鍦紝浠ュ強閮ㄩ棬鏄惁濉敊绛夋牎楠岄�昏緫
+			List<String> finalRepeatUserId = repeatUserId;
+			poList.stream().forEach(smUserPO -> {
+				//鍏堝蹇呭~灞炴�у垽绌哄鐞�
+				if(Func.isBlank(smUserPO.getId())){
+					throw new VciBaseException("绗��"+smUserPO.getRowIndex()+"銆戣锛寀sernameerror");
+				}else if(Func.isBlank(smUserPO.getName())){
+					throw new VciBaseException("绗��"+smUserPO.getRowIndex()+"銆戣锛宯ameerror");
+				}else if(Func.isBlank(smUserPO.getPassword())){
+					throw new VciBaseException("绗��"+smUserPO.getRowIndex()+"銆戣锛宲assworderror");
+				}else if (Func.isNotEmpty(smUserVOList) && finalRepeatUserId.contains(smUserPO.getId())){//2銆佸垽鏂敤鎴峰悕鏄惁閲嶅
+					throw new VciBaseException("绗��"+smUserPO.getRowIndex()+"銆戣锛岀敤鎴峰悕鍦ㄧ郴缁熶腑宸茬粡瀛樺湪,璇蜂慨鏀�!");
+				}else if(Func.isNotBlank(smUserPO.getPkDepartmentName())){//澶勭悊濉啓浜嗛儴闂ㄧ殑鏁版嵁琛�
+					OrgDepartmentVO orgDepartmentVO = deptVOMap.get(smUserPO.getPkDepartmentName());
+					//閮ㄩ棬涓虹┖灏辫鏄庣敤鎴峰~鍐欓敊璇�
+					if(Func.isEmpty(orgDepartmentVO) && Func.isBlank(orgDepartmentVO.getOid())){
+						throw new VciBaseException("绗��"+smUserPO.getRowIndex()+"銆戣鏁版嵁锛岄儴闂ㄨ缃敊璇紝鍘熷洜锛氭湭鏌ヨ鍒拌璺緞涓嬬殑閮ㄩ棬");
+					}
+				}else if(excelReapeat.containsKey(smUserPO.getId())){//琛ㄦ牸涓垽閲�
+					throw new VciBaseException("绗��"+excelReapeat.get(smUserPO.getId())+"銆戣鍜岀銆�"+smUserPO.getRowIndex()+"銆戣鏁版嵁锛岃处鍙烽噸澶�");
+				}
+				excelReapeat.put(smUserPO.getId(),smUserPO.getRowIndex());
+			});
+			//淇濆瓨閫昏緫
+			poList.stream().forEach(smUserPO->{
+				SmUserDTO smUserDTO = new SmUserDTO();
+				BeanUtil.convert(smUserPO,smUserDTO);
+				//鐢ㄦ埛淇℃伅鏄惁瑙勮寖妫�鏌�
+				this.check(smUserDTO,true,true);
+				//鐢熸垚瀛樺偍鐨凞O瀵硅薄
+				Date date = new Date();
+				smUserDTO.setPwdUpdateTime(date);
+				smUserDTO.setStatus((short) 0);
+				smUserDTO.setCreateTime(date);
+				smUserDTO.setCreator(loginUserId);
+				smUserDTO.setLastModifier(loginUserId);
+				//淇濆瓨鐢ㄦ埛
+				String oid = null;
+				try {
+					//淇濆瓨鐢ㄦ埛鑾峰彇鍒扮敤鎴穙id
+					oid = platformClientUtil.getFrameworkService().saveUser(changeSmUserDTOToUserInfo(smUserDTO), userEntityInfo);
+					//淇濆瓨鐢ㄦ埛閮ㄩ棬鍏宠仈鍏崇郴
+					if(Func.isNotBlank(oid) && Func.isNotBlank(smUserDTO.getPkDepartmentName())){
+						orgDeptQueryService.saveUsersDept(
+								new String[]{oid},
+								deptVOMap.get(smUserDTO.getPkDepartmentName()).getOid()
+						);
+					}
+				} catch (PLException e) {
+					e.printStackTrace();
+					throw new VciBaseException("鎵ц鍒扮銆�"+smUserPO.getRowIndex()+"銆戣淇濆瓨閫昏緫鏃跺嚭鐜伴敊璇紝鍘熷洜锛�" + 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("鐢ㄦ埛瀵煎叆鎴愬姛锛�");
+	}
+
 }

--
Gitblit v1.9.3