ソースを参照

佛燃二开需求改造

chenzhfa 3 年 前
コミット
5b3769f328

+ 2 - 2
hrhi/resources/cloudapi.properties

@@ -1,10 +1,10 @@
 #sit
 #cloudapi.apikey=21d0b041-13d4-4670-a107-626443693182
 #cloudapi.secretKey=552333e8-36b7-4eb1-a131-4aa63004e92b
-#cloudapi.url=http://sdcs-api-dpb.yunxuetang.com.cn
+#cloudapi.url=https://sdcs-api-dpb.yunxuetang.com.cn
 
 #prod
 cloudapi.apikey=e8765865-58b1-4d11-8c33-95e6b5336fea
 cloudapi.secretKey=54705a73-1f8f-43f0-baff-6b9b6c964a87
-cloudapi.url=http://sdcs-api-dpb.yunxuetang.cn
+cloudapi.url=https://sdcs-api-dpb.yunxuetang.cn
 

+ 1 - 1
hrhi/src/private/nc/impl/hr/train/CloudKngcatalogsPlugin.java

@@ -45,7 +45,7 @@ public class CloudKngcatalogsPlugin implements IBackgroundWorkPlugin {
 			if("0".equals(code)) {
 				JSONArray jsonArray = jsonObject.getJSONArray("data");//Êý¾Ýdata
 				if(jsonArray != null && jsonArray.size() > 0) {
-					List<CloudKngcatalogsVO> vosList = JSONArray.parseArray(jsonArray.toJSONString(), CloudKngcatalogsVO.class);
+					List<CloudKngcatalogsVO> vosList = JSONArray.parseArray(jsonArray.toJSONString().replaceAll("status", "cloudStatus"), CloudKngcatalogsVO.class);
 					if(vosList != null) {
 						String sql = "select id,pk_kngcatalogs from cloud_kngcatalogs where nvl(dr,0) = 0";
 						List<Map<String,String>> listMap = (List<Map<String,String>>) dao.executeQuery(sql, new ColumnListProcessor());

+ 1 - 1
hrhi/src/private/nc/impl/hr/train/CloudOnlineuserknowledgePlugin.java

@@ -273,7 +273,7 @@ public class CloudOnlineuserknowledgePlugin implements IBackgroundWorkPlugin {
 						if("0".equals(icode)) {
 							JSONArray jsonArrayi = datai.getJSONArray("datas");//数据data
 							if(jsonArrayi != null) {
-								List<CloudOnlineuserknowledge> vosList = JSONArray.parseArray(jsonArrayi.toJSONString(), CloudOnlineuserknowledge.class);
+								List<CloudOnlineuserknowledge> vosList = JSONArray.parseArray(jsonArrayi.toJSONString().replaceAll("status", "cloudStatus"), CloudOnlineuserknowledge.class);
 								//判断是否已存在中间表
 								if(vosList != null) {
 									for(CloudOnlineuserknowledge vo : vosList) {

+ 1 - 1
hrhi/src/private/nc/impl/hr/train/CloudPsnPlugin.java

@@ -50,7 +50,7 @@ public class CloudPsnPlugin implements IBackgroundWorkPlugin {
 		if(map.get("nums") != null && !"".equals(map.get("nums"))) {
 			int nums = Integer.valueOf(arg0.getKeyMap().get("nums").toString());
 			if(nums == 0) {
-				updateDate = "2022-01-01";
+				updateDate = "2019-01-01";
 			} else {
 				c.add(Calendar.DAY_OF_MONTH, nums);
 				updateDate = sdf.format(c.getTime());

+ 367 - 262
hrhi/src/private/nc/impl/hr/train/TrainCloudSchoolImpl.java

@@ -1,262 +1,367 @@
-package nc.impl.hr.train;
-
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.net.URL;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.commons.codec.digest.DigestUtils;
-
-import com.alibaba.fastjson.JSONObject;
-
-import nc.vo.pub.BusinessException;
-import okhttp3.Headers;
-import okhttp3.MediaType;
-import okhttp3.OkHttpClient;
-import okhttp3.Request;
-import okhttp3.RequestBody;
-import okhttp3.Response;
-
-public class TrainCloudSchoolImpl {
-	
-	private static Properties props = new Properties(); 
-	
-	static {
-		try {
-			if (props.size() <= 0) {
-				ClassLoader classLoader = new Object() {}.getClass().getClassLoader();
-				URL url = classLoader.getResource("cloudapi.properties");
-				FileInputStream in = new FileInputStream(url.getFile());
-				props.load(in);
-			}
-		} catch (IOException e) {
-			
-		}
-	}
-	
-	public String getUrl() {
-		return props.getProperty("cloudapi.url");
-	}
-	
-	/**
-	 * 获取表头处理数据
-	 * @return
-	 */
-	public Map<String,Object> getBodyMap() {
-        Map<String, Object> body = new HashMap();
-        String apikey = props.getProperty("cloudapi.apikey");//"21d0b041-13d4-4670-a107-626443693182";// 从云学堂客服获取
-        String salt = String.valueOf(new Date().getTime()).substring(0, 6);;// 随机数,为api的每个请求随机生成的字符串,最短3位,最长32位
-        String secretKey =  props.getProperty("cloudapi.secretKey");//"552333e8-36b7-4eb1-a131-4aa63004e92b";//从云学堂客服获取
-        String signature = DigestUtils.sha256Hex(secretKey + salt);//将secretKey salt 2个字符串按先后顺序拼接成一个字符串并进行SHA-256哈希计算
-        body.put("apikey", apikey);
-        body.put("salt", salt);
-        body.put("signature", signature);
-        return body;
-    }
-	
-	/**
-	 * 根据传参数调用不一样的云学堂接口
-	 * @param bodyMap
-	 * @param url
-	 * @return
-	 */
-	public String getCouldSchool(Map<String,Object> bodyMap,String url) throws BusinessException{
-		String result = "";
-		String bodyString = JSONObject.toJSONString(bodyMap);
-        try {
-            OkHttpClient client = new OkHttpClient().newBuilder().readTimeout(500000, TimeUnit.MILLISECONDS).build();
-            MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
-            RequestBody requestBody = RequestBody.create(mediaType, bodyString);
-            Request request = new Request.Builder().headers(Headers.of(new HashMap<>(1))).url(url).post(requestBody).build();
-            Response response = client.newBuilder().readTimeout(500000L, TimeUnit.MILLISECONDS).build().newCall(request).execute();
-            result = response.body().string();
-        } catch (Exception e) {
-            System.out.println("执行包含头部的post请求,body:" + bodyMap + ",url:" + url + ",请求数据:" + bodyMap + ",执行错误信息:" + e);
-            throw new BusinessException("执行包含头部的post请求,body:" + bodyMap + ",url:" + url + ",请求数据:" + bodyMap + ",执行错误信息:" + e);
-        }
-        return result;
-	}
-	
-	/**
-	 * 获取用户列表数据
-	 * @param bodyMap
-	 * @return
-	 */
-	public String getUserList(Map<String,Object> bodyMap) throws BusinessException{
-		String result = "";
-		bodyMap.put("pageNo", 1);
-//		bodyMap.put("updateDate", new UFDate().toDate());//此处是添加接口所需传入参数
-		String bodyString = JSONObject.toJSONString(bodyMap);
-		String qurl = getUrl();
-        // 阿里环境域名http://sdcs-api-dpbc1.yunxuetang.cn/v1 ;
-        // ucloud环境域名 http://sdcs-api-dpb.yunxuetang.cn/v1 ;
-		//测试http://sdcs-api-dpb.yunxuetang.com.cn
-        String url = qurl + "/v1/customdata/users";
-        try {
-        	result = getCouldSchool(bodyMap,url);
-        } catch (Exception e) {
-            System.out.println("执行包含头部的post请求,body:" + bodyMap + ",url:" + url + ",请求数据:" + bodyMap + ",执行错误信息:" + e);
-            throw new BusinessException("执行包含头部的post请求,body:" + bodyMap + ",url:" + url + ",请求数据:" + bodyMap + ",执行错误信息:" + e);
-        }
-        return result;
-	}
-	
-	/**
-	 * 学习计划执行明细(分页)(学习计划)
-	 * @param bodyMap
-	 * @param curPage 当前页
-	 * @param pageSize 每页大小
-	 * @return
-	 * @throws BusinessException 
-	 */
-	public String getStudyplandetailpagelist(Map<String,Object> bodyMap,int curPage,int pageSize) throws BusinessException {
-		String result = "";
-		bodyMap.put("curPage", curPage);//当前页
-		bodyMap.put("pageSize", pageSize);//每页大小
-//		bodyMap.put("updateDate", new UFDate().toDate());//员工学习知识的最新日期(用于获取增量数据,员工最新学习时间大于等于该日期的数据),示例:2017-10-01
-//		bodyMap.put("updateEndDate", new UFDate().toDate());//更新结束时间,查询从更新开始日期到更新结束日期之间有过更新或新增操作的数据
-//		bodyMap.put("planID", "");//学习计划id 不是必输项
-//		bodyMap.put("userId", "");//用户id(不必填)
-//		bodyMap.put("status", "");//状态,枚举(未学习NoStart;学习中Studying;已完成 Completed) 不是必输项
-		String bodyString = JSONObject.toJSONString(bodyMap);
-		String qurl = getUrl();
-		String url = qurl + "/v1/studyplans/studyplandetailpagelist";
-        try {
-        	result = getCouldSchool(bodyMap,url);
-        } catch (Exception e) {
-            System.out.println("执行包含头部的post请求,body:" + bodyMap + ",url:" + url + ",请求数据:" + bodyMap + ",执行错误信息:" + e);
-            throw new BusinessException("执行包含头部的post请求,body:" + bodyMap + ",url:" + url + ",请求数据:" + bodyMap + ",执行错误信息:" + e);
-        }
-        return result;
-	}
-	
-	/**
-	 * 所有培训课程(分页)
-	 * @param bodyMap
-	 * @param curPage
-	 * @param pageSize
-	 * @return
-	 * @throws BusinessException 
-	 */
-	public String gettrainingcontentlistpage(Map<String,Object> bodyMap,int curPage,int pageSize) throws BusinessException {
-		String result = "";
-		bodyMap.put("curPage", curPage);//当前页
-		bodyMap.put("pageSize", pageSize);//每页大小
-//		bodyMap.put("updateDate", new UFDate().toDate());//培训课程更新日期 例如2020-01-01
-//		bodyMap.put("trainingID", "");//更培训ID 不是必输项
-		String bodyString = JSONObject.toJSONString(bodyMap);
-		String qurl = getUrl();
-		String url = qurl + "/v1/training/gettrainingcontentlistpage";
-        try {
-        	result = getCouldSchool(bodyMap,url);
-        } catch (Exception e) {
-            System.out.println("执行包含头部的post请求,body:" + bodyMap + ",url:" + url + ",请求数据:" + bodyMap + ",执行错误信息:" + e);
-            throw new BusinessException("执行包含头部的post请求,body:" + bodyMap + ",url:" + url + ",请求数据:" + bodyMap + ",执行错误信息:" + e);
-        }
-        return result;
-	}
-	
-	/**
-	 * 培训课程完成情况(线下培训)
-	 * @param bodyMap
-	 * @param curPage
-	 * @param pageSize
-	 * @param trainContentID
-	 * @return
-	 * @throws BusinessException 
-	 */
-	public String getcontentfinshdetaillist(Map<String,Object> bodyMap,int curPage,int pageSize,String trainContentID) throws BusinessException {
-		String result = "";
-		bodyMap.put("curPage", curPage);//当前页
-		bodyMap.put("pageSize", pageSize);//每页大小
-//		bodyMap.put("updateDate", new UFDate().toDate());//培训课程更新日期 例如2020-01-01
-		bodyMap.put("trainContentID", trainContentID);//培训内容id 必填
-		String qurl = getUrl();
-		String url = qurl + "/v1/training/getcontentfinshdetaillist";
-        try {
-        	result = getCouldSchool(bodyMap,url);
-        } catch (Exception e) {
-            System.out.println("执行包含头部的post请求,body:" + bodyMap + ",url:" + url + ",请求数据:" + bodyMap + ",执行错误信息:" + e);
-            throw new BusinessException("执行包含头部的post请求,body:" + bodyMap + ",url:" + url + ",请求数据:" + bodyMap + ",执行错误信息:" + e);
-        }
-        return result;
-	}
-	
-	/**
-	 * 获取知识目录列表
-	 * @param bodyMap
-	 * @param curPage
-	 * @param pageSize
-	 * @return
-	 * @throws BusinessException 
-	 */
-	public String getKngcatalogs(Map<String,Object> bodyMap,int curPage,int pageSize) throws BusinessException {
-		String result = "";
-//		bodyMap.put("curPage", curPage);//当前页
-//		bodyMap.put("pageSize", pageSize);//每页大小
-//		bodyMap.put("updateDate", new UFDate().toDate());//培训课程更新日期 例如2020-01-01
-//		bodyMap.put("trainContentID", trainContentID);//培训内容id 必填
-		String qurl = getUrl();
-		String url = qurl + "/v1/customdata/knowledges/kngcatalogs";
-        try {
-        	result = getCouldSchool(bodyMap,url);
-        } catch (Exception e) {
-            System.out.println("执行包含头部的post请求,body:" + bodyMap + ",url:" + url + ",请求数据:" + bodyMap + ",执行错误信息:" + e);
-            throw new BusinessException("执行包含头部的post请求,body:" + bodyMap + ",url:" + url + ",请求数据:" + bodyMap + ",执行错误信息:" + e);
-        }
-        return result;
-	}
-	
-	/**
-	 * 获取知识列表
-	 * @param bodyMap
-	 * @param curPage
-	 * @param pageSize
-	 * @return
-	 * @throws BusinessException 
-	 */
-	public String getKnowledges(Map<String,Object> bodyMap,int curPage,int pageSize) throws BusinessException {
-		String result = "";
-		String qurl = getUrl();
-		String url = qurl + "/v1/customdata/knowledges";
-        try {
-        	result = getCouldSchool(bodyMap,url);
-        } catch (Exception e) {
-            System.out.println("执行包含头部的post请求,body:" + bodyMap + ",url:" + url + ",请求数据:" + bodyMap + ",执行错误信息:" + e);
-            throw new BusinessException("执行包含头部的post请求,body:" + bodyMap + ",url:" + url + ",请求数据:" + bodyMap + ",执行错误信息:" + e);
-        }
-        return result;
-	}
-
-	/**
-	 * 员工所有线上学习记录  所有用户线上学习记录,包含自主学习、学习计划、岗位学习、混合式学习等,并包含课程包明细
-	 * @param bodyMap
-	 * @param curPage
-	 * @param pageSize
-	 * @return
-	 * @throws BusinessException 
-	 */
-	public String getOnlineuserknowledge(Map<String,Object> bodyMap,int curPage,int pageSize) throws BusinessException {
-		String result = "";
-		bodyMap.put("curPage", curPage);//当前页
-		bodyMap.put("pageSize", pageSize);//每页大小
-//		updateDate 更新开始时间
-//		updateEndDate 更新结束时间 时间间隔不超过一个月,数据量大,建议最好按天查询
-		String bodyString = JSONObject.toJSONString(bodyMap);
-		
-		String qurl = getUrl();
-		String url = qurl + "/v1/knowledge/getonlineuserknowledge";
-        try {
-        	result = getCouldSchool(bodyMap,url);
-        } catch (Exception e) {
-            System.out.println("执行包含头部的post请求,body:" + bodyMap + ",url:" + url + ",请求数据:" + bodyMap + ",执行错误信息:" + e);
-            throw new BusinessException("执行包含头部的post请求,body:" + bodyMap + ",url:" + url + ",请求数据:" + bodyMap + ",执行错误信息:" + e);
-        }
-        return result;
-	}
-	
-}
+package nc.impl.hr.train;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URL;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.methods.RequestEntity;
+import org.apache.commons.httpclient.protocol.Protocol;
+import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
+
+import com.alibaba.fastjson.JSONObject;
+
+import nc.hrhi.httpUtil.MySecureProtocolSocketFactory;
+import nc.vo.pub.BusinessException;
+
+public class TrainCloudSchoolImpl {
+	
+	private static Properties props = new Properties(); 
+	
+	static {
+		try {
+			if (props.size() <= 0) {
+				ClassLoader classLoader = new Object() {}.getClass().getClassLoader();
+				URL url = classLoader.getResource("cloudapi.properties");
+				FileInputStream in = new FileInputStream(url.getFile());
+				props.load(in);
+			}
+		} catch (IOException e) {
+			
+		}
+	}
+	
+	public String getUrl() {
+		return props.getProperty("cloudapi.url");
+	}
+	
+	/**
+	 * 鑾峰彇琛ㄥご澶勭悊鏁版嵁
+	 * @return
+	 */
+	public Map<String,Object> getBodyMap() {
+        Map<String, Object> body = new HashMap();
+        String apikey = props.getProperty("cloudapi.apikey");//"21d0b041-13d4-4670-a107-626443693182";// 浠庝簯瀛﹀爞瀹㈡湇鑾峰彇
+        String salt = String.valueOf(new Date().getTime()).substring(0, 6);;// 随机数,为api的每个请求随机生成的字符串,最短3位,最长32位
+        String secretKey =  props.getProperty("cloudapi.secretKey");//"552333e8-36b7-4eb1-a131-4aa63004e92b";//浠庝簯瀛﹀爞瀹㈡湇鑾峰彇
+        String signature = DigestUtils.sha256Hex(secretKey + salt);//灏唖ecretKey salt 2涓�瓧绗︿覆鎸夊厛鍚庨『搴忔嫾鎺ユ垚涓€涓�瓧绗︿覆骞惰繘琛孲HA-256鍝堝笇璁$畻
+        body.put("apikey", apikey);
+        body.put("salt", salt);
+        body.put("signature", signature);
+        return body;
+    }
+	/**
+     * 从输入流中读取数据
+     * 
+     * @param inStream
+     * @return
+     * @throws Exception
+     */
+    public static byte[] readInputStream(InputStream inStream) throws Exception {
+        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
+        byte[] buffer = new byte[1024];
+        int len = 0;
+        while ((len = inStream.read(buffer)) != -1) {
+            outStream.write(buffer, 0, len);
+        }
+        byte[] data = outStream.toByteArray();
+        outStream.close();
+        inStream.close();
+        return data;
+    }
+	/**
+	 * 根据传参数调用不一样的云学堂接口
+	 * @param bodyMap
+	 * @param url
+	 * @return
+	 */
+	public String getCouldSchool(Map<String,Object> bodyMap,String url) throws BusinessException{
+		String result = "";
+		String bodyString = JSONObject.toJSONString(bodyMap);
+		try {
+			byte[] requestBytes = bodyString.getBytes("utf-8"); // 将参数转为二进制流
+	        HttpClient httpClient = new HttpClient();// 瀹㈡埛绔�疄渚嬪寲
+	        PostMethod postMethod = new PostMethod(url);
+	        //璁剧疆璇锋眰澶碅uthorization
+	//        postMethod.setRequestHeader("Authorization", "Basic " + authorization);
+	        // 设置请求头  Content-Type
+	        postMethod.setRequestHeader("Content-Type", "application/json");
+	        InputStream inputStream = new ByteArrayInputStream(requestBytes, 0,
+	                requestBytes.length);
+	        RequestEntity requestEntity = new InputStreamRequestEntity(inputStream,
+	                requestBytes.length, "application/json; charset=utf-8"); // 请求体
+	        postMethod.setRequestEntity(requestEntity);
+	        httpClient.executeMethod(postMethod);// 鎵ц�璇锋眰
+	        InputStream soapResponseStream = postMethod.getResponseBodyAsStream();// 鑾峰彇杩斿洖鐨勬祦
+	        byte[] datas = null;
+            datas = readInputStream(soapResponseStream);// 从输入流中读取数据
+            // 灏嗕簩杩涘埗娴佽浆涓篠tring
+            result = new String(datas, "UTF-8");
+        } catch (Exception e) {
+            System.out.println("鎵ц�鍖呭惈澶撮儴鐨刾ost璇锋眰,body:" + bodyString + ",url:" + url + ",鎵ц�閿欒�淇℃伅:" + e);
+            throw new BusinessException("鎵ц�鍖呭惈澶撮儴鐨刾ost璇锋眰,body:" + bodyString + ",url:" + url + ",鎵ц�閿欒�淇℃伅:" + e);
+		}
+        return result;
+		
+//        try {
+////            OkHttpClient client = new OkHttpClient().newBuilder().readTimeout(500000, TimeUnit.MILLISECONDS).build();
+////            MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
+////            RequestBody requestBody = RequestBody.create(mediaType, bodyString);
+////            Request request = new Request.Builder().headers(Headers.of(new HashMap<>(1))).url(url).post(requestBody).build();
+////            Response response = client.newBuilder().readTimeout(500000L, TimeUnit.MILLISECONDS).build().newCall(request).execute();
+////            result = response.body().string();
+//        	OkHttpClient client = SSLSocketClient.OkHttpClientgetUnsafeOkHttpClient().newBuilder()
+//        			.sslSocketFactory(SSLSocketClient.getSSLSocketFactory())//閰嶇疆
+//        			.hostnameVerifier(SSLSocketClient.getHostnameVerifier())//閰嶇疆
+//        			.readTimeout(500000, TimeUnit.MILLISECONDS)
+//        			  .build().connectionSpecs(Collections.singletonList(spec));
+//        	
+//        			MediaType mediaType = MediaType.parse("application/json");
+//        			RequestBody body = RequestBody.create(mediaType, bodyString);
+//        			Request request = new Request.Builder()
+//        			  .url(url)
+//        			  .method("POST", body)
+//        			  .addHeader("Content-Type", "application/json")
+//        			  .build();
+//        			Response response = client.newBuilder().readTimeout(500000L, TimeUnit.MILLISECONDS).build().newCall(request).execute();
+//        			result = response.body().string();
+//        } catch (Exception e) {
+//            System.out.println("鎵ц�鍖呭惈澶撮儴鐨刾ost璇锋眰,body:" + bodyString + ",url:" + url + ",鎵ц�閿欒�淇℃伅:" + e);
+//            throw new BusinessException("鎵ц�鍖呭惈澶撮儴鐨刾ost璇锋眰,body:" + bodyString + ",url:" + url + ",鎵ц�閿欒�淇℃伅:" + e);
+//        }
+//        return result;
+	}
+	
+	/**
+	 * 根据传参数调用不一样的云学堂接口
+	 * @param bodyMap
+	 * @param url
+	 * @return
+	 */
+	public String getCouldSchool2(Map<String,Object> bodyMap,String url) throws BusinessException{
+		String result = "";
+		String bodyString = JSONObject.toJSONString(bodyMap);
+		//澹版槑
+		ProtocolSocketFactory fcty = new MySecureProtocolSocketFactory();
+		//鍔犲叆鐩稿叧鐨刪ttps璇锋眰鏂瑰紡
+		Protocol.registerProtocol("https", new Protocol("https", fcty, 443));
+		//发送请求即可
+		org.apache.commons.httpclient.HttpClient httpclient = new org.apache.commons.httpclient.HttpClient();
+		PostMethod postMethod = new PostMethod(url);
+		try {
+			byte[] requestBytes = bodyString.getBytes("utf-8"); // 将参数转为二进制流
+	        postMethod.setRequestHeader("Content-Type", "application/json");
+	        InputStream inputStream = new ByteArrayInputStream(requestBytes, 0,
+	                requestBytes.length);
+	        RequestEntity requestEntity = new InputStreamRequestEntity(inputStream,
+	                requestBytes.length, "application/json; charset=utf-8"); // 请求体
+	        postMethod.setRequestEntity(requestEntity);
+	        httpclient.executeMethod(postMethod);// 鎵ц�璇锋眰
+	        InputStream soapResponseStream = postMethod.getResponseBodyAsStream();// 鑾峰彇杩斿洖鐨勬祦
+	        byte[] datas = null;
+            datas = readInputStream(soapResponseStream);// 从输入流中读取数据
+            // 灏嗕簩杩涘埗娴佽浆涓篠tring
+            result = new String(datas, "UTF-8");
+		} catch (Exception e) {
+            System.out.println("鎵ц�鍖呭惈澶撮儴鐨刾ost璇锋眰,body:" + bodyString + ",url:" + url + ",鎵ц�閿欒�淇℃伅:" + e);
+            throw new BusinessException("鎵ц�鍖呭惈澶撮儴鐨刾ost璇锋眰,body:" + bodyString + ",url:" + url + ",鎵ц�閿欒�淇℃伅:" + e);
+		} finally {
+			postMethod.releaseConnection();
+		}
+        return result;
+	}
+	
+	/**
+	 * 鑾峰彇鐢ㄦ埛鍒楄〃鏁版嵁
+	 * @param bodyMap
+	 * @return
+	 */
+	public String getUserList(Map<String,Object> bodyMap) throws BusinessException{
+		String result = "";
+//		bodyMap.put("pageNo", 1);
+//		bodyMap.put("updateDate", new UFDate().toDate());//姝ゅ�鏄�坊鍔犳帴鍙f墍闇€浼犲叆鍙傛暟
+		String bodyString = JSONObject.toJSONString(bodyMap);
+		String qurl = getUrl();
+        // 闃块噷鐜��鍩熷悕http://sdcs-api-dpbc1.yunxuetang.cn/v1 ;
+        // ucloud鐜��鍩熷悕 http://sdcs-api-dpb.yunxuetang.cn/v1 ;
+		//娴嬭瘯http://sdcs-api-dpb.yunxuetang.com.cn
+        String url = qurl + "/v1/customdata/users";
+        try {
+        	result = getCouldSchool(bodyMap,url);
+        } catch (Exception e) {
+        	System.out.println("鎵ц�鍖呭惈澶撮儴鐨刾ost璇锋眰,body:" + bodyString + ",url:" + url + ",鎵ц�閿欒�淇℃伅:" + e);
+            throw new BusinessException("鎵ц�鍖呭惈澶撮儴鐨刾ost璇锋眰,body:" + bodyString + ",url:" + url + ",鎵ц�閿欒�淇℃伅:" + e);
+        }
+        return result;
+	}
+	
+	/**
+	 * 瀛︿範璁″垝鎵ц�鏄庣粏锛堝垎椤碉級锛堝�涔犺�鍒掞級
+	 * @param bodyMap
+	 * @param curPage 当前页
+	 * @param pageSize 姣忛〉澶у皬
+	 * @return
+	 * @throws BusinessException 
+	 */
+	public String getStudyplandetailpagelist(Map<String,Object> bodyMap,int curPage,int pageSize) throws BusinessException {
+		String result = "";
+		bodyMap.put("curPage", curPage);//当前页
+		bodyMap.put("pageSize", pageSize);//姣忛〉澶у皬
+//		bodyMap.put("updateDate", new UFDate().toDate());//员工学习知识的最新日期(用于获取增量数据,员工最新学习时间大于等于该日期的数据),示例:2017-10-01
+//		bodyMap.put("updateEndDate", new UFDate().toDate());//鏇存柊缁撴潫鏃堕棿锛屾煡璇�粠鏇存柊寮€濮嬫棩鏈熷埌鏇存柊缁撴潫鏃ユ湡涔嬮棿鏈夎繃鏇存柊鎴栨柊澧炴搷浣滅殑鏁版嵁
+//		bodyMap.put("planID", "");//学习计划id 不是必输项
+//		bodyMap.put("userId", "");//用户id(不必填)
+//		bodyMap.put("status", "");//状态,枚举(未学习NoStart;学习中Studying;已完成 Completed) 不是必输项
+		String bodyString = JSONObject.toJSONString(bodyMap);
+		String qurl = getUrl();
+		String url = qurl + "/v1/studyplans/studyplandetailpagelist";
+        try {
+        	result = getCouldSchool(bodyMap,url);
+        } catch (Exception e) {
+        	System.out.println("鎵ц�鍖呭惈澶撮儴鐨刾ost璇锋眰,body:" + bodyString + ",url:" + url + ",鎵ц�閿欒�淇℃伅:" + e);
+            throw new BusinessException("鎵ц�鍖呭惈澶撮儴鐨刾ost璇锋眰,body:" + bodyString + ",url:" + url + ",鎵ц�閿欒�淇℃伅:" + e);
+        }
+        return result;
+	}
+	
+	/**
+	 * 所有培训课程(分页)
+	 * @param bodyMap
+	 * @param curPage
+	 * @param pageSize
+	 * @return
+	 * @throws BusinessException 
+	 */
+	public String gettrainingcontentlistpage(Map<String,Object> bodyMap,int curPage,int pageSize) throws BusinessException {
+		String result = "";
+		bodyMap.put("curPage", curPage);//当前页
+		bodyMap.put("pageSize", pageSize);//姣忛〉澶у皬
+//		bodyMap.put("updateDate", new UFDate().toDate());//鍩硅�璇剧▼鏇存柊鏃ユ湡 渚嬪�2020-01-01
+//		bodyMap.put("trainingID", "");//更培训ID 不是必输项
+		String bodyString = JSONObject.toJSONString(bodyMap);
+		String qurl = getUrl();
+		String url = qurl + "/v1/training/gettrainingcontentlistpage";
+        try {
+        	result = getCouldSchool(bodyMap,url);
+        } catch (Exception e) {
+        	System.out.println("鎵ц�鍖呭惈澶撮儴鐨刾ost璇锋眰,body:" + bodyString + ",url:" + url + ",鎵ц�閿欒�淇℃伅:" + e);
+            throw new BusinessException("鎵ц�鍖呭惈澶撮儴鐨刾ost璇锋眰,body:" + bodyString + ",url:" + url + ",鎵ц�閿欒�淇℃伅:" + e);
+        }
+        return result;
+	}
+	
+	/**
+	 * 鍩硅�璇剧▼瀹屾垚鎯呭喌(绾夸笅鍩硅�)
+	 * @param bodyMap
+	 * @param curPage
+	 * @param pageSize
+	 * @param trainContentID
+	 * @return
+	 * @throws BusinessException 
+	 */
+	public String getcontentfinshdetaillist(Map<String,Object> bodyMap,int curPage,int pageSize,String trainContentID) throws BusinessException {
+		String result = "";
+		bodyMap.put("curPage", curPage);//当前页
+		bodyMap.put("pageSize", pageSize);//姣忛〉澶у皬
+//		bodyMap.put("updateDate", new UFDate().toDate());//鍩硅�璇剧▼鏇存柊鏃ユ湡 渚嬪�2020-01-01
+		bodyMap.put("trainContentID", trainContentID);//鍩硅�鍐呭�id 蹇呭~
+		String qurl = getUrl();
+		String url = qurl + "/v1/training/getcontentfinshdetaillist";
+		String bodyString = JSONObject.toJSONString(bodyMap);
+        try {
+        	result = getCouldSchool(bodyMap,url);
+        } catch (Exception e) {
+        	System.out.println("鎵ц�鍖呭惈澶撮儴鐨刾ost璇锋眰,body:" + bodyString + ",url:" + url + ",鎵ц�閿欒�淇℃伅:" + e);
+            throw new BusinessException("鎵ц�鍖呭惈澶撮儴鐨刾ost璇锋眰,body:" + bodyString + ",url:" + url + ",鎵ц�閿欒�淇℃伅:" + e);
+        }
+        return result;
+	}
+	
+	/**
+	 * 鑾峰彇鐭ヨ瘑鐩�綍鍒楄〃
+	 * @param bodyMap
+	 * @param curPage
+	 * @param pageSize
+	 * @return
+	 * @throws BusinessException 
+	 */
+	public String getKngcatalogs(Map<String,Object> bodyMap,int curPage,int pageSize) throws BusinessException {
+		String result = "";
+//		bodyMap.put("curPage", curPage);//当前页
+//		bodyMap.put("pageSize", pageSize);//姣忛〉澶у皬
+//		bodyMap.put("updateDate", new UFDate().toDate());//鍩硅�璇剧▼鏇存柊鏃ユ湡 渚嬪�2020-01-01
+//		bodyMap.put("trainContentID", trainContentID);//鍩硅�鍐呭�id 蹇呭~
+		String qurl = getUrl();
+		String url = qurl + "/v1/customdata/knowledges/kngcatalogs";
+		String bodyString = JSONObject.toJSONString(bodyMap);
+        try {
+        	result = getCouldSchool(bodyMap,url);
+        } catch (Exception e) {
+        	System.out.println("鎵ц�鍖呭惈澶撮儴鐨刾ost璇锋眰,body:" + bodyString + ",url:" + url + ",鎵ц�閿欒�淇℃伅:" + e);
+            throw new BusinessException("鎵ц�鍖呭惈澶撮儴鐨刾ost璇锋眰,body:" + bodyString + ",url:" + url + ",鎵ц�閿欒�淇℃伅:" + e);
+        }
+        return result;
+	}
+	
+	/**
+	 * 鑾峰彇鐭ヨ瘑鍒楄〃
+	 * @param bodyMap
+	 * @param curPage
+	 * @param pageSize
+	 * @return
+	 * @throws BusinessException 
+	 */
+	public String getKnowledges(Map<String,Object> bodyMap,int curPage,int pageSize) throws BusinessException {
+		String result = "";
+		String qurl = getUrl();
+		String url = qurl + "/v1/customdata/knowledges";
+		String bodyString = JSONObject.toJSONString(bodyMap);
+        try {
+        	result = getCouldSchool(bodyMap,url);
+        } catch (Exception e) {
+        	System.out.println("鎵ц�鍖呭惈澶撮儴鐨刾ost璇锋眰,body:" + bodyString + ",url:" + url + ",鎵ц�閿欒�淇℃伅:" + e);
+            throw new BusinessException("鎵ц�鍖呭惈澶撮儴鐨刾ost璇锋眰,body:" + bodyString + ",url:" + url + ",鎵ц�閿欒�淇℃伅:" + e);
+        }
+        return result;
+	}
+
+	/**
+	 * 员工所有线上学习记录  所有用户线上学习记录,包含自主学习、学习计划、岗位学习、混合式学习等,并包含课程包明细
+	 * @param bodyMap
+	 * @param curPage
+	 * @param pageSize
+	 * @return
+	 * @throws BusinessException 
+	 */
+	public String getOnlineuserknowledge(Map<String,Object> bodyMap,int curPage,int pageSize) throws BusinessException {
+		String result = "";
+		bodyMap.put("curPage", curPage);//当前页
+		bodyMap.put("pageSize", pageSize);//姣忛〉澶у皬
+//		updateDate 更新开始时间
+//		updateEndDate 更新结束时间 时间间隔不超过一个月,数据量大,建议最好按天查询
+		String bodyString = JSONObject.toJSONString(bodyMap);
+		
+		String qurl = getUrl();
+		String url = qurl + "/v1/knowledge/getonlineuserknowledge";
+        try {
+        	result = getCouldSchool(bodyMap,url);
+        } catch (Exception e) {
+        	System.out.println("鎵ц�鍖呭惈澶撮儴鐨刾ost璇锋眰,body:" + bodyString + ",url:" + url + ",鎵ц�閿欒�淇℃伅:" + e);
+            throw new BusinessException("鎵ц�鍖呭惈澶撮儴鐨刾ost璇锋眰,body:" + bodyString + ",url:" + url + ",鎵ц�閿欒�淇℃伅:" + e);
+        }
+        return result;
+	}
+	
+}

+ 4 - 3
hrhi/src/private/nc/impl/hr/train/TrainSubImportPlugin.java

@@ -37,12 +37,12 @@ public class TrainSubImportPlugin implements IBackgroundWorkPlugin {
 		BaseDAO dao = new BaseDAO();
 		Map map = arg0.getKeyMap();
 		Date date = new Date();
-		int dyear = date.getYear();
-		int qyear = date.getYear();
+		int dyear = date.getYear() + 1900;
+		int qyear = date.getYear() + 1900;
 		if(map.get("nums") != null && !"".equals(map.get("nums"))) {
 			int nums = Integer.valueOf(arg0.getKeyMap().get("nums").toString());
 			if(nums == 0) {
-				qyear = 2020;
+				qyear = 2019;
 			} else {
 				qyear = dyear - Integer.valueOf(map.get("nums").toString());
 			}
@@ -126,5 +126,6 @@ public class TrainSubImportPlugin implements IBackgroundWorkPlugin {
 		alertObj.setReturnType(PreAlertReturnType.RETURNMESSAGE);
 		return alertObj;
 	}
+	
 
 }

+ 30 - 0
hrhi/src/public/nc/hrhi/httpUtil/HttpClientUtil.java

@@ -0,0 +1,30 @@
+package nc.hrhi.httpUtil;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.protocol.Protocol;
+import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
+/*
+ * 利用HttpClient进行post请求的工具类
+ */
+public class HttpClientUtil {
+
+    public static String doGet(String url) throws Exception {
+        //声明
+        ProtocolSocketFactory fcty = new MySecureProtocolSocketFactory();
+        //加入相关的https请求方式
+        Protocol.registerProtocol("https", new Protocol("https", fcty, 443));
+        //发送请求即可
+        org.apache.commons.httpclient.HttpClient httpclient = new org.apache.commons.httpclient.HttpClient();
+        GetMethod httpget = new GetMethod(url);
+        System.out.println("======url:" + url);
+        try {
+            httpclient.executeMethod(httpget);
+            return httpget.getResponseBodyAsString();
+        } catch (Exception ex) {
+            ex.printStackTrace();
+            throw new Exception(ex.getMessage());
+        } finally {
+            httpget.releaseConnection();
+        }
+    }
+
+}

+ 96 - 0
hrhi/src/public/nc/hrhi/httpUtil/MySecureProtocolSocketFactory.java

@@ -0,0 +1,96 @@
+package nc.hrhi.httpUtil;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.net.UnknownHostException;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import org.apache.commons.httpclient.ConnectTimeoutException;
+import org.apache.commons.httpclient.HttpClientError;
+import org.apache.commons.httpclient.params.HttpConnectionParams;
+import org.apache.commons.httpclient.protocol.ControllerThreadSocketFactory;
+import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory;
+
+public class MySecureProtocolSocketFactory implements SecureProtocolSocketFactory {
+
+    //这里添加一个属性,主要目的就是来获取ssl跳过验证
+    private SSLContext sslContext = null;
+    /**
+     * Constructor for MySecureProtocolSocketFactory.
+     */
+    public MySecureProtocolSocketFactory() {
+    }
+    /**
+     * 这个创建一个获取SSLContext的方法,导入MyX509TrustManager进行初始化
+     * @return
+     */
+    private static SSLContext createEasySSLContext() {
+        try {
+            SSLContext context = SSLContext.getInstance("SSL");
+            context.init(null, new TrustManager[] { new MyX509TrustManager() },
+                    null);
+            return context;
+        } catch (Exception e) {
+            throw new HttpClientError(e.toString());
+        }
+    }
+
+    /**
+     * 判断获取SSLContext
+     * @return
+     */
+    private SSLContext getSSLContext() {
+        if (this.sslContext == null) {
+            this.sslContext = createEasySSLContext();
+        }
+        return this.sslContext;
+    }
+    //后面的方法基本上就是带入相关参数就可以了
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.apache.commons.httpclient.protocol.ProtocolSocketFactory#createSocket(java.lang.String,
+     *      int, java.net.InetAddress, int)
+     */
+    public Socket createSocket(String host, int port, InetAddress clientHost,int clientPort) throws IOException, UnknownHostException {
+        return getSSLContext().getSocketFactory().createSocket(host, port,clientHost, clientPort);
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.apache.commons.httpclient.protocol.ProtocolSocketFactory#createSocket(java.lang.String,
+     *      int, java.net.InetAddress, int,
+     *      org.apache.commons.httpclient.params.HttpConnectionParams)
+     */
+    public Socket createSocket(final String host, final int port,final InetAddress localAddress, final int localPort,
+                               final HttpConnectionParams params) throws IOException,UnknownHostException, ConnectTimeoutException {
+        if (params == null) {
+            throw new IllegalArgumentException("Parameters may not be null");
+        }
+        int timeout = params.getConnectionTimeout();
+        if (timeout == 0) {
+            return createSocket(host, port, localAddress, localPort);
+        } else {
+            return ControllerThreadSocketFactory.createSocket(this, host, port,localAddress, localPort, timeout);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see SecureProtocolSocketFactory#createSocket(java.lang.String,int)
+     */
+    public Socket createSocket(String host, int port) throws IOException,UnknownHostException {
+        return getSSLContext().getSocketFactory().createSocket(host, port);
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see SecureProtocolSocketFactory#createSocket(java.net.Socket,java.lang.String,int,boolean)
+     */
+    public Socket createSocket(Socket socket, String host, int port,boolean autoClose) throws IOException, UnknownHostException {
+        return getSSLContext().getSocketFactory().createSocket(socket, host,port, autoClose);
+    }
+}

+ 126 - 0
hrhi/src/public/nc/hrhi/httpUtil/SSLSocketClient.java

@@ -0,0 +1,126 @@
+package nc.hrhi.httpUtil;
+import java.security.SecureRandom;
+import java.security.cert.X509Certificate;
+import java.util.Arrays;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+
+import org.apache.http.util.TextUtils;
+
+import okhttp3.OkHttpClient;
+
+//https://www.cnblogs.com/chinaifae/articles/10442797.html
+public class SSLSocketClient {
+
+    //获取这个SSLSocketFactory
+    public static SSLSocketFactory getSSLSocketFactory() {
+        try {
+            SSLContext sslContext = SSLContext.getInstance("SSL");
+            sslContext.init(null, getTrustManager(), new SecureRandom());
+            return sslContext.getSocketFactory();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    //获取TrustManager
+    private static TrustManager[] getTrustManager() {
+        TrustManager[] trustAllCerts = new TrustManager[]{
+                new X509TrustManager() {
+                    @Override
+                    public void checkClientTrusted(X509Certificate[] chain, String authType) {
+                    }
+
+                    @Override
+                    public void checkServerTrusted(X509Certificate[] chain, String authType) {
+                    }
+
+                    @Override
+                    public X509Certificate[] getAcceptedIssuers() {
+                        return new X509Certificate[]{};
+                    }
+                }
+        };
+        return trustAllCerts;
+    }
+
+    //获取HostnameVerifier
+    public static HostnameVerifier getHostnameVerifier() {
+        HostnameVerifier hostnameVerifier = new HostnameVerifier() {
+            @Override
+            public boolean verify(String s, SSLSession sslSession) {
+                return true;
+            }
+        };
+        return hostnameVerifier;
+    }
+    
+    /**
+
+	* okHttp3添加信任所有证书
+	 * @return 
+	 * @return 
+
+	* @return
+
+	*/
+
+	public static OkHttpClient OkHttpClientgetUnsafeOkHttpClient() {
+
+	try {
+
+		final TrustManager[] trustAllCerts =new TrustManager[]{
+			new X509TrustManager() {
+	
+				@Override
+				public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {}
+		
+				@Override
+				public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {}
+		
+				@Override
+				public java.security.cert.X509Certificate[]getAcceptedIssuers() {
+					return new java.security.cert.X509Certificate[]{};
+				}
+			}
+		};
+
+		final SSLContext sslContext = SSLContext.getInstance("TLS");
+
+		sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
+
+		final javax.net.ssl.SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
+
+		OkHttpClient.Builder builder =new OkHttpClient.Builder();
+
+
+		builder.sslSocketFactory(sslSocketFactory,(X509TrustManager)trustAllCerts[0]);
+
+		builder.hostnameVerifier(new HostnameVerifier() {
+		String[]arr =new String[]{};
+		
+		@Override
+		public boolean verify(String hostname, SSLSession session) {
+
+		if (TextUtils.isEmpty(hostname)) {
+	
+			return false;
+	
+		}
+
+		return !Arrays.asList(arr).contains(hostname);
+	
+			}
+	
+		});
+			return builder.build();
+		}catch (Exception e){
+			throw new RuntimeException(e);
+		}
+	}
+}

+ 123 - 0
hrhi/src/public/nc/plugin/hi/entrymng/EntryPrintDataSourceForMail.java

@@ -0,0 +1,123 @@
+/****************************************************************************************
+ * sunpenga
+ * 2011-8-5
+ ***************************************************************************************/
+package nc.plugin.hi.entrymng;
+
+import nc.bs.framework.common.NCLocator;
+import nc.bs.logging.Logger;
+import nc.itf.hi.IPsndocQryService;
+import nc.itf.hi.entrymng.IEntrymngQueryService;
+import nc.md.persist.framework.MDPersistenceService;
+import nc.ui.pub.print.IMetaDataDataSource;
+import nc.vo.hi.entrymng.AggEntryapplyVO;
+import nc.vo.hi.entrymng.EntryapplyVO;
+import nc.vo.hi.psndoc.EduVO;
+import nc.vo.hi.psndoc.FamilyVO;
+import nc.vo.hi.psndoc.LinkmanVO;
+import nc.vo.hi.psndoc.PsndocAggVO;
+import nc.vo.hi.psndoc.WorkVO;
+import nc.vo.pub.BusinessException;
+import nc.vo.pub.SuperVO;
+
+/**
+ * @author sunpenga
+ * 
+ */
+public class EntryPrintDataSourceForMail implements IMetaDataDataSource {
+
+	// 单据主表ID
+	private String billId = null;
+
+	// 单据类型
+	private String billType = null;
+
+	public EntryPrintDataSourceForMail(String billId, String billType) {
+		super();
+		this.billId = billId;
+		this.billType = billType;
+	}
+
+	@Override
+	public String[] getAllDataItemExpress() {
+		return null;
+	}
+
+	@Override
+	public String[] getAllDataItemNames() {
+		return null;
+	}
+
+	@Override
+	public String[] getDependentItemExpressByExpress(String arg0) {
+		return null;
+	}
+
+	@Override
+	public String[] getItemValuesByExpress(String arg0) {
+		if("pk_entryapply".equals(arg0)) {
+			return new String[] {billId};
+		}
+		return null;
+	}
+
+	@Override
+	public String getModuleName() {
+		return null;
+	}
+
+	@Override
+	public boolean isNumber(String arg0) {
+		return false;
+	}
+
+	@Override
+	public Object[] getMDObjects() {
+
+		try {
+			AggEntryapplyVO vo = NCLocator.getInstance().lookup(IEntrymngQueryService.class).queryByPk(getBillId());
+			
+		   String pk_psndoc = ((EntryapplyVO)vo.getParentVO()).getPk_psndoc();
+			 // 没有通过主键数组查询的接口,暂时先循环查询
+           PsndocAggVO aggvo = MDPersistenceService.lookupPersistenceQueryService().queryBillOfVOByPK(PsndocAggVO.class, pk_psndoc, false);
+           //此处只支持入职登记表打印的四个子集
+
+           String order = " recordnum desc ";
+           IPsndocQryService psndocQryService = NCLocator.getInstance().lookup(IPsndocQryService.class);
+           String cond = " pk_psndoc = '" + pk_psndoc + "' ";
+           SuperVO[] works = psndocQryService.querySubVO(WorkVO.class, cond, order);
+           SuperVO[] edus = psndocQryService.querySubVO(EduVO.class, cond, order);
+           SuperVO[] familys = psndocQryService.querySubVO(FamilyVO.class, cond, order);
+           SuperVO[] linkmans = psndocQryService.querySubVO(LinkmanVO.class, cond, order);
+           aggvo.setTableVO(WorkVO.getDefaultTableName(),works);
+           aggvo.setTableVO(EduVO.getDefaultTableName(),edus);
+           aggvo.setTableVO(FamilyVO.getDefaultTableName(),familys);
+           aggvo.setTableVO(LinkmanVO.getDefaultTableName(),linkmans);
+           if("6101-Cxx-01".equals(((EntryapplyVO)vo.getParentVO()).getTranstype())) {
+        	   return new AggEntryapplyVO[] {vo};
+           }
+		   return new PsndocAggVO[] {aggvo};	
+//		   return new AggEntryapplyVO[]{vo};
+		} catch (BusinessException e) {
+			Logger.error(e.getMessage(), e);
+			return null;
+		}
+	}
+
+	public void setBillId(String billId) {
+		this.billId = billId;
+	}
+
+	public String getBillId() {
+		return billId;
+	}
+
+	public void setBillType(String billType) {
+		this.billType = billType;
+	}
+
+	public String getBillType() {
+		return billType;
+	}
+
+}

+ 32 - 1
hrkq/hrkq/src/client/nccloud/hrkq/hrkq/monthottimevo/action/MonthOtTimeVOQueryListAction.java

@@ -4,6 +4,7 @@ package nccloud.hrkq.hrkq.monthottimevo.action;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 import com.alibaba.fastjson.JSONArray;
 
@@ -12,6 +13,7 @@ import nc.md.persist.framework.IMDPersistenceQueryService;
 import nc.ui.querytemplate.querytree.IQueryScheme;
 import nc.vo.hi.psndoc.PsnJobVO;
 import nc.vo.hrkq.monthottime.AggMonthOtTimeVO;
+import nc.vo.pf.pub.util.SQLUtil;
 import nc.vo.pub.BusinessException;
 import nc.vo.pub.lang.UFDate;
 import nc.vo.pubapp.pattern.pub.Constructor;
@@ -26,7 +28,10 @@ import nccloud.framework.web.ui.pattern.grid.Grid;
 import nccloud.framework.web.ui.pattern.grid.GridOperator;
 import nccloud.hrkq.hrkq.monthottimevo.hrkq.bean.PageQueryVO;
 import nccloud.hrkq.hrkq.monthottimevo.hrkq.util.CommonUtil;
+import nccloud.itf.hrkq.hrkq.IMonthottimevoMaintain;
+import nccloud.web.hr.pub.HRNccQueryHelper;
 import nccloud.web.hrkq.common.utils.AttendDataUtil;
+import nccloud.web.uapbd.commons.web.ParamUtils;
 
 /**
  * 列表查询(查询方案)操作
@@ -38,17 +43,43 @@ public class MonthOtTimeVOQueryListAction implements ICommonAction {
   public Object doAction(IRequest paramIRequest) {
     PageQueryVO page = null;
     QueryTreeFormatVO queryParam = this.getQueryParam(paramIRequest);
+    String busiaction = paramIRequest.getRequestJsonVO().getSysParamJson().getBusiaction();
     try {
       // 1、 获取scheme
       IQueryScheme scheme = this.getScheme(queryParam);
       // 2、调用服务,获取VO信息(平台默认生成方法,有效率问题,最佳实现要改掉)
 //      AggMonthOtTimeVO[] aggvos =
 //          CommonUtil.getMaintainService().query(scheme);
+      List<String> pkList;
+      String pkGroup = SessionContext.getInstance().getClientInfo().getPk_group();
+      String userId = SessionContext.getInstance().getClientInfo().getUserid(); 
       String whereSql = scheme.getWhereSQLOnly();
       IMDPersistenceQueryService service = CommonUtil.getMDQueryService();
       PsnJobVO psnjobVO = AttendDataUtil.queryPsnJob(null);
-      String userId = SessionContext.getInstance().getClientInfo().getUserid();
       String pk_psndocSql = " (pk_psndoc = '"+psnjobVO.getPk_psndoc()+"' or billmaker ='"+userId+"') and isnull(dr,0) = 0 order by creationtime desc";
+      if(busiaction.indexOf("本月加班办理") >= 0) {
+    	  IMonthottimevoMaintain serviceMaintain = CommonUtil.getMaintainService();
+    	  //有权限的部门
+//    	  List<String> deptList = serviceMaintain.getPowerDeptMap(userId, pkGroup, SessionContext.getInstance().getAppcode());
+    	  String sql = "select  c.pk_org as pk_org\n" +
+					"          from sm_user a\n" + 
+					"         inner join sm_user_role b\n" + 
+					"            on a.cuserid = b.cuserid\n" + 
+					"         inner join sm_subject_org c\n" + 
+					"            on b.pk_role = c.subjectid\n" + 
+					"         inner join org_dept d\n" + 
+					"            on c.pk_org = d.pk_dept\n" + 
+					"         inner join sm_role e\n" + 
+					"            on b.pk_role = e.pk_role\n" + 
+					"         where   a.cuserid = '"+userId+"'";
+    	  
+//    	  if(deptList != null && deptList.size() > 0) {
+//    		  pk_psndocSql = SQLUtil.buildSqlForIn("pk_dept",deptList.toArray(new String[0])) + " and isnull(dr,0) = 0 order by creationtime desc";
+    		  pk_psndocSql = " pk_dept in("+sql+")" + " and isnull(dr,0) = 0 order by creationtime desc";
+//    	  }
+      } else {
+    	  
+      }
       String wheresql2 = whereSql != null && whereSql.length() > 0 ? whereSql + " and "+ pk_psndocSql : pk_psndocSql;
       Collection<AggMonthOtTimeVO> bills2 =
           service.queryBillOfVOByCond(AggMonthOtTimeVO.class, wheresql2, false,

+ 105 - 0
hrkq/hrkq/src/private/nccloud/impl/hrkq/hrkq/MonthottimevoMaintainImpl.java

@@ -1,10 +1,18 @@
 
 package nccloud.impl.hrkq.hrkq;
 
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import nc.bs.framework.common.NCLocator;
+import nc.bs.logging.Logger;
+import nc.hr.utils.InSQLCreator;
+import nc.hr.utils.ResHelper;
+import nc.itf.org.IOrgConst;
+import nc.itf.uap.IUAPQueryBS;
 import nc.md.persist.framework.MDPersistenceService;
 import nc.ui.querytemplate.querytree.IQueryScheme;
 import nc.vo.bd.defdoc.DefdocVO;
@@ -15,6 +23,8 @@ import nc.vo.pub.lang.UFDate;
 import nc.vo.pub.lang.UFDouble;
 import nccloud.impl.pub.ace.AceAggbusiMonthOtTimeVOPubServiceImpl;
 import nccloud.itf.hrkq.hrkq.IMonthottimevoMaintain ;
+import nccloud.pub.hrkq.util.StringListProcessor;
+import nccloud.pubitf.baseapp.apprbac.IAppAndOrgPermQueryPubService;
 
 public class MonthottimevoMaintainImpl extends AceAggbusiMonthOtTimeVOPubServiceImpl implements IMonthottimevoMaintain  {
 
@@ -101,4 +111,99 @@ public class MonthottimevoMaintainImpl extends AceAggbusiMonthOtTimeVOPubService
 		public List<MonthOtTimeBVO> queryBVOByPkPsndoc(String pk_psndoc) throws BusinessException {
 			return super.queryBVOByPkPsndoc(pk_psndoc);
 		}
+		
+		/**
+	     * 获取当前登录人有权限的部门
+	     *
+	     * @param userId  用户
+	     * @param PkGroup 集团
+	     * @param appCode appCode
+	     * @return 返回sql
+	     * @throws BusinessException
+	     */
+	    private String getPowerDeptCondition(String userId, String PkGroup, String appCode) throws BusinessException {
+	        IAppAndOrgPermQueryPubService service = NCLocator.getInstance().lookup(IAppAndOrgPermQueryPubService.class);
+
+	        String[] deptIds = service.queryUserPermOrgPksByAppAndWithOrgTypesFilter(userId, appCode, new String[]{IOrgConst.DEPTORGTYPE}, PkGroup);
+	        if (deptIds == null || deptIds.length == 0) {
+	            return null;
+	        }
+	        InSQLCreator isc = new InSQLCreator();
+	        String strInSql = null;
+	        try {
+	            strInSql = isc.getInSQL(deptIds);
+	        } catch (BusinessException e) {
+	            Logger.error(e.getMessage(), e);
+	            throw new RuntimeException(ResHelper.getString("6020hrkq", "6020hrkq00014")
+	                    /*@res "查询有权限部门异常!" */);
+	        }
+	        if (strInSql.startsWith("(")) {
+	            return "(select org_dept.pk_dept from org_dept inner join org_admin_enable on org_dept.pk_org=org_admin_enable.pk_adminorg where org_dept.hrcanceled<>'Y' and org_dept.pk_dept in " + strInSql + ")";
+	        } else {
+	            return "(select org_dept.pk_dept from org_dept inner join org_admin_enable on org_dept.pk_org=org_admin_enable.pk_adminorg where org_dept.hrcanceled<>'Y' and org_dept.pk_dept in (" + strInSql + "))";
+	        }
+	    }
+	    
+	    /**
+	     * 获取有权限部门map
+	     *
+	     * @param userId  userId
+	     * @param PkGroup pkGroup
+	     * @param appCode appCode
+	     * @return map
+	     * @throws BusinessException BusinessException
+	     */
+	    @Override
+	    public List<String> getPowerDeptMap(String userId, String PkGroup, String appCode) throws BusinessException {
+//	        IAppAndOrgPermQueryPubService service = NCLocator.getInstance().lookup(IAppAndOrgPermQueryPubService.class);
+//	        List<String> result = new ArrayList();
+//	        String[] deptIds = service.queryUserPermOrgPksByAppAndWithOrgTypesFilter(userId, appCode, new String[]{IOrgConst.DEPTORGTYPE}, PkGroup);
+//	        if (deptIds == null || deptIds.length == 0) {
+//	            return null;
+//	        }
+//	        InSQLCreator isc = new InSQLCreator();
+//	        String strInSql = null;
+//	        try {
+//	            strInSql = isc.getInSQL(deptIds);
+//	        } catch (BusinessException e) {
+//	            Logger.error(e.getMessage(), e);
+//	            throw new RuntimeException(ResHelper.getString("6020hrkq", "6020hrkq00014")
+//	                    /*@res "查询有权限部门异常!" */);
+//	        }
+//	        String sql;
+//	        if (strInSql.startsWith("(")) {
+//	            sql = "(select org_dept.pk_dept from org_dept inner join org_admin_enable on org_dept.pk_org=org_admin_enable.pk_adminorg where org_dept.hrcanceled<>'Y' and org_dept.pk_dept in " + strInSql + ")";
+//	        } else {
+//	            sql = "(select org_dept.pk_dept from org_dept inner join org_admin_enable on org_dept.pk_org=org_admin_enable.pk_adminorg where org_dept.hrcanceled<>'Y' and org_dept.pk_dept in (" + strInSql + "))";
+//	        }
+//	        List<String> powerDeptIds = (List<String>) NCLocator.getInstance().lookup(IUAPQueryBS.class).executeQuery(sql,
+//	                new StringListProcessor());
+//	        Map<String, String> deptMap = new HashMap<>();
+//	        for (String powerDeptId : powerDeptIds) {
+//	            if (!deptMap.containsKey(powerDeptId)) {
+//	                deptMap.put(powerDeptId, "1");
+//	                result.add(powerDeptId);
+//	            }
+//	        }
+//	        if (deptMap.isEmpty()) {
+//	            return null;
+//	        }
+	    	
+
+			String sql = "select  c.pk_org as pk_org\n" +
+						"          from sm_user a\n" + 
+						"         inner join sm_user_role b\n" + 
+						"            on a.cuserid = b.cuserid\n" + 
+						"         inner join sm_subject_org c\n" + 
+						"            on b.pk_role = c.subjectid\n" + 
+						"         inner join org_dept d\n" + 
+						"            on c.pk_org = d.pk_dept\n" + 
+						"         inner join sm_role e\n" + 
+						"            on b.pk_role = e.pk_role\n" + 
+						"         where   a.cuserid = '"+userId+"'";
+			List<String> powerDeptIds = (List<String>) NCLocator.getInstance().lookup(IUAPQueryBS.class).executeQuery(sql,
+	                new StringListProcessor());
+	    	
+	        return powerDeptIds;
+	    }
 }

+ 11 - 0
hrkq/hrkq/src/public/nccloud/itf/hrkq/hrkq/IMonthottimevoMaintain.java

@@ -84,4 +84,15 @@ public interface IMonthottimevoMaintain {
          * @throws BusinessException
          */
         public List<MonthOtTimeBVO> queryBVOByPkPsndoc(String pk_psndoc) throws BusinessException;
+        
+        /**
+	     * »ñÈ¡ÓÐȨÏÞ²¿ÃÅmap
+	     *
+	     * @param userId  userId
+	     * @param PkGroup pkGroup
+	     * @param appCode appCode
+	     * @return map
+	     * @throws BusinessException BusinessException
+	     */
+        public List<String> getPowerDeptMap(String userId, String PkGroup, String appCode) throws BusinessException;
 }

+ 382 - 0
hrrpt/nccloud/src/client/nccloud/web/hr/rpt/action/WaRptQryAfterEditAction.java

@@ -0,0 +1,382 @@
+package nccloud.web.hr.rpt.action;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import nc.bs.logging.Logger;
+import nc.hr.utils.ResHelper;
+import nc.itf.hr.wa.IClassitemQry;
+import nc.itf.hr.wa.IPaydataQueryService;
+import nc.itf.hr.wa.IWaClass;
+import nc.itf.hr.wa.IWaProviderService;
+import nc.itf.hr.wa.IWaPub;
+import nc.itf.org.IOrgConst;
+import nc.vo.bd.pub.NODE_TYPE;
+import nc.vo.hr.tools.pub.GeneralVO;
+import nc.vo.pub.BusinessException;
+import nc.vo.pub.BusinessRuntimeException;
+import nc.vo.uif2.LoginContext;
+import nc.vo.wa.category.WaClassVO;
+import nc.vo.wa.classitem.WaClassItemVO;
+import nc.vo.wa.item.WaItemVO;
+import nc.vo.wa.paydata.WaPaydataDspVO;
+import nc.vo.wa.pub.PeriodStateVO;
+import nc.vo.wa.pub.WaLoginContext;
+import nc.vo.wa.pub.WaLoginVO;
+import nc.wa.smartmodel.provider.util.WaGlobalVO;
+import nc.wa.smartmodel.provider.util.WaProviderConst;
+import nccloud.commons.lang.ArrayUtils;
+import nccloud.commons.lang.StringUtils;
+import nccloud.framework.service.ServiceLocator;
+import nccloud.framework.web.container.IRequest;
+import nccloud.framework.web.container.SessionContext;
+import nccloud.framework.web.ui.model.row.Cell;
+import nccloud.framework.web.ui.model.row.Row;
+import nccloud.framework.web.ui.pattern.form.Form;
+import nccloud.web.hr.pub.HRCommonAction;
+import nccloud.web.hr.pub.HRNccTemplateUtils;
+import nccloud.web.hr.pub.HRNccUtils;
+import nccloud.web.hr.rpt.pub.INccHrRptConst;
+import nccloud.web.hrhi.pub.PsndocTempUtils;
+import nccloud.web.uapbd.commons.web.ParamUtils;
+
+/**
+ * 编辑后事件
+ */
+public class WaRptQryAfterEditAction extends HRCommonAction {
+
+	@Override
+	public <T> Object execute(IRequest iRequest, T t) throws Exception {
+		ParamUtils param = new ParamUtils(iRequest);
+		LoginContext loginContext = HRNccUtils.getLoginContext(param);
+
+		String areaCode = param.getString("area_code", null);
+		if (StringUtils.isBlank(areaCode)) {
+			throw new BusinessRuntimeException("Parameter Error!");
+		}
+
+		String itemKey = param.getString("key", null);
+		if (StringUtils.isBlank(itemKey)) {
+			throw new BusinessRuntimeException("Parameter Error!");
+		}
+		HashMap result = new HashMap();
+		// model参数
+		GeneralVO vo = HRNccTemplateUtils.getVOFromForm(GeneralVO.class, PsndocTempUtils.getModelStr(param, null));
+		if ("WaAccountByYearQueryConditionPanel".equals(areaCode)) {
+			// 单位年度工资台账
+			if (WaProviderConst.WA_CLASS_PK.equals(itemKey)) {
+				String waClassPk = (String) vo.getAttributeValue(WaProviderConst.WA_CLASS_PK);
+				WaClassVO waclassVO;
+				String Cyear = "";
+				waclassVO = getWaClass(waClassPk);
+				if (null != waclassVO) {
+					Cyear = waclassVO.getCyear();
+				}
+				vo.setAttributeValue(WaProviderConst.BASE_CYEAR, Cyear);
+				Form form = HRNccTemplateUtils.getFormWithArea(INccHrRptConst.TEMPLET_WARPT_GRP, areaCode, vo);
+				if (form != null && form.getModel() != null && form.getModel().getRows() != null && form.getModel().getRows().length > 0) {
+					for (Row row : form.getModel().getRows()) {
+						Cell cell = row.getCell(WaProviderConst.BASE_CYEAR);
+						if (cell != null) {
+							cell.setDisplay((String) cell.getValue());
+						}
+					}
+				}
+				result.put("form", form);
+				WaGlobalVO waGlobalVO = new WaGlobalVO();
+				waGlobalVO.setWaClassPK(waClassPk);
+				waGlobalVO.setWaYear(Cyear);
+				result.put("item_list", getItemList(waGlobalVO, 0));
+				extracted(result, vo);
+				return result;
+			}
+		} else if ("WaItemQueryConditionPanelForGroup".equals(areaCode) || "WaBaseQueryConditionPanel".equals(areaCode) || "WaSumByPsnclQueryConditionPanel".equals(areaCode)
+				|| "WaSumByDeptQueryConditionPanel".equals(areaCode) || "WaItemQueryConditionPanel".equals(areaCode)) {
+			// 集团级薪资明细表&薪资变动***表&人员类别汇总表&部门汇总表&薪资明细表
+			if (WaProviderConst.WA_CLASS_PK.equals(itemKey)) {
+				String waClassPk = (String) vo.getAttributeValue(WaProviderConst.WA_CLASS_PK);
+				WaClassVO waclassVO;
+				String Cperiod = "";
+				waclassVO = getWaClass(waClassPk);
+				if (waclassVO != null) {
+					Cperiod = waclassVO.getCyear() + waclassVO.getCperiod();
+				}
+				vo.setAttributeValue(WaProviderConst.BASE_CPERIOD, null);
+				vo.setAttributeValue(WaProviderConst.COMPARE_CPERIOD, Cperiod);
+				Form form = HRNccTemplateUtils
+						.getFormWithArea("WaItemQueryConditionPanelForGroup".equals(areaCode) ? INccHrRptConst.TEMPLET_WARPT_GRP : INccHrRptConst.TEMPLET_WARPT_ORG, areaCode, vo);
+				if (form != null && form.getModel() != null && form.getModel().getRows() != null && form.getModel().getRows().length > 0) {
+					for (Row row : form.getModel().getRows()) {
+						Cell cell = row.getCell(WaProviderConst.COMPARE_CPERIOD);
+						if (cell != null) {
+							cell.setDisplay((String) cell.getValue());
+						}
+					}
+				}
+				result.put("form", form);
+				return result;
+			} else if (WaProviderConst.BASE_CPERIOD.equals(itemKey)) {
+				String baseCperiod = (String) vo.getAttributeValue(WaProviderConst.BASE_CPERIOD);
+				String waClassPk = (String) vo.getAttributeValue(WaProviderConst.WA_CLASS_PK);
+				WaGlobalVO waGlobalVO = null;
+				if (baseCperiod != null && baseCperiod.length() == 6) {
+					String m_waYear = baseCperiod.substring(0, 4);
+					String m_waPeriod = baseCperiod.substring(4, baseCperiod.length());
+					// 设置薪资类别参数
+					waGlobalVO = new WaGlobalVO();
+					waGlobalVO.setWaClassPK(waClassPk);
+					waGlobalVO.setWaYear(m_waYear);
+					waGlobalVO.setWaPeriod(m_waPeriod);
+					waGlobalVO.setCurPk_org(loginContext.getPk_org());
+					waGlobalVO.setCurUserid(loginContext.getPk_loginUser());
+				}
+				result.put("item_list", getItemList(waGlobalVO, 0));
+				extracted(result, vo);
+				if ("WaBaseQueryConditionPanel".equals(areaCode) || "WaSumByDeptQueryConditionPanel".equals(areaCode) || "WaItemQueryConditionPanel".equals(areaCode)) {
+					// 这三个要查询数值型薪资项目和字符型薪资项目
+					IPaydataQueryService service = ServiceLocator.find(IPaydataQueryService.class);
+					String m_waYear = baseCperiod.substring(0, 4);
+					String m_waPeriod = baseCperiod.substring(4, baseCperiod.length());
+					WaLoginContext waLoginContext = getWaLoginContext(loginContext.getPk_group(), loginContext.getPk_org(), m_waYear, m_waPeriod, waClassPk, null, null, null, null,
+							"");// 补发期间参数
+					WaClassItemVO[] itemVOs = service.getUserClassItemVOs(waLoginContext);
+					// 用户对该方案下所有项目都没有权限的时候,就会NULL
+					if (!ArrayUtils.isEmpty(itemVOs)) {
+						List<Map<String, Object>> numlist = new ArrayList<>();
+						List<Map<String, Object>> stringlist = new ArrayList<>();
+						result.put("numlist", numlist);
+						result.put("stringlist", stringlist);
+						for (WaClassItemVO item : itemVOs) {
+							Map<String, Object> headMap = new LinkedHashMap<>();
+							headMap.put("attrcode", item.getItemkey());
+							headMap.put("datatype", item.getIitemtype());
+							headMap.put("label", item.getName());
+							headMap.put("scale", item.getIflddecimal());
+							headMap.put("maxlength", item.getIfldwidth());
+							if (item.getIitemtype() == 0) {
+								// 数字型
+								numlist.add(headMap);
+							} else if (item.getIitemtype() == 1) {
+								// 字符型
+								stringlist.add(headMap);
+							}
+						}
+					}
+				}
+				return result;
+			}
+
+		} else if ("WaAccountByMonthQueryConditionPanel".equals(areaCode)) {
+			// 年度对比分析
+			if (WaProviderConst.WA_CLASS_PK.equals(itemKey)) {
+				String waClassPk = (String) vo.getAttributeValue(WaProviderConst.WA_CLASS_PK);
+				WaClassVO waclassVO;
+				String Cyear = "";
+				waclassVO = getWaClass(waClassPk);
+				if (waclassVO != null) {
+					Cyear = waclassVO.getCyear();
+				}
+				vo.setAttributeValue(WaProviderConst.BASE_CYEAR, null);
+				vo.setAttributeValue(WaProviderConst.COMPARE_CYEAR, Cyear);
+				Form form = HRNccTemplateUtils.getFormWithArea(INccHrRptConst.TEMPLET_WARPT_GRP, areaCode, vo);
+				if (form != null && form.getModel() != null && form.getModel().getRows() != null && form.getModel().getRows().length > 0) {
+					for (Row row : form.getModel().getRows()) {
+						Cell cell = row.getCell(WaProviderConst.COMPARE_CYEAR);
+						if (cell != null) {
+							cell.setDisplay((String) cell.getValue());
+						}
+					}
+				}
+				result.put("form", form);
+				WaGlobalVO waGlobalVO = new WaGlobalVO();
+				waGlobalVO.setWaClassPK(waClassPk);
+				waGlobalVO.setWaYear(Cyear);
+				result.put("item_list", getItemList(waGlobalVO, 0));
+				extracted(result, vo);
+				return result;
+			}
+		} else if ("WaMultiRptQueryConditionPanel".equals(areaCode)) {
+			if (WaProviderConst.WA_CLASS_PK.equals(itemKey)) {
+				String curUserid = loginContext.getPk_loginUser();
+				String m_waYear = (String) vo.getAttributeValue(WaProviderConst.CAC_CYEAR);
+				String m_waPeriod = (String) vo.getAttributeValue(WaProviderConst.CAC_CPERIOD);
+				if (m_waPeriod != null && m_waPeriod.trim().length() == 1) {
+					m_waPeriod = "0" + m_waPeriod.trim();
+				}
+				String pk_org = loginContext.getPk_org();
+				String classPKs = (String) vo.getAttributeValue(WaProviderConst.WA_CLASS_PK);
+				if (StringUtils.isBlank(classPKs)) {
+					//
+					return result;
+				}
+				String[] waClassPks = classPKs.split(",");
+				// 设置薪资类别参数
+				WaGlobalVO[] waGlobalVOs = new WaGlobalVO[waClassPks.length];
+				for (int i = 0; i < waClassPks.length; i++) {
+					waGlobalVOs[i] = new WaGlobalVO();
+					waGlobalVOs[i].setCurUserid(curUserid);
+					waGlobalVOs[i].setCurPk_org(pk_org);
+					waGlobalVOs[i].setWaClassPK(waClassPks[i]);
+					waGlobalVOs[i].setWaYear(m_waYear);
+					waGlobalVOs[i].setWaPeriod(m_waPeriod);
+				}
+				WaItemVO[] items = ServiceLocator.find(IClassitemQry.class).queryItemInfoWithPowerForMutiClasses(waGlobalVOs, 0);
+				result.put("item_list", createList(items));
+				extracted(result, vo);
+				return result;
+			}
+		} else if ("OrgWaAccountQueryConditionPanel".equals(areaCode) || "DeptWaAccountQueryConditionPanel".equals(areaCode)) {
+			// 单位薪资和部门信息
+			if (WaProviderConst.CAC_CYEAR.equals(itemKey)) {
+				// 存在一个校验
+				GeneralVO[] generalVOs = null;
+				try {
+					generalVOs = ServiceLocator.find(IWaProviderService.class).getAllTmItem(loginContext.getPk_group(), loginContext.getPk_org(),
+							(String) vo.getAttributeValue(WaProviderConst.CAC_CYEAR));
+				} catch (BusinessException e) {
+					Logger.error(e.getMessage(), e);
+				}
+				if (ArrayUtils.isEmpty(generalVOs)) {
+					// 前端提示错误,清空年度输入框
+					result.put("err_msg", ResHelper.getString("6013report", "06013report0036")/* @res "薪资总额项目数据不能为空!" */);
+					vo.setAttributeValue(WaProviderConst.CAC_CYEAR, null);
+					result.put("form", HRNccTemplateUtils.getFormWithArea(INccHrRptConst.TEMPLET_WARPT_ORG, areaCode, vo));
+				}
+				return result;
+			}
+		}
+		
+		return result;
+	}
+
+	private void extracted(HashMap result, GeneralVO vo) throws BusinessException {
+		//add by@chenzf 添加薪资发放设置的通用项目 2022-5-23 17:49:52 begin 
+		if(result.get("item_list") != null) {
+			List<Map> map = (List<Map>) result.get("item_list");
+			List<Map> dmap = new ArrayList();//待选
+			List<Map> ymap = new ArrayList();//已选
+			if(map.size() > 0) {
+				String waClassPk = (String) vo.getAttributeValue(WaProviderConst.WA_CLASS_PK);
+//				select * from wa_paydatadsp where type = 0 and pk_wa_class = '1001A1100000000MYC7Z' and bshow = 'Y' and iswaitem = 'Y' order by displayseq;
+				List<WaPaydataDspVO> list = ServiceLocator.find(IClassitemQry.class).queryWaPaydataDspVOByPkWaClass(waClassPk);
+				if(list != null && list.size() > 0) {
+					List<String> keyList = new ArrayList();
+					for(WaPaydataDspVO dspVO : list) {
+						keyList.add(dspVO.getItem_key());
+					}
+					for(Map m : map) {
+						if(keyList.contains(m.get("itemkey"))) {
+							ymap.add(m);
+						} else {
+							dmap.add(m);
+						}
+					}
+				}
+			}
+			result.put("item_list", dmap);
+			result.put("yitem_list", ymap);
+		}
+		//add by@chenzf 添加薪资发放设置的通用项目 2022-5-23 17:49:52 end
+	}
+
+	private static WaLoginContext getWaLoginContext(String pk_group, String pk_org, String cyear, String cperiod, String pk_wa_class, String pk_sub_class, String pk_childclass,
+			String batch, String reyear, String reperiod) throws BusinessException {
+		if (StringUtils.isBlank(pk_sub_class)) // 如果没有多次发放,则为当前方案
+			pk_sub_class = pk_wa_class;
+		if (StringUtils.isBlank(pk_childclass)) // 如果没有多次发放,则为当前方案
+			pk_childclass = pk_wa_class;
+		Integer batchValue = StringUtils.isBlank(batch) ? 0 : Integer.valueOf(batch); // 第n次发放
+		if (StringUtils.isBlank(pk_group)) // 所属集团
+			pk_group = SessionContext.getInstance().getClientInfo().getPk_group();
+		String pk_user = SessionContext.getInstance().getClientInfo().getUserid();
+		// 设置组织类型
+		NODE_TYPE nodeType = NODE_TYPE.ORG_NODE;
+		if (StringUtils.isBlank(pk_org)) {
+			throw new RuntimeException("Error Only4Dev:pk_org一定要传!!!!!!!!!!");
+			// return null;
+		} else if (IOrgConst.GLOBEORG.equals(pk_org)) {
+			nodeType = NODE_TYPE.GLOBE_NODE;
+		} else if (pk_org.equals(pk_group)) {
+			nodeType = NODE_TYPE.GROUP_NODE;
+		} else {
+			nodeType = NODE_TYPE.ORG_NODE;
+		}
+		// 薪资上下文
+		WaLoginContext context = new WaLoginContext();
+		context.setPk_group(pk_group);
+		context.setNodeType(nodeType);
+		context.setPk_org(pk_org);
+		context.setPkorgs(new String[] { pk_org });
+		context.setPk_loginUser(pk_user);
+
+		if (StringUtils.isBlank(cyear) || StringUtils.isBlank(cperiod))
+			return context;
+		// 期间状态
+		PeriodStateVO periodStateVO = new PeriodStateVO();
+		periodStateVO.setCyear(cyear);
+		periodStateVO.setCperiod(cperiod);
+		periodStateVO.setPk_wa_class(pk_childclass);
+		// 薪资参数
+		WaLoginVO waLoginVO = new WaLoginVO();
+		waLoginVO.setPk_group(pk_group);
+		waLoginVO.setPk_org(pk_org);
+		waLoginVO.setPeriodVO(periodStateVO);
+		waLoginVO.setCyear(cyear);
+		waLoginVO.setCperiod(cperiod);
+		waLoginVO.setPk_prnt_class(pk_wa_class);
+		waLoginVO.setPk_wa_class(pk_childclass);
+
+		// 期间状态
+		try {
+			IWaPub service = ServiceLocator.find(IWaPub.class);
+			waLoginVO = service.getWaclassVOWithState(waLoginVO);
+		} catch (BusinessException e) {
+			Logger.error(e.getMessage(), e);
+		} catch (Exception e1) {
+			throw new BusinessException(ResHelper.getString("6013salarypmt", "06013salarypmt0295")/* @res "方案类型已发生改变需重新加载" */);
+		}
+		// 当选择非最新期间 查询状态后会变成最新期间
+		waLoginVO.setCyear(cyear);
+		waLoginVO.setCperiod(cperiod);
+		waLoginVO.setBatch(batchValue);
+		waLoginVO.setReyear(reyear);
+		waLoginVO.setReperiod(reperiod);
+		context.setWaLoginVO(waLoginVO);
+		return context;
+	}
+
+	protected List<Map> createList(WaItemVO[] systemItemVOs) {
+		List<Map> itemList = new ArrayList<>();
+		for (int i = 0; systemItemVOs != null && i < systemItemVOs.length; i++) {
+			Map m = new HashMap();
+			m.put("key", systemItemVOs[i].getPk_wa_item());
+			m.put("title", systemItemVOs[i].getName());
+			m.put("code", systemItemVOs[i].getCode());
+			m.put("itemkey", systemItemVOs[i].getItemkey());
+			itemList.add(m);
+		}
+		return itemList;
+	}
+
+	private List<Map> getItemList(WaGlobalVO waGlobalVO, int type) throws BusinessException {
+		WaItemVO[] systemItemVOs = ServiceLocator.find(IClassitemQry.class).queryItemInfoWithClass(waGlobalVO, type);
+		return createList(systemItemVOs);
+	}
+
+	private WaClassVO getWaClass(String pk) {
+		if (StringUtils.isBlank(pk)) {
+			return null;
+		}
+		WaClassVO waclassVO = null;
+		try {
+			waclassVO = ServiceLocator.find(IWaClass.class).queryWaClassByPK(pk);
+		} catch (Exception ex) {
+			Logger.error(ex.getMessage(), ex);
+			return null;
+		}
+		return waclassVO;
+	}
+}

+ 286 - 0
hrrpt/nccloud/src/private/nc/impl/wa/rpt/ClassitemImpl.java

@@ -0,0 +1,286 @@
+package nc.impl.wa.rpt;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.List;
+import java.util.Vector;
+
+import nc.bs.dao.BaseDAO;
+import nc.hr.utils.SQLHelper;
+import nc.itf.hr.wa.IClassitemQry;
+import nc.itf.org.IOrgConst;
+import nc.jdbc.framework.processor.BeanListProcessor;
+import nc.jdbc.framework.processor.ResultSetProcessor;
+import nc.vo.hr.pub.FormatVO;
+import nc.vo.pub.BusinessException;
+import nc.vo.wa.item.WaItemVO;
+import nc.vo.wa.paydata.WaPaydataDspVO;
+import nc.wa.smartmodel.provider.util.WaGlobalVO;
+import nccloud.commons.lang.StringUtils;
+/**
+ * 薪资项目 查询 实现类
+ * 
+ * @author suihang
+ * @version 最后修改日期 2011-1-4
+ * @see  
+ * @since  
+ */
+public class ClassitemImpl implements IClassitemQry{
+	
+	private final BaseDAO dao = new BaseDAO();
+	
+	/**
+	 * 根据单条薪资类别参数查询薪资项目
+	 * @param waGlobalVO 薪资类别参数
+	 * @return ItemVO[] 薪资项目
+	 * @throws BusinessException
+	 */
+	public  WaItemVO[] queryItemInfoWithPower(WaGlobalVO waGlobalVO,int type) throws BusinessException{
+
+		if(waGlobalVO==null){
+			//当薪资类别参数为空时,不进行查询。即默认薪资项目集合也为空。
+			return null;
+		}
+	 	StringBuffer sqlB = new StringBuffer();
+		sqlB.append(" select distinct wa_item.pk_wa_item, ");  
+		sqlB.append("  "+ SQLHelper.getMultiLangNameColumn("wa_classitem.name")+ " , "); 
+		sqlB.append(" wa_item.code, "); 
+		sqlB.append(" wa_item.itemkey, ");
+		sqlB.append(" wa_classitemdsp.displayseq, ");
+		sqlB.append(" wa_classitem.idisplayseq ");
+		
+		sqlB.append(" from wa_classitem ");
+		sqlB.append(" left outer join wa_classitemdsp ");
+		sqlB.append(" on wa_classitem.pk_wa_class = wa_classitemdsp.pk_wa_class  ");
+		sqlB.append(" and wa_classitem.cyear = wa_classitemdsp.cyear  ");
+		sqlB.append(" and wa_classitem.cperiod = wa_classitemdsp.cperiod  ");
+		sqlB.append(" and wa_classitem.pk_wa_classitem = wa_classitemdsp.pk_wa_classitem  ");
+		sqlB.append(" and wa_classitemdsp.pk_user = '" + waGlobalVO.getCurUserid() + "' ,");
+		sqlB.append(" wa_item ");
+			
+		sqlB.append(" where wa_classitem.pk_wa_item = wa_item.pk_wa_item");
+		sqlB.append(" and  wa_classitem.pk_wa_class =  '" + waGlobalVO.getWaClassPK() + "' ");
+		sqlB.append(" and  wa_classitem.cyear = '" + waGlobalVO.getWaYear() + "' ");
+		sqlB.append(" and  wa_classitem.cperiod = '" + waGlobalVO.getWaPeriod() + "' ");
+
+		sqlB.append(" and wa_item.pk_wa_item in (");
+		// 根据薪资期间、薪资类别、所选组织以及登录人权限筛选
+		sqlB.append(getItemPkSqlByUseridClassid( new WaGlobalVO[] { waGlobalVO }));
+		sqlB.append(" )");
+		if(type==0){
+			sqlB.append(" and  wa_item.iitemtype = 0 ");
+		}
+		// 与薪资发放项目顺序保持一致20200225
+		//sqlB.append(" order by wa_classitemdsp.displayseq asc");
+		sqlB.append(" order by wa_classitem.idisplayseq ");
+		
+		
+		return (WaItemVO[]) dao.executeQuery(sqlB.toString(), new ResultSetProcessor() {
+			private static final long serialVersionUID = 3623741235217336426L;
+			/** 
+			 * 封装结果集,返回WaItemVO[]形式结果 
+			 */
+			public Object handleResultSet(ResultSet rs) throws SQLException {
+	
+				Vector<WaItemVO> vector = new Vector<WaItemVO>();
+				while (rs.next()) {
+					WaItemVO itemVO = new WaItemVO();
+					itemVO.setPk_wa_item(rs.getString(1));
+					itemVO.setName(rs.getString(2));
+					itemVO.setCode(rs.getString(3));
+					itemVO.setItemkey(rs.getString(4));
+					vector.add(itemVO);
+				}
+				return vector.size() > 0 ? vector.toArray(new WaItemVO[vector.size()]) : null;
+			}
+		});
+	}
+
+	@Override
+	public WaItemVO[] queryItemInfoWithCondition(WaGlobalVO waGlobalVO,String condition)
+			throws BusinessException {
+
+		if(waGlobalVO==null){
+			//当薪资类别参数为空时,不进行查询。即默认薪资项目集合也为空。
+			return null;
+		}
+	 	StringBuffer sqlB = new StringBuffer();
+		sqlB.append(" select distinct wa_item.pk_wa_item, ");  
+		sqlB.append("  "+ SQLHelper.getMultiLangNameColumn("wa_classitem.name")+ " , "); 
+		sqlB.append(" wa_item.code, "); 
+		sqlB.append(" wa_item.itemkey, ");
+		sqlB.append(" wa_item.idisplayseq ");
+		sqlB.append(" from wa_classitem ,wa_item");
+		sqlB.append(" where wa_classitem.pk_wa_item = wa_item.pk_wa_item");
+		sqlB.append(" and  wa_classitem.pk_wa_class =  '" + waGlobalVO.getWaClassPK() + "' ");
+		sqlB.append(" and  wa_classitem.cyear = '" + waGlobalVO.getWaYear() + "' ");
+		sqlB.append(" and  wa_classitem.cperiod = '" + waGlobalVO.getWaPeriod() + "' ");
+		if(!StringUtils.isEmpty(condition)){
+			sqlB.append(" and  wa_item."+condition);
+		}
+		sqlB.append(" order by wa_item.idisplayseq ,code");
+		
+		return (WaItemVO[]) dao.executeQuery(sqlB.toString(), new ResultSetProcessor() {
+			private static final long serialVersionUID = 3623741235217336426L;
+			/** 
+			 * 封装结果集,返回WaItemVO[]形式结果 
+			 */
+			public Object handleResultSet(ResultSet rs) throws SQLException {
+	
+				Vector<WaItemVO> vector = new Vector<WaItemVO>();
+				while (rs.next()) {
+					WaItemVO itemVO = new WaItemVO();
+					itemVO.setPk_wa_item(rs.getString(1));
+					itemVO.setName(rs.getString(2));
+					itemVO.setCode(rs.getString(3));
+					itemVO.setItemkey(rs.getString(4));
+					vector.add(itemVO);
+				}
+				return vector.size() > 0 ? vector.toArray(new WaItemVO[vector.size()]) : null;
+			}
+		});
+	}
+	
+	@Override
+	public WaItemVO[] queryItemInfoWithClass(WaGlobalVO waGlobalVO,int type)
+			throws BusinessException {
+
+		if(waGlobalVO==null){
+			//当薪资类别参数为空时,不进行查询。即默认薪资项目集合也为空。
+			return null;
+		}
+	 	StringBuffer sqlB = new StringBuffer();
+		sqlB.append(" select distinct wa_item.pk_wa_item, ");  
+		sqlB.append("  "+ SQLHelper.getMultiLangNameColumn("wa_item.name")+ " , "); 
+		sqlB.append(" wa_item.code, "); 
+		sqlB.append(" wa_item.itemkey, ");
+		sqlB.append(" wa_item.idisplayseq ");
+		sqlB.append(" from wa_classitem ,wa_item");
+		sqlB.append(" where wa_classitem.pk_wa_item = wa_item.pk_wa_item");
+		sqlB.append(" and  wa_classitem.pk_wa_class =  '" + waGlobalVO.getWaClassPK() + "' ");
+		sqlB.append(" and  wa_classitem.cyear = '" + waGlobalVO.getWaYear() + "' ");
+		if(type==0){
+			sqlB.append(" and  wa_item.iitemtype = 0 ");
+		}
+		sqlB.append(" order by wa_item.idisplayseq asc");
+		
+		return (WaItemVO[]) dao.executeQuery(sqlB.toString(), new ResultSetProcessor() {
+			private static final long serialVersionUID = 3623741235217336426L;
+			/** 
+			 * 封装结果集,返回WaItemVO[]形式结果 
+			 */
+			public Object handleResultSet(ResultSet rs) throws SQLException {
+	
+				Vector<WaItemVO> vector = new Vector<WaItemVO>();
+				while (rs.next()) {
+					WaItemVO itemVO = new WaItemVO();
+					itemVO.setPk_wa_item(rs.getString(1));
+					itemVO.setName(rs.getString(2));
+					itemVO.setCode(rs.getString(3));
+					itemVO.setItemkey(rs.getString(4));
+					vector.add(itemVO);
+				}
+				return vector.size() > 0 ? vector.toArray(new WaItemVO[vector.size()]) : null;
+			}
+		});
+	}
+
+	/**
+	 * 根据多条薪资类别参数查询薪资项目
+	 * @param waGlobalVOs 薪资类别参数
+	 * @return ItemVO[] 薪资项目
+	 * @throws BusinessException
+	 */
+	public  WaItemVO[] queryItemInfoWithPowerForMutiClasses(WaGlobalVO[] waGlobalVOs,int type) throws BusinessException{
+		if(waGlobalVOs==null){
+			return null;
+		}
+		WaGlobalVO waGlobalVO = waGlobalVOs[0];
+	 	StringBuffer sqlB = new StringBuffer();
+		sqlB.append(" select distinct wa_item.pk_wa_item, "); 
+		sqlB.append("  "+ SQLHelper.getMultiLangNameColumn("wa_item.name")+ " , ");  
+		sqlB.append(" wa_item.code, ");   
+		sqlB.append(" wa_item.itemkey ");
+		sqlB.append(" from wa_item  where  ");
+
+		if (waGlobalVO.getWaClassPK() == null) {
+			//没有薪资类别 就显示所选组织的所有薪资项目
+			sqlB.append("  (wa_item.pk_org= '"+waGlobalVO.getCurPk_org()+"' or wa_item.pk_org='"+waGlobalVO.getCurPk_group()+"' or wa_item.pk_org='"+IOrgConst.GLOBEORGTYPE+"' ) " );
+		}else{
+			//如果有薪资类别,根据薪资期间、薪资类别、所选组织以及登录人权限筛选
+			sqlB.append("   wa_item.pk_wa_item in (");
+			sqlB.append(getItemPkSqlByUseridClassid(waGlobalVOs));
+			sqlB.append(" )");
+		}
+		if(type==0){
+			sqlB.append(" and  wa_item.iitemtype = 0 ");
+		}
+		
+		return (WaItemVO[]) dao.executeQuery(sqlB.toString(), new ResultSetProcessor() {
+			private static final long serialVersionUID = 3623741235217336426L;
+			/** 
+			 * 封装结果集,返回WaItemVO[]形式结果 
+			 */
+			public Object handleResultSet(ResultSet rs) throws SQLException {
+
+				Vector<WaItemVO> vector = new Vector<WaItemVO>();
+				while (rs.next()) {
+					WaItemVO itemVO = new WaItemVO();
+					itemVO.setPk_wa_item(rs.getString(1));
+					itemVO.setName(rs.getString(2));
+					itemVO.setCode(rs.getString(3));
+					itemVO.setItemkey(rs.getString(4));
+					vector.add(itemVO);
+				}
+				return vector.size() > 0 ? vector.toArray(new WaItemVO[vector.size()]) : null;
+			}
+		});
+	}
+	
+	/**
+	 * 根据薪资期间和薪资类别找出登录人的项目权限 suihang 2010-12-23
+	 *
+	 * @param waGlobalVOs
+	 * @return
+	 */
+
+	private String getItemPkSqlByUseridClassid(WaGlobalVO[] waGlobalVOs) {
+		String userid = waGlobalVOs[0].getCurUserid();
+		String pk_org = waGlobalVOs[0].getCurPk_org();
+		String cyear = waGlobalVOs[0].getWaYear();
+		String cperiod = waGlobalVOs[0].getWaPeriod();
+		StringBuffer sqlB = new StringBuffer();
+		sqlB.append(" select  wa_item.pk_wa_item "); 
+		sqlB.append(" from wa_item ");
+		sqlB.append(" where wa_item.pk_wa_item in ");
+		/**
+		 * 关联wa_itempower表(即与登录人员角色关联)
+		 */
+		sqlB.append(" ( select distinct wa_itempower.pk_wa_item from wa_itempower ,wa_classitem where  wa_itempower.pk_wa_item = wa_classitem.pk_wa_item ");
+		sqlB.append(" and ( wa_itempower.pk_subject in ( select pk_role from sm_user_role where cuserid = '"+userid+"' ) or pk_subject = '"+userid+"' )");
+		sqlB.append(" and  wa_classitem.pk_org = '"+pk_org+"' ");
+		sqlB.append(" and  wa_classitem.pk_wa_class in  (" + FormatVO.formatArrayToString(waGlobalVOs, WaGlobalVO.WACLASSPK) + ")  ");
+		sqlB.append(" and  wa_classitem.cyear = '" + cyear + "' ");
+		sqlB.append(" and  wa_classitem.cperiod = '" + cperiod + "' )");
+		/*sqlB.append(" ( select distinct wa_classitem.pk_wa_item from wa_classitem where  wa_item.pk_wa_item = wa_classitem.pk_wa_item  ");
+		sqlB.append(" and  wa_classitem.pk_wa_class in  (" + FormatVO.formatArrayToString(waGlobalVOs, WaGlobalVO.WACLASSPK) + ") ");
+		sqlB.append(" and  wa_classitem.pk_org = '"+pk_org+"' ");
+		sqlB.append(" and  wa_classitem.cyear = '" + cyear + "' ");
+		sqlB.append(" and  wa_classitem.cperiod = '" + cperiod + "' )");*/
+		
+		return sqlB.toString();
+	}
+
+	/**
+	 * 根据方案主键查询薪资发放设置为通用项目的数据
+	 * @param pk_wa_class
+	 * @return
+	 * @throws BusinessException
+	 */
+	@Override
+	public List<WaPaydataDspVO> queryWaPaydataDspVOByPkWaClass(String pk_wa_class) throws BusinessException {
+		String sql = "select * from wa_paydatadsp where type = 0 and pk_wa_class = '"+pk_wa_class+"' and bshow = 'Y' and iswaitem = 'Y' order by displayseq";
+		List<WaPaydataDspVO> list = (List<WaPaydataDspVO>) dao.executeQuery(sql, new BeanListProcessor(WaPaydataDspVO.class));
+		return list;
+	}
+}

+ 55 - 0
hrrpt/nccloud/src/public/nc/itf/hr/wa/IClassitemQry.java

@@ -0,0 +1,55 @@
+package nc.itf.hr.wa;
+
+import java.util.List;
+
+import nc.vo.pub.BusinessException;
+import nc.vo.wa.item.WaItemVO;
+import nc.vo.wa.paydata.WaPaydataDspVO;
+import nc.wa.smartmodel.provider.util.WaGlobalVO;
+/**
+ * 薪资项目 查询 服务接口
+ * 
+ * @author suihang
+ * @version 最后修改日期 2011-1-4
+ * @see  
+ * @since  
+ */
+public interface IClassitemQry {
+	/**
+	 * 根据单条薪资类别年度查询薪资项目(无权限)
+	 * @param waGlobalVO 薪资类别参数
+	 * @return ItemVO[] 薪资项目
+	 * @throws BusinessException
+	 */
+	public abstract WaItemVO[] queryItemInfoWithClass(WaGlobalVO waGlobalVO,int type) throws BusinessException;
+
+	/**
+	 * 根据单条薪资类别参数查询薪资项目
+	 * @param waGlobalVO 薪资类别参数
+	 * @return ItemVO[] 薪资项目
+	 * @throws BusinessException
+	 */
+	public abstract WaItemVO[] queryItemInfoWithPower(WaGlobalVO waGlobalVO,int type) throws BusinessException;
+
+	/**
+	 * 根据多条薪资类别参数查询薪资项目
+	 * @param waGlobalVO 薪资类别参数
+	 * @return ItemVO[] 薪资项目
+	 * @throws BusinessException
+	 */
+	public abstract WaItemVO[] queryItemInfoWithPowerForMutiClasses(WaGlobalVO[] waGlobalVOs,int type) throws BusinessException;
+	
+	
+	public abstract WaItemVO[] queryItemInfoWithCondition(WaGlobalVO waGlobalVO,String condition)
+			throws BusinessException;
+
+	/**
+	 * 根据方案主键查询薪资发放设置为通用项目的数据
+	 * @param pk_wa_class
+	 * @return
+	 * @throws BusinessException
+	 */
+	public abstract List<WaPaydataDspVO> queryWaPaydataDspVOByPkWaClass(String pk_wa_class) throws BusinessException;
+	
+}
+

+ 887 - 0
hrtrn/src/private/nccloud/impl/hryf/psninfoapprove/impl/PsninfoApproveServiceImpl.java

@@ -0,0 +1,887 @@
+package nccloud.impl.hryf.psninfoapprove.impl;
+
+import nc.bs.dao.BaseDAO;
+import nc.bs.framework.common.NCLocator;
+import nc.bs.logging.Logger;
+import nc.hr.frame.persistence.HrBatchService;
+import nc.hr.utils.CommonUtils;
+import nc.hr.utils.HRFileUtils;
+import nc.hr.utils.PubEnv;
+import nc.hr.utils.ResHelper;
+import nc.hr.utils.StringPiecer;
+import nc.itf.hi.IPersonRecordService;
+import nc.itf.hi.IPsndocQryService;
+import nc.itf.hi.IPsndocService;
+import nc.itf.hr.frame.IPersistenceRetrieve;
+import nc.itf.hr.frame.IPersistenceUpdate;
+import nc.itf.hr.infoset.IInfoSetQry;
+import nc.itf.uap.IUAPQueryBS;
+import nc.jdbc.framework.generator.SequenceGenerator;
+import nc.jdbc.framework.processor.ColumnListProcessor;
+import nc.jdbc.framework.processor.ColumnProcessor;
+import nc.jdbc.framework.processor.MapListProcessor;
+import nc.md.innerservice.IMetaDataQueryService;
+import nc.md.model.IAttribute;
+import nc.md.model.IBean;
+import nc.pub.tools.HiSQLHelper;
+import nc.pub.tools.VOUtils;
+import nc.ui.bd.ref.IRefConst;
+import nc.vo.bd.address.AddressVO;
+import nc.vo.bd.pub.NODE_TYPE;
+import nc.vo.hi.psndoc.CapaVO;
+import nc.vo.hi.psndoc.CertVO;
+import nc.vo.hi.psndoc.CtrtVO;
+import nc.vo.hi.psndoc.EnterQualCertVO;
+import nc.vo.hi.psndoc.OtherCertVO;
+import nc.vo.hi.psndoc.PartTimeVO;
+import nc.vo.hi.psndoc.PsnJobVO;
+import nc.vo.hi.psndoc.PsnOrgVO;
+import nc.vo.hi.psndoc.PsnSuperVO;
+import nc.vo.hi.psndoc.PsndocAggVO;
+import nc.vo.hi.psndoc.PsndocVO;
+import nc.vo.hi.psndoc.QulifyVO;
+import nc.vo.hi.psndoc.TrainCertfileVO;
+import nc.vo.hi.psndoc.TrainVO;
+import nc.vo.hi.psndoc.WainfoVO;
+import nc.vo.hr.infoset.InfoSetVO;
+import nc.vo.pub.BusinessException;
+import nc.vo.pub.SuperVO;
+import nc.vo.pub.VOStatus;
+import nc.vo.pub.lang.UFBoolean;
+import nc.vo.pub.lang.UFDateTime;
+import nc.vo.pub.lang.UFLiteralDate;
+import nc.vo.uif2.LoginContext;
+import nc.vo.util.SqlWhereUtil;
+import nccloud.commons.collections.CollectionUtils;
+import nccloud.commons.collections.MapUtils;
+import nccloud.commons.lang.ArrayUtils;
+import nccloud.commons.lang.StringUtils;
+import nccloud.dto.hryf.appconf.AppConfItemVO;
+import nccloud.dto.hryf.appconf.AppConfSetVO;
+import nccloud.dto.hryf.psninfo.PsnInfoApproveCheckEnum;
+import nccloud.dto.hryf.psninfo.PsnInfoApproveVO;
+import nccloud.itf.hryf.appconf.IAppconfService;
+import nccloud.itf.hryf.psninfoapprove.IPsninfoApproveService;
+import nccloud.vo.hr.json.HRJsonUtils;
+
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 员工信息审核服务
+ */
+public class PsninfoApproveServiceImpl implements IPsninfoApproveService {
+
+	private HrBatchService serviceTemplate;
+
+	private HrBatchService getServiceTemplate() {
+		if (serviceTemplate == null)
+		{
+			serviceTemplate = new HrBatchService("");
+		}
+		return serviceTemplate;
+	}
+
+	@Override
+	public String[] queryPKsByCondition(String pk_org, String condition) throws BusinessException {
+		StringBuffer sql = new StringBuffer();
+		sql.append("select pk_psninfoapprove from hi_psninfoapp where 1=1 ");
+		if (StringUtils.isNotBlank(pk_org)) {
+			sql.append(" and pk_org = '" + pk_org + "' ");
+		}
+		if (StringUtils.isNotBlank(condition)) {
+			sql.append(" and " + condition);
+		}
+		SqlWhereUtil sqlWhereUtil = new SqlWhereUtil(sql.toString());
+
+		// 人员权限
+		String psndocSql = HiSQLHelper.getPsnPowerSql(PubEnv.getPk_group(), "6007psnjob", IRefConst.DATAPOWEROPERATION_CODE,  "hi_psninfoapp");
+		if (StringUtils.isNotBlank(psndocSql)) { 
+			sqlWhereUtil.and(psndocSql);
+		}
+		String sqlCondition = sqlWhereUtil.getSQLWhere();
+		@SuppressWarnings("unchecked")
+		List<String> pkList = (List<String>) new BaseDAO().executeQuery(sqlCondition, new ColumnListProcessor());
+		return CollectionUtils.isEmpty(pkList) ? null : pkList.toArray(new String[0]);
+	}
+
+	@Override
+	public PsnInfoApproveVO[] queryByCondition(String condition) throws BusinessException {
+		return getServiceTemplate().queryByCondition(PsnInfoApproveVO.class, condition);
+	}
+
+	@Override
+	public PsnInfoApproveVO queryByPk(String pk) throws BusinessException {
+		if (StringUtils.isBlank(pk))
+		{
+			return null;
+		}
+		return getServiceTemplate().queryByPk(PsnInfoApproveVO.class, pk);
+	}
+
+	@Override
+	public PsnInfoApproveVO[] queryByPks(String[] pks) throws BusinessException {
+		return getServiceTemplate().queryByPks(PsnInfoApproveVO.class, pks);
+	}
+
+	@Override
+	public void delete(PsnInfoApproveVO[] vos) throws BusinessException {
+		getServiceTemplate().delete(vos);
+	}
+
+	@Override
+	public void deleteByPks(String[] pks) throws BusinessException {
+		PsnInfoApproveVO[] vos = getServiceTemplate().queryByPks(PsnInfoApproveVO.class, pks);
+		delete(vos);
+	}
+	
+	@Override
+	public void update(PsnInfoApproveVO[] vos, String[] selFields) throws BusinessException {
+		NCLocator.getInstance().lookup(IPersistenceUpdate.class).updateVOArray(null, vos, selFields, null);
+	}
+
+	@Override
+	public PsnInfoApproveVO[] doApprove(String[] pks, int checkstatus, String checknote) throws BusinessException {
+		PsnInfoApproveVO[] vos = queryByPks(pks);
+		if (ArrayUtils.isEmpty(vos))
+		{
+			return null;
+		}
+		// 查询人员
+		String[] pk_psndocs = StringPiecer.getStrArrayDistinct(vos, PsnInfoApproveVO.PK_PSNJOB);
+		PsndocAggVO[] psndocAggs = NCLocator.getInstance().lookup(IPsndocQryService.class).queryPsndocVOByPks(pk_psndocs);
+		PsndocVO[] psndocVOs = CommonUtils.getParentVOArrayFromAggVOs(PsndocVO.class, psndocAggs);
+		Map<String, PsndocVO> psndocMap = CommonUtils.toMap(PsndocVO.PK_PSNDOC, psndocVOs);
+		// 赋值并保存人员信息 -- 因人员保存要逐个校验,所以在循环内保存
+		IPersistenceUpdate psndocUpdateService = NCLocator.getInstance().lookup(IPersistenceUpdate.class);
+		for (PsnInfoApproveVO vo : vos) {
+			if (PsnInfoApproveCheckEnum.UNCHECK.getIndex() != vo.getCheckstatus())
+			{
+				throw new BusinessException(ResHelper.getString("6008hrgx", "06008hrgx0053")/* @res "记录已被审核,无法再次审核!" */);
+			}
+			vo.setPk_checkuser(PubEnv.getPk_user());
+			vo.setCheckdate(PubEnv.getServerLiteralDate());
+			vo.setCheckstatus(checkstatus);
+			vo.setChecknote(checknote);
+			vo.setModifier(PubEnv.getPk_user());
+			vo.setModifiedtime(PubEnv.getServerTime());
+			if(checkstatus == 2 ){
+				//审批不通过
+				continue;
+			}
+			// 收集修改后信息
+			Object value = vo.getNewvalue();
+			//收集修改前的信息
+			Object oldvalue = vo.getOldvalue();
+			if (value == null)
+			{
+				continue;
+			}
+			String voStr = new String((byte[]) value);
+			String oldStr = new String((byte[]) oldvalue);
+			InfoSetVO infoset = (InfoSetVO) NCLocator.getInstance().lookup(IPersistenceRetrieve.class).retrieveByPk(null, InfoSetVO.class, vo.getPk_infoset());
+			String tableCode = infoset.getInfoset_code();
+			// 保存人员子表
+			if (!PsndocVO.getDefaultTableName().equals(tableCode)) {
+				IBean bean = NCLocator.getInstance().lookup(IMetaDataQueryService.class).getBeanByName("hrhi", tableCode);
+				Class<?> clazz = null;
+				try {
+					clazz = Class.forName(bean.getFullClassName());
+				} catch (ClassNotFoundException ex) {
+					Logger.error(ex);
+				}
+				SuperVO[] subVOs = HRJsonUtils.fromJson(voStr, Array.newInstance(clazz, 1).getClass());
+				updateSubPsnInfo(vo.getPk_psndoc(), vo.getPk_infoset(), vo.getPk_org(), subVOs);
+				continue;
+			}
+			// 保存人员主表
+			PsndocVO psndocVO = psndocMap.get(vo.getPk_psndoc());
+			Map<String, Object> valueMap = HRJsonUtils.fromJson(voStr, Map.class);
+			Map<String, Object> oldMap = HRJsonUtils.fromJson(oldStr, Map.class);
+			if (oldMap.size() > valueMap.size()) {
+				//变更后的值存在清空的情况
+				for (String k : oldMap.keySet()) {
+					for (String n : valueMap.keySet()) {
+						if (!k.equals(n)) {
+							valueMap.put(k, null);
+						}
+					}
+				}
+			}
+			PsndocVO newPsndocVO = HRJsonUtils.fromJson(voStr, PsndocVO.class);
+			String[] updateFlds =  valueMap.keySet().toArray(new String[0]);
+			for (String key : valueMap.keySet()) {
+				psndocVO.setAttributeValue(key, newPsndocVO.getAttributeValue(key));
+				if(PsndocVO.PHOTO.equals(key)){
+					//照片字段特殊处理
+					if(newPsndocVO.getPhoto()!=null){
+						if(newPsndocVO.getPhoto() instanceof String){
+							psndocVO.setPhoto(HRFileUtils.base64Decode(psndocVO.getPhoto().toString().replaceAll("\r|\n", "")));
+						}
+						psndocVO.setPreviewphoto(VOUtils.transPreviewPhoto((byte[]) psndocVO.getPhoto()));
+					}
+					else{
+						psndocVO.setPreviewphoto(null);
+					}
+					updateFlds = (String[]) ArrayUtils.add(updateFlds, PsndocVO.PREVIEWPHOTO);
+				}
+			}
+			psndocUpdateService.updateVO(null, psndocVO, updateFlds, null);
+		}
+		// 保存
+		return getServiceTemplate().update(true, vos);
+	}
+
+	@Override
+	public String savePsndocVO(String pk_org, PsndocVO psndocVO, boolean needCheck) throws BusinessException {
+		if (StringUtils.isBlank(pk_org) || psndocVO == null)
+		{
+			return null;
+		}
+		// 个人信息审核配置
+		List<AppConfSetVO> setVOs = NCLocator.getInstance().lookup(IAppconfService.class).queryAppConfSetVOByCond(pk_org, PsndocVO.getDefaultTableName());
+		if (CollectionUtils.isEmpty(setVOs))
+		{
+			return null;
+		}
+		// 原基本信息
+		PsndocAggVO dbPsndocVOAgg = NCLocator.getInstance().lookup(IPsndocQryService.class).queryPsndocVOByPk(psndocVO.getPk_psndoc());
+		if (dbPsndocVOAgg == null)
+		{
+			return null;
+		}
+		PsndocVO dbPsndocVO = dbPsndocVOAgg.getParentVO();
+		AppConfSetVO setVO = setVOs.get(0);
+		List<AppConfItemVO> itemList = setVO.getItemList();
+		if (CollectionUtils.isEmpty(itemList))
+		{
+			return null;
+		}
+		Map<String, Object> oldValueMap = new HashMap<String, Object>();
+		Map<String, Object> newValueMap = new HashMap<String, Object>();
+		boolean hasDirectUpdate = false; // 是否有直接更新的数据
+		boolean isIndoc = dbPsndocVO.getPsnOrgVO().getIndocflag() != null && dbPsndocVO.getPsnOrgVO().getIndocflag().booleanValue(); // 是否正式员工
+		for (AppConfItemVO item : itemList) {
+			String fieldCode = item.getInfoset_item_code();
+			// 值相同不用处理
+			if (isSameValue(psndocVO, dbPsndocVO, fieldCode))
+			{
+				continue;
+			}
+			// 是否需要审核 -- 未转档人员均不需要审核
+			boolean isApprove = isIndoc && item.getEntry_approval() != null && item.getEntry_approval().booleanValue();
+			if (!isApprove) {
+				// 不需要审核直接更新数据库信息
+				dbPsndocVO.setAttributeValue(fieldCode, psndocVO.getAttributeValue(fieldCode));
+				if(PsndocVO.PHOTO.equals(fieldCode)){
+					//照片字段特殊处理
+					if(dbPsndocVO.getPhoto()!=null){
+						if(dbPsndocVO.getPhoto() instanceof String){
+							dbPsndocVO.setPhoto(HRFileUtils.base64Decode(dbPsndocVO.getPhoto().toString().replaceAll("\r|\n", "")));
+						}
+						dbPsndocVO.setPreviewphoto(VOUtils.transPreviewPhoto((byte[]) dbPsndocVO.getPhoto()));
+					}
+					else{
+						dbPsndocVO.setPreviewphoto(null);
+					}
+				}
+				hasDirectUpdate = true;
+				continue;
+			}
+			// 需要审核的记录下来,后面处理
+			if ("addr".equals(fieldCode) && dbPsndocVO.getAttributeValue(fieldCode) == null) {
+				oldValueMap.put(fieldCode, null);
+			} else {
+				oldValueMap.put(fieldCode, "addr".equals(fieldCode) ? dbPsndocVO.getAttributeValue(fieldCode).toString().substring(0,16) + "ABCD" : dbPsndocVO.getAttributeValue(fieldCode));
+			}
+			newValueMap.put(fieldCode, psndocVO.getAttributeValue(fieldCode));
+		}
+		// 处理审核信息
+		if (MapUtils.isNotEmpty(oldValueMap) || MapUtils.isNotEmpty(newValueMap)) {
+			if (needCheck)
+			{
+				return "needCheck";
+			}
+			oldValueMap.put(PsndocVO.PK_PSNDOC, psndocVO.getPk_psndoc());
+			newValueMap.put(PsndocVO.PK_PSNDOC, psndocVO.getPk_psndoc());
+			for (String key : newValueMap.keySet()) {
+				if (newValueMap.get(key) == null) {
+					newValueMap.put(key, "");
+				}
+			}
+			String oldValue = HRJsonUtils.toJson(oldValueMap);
+			String newValue = HRJsonUtils.toJson(newValueMap);
+			savePsnInfoApproveVO(oldValue, newValue, setVO, dbPsndocVO);
+		}
+		// 直接更新
+		if (hasDirectUpdate) {
+			NCLocator.getInstance().lookup(IPersistenceUpdate.class).updateVO(null, dbPsndocVO, null, null);
+		}
+		return null;
+	}
+	
+	/**
+	 * 比较两VO中指定属性值是否一致
+	 * 
+	 * @param vo1
+	 * @param vo2
+	 * @param fieldCode
+	 * @return
+	 */
+	private boolean isSameValue(SuperVO vo1, SuperVO vo2, String fieldCode) {
+		Object val1 = vo1.getAttributeValue(fieldCode);
+		Object val2 = vo2.getAttributeValue(fieldCode);
+		//家庭地址需要特殊处理
+		if ("addr".equals(fieldCode) && val1 != null) {
+			try {
+				AddressVO oldAddressVO = (AddressVO) NCLocator.getInstance().lookup(IPersistenceRetrieve.class).retrieveByPk(null, AddressVO.class, val1.toString().substring(0, 16) + "ABCD");
+				AddressVO newAddressVO = (AddressVO) NCLocator.getInstance().lookup(IPersistenceRetrieve.class).retrieveByPk(null, AddressVO.class, val1.toString());
+				if (oldAddressVO != null && newAddressVO != null) {
+					if (((oldAddressVO.getCountry() == null && newAddressVO.getCountry() == null) || (oldAddressVO.getCountry() != null && newAddressVO.getCountry() != null && (oldAddressVO.getCountry().equals(newAddressVO.getCountry()))))
+							&& ((oldAddressVO.getProvince() == null && newAddressVO.getProvince() == null) || (oldAddressVO.getProvince() != null && newAddressVO.getProvince() != null && (oldAddressVO.getProvince().equals(newAddressVO.getProvince()))))
+							&& ((oldAddressVO.getCity() == null && newAddressVO.getCity() == null) || (oldAddressVO.getCity() != null && newAddressVO.getCity() != null && (oldAddressVO.getCity().equals(newAddressVO.getCity()))))
+							&& ((oldAddressVO.getVsection() == null && newAddressVO.getVsection() == null) || (oldAddressVO.getVsection() != null && newAddressVO.getVsection() != null && (oldAddressVO.getVsection().equals(newAddressVO.getVsection()))))
+							&& ((oldAddressVO.getDetailinfo() == null && newAddressVO.getDetailinfo() == null) || (oldAddressVO.getDetailinfo() != null && newAddressVO.getDetailinfo() != null && (oldAddressVO.getDetailinfo().equals(newAddressVO.getDetailinfo()))))
+							&& ((oldAddressVO.getPostcode() == null && newAddressVO.getPostcode() == null) || (oldAddressVO.getPostcode() != null && newAddressVO.getPostcode() != null && (oldAddressVO.getPostcode().equals(newAddressVO.getPostcode()))))) {
+						return true;
+					}
+				}
+				return false;
+			} catch (BusinessException e) {
+				e.printStackTrace();
+			}
+		}
+		if (val1 instanceof byte[]) {
+			val1 = HRFileUtils.base64Encode((byte[]) val1);
+		}
+		if (val2 instanceof byte[]) {
+			val2 = HRFileUtils.base64Encode((byte[]) val2);
+		}
+		if (val1 == null && val2 == null)
+		{
+			return true;
+		}
+		return val1 != null && val1.equals(val2);
+	}
+
+	/**
+	 * 保存员工基本信息--生成hi_psninfoapp记录
+	 * 
+	 * @param oldValue
+	 * @param newValue
+	 * @param appConfSet
+	 * @param psndocVO
+	 * @return
+	 * @throws BusinessException
+	 */
+	private PsnInfoApproveVO savePsnInfoApproveVO(String oldValue, String newValue, AppConfSetVO appConfSet, PsndocVO psndocVO) throws BusinessException {
+		PsnInfoApproveVO vo = new PsnInfoApproveVO();
+		// 人员最新任职vo
+		PsnJobVO psnJobVO = psndocVO.getPsnJobVO();
+		vo.setPk_group(PubEnv.getPk_group());
+		vo.setPk_org(psnJobVO != null ? psnJobVO.getPk_hrorg() : null);
+		vo.setPk_psnjob(psnJobVO != null ? psnJobVO.getPk_psnjob() : null);
+		vo.setPk_applicant(PubEnv.getPk_user()); // 申请人主键(用户主键)
+		vo.setApplydate(new UFLiteralDate());
+		vo.setCreator(PubEnv.getPk_user());
+		vo.setCreationtime(new UFDateTime());
+		vo.setPk_psndoc(psndocVO.getPk_psndoc()); // 变更职员主键
+		vo.setSubmitdate(new UFLiteralDate());
+		vo.setCheckstatus(PsnInfoApproveCheckEnum.UNCHECK.getIndex());
+		vo.setReadstatus(0); // 预览状态 0-未读 1-已读
+		vo.setPk_infoset(appConfSet.getPk_infoset());
+		vo.setInfoset_code(appConfSet.getInfosetcode());
+		vo.setInfoset_name(appConfSet.getInfosetname());
+		vo.setTable_code(appConfSet.getTablecode());
+		vo.setVo_class_name(appConfSet.getVo_class_name());
+		vo.setOldvalue(StringUtils.isEmpty(oldValue) ? null : oldValue.getBytes());
+		vo.setNewvalue(StringUtils.isEmpty(newValue) ? null : newValue.getBytes());
+		return getServiceTemplate().insert(vo)[0];
+	}
+
+	@SuppressWarnings("deprecation")
+	@Override
+	public String savePsnSubInfo(String pk_org, PsndocVO psndocVO, SuperVO[] vos, boolean needCheck) throws BusinessException {
+		if (ArrayUtils.isEmpty(vos) || StringUtils.isBlank(pk_org) || psndocVO == null)
+		{
+			return null;
+		}
+		// 个人信息审核配置
+		List<AppConfSetVO> setVOs = NCLocator.getInstance().lookup(IAppconfService.class).queryAppConfSetVOByCond(pk_org, vos[0].getTableName());
+		if (CollectionUtils.isEmpty(setVOs))
+		{
+			return null;
+		}
+		// 是否正式员工
+		boolean isIndoc = psndocVO.getPsnOrgVO().getIndocflag() != null && psndocVO.getPsnOrgVO().getIndocflag().booleanValue();
+		// 是否需要审核 -- 未转档人员均不需要审核
+		AppConfSetVO setVO = setVOs.get(0);
+		boolean isApprove = isIndoc && setVO.getEntry_approval() != null && setVO.getEntry_approval().booleanValue();
+		if (!isApprove && needCheck) {
+			// 第一次调用
+			return null;
+		}
+		if (!isApprove && !needCheck) {
+			// 第二次调用
+			updateSubPsnInfo(psndocVO.getPk_psndoc(), setVO.getPk_infoset(), pk_org, vos);
+			return null;
+		}
+		if (needCheck)
+		{
+			return "needCheck";
+		}
+		// 需要审核的保存到审核表
+//		 vos = filterNoChangVO(vos);
+		List<SuperVO> newValueList = new ArrayList<SuperVO>();
+//		for(SuperVO vo : vos) {
+//			if (VOStatus.UNCHANGED == vo.getStatus()) {
+//				continue;
+//			}
+//			newValueList.add(vo);
+//		}
+		CollectionUtils.addAll(newValueList, vos);
+		List<SuperVO> oldValueList = new ArrayList<SuperVO>();
+		SuperVO[] dbSubVOs = queryPsnSubVOs(vos);
+		if (!ArrayUtils.isEmpty(dbSubVOs)) {
+			CollectionUtils.addAll(oldValueList, dbSubVOs);
+		}
+		String oldValue = HRJsonUtils.toJson(oldValueList);
+		
+		for(int i = 0; i < newValueList.size(); i++) {
+			SuperVO vo = newValueList.get(i);
+			String key = queryKeyByTableCode(vo.getTableName());
+			if(key != null && (vo.getPrimaryKey() == null || "".equals(vo.getPrimaryKey()))){
+				vo.setAttributeValue(key, "isnew");
+				vo.setPrimaryKey(new SequenceGenerator().generate());
+			}
+		}
+		
+		String newValue = HRJsonUtils.toJson(newValueList);
+		savePsnInfoApproveVO(oldValue, newValue, setVO, psndocVO);
+		return null;
+	}
+	
+	public String queryKeyByTableCode(String tablecode){
+    	StringBuffer sqlstr=new StringBuffer("");
+    	sqlstr.append("select item_code from hr_infoset_item").append("\r\n");
+    	sqlstr.append("       left join hr_infoset").append("\r\n");
+    	sqlstr.append("            on hr_infoset_item.pk_infoset = hr_infoset.pk_infoset").append("\r\n");
+    	sqlstr.append("       where hr_infoset.table_code = '"+tablecode+"' and hr_infoset_item.item_name = '附件标识'"); 
+    	String key = null;
+		try {
+			key = (String) NCLocator.getInstance().lookup(IUAPQueryBS.class).executeQuery(sqlstr.toString(),new ColumnProcessor());
+		} catch (BusinessException e) {
+			e.printStackTrace();
+		}
+    	return key;
+    }
+
+	/**
+	 * 查询涉及到的子表数据
+	 * 
+	 * @param vos
+	 * @return
+	 * @throws BusinessException
+	 */
+	private SuperVO[] queryPsnSubVOs(SuperVO[] vos) throws BusinessException {
+		if (ArrayUtils.isEmpty(vos))
+		{
+			return null;
+		}
+		// 组装所有主键数组
+		List<String> pkList = new ArrayList<String>();
+		for (SuperVO vo : vos) {
+			if (VOStatus.NEW == vo.getStatus()) { // 新增的不需要再查了
+				continue;
+			}
+			if (VOStatus.UNCHANGED == vo.getStatus()) {
+				continue;
+			}
+			String pk = vo.getPrimaryKey();
+			if (StringUtils.isBlank(pk))
+			{
+				continue;
+			}
+			pkList.add(pk);
+		}
+		if (CollectionUtils.isEmpty(pkList)){
+			return null;
+		}
+		return getServiceTemplate().queryByPks(vos[0].getClass(), pkList.toArray(new String[0]));
+	}
+
+	/**
+	 * 更新员工子集信息
+	 * 
+	 * @throws BusinessException
+	 */
+	private void updateSubPsnInfo(String pk_psndoc, String pk_infoset, String pk_org, SuperVO[] vos) throws BusinessException {
+		InfoSetVO infoset = NCLocator.getInstance().lookup(IInfoSetQry.class).queryInfoSetByPk(pk_infoset);
+		if (infoset == null) {
+			throw new BusinessException(ResHelper.getString("6008hrgx", "06008hrgx0054")/* @res "没有找到对应信息集!" */);
+		}
+		IPersonRecordService recordService = NCLocator.getInstance().lookup(IPersonRecordService.class);
+		IPsndocService psndocService = NCLocator.getInstance().lookup(IPsndocService.class);
+		// 人员子集有排序和最新处理,必须一行一行处理
+		for (SuperVO vo : vos) {
+			if (vo.getStatus() == VOStatus.NEW) {
+				vo.setAttributeValue(PsnSuperVO.CREATOR, PubEnv.getPk_user());
+				vo.setAttributeValue(PsnSuperVO.CREATIONTIME, PubEnv.getServerTime());
+				vo.setAttributeValue(PsndocVO.PK_GROUP, PubEnv.getPk_group());
+				vo.setAttributeValue(PsndocVO.PK_ORG, pk_org);
+				vo.setAttributeValue(PsndocVO.PK_PSNDOC, pk_psndoc);
+				recordService.insertRecord(vo, infoset);
+				continue;
+			}
+			// 子集每次保存都会刷新同表其他数据,导致ts不一致,此处暂时直接覆盖一下ts
+			SuperVO tmpVO = getServiceTemplate().queryByPk(vo.getClass(), vo.getPrimaryKey());
+			if (tmpVO == null)
+			{
+				continue;
+			}
+			vo.setAttributeValue("ts", tmpVO.getAttributeValue("ts"));
+			if (vo.getStatus() == VOStatus.UPDATED) {
+				recordService.updateRecord(vo);
+			} else if (vo.getStatus() == VOStatus.DELETED) {
+				psndocService.deleteSub(vo);
+			}
+		}
+
+		//如果修改的是证件子集  需要将证件子集中默认的那一条回写到基本信息上
+		if (CertVO.getDefaultTableName().equals(infoset.getInfoset_code())) {
+			CertVO[] certs = (CertVO[]) NCLocator.getInstance().lookup(IPersistenceRetrieve.class).retrieveByClause(null,CertVO.class, " pk_psndoc = '" + pk_psndoc + "' and iseffect = 'Y' order by recordnum desc ");
+			for (int i = 0; certs != null && i < certs.length; i++) {
+				if (certs[i].getIsstart() != null && certs[i].getIsstart().booleanValue() && StringUtils.isNotBlank(certs[i].getIdtype())
+						&& StringUtils.isNotBlank(certs[i].getId())) {
+					PsndocVO psndoc = (PsndocVO) NCLocator.getInstance().lookup(IPersistenceRetrieve.class).retrieveByPk(null, PsndocVO.class, pk_psndoc);
+					psndoc.setIdtype(certs[i].getIdtype());
+					psndoc.setId(certs[i].getId());
+					NCLocator.getInstance().lookup(IPersistenceUpdate.class).updateVO(null, psndoc, new String[] {PsndocVO.ID,PsndocVO.IDTYPE}, null);
+					break;
+				}
+			}
+		}
+
+		// 子集更新后同步主表数据
+		NCLocator.getInstance().lookup(IPsndocService.class).updateDataAfterSubDataChanged(infoset.getInfoset_code(), pk_psndoc);
+	}
+
+	@Override
+	public Map<String, Object> queryPsnInfoByTableCode(String tableCode, String pk_psndoc, boolean isTeam) throws BusinessException {
+		PsndocAggVO psndocAggVO = NCLocator.getInstance().lookup(IPsndocQryService.class).queryPsndocVOByPk(pk_psndoc);
+		if (psndocAggVO == null)
+		{
+			return null;
+		}
+		Map<String, Object> resultMap = new HashMap<String, Object>();
+		PsndocVO psndocVO = psndocAggVO.getParentVO();
+		// 取人员所属组织
+		String pk_org = psndocVO.getPsnJobVO().getPk_hrorg();
+		// 查询未审核个人信息
+		PsnInfoApproveVO approveVO = querySubmitPsnInfoByTableCode(pk_org, pk_psndoc, tableCode, false);
+		// 如果是团队成员信息或没有待审核数据,直接返回
+		if (isTeam) {
+			if (PsndocVO.getDefaultTableName().equals(tableCode)) { // 基本信息表
+				resultMap.put("vos", psndocVO);
+			} else if (PsnJobVO.getDefaultTableName().equals(tableCode)) {
+				//resultMap.put("vos", new PsnJobVO[] { psndocVO.getPsnJobVO() });
+				IBean bean = NCLocator.getInstance().lookup(IMetaDataQueryService.class).getBeanByName("hrhi", tableCode);
+				Class<?> clazz = null;
+				try {
+					clazz = Class.forName(bean.getFullClassName());
+				} catch (ClassNotFoundException ex) {
+					Logger.error(ex);
+				}
+				SuperVO[] subVOs = NCLocator.getInstance().lookup(IPersistenceRetrieve.class).retrieveByClause(null, PsnJobVO.class, " pk_psndoc = '" + pk_psndoc + "' order by begindate,enddate,recordnum desc ");
+				subVOs = filterDeleteVOs(subVOs);
+				resultMap.put("vos", subVOs);
+			} else if (PsnOrgVO.getDefaultTableName().equals(tableCode)) {
+				resultMap.put("vos", new PsnOrgVO[] { psndocVO.getPsnOrgVO() });
+			} else {
+				SuperVO[] subVOs = queryPsnShowSubVOsByTableCode(psndocVO, tableCode);
+				resultMap.put("vos", subVOs);
+			}
+			resultMap.put("hasApprove", "N");
+			return resultMap;
+		}else if(approveVO == null){
+			if (PsndocVO.getDefaultTableName().equals(tableCode)) { // 基本信息表
+				resultMap.put("vos", psndocVO);
+			} else if (PsnJobVO.getDefaultTableName().equals(tableCode)) {
+				//resultMap.put("vos", new PsnJobVO[] { psndocVO.getPsnJobVO() });
+				IBean bean = NCLocator.getInstance().lookup(IMetaDataQueryService.class).getBeanByName("hrhi", tableCode);
+				Class<?> clazz = null;
+				try {
+					clazz = Class.forName(bean.getFullClassName());
+				} catch (ClassNotFoundException ex) {
+					Logger.error(ex);
+				}
+				SuperVO[] subVOs = NCLocator.getInstance().lookup(IPersistenceRetrieve.class).retrieveByClause(null, PsnJobVO.class, " pk_psndoc = '" + pk_psndoc + "' order by begindate,enddate,recordnum desc ");
+				subVOs = filterDeleteVOs(subVOs);
+				resultMap.put("vos", subVOs);
+			} else if (PsnOrgVO.getDefaultTableName().equals(tableCode)) {
+				resultMap.put("vos", new PsnOrgVO[] { psndocVO.getPsnOrgVO() });
+			} else {
+				SuperVO[] subVOs = queryPsnShowSubVOsByTableCode(psndocVO, tableCode);
+				resultMap.put("vos", subVOs);
+			}
+			resultMap.put("hasApprove", "N");
+
+			// 查询已审核个人信息
+			PsnInfoApproveVO approvedVO = querySubmitPsnInfoByTableCode(pk_org, pk_psndoc, tableCode, true);
+			if(null == approvedVO){
+				return resultMap;
+			}else{
+				// readstatus:预览状态 0-未读 1-已读
+				if(PsnInfoApproveCheckEnum.CHECK_SUCCESS.getIndex() == approvedVO.getReadstatus()){
+					return resultMap;
+				}
+				// 审核通过
+				if(PsnInfoApproveCheckEnum.CHECK_SUCCESS.getIndex() == approvedVO.getCheckstatus()){
+					resultMap.put("isapproved", "Y");
+				}// 审核不通过
+				else if(PsnInfoApproveCheckEnum.CHECK_FAIL.getIndex() == approvedVO.getCheckstatus()){
+					resultMap.put("isapproved", "N");
+				}
+				resultMap.put("pk_psninfoapprove", approvedVO.getPk_psninfoapprove());
+			}
+			return resultMap;
+		}
+		// 有待审核信息,直接返回前端转换VO--前端有转换器方便一些
+		resultMap.put("vos", approveVO.getNewvalue());
+		resultMap.put("pk_psninfoapprove", approveVO.getPk_psninfoapprove());
+		if (PsndocVO.getDefaultTableName().equals(tableCode)) {
+			Map<String, Object> valueMap = HRJsonUtils.fromJson(new String((byte[]) approveVO.getNewvalue()), Map.class);
+			PsndocVO newPsndocVO = HRJsonUtils.fromJson(new String((byte[]) approveVO.getNewvalue()), PsndocVO.class);
+			for (String key : valueMap.keySet()) {
+				psndocVO.setAttributeValue(key, newPsndocVO.getAttributeValue(key));
+			}
+			resultMap.put("vos", psndocVO);
+		} else {
+			IBean bean = NCLocator.getInstance().lookup(IMetaDataQueryService.class).getBeanByName("hrhi", tableCode);
+			Class<?> clazz = null;
+			try {
+				clazz = Class.forName(bean.getFullClassName());
+			} catch (ClassNotFoundException ex) {
+				Logger.error(ex);
+			}
+			SuperVO[] subVOs = HRJsonUtils.fromJson(new String((byte[]) approveVO.getNewvalue()), Array.newInstance(clazz, 1).getClass());
+			subVOs = filterDeleteVOs(subVOs);
+			resultMap.put("vos", subVOs);
+		}
+		resultMap.put("hasApprove", "Y");
+		return resultMap;
+	}
+
+	@Override
+	public Map<String, Object> queryAllSubmitInfo(String pk_psndoc, boolean checkstatus) throws BusinessException {
+		PsndocAggVO psndocAggVO = NCLocator.getInstance().lookup(IPsndocQryService.class).queryPsndocVOByPk(pk_psndoc);
+		if (psndocAggVO == null)
+		{
+			return null;
+		}
+		Map<String, Object> resultMap = new HashMap<String, Object>();
+		PsndocVO psndocVO = psndocAggVO.getParentVO();
+		// 取人员所属组织
+		String pk_org = psndocVO.getPsnJobVO().getPk_hrorg();
+		// 查询已审核个人信息
+		LoginContext context = new LoginContext();
+		context.setPk_group(PubEnv.getPk_group());
+		context.setPk_org(pk_org);
+		context.setNodeType(NODE_TYPE.ORG_NODE);
+		String whereCond = null;
+		if(checkstatus){
+			whereCond = " pk_org = '" + pk_org + "' and checkstatus <> 0 and pk_psndoc = '" + pk_psndoc + "' order by ts desc";
+		}else{
+			whereCond = " pk_org = '" + pk_org + "' and checkstatus = 0 and pk_psndoc = '" + pk_psndoc + "' ";
+		}
+		PsnInfoApproveVO[] approvedVOs = queryByCondition(whereCond);
+		if (ArrayUtils.isEmpty(approvedVOs)) {
+			return resultMap;
+		}else{
+			ArrayList<Map<String, String>> list = new ArrayList<>();
+			ArrayList<String> infosetPkList = new ArrayList<>();
+			for (PsnInfoApproveVO approve : approvedVOs) {
+				HashMap<String, String> map = new HashMap<>();
+				// readstatus:预览状态 0-未读 1-已读
+				if(PsnInfoApproveCheckEnum.CHECK_SUCCESS.getIndex() == approve.getReadstatus()){
+					continue;
+				}
+				// 审核通过
+				if(PsnInfoApproveCheckEnum.CHECK_SUCCESS.getIndex() == approve.getCheckstatus()){
+					map.put("isapproved", "Y");
+				}// 审核不通过
+				else if(PsnInfoApproveCheckEnum.CHECK_FAIL.getIndex() == approve.getCheckstatus()){
+					map.put("isapproved", "N");
+				}
+				map.put("area", approve.getPk_infoset());
+				infosetPkList.add(approve.getPk_infoset());
+				map.put("checknote", approve.getChecknote());
+				map.put("pk_psninfoapprove", approve.getPk_psninfoapprove());
+				list.add(map);
+			}
+			if (CollectionUtils.isEmpty(list)) {
+				return resultMap;
+			} else {
+				// 此处根据信息区查出对应子集编码,方便前端处理
+				String sql = " select pk_infoset, infoset_code from hr_infoset where pk_infoset in ( ";
+				for (String pk_infoset : infosetPkList) {
+					sql += "'" + pk_infoset + "',";
+				}
+				sql = sql.substring(0, sql.length() - 1) +  ")";
+				List<Map<String, String>> infosetList = (List<Map<String, String>>) NCLocator.getInstance().lookup(IUAPQueryBS.class)
+						.executeQuery(sql, new MapListProcessor());
+				for (Map<String, String> map : list) {
+					String pk_infoset = map.get("area");
+					for (Map<String, String> m : infosetList) {
+						if (pk_infoset.equals(m.get("pk_infoset"))) {
+							map.put("area", m.get("infoset_code"));
+							break;
+						}
+					}
+				}
+				resultMap.put("submitPsnInfos", list);
+			}
+		}
+		return resultMap;
+	}
+
+	/**
+	 * 过滤掉已删除的数据
+	 * 
+	 * @param subVOs
+	 * @return
+	 */
+	private SuperVO[] filterDeleteVOs(SuperVO[] subVOs) {
+		if (ArrayUtils.isEmpty(subVOs))
+		{
+			return null;
+		}
+		List<SuperVO> voList = new ArrayList<SuperVO>();
+		for (SuperVO vo : subVOs) {
+			if (VOStatus.DELETED == vo.getStatus())
+			{
+				continue;
+			}
+			voList.add(vo);
+		}
+		return CollectionUtils.isEmpty(voList) ? null : voList.toArray(new SuperVO[0]);
+	}
+
+	/**
+	 * 查询待审核的个人信息
+	 * @param pk_org
+	 * @param pk_psndoc
+	 * @param tableCode
+	 * @param checkstatus : true-已审核, false-未审核
+	 * @return
+	 * @throws BusinessException
+	 */
+	private PsnInfoApproveVO querySubmitPsnInfoByTableCode(String pk_org, String pk_psndoc, String tableCode, boolean checkstatus) throws BusinessException {
+		// 查询信息集配置
+		String condition = " infoset_code = '" + tableCode + "'";
+		LoginContext context = new LoginContext();
+		context.setPk_group(PubEnv.getPk_group());
+		context.setPk_org(pk_org);
+		context.setNodeType(NODE_TYPE.ORG_NODE);
+		InfoSetVO[] infosetVOs = NCLocator.getInstance().lookup(IInfoSetQry.class).queryInfoSet(context, condition);
+		if (ArrayUtils.isEmpty(infosetVOs))
+		{
+			return null;
+		}
+		String whereCond = null;
+		if(checkstatus){
+			whereCond = " pk_org = '" + pk_org + "' and checkstatus <> 0 and pk_infoset = '" + infosetVOs[0].getPk_infoset() + "' and pk_psndoc = '" + pk_psndoc + "' order by ts desc";
+		}else{
+			whereCond = " pk_org = '" + pk_org + "' and checkstatus = 0 and pk_infoset = '" + infosetVOs[0].getPk_infoset() + "' and pk_psndoc = '" + pk_psndoc + "' ";
+		}
+		PsnInfoApproveVO[] approveVOs = queryByCondition(whereCond);
+		return ArrayUtils.isEmpty(approveVOs) ? null : approveVOs[0];
+	}
+
+	/**
+	 * 查询可显示的子集信息
+	 * 
+	 * @return
+	 * @throws BusinessException
+	 */
+	private SuperVO[] queryPsnShowSubVOsByTableCode(PsndocVO psndocVO, String tableCode) throws BusinessException {
+		String strAddtionalWhere = "";
+		if (PsnJobVO.getDefaultTableName().equals(tableCode)) {
+			strAddtionalWhere += " hi_psnjob.ismainjob='Y'";
+		} else if (PartTimeVO.getDefaultTableName().equals(tableCode)) {
+			strAddtionalWhere += " hi_psnjob.ismainjob='N'";
+		} else if (CtrtVO.getDefaultTableName().equals(tableCode)) {
+			// 在维护和信息节点合同只能看到生效的记录
+			strAddtionalWhere += " hi_psndoc_ctrt.isrefer = 'Y' ";
+		} else if (CapaVO.getDefaultTableName().equals(tableCode)) {
+			strAddtionalWhere += " hi_psndoc_capa.lastflag = 'Y' ";
+		} else if (TrainVO.getDefaultTableName().equals(tableCode)) {
+			strAddtionalWhere += " hi_psndoc_train.pk_psnjob = '" + psndocVO.getPsnJobVO().getPk_psnjob() + "' ";
+		}
+		String strWhere = " pk_psndoc='" + psndocVO.getPk_psndoc() + "'";
+
+		// 业务子集还要按照组织关系主键过滤
+		if ((PsndocAggVO.hashBusinessInfoSet.contains(tableCode) || WainfoVO.getDefaultTableName().equals(tableCode))) {
+			//
+			String pk_org = psndocVO.getPsnJobVO().getPk_hrorg();
+			String pk_psnorg = psndocVO.getPsnOrgVO().getPk_psnorg();
+			if (PsnJobVO.getDefaultTableName().equals(tableCode)) {
+				strWhere += " and pk_org = '" + pk_org + "' and pk_psnorg = '" + pk_psnorg + "'";
+			} else if (PsndocAggVO.hashPsnJobInfoSet.contains(tableCode)) {
+				strWhere += " and pk_psnjob in (select pk_psnjob from hi_psnjob where pk_org = '" + pk_org + "' and pk_psnorg = '" + pk_psnorg + "') ";
+			} else {
+				// 只显示当前组织关系的数据
+				strWhere += " and pk_psnorg = '" + pk_psnorg + "'";
+			}
+
+			// 信息查询节点 单独处理主职/兼职记录
+			UFBoolean ismainjob = psndocVO.getPsnJobVO().getIsmainjob();
+			if (ismainjob == null || !ismainjob.booleanValue()) {
+				// 兼职,除兼职外的业务子集不显示
+				if (WainfoVO.getDefaultTableName().equals(tableCode)) {
+					strWhere += " and pk_psnjob in (select pk_psnjob from hi_psnjob where pk_org = '" + pk_org + "' and pk_psnorg = '" + pk_psnorg + "' and ismainjob = 'N') ";
+				} else if (PartTimeVO.getDefaultTableName().equals(tableCode)) {
+					// 兼职页签显示任职组织下的兼职
+					strWhere += " and pk_org = '" + pk_org + "' ";
+				} else if (TrainVO.getDefaultTableName().equals(tableCode)) {
+					strWhere += " and 1 = 1 ";
+				} else {
+					strWhere += " and 1 = 2 ";
+				}
+			}
+		}
+
+		if (strAddtionalWhere.length() > 0) {
+			strWhere = strWhere + " and " + strAddtionalWhere;
+		}
+
+		IBean bean = NCLocator.getInstance().lookup(IMetaDataQueryService.class).getBeanByName("hrhi", tableCode);
+		IAttribute attribute = bean.getAttributeByName("recordnum");
+		String strOrder = attribute != null ? " recordnum desc" : null;// 此处根据不同情况构建order
+
+		// 业务子集在非编辑态并且显示所有信息时,按照开始时间排序
+		if (PsndocAggVO.hashBusinessInfoSet.contains(tableCode)) {
+			if (QulifyVO.getDefaultTableName().equals(tableCode)) {
+				strOrder = " authendate ";
+			} else if (OtherCertVO.getDefaultTableName().equals(tableCode)
+					|| TrainCertfileVO.getDefaultTableName().equals(tableCode)
+					|| EnterQualCertVO.getDefaultTableName().equals(tableCode)) {
+				// 证书子集按证书颁发时间排序
+				strOrder = " firstdate ";
+			} else {
+				strOrder = " begindate ";
+			}
+		}
+		Class<?> clazzVO = null;
+		try {
+			clazzVO = Class.forName(bean.getFullClassName());
+		} catch (ClassNotFoundException ex) {
+			Logger.error(ex);
+		}
+		SuperVO[] subVOs = NCLocator.getInstance().lookup(IPsndocQryService.class).querySubVO(clazzVO, strWhere, strOrder);
+		return subVOs;
+	}
+}